Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Нужен совет / 8 сообщений из 8, страница 1 из 1
26.10.2014, 12:39
    #38787524
NDAleksey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет
Доброго всем времени!
Настал критический момент, когда не получается собрать мысли в кучу. Это мой первый веб-проект на SpringMVC + Hibernate, времени мало, а делать надо)

Есть страница, в которую попадают вопросы из БД в виде таблицы. Для каждой строки таблицы генерируются кнопки: ответить, изменить, удалить (страница админки). При нажатии первых двух кнопок, появляется всплывающее окошко с компонентами: textarea "содержимое ответа" + submit "Ответить". Часть кода:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
<c:forEach items="${questionList}" var="question">
                <tr>
                    <td>${question.message}</td>
                    <td>${question.authorName}</td>
                    <td>${question.postDate}</td>
                    <td>${question.answer}</td>
                    <td>${question.answerDate}</td>
                    <td>
                        <button onclick="addAnswerWindowShow(); windowCase = 0">Ответить</button>
                        </br>
                        <button onclick="modifyAnswerWindowShow(); windowCase = 1">Изменить</button>
                        </br>
                        <button windowCase = 2">Удалить</button>
                        </br>

                        <div id="addAnswerWindow">
                            <div class="messageBoxTitle">Добавление ответа</div>
                            <form:form accept-charset="utf-8" action="/add_answer" commandName="question" method="POST">
                                <form:textarea class="messageBox" maxlength="255" rows="5"
                                          cols="50" path="answer"></form:textarea></br></br>
                                <input class="sendBtn" type="submit" value="Сохранить">
                                <button class="sendBtn" onclick="closePopup()">Отмена</button>
                            </form:form>
                        </div>
    ...
</c:forEach>



Метода контроллера:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
   @Autowired
    private QuestionService questionService;

    @RequestMapping(value = "/add_answer", method = RequestMethod.POST)
    public String addAnswer(@ModelAttribute("question") Question question) {
        question.setAnswerDate(new Timestamp(new Date().getTime()));
        questionService.modifyQuestion(question);

        return "redirect:/answers";
    }



questionService - это надстрока над надстрокой от
Код: java
1.
2.
3.
4.
5.
6.
7.
@Autowired
private SessionFactory sessionFactory;

@Override
public void modifyQuestion(Question question) {
    sessionFactory.getCurrentSession().update(question);
}



Вся соль в том, что я не могу просто передать туда question из метода addAnswer , т.к. с JSP странички туда летит только question.answer , а остальные поля не заполнены. Короче суть вопроса - как сделать привязку всех данных в строке таблицы на JSP-страничке к кнопкам "Ответить" и "Изменить"?
...
Рейтинг: 0 / 0
27.10.2014, 14:19
    #38788216
Pavel Kurakin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет
Ну как вариант добавте в форму скрытые поля
Код: html
1.
2.
3.
<form:hidden path="message" />
<form:hidden path="authorName" />
... и т.д.



З.Ы. Не по теме, но в вашем коде меня еще смущает то что в цикле создается множество форм с одинаковым ID.
...
Рейтинг: 0 / 0
27.10.2014, 14:21
    #38788219
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет
NDAleksey,

Я два раза прочитал. Нифига не понял. Что мешает вычитать Question по id? Что мешает запустить update по Answer, в котором есть Question id? Зачем передавать остальные поля?
...
Рейтинг: 0 / 0
27.10.2014, 14:22
    #38788222
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет
Pavel KurakinНу как вариант добавте в форму скрытые поля
Для того чтобы сохранить Answer в базе, достаточно иметь Quotation.pk. Нафига остальные поля-то?
...
Рейтинг: 0 / 0
27.10.2014, 14:45
    #38788258
Pavel Kurakin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет
BlazkowiczДля того чтобы сохранить Answer в базе, достаточно иметь Quotation.pk. Нафига остальные поля-то?
Я не знаю. ТС так хотел :)
...
Рейтинг: 0 / 0
28.10.2014, 19:36
    #38789814
NDAleksey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет
Pavel KurakinНу как вариант добавте в форму скрытые поля
Код: html
1.
2.
3.
<form:hidden path="message" />
<form:hidden path="authorName" />
... и т.д.



З.Ы. Не по теме, но в вашем коде меня еще смущает то что в цикле создается множество форм с одинаковым ID.

да, с одинаковым ID идея была ужасная, поэтому сразу же вынес его из цикла
...
Рейтинг: 0 / 0
28.10.2014, 20:06
    #38789829
NDAleksey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет
BlazkowiczNDAleksey,

Я два раза прочитал. Нифига не понял. Что мешает вычитать Question по id? Что мешает запустить update по Answer, в котором есть Question id? Зачем передавать остальные поля?

В приведенном коде вычитать по ID не проблема. Просто несостыковка мыслей в голове - прошу прощения. Просто я тот код сразу изменил, т.к. глупо добавлять div-ы с одинаковыми ID и дублировать код в страничку. Сделал так:

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
...

<c:forEach items="${questionList}" var="question">
                <tr>
                    <td>${question.message}</td>
                    <td>${question.authorName}</td>
                    <td>${question.postDate}</td>
                    <td>${question.answer}</td>
                    <td>${question.answerDate}</td>
                    <td>
                        <button onclick="setAttributes(${question.id}, 0); showPopupWindow();">Ответить</button>
                        </br>
                        <button onclick="setAttributes(${question.id}, 1); showPopupWindow();">Изменить</button>
                        </br>
                        <button windowCase = 2">Удалить</button>
                        </br>
                    </td>
                </tr>
            </c:forEach>
            </tbody>
        </table>
    </c:if>
</div>
<div id="popupWindow">
    <div class="messageBoxTitle">Добавление ответа</div>
    <form:form cssStyle="display: inline;" accept-charset="utf-8" action="/update_question" commandName="question" method="GET">
        <input id="questionId" name="questionId" type="hidden"/>
        <input id="windowCase" name="windowCase" type="hidden"/>
        <form:textarea class="messageBox" maxlength="255" rows="5"
                       cols="50" path="answer"></form:textarea></br></br>
        <input class="sendBtn" type="submit" value="Сохранить">
    </form:form>
    <button class="sendBtn" onclick="closePopupWindow()">Отмена</button>
</div>
<div id="overlay"/>



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
@RequestMapping(value = "/update_question", method = RequestMethod.GET)
    public String updateQuestion(@ModelAttribute("question") Question question, @RequestParam("questionId") String questionId) {

        if (!question.getAnswer().trim().equals("")) {
            int id = Integer.parseInt(questionId);
            Question question1 = questionService.getQuestionById(id);

            question.setId(question1.getId());
            question.setMessage(question1.getMessage());
            question.setPostDate(question1.getPostDate());
            question.setAuthorName(question1.getAuthorName());
            question.setAnswerDate(new Timestamp(new Date().getTime()));
            System.out.println(question.getAnswer());
            questionService.modifyQuestion(question);
        }

        return "redirect:/answers";
    }



Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
var _windowCase, _questionId;

function setAttributes(questionId, windowCase) {
    _questionId = questionId;
    _windowCase = windowCase;
}

function showPopupWindow() {
    document.getElementById('questionId').setAttribute('value', _questionId);

    document.getElementById('popupWindow').style.display = 'block';
    document.getElementById('overlay').style.display = 'block';
}
function closePopupWindow() {
    document.getElementById('popupWindow').style.display = 'none';
    document.getElementById('overlay').style.display = 'none';
}



Теперь окошко открывается, и сохраняется в answer , что в textarea записали. Но теперь другой вопрос: как мне при появлении всплывающего окна грузить в textarea данные из поля message , т.е. грузить текст вопроса. Мне представляется единственный способ - применить хак в скрипте.

P.S. прошу критиковать изложенный выше подход - думаю, что он не оптимален)
...
Рейтинг: 0 / 0
29.10.2014, 07:08
    #38790090
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужен совет
NDAleksey,

Если есть время, то попробуй jqGrid .
Для работы с ним надо будет написать RestController
Для чтения данных
Нужен такой тип, то что будет @ResponseBody (GET)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
public class ResponseBody {
    private int page;
    private int total;
    private int records;
    private List rows;

    public List getRows() {
        return rows;
    }

    public void setRows(List rows) {
        this.rows = rows;
    }

    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public int getRecords() {
        return records;
    }

    public void setRecords(int records) {
        this.records = records;
    }
}



Еще нужен будет POST-обработчик для добавления, изменения, удаления.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Нужен совет / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]