бин сеанса Java - перезагрузить данные? - PullRequest
1 голос
/ 16 октября 2010

Вот что я хочу сделать.Это кажется простым, но я не могу заставить его работать.JSP1 - пользователь заполняет форму, отправляет на JSP2.JSP2 заполняет значения формы в Bean-компоненте и отображает данные, а также предлагает пользователю возможность возвращать и изменять (history.back ()) или отправлять сервлету.У меня есть три различных варианта, и у каждого есть проблемы.

ВАРИАНТ 1: JSP1 - стандартная HTML-форма, отправляется в JSP2

<form name="testform" method="post" action="jsp2.jsp">
...
City: <input name="currentCity" type="text" />

JSP2 -

<jsp:useBean id="workorder" type="com.mycompany.app.WorkorderBean" class="com.mycompany.app.WorkorderBean" scope="request">
    <jsp:setProperty name="workorder" property="*" />
</jsp:useBean>
...
currentCity: ${workorder.currentCity}

Проблема - когда JSP2 отправляется на контроллер, и я звоню WorkorderBean workorder = (WorkorderBean) request.getAttribute("workorder");, он возвращает ноль.Таким образом, «scope = request» не переходит из JSP в сервлет.

ВАРИАНТ 2: Тот же сценарий, но в JSP2 используется «scope = session». Проблема : когда пользователь решает вернуться к JSP1 и изменить данные, а затем повторно передает его в JSP2, JSP2 не использует новые значения, поскольку он уже имеет компонент в качестве сессионного компонента. Вопрос : Есть ли способ очистить сессионный компонент при отправке из JSP1?Я не думаю, что смогу сделать это с помощью Javascript.

ВАРИАНТ 3: JSP1 отправляет сервлету, который форматирует сессионный компонент и отправляет JSP2. Проблема : Когда пользователь решает вернуться из JSP2 в JSP1 для внесения изменений, все данные теряются в форме.

Как я могу заставить это работать?

Ответы [ 2 ]

1 голос
/ 16 октября 2010

Лучше всего сделать так, чтобы на второй странице была форма со скрытыми полями.

А затем в первой форме она должна была просмотреть запрос на ввод данных.

Итак, вы получите следующее:

GET /jsp1

Показывает начальную форму, пустую.Затем он отправляет сообщение в JSP2

POST /jsp2
fname=Frank&lname=Jones&city=Atlanta

jsp2, затем перенаправляет обратно к себе:

GET /jsp2?fname=Frank&lname=Jones&city=Atlanta

И отображает эти значения.

Если пользователь нажимает НАЗАД, тогдаувидеть их оригинальную работу.Если вы предоставляете им ссылку «Вернуться назад», и это реальная ссылка, она должна быть похожа на JSP2, только вместо этого это JSP1:

GET /jsp1?fname=Frank&lname=Jones&city=Atlanta

Если они решат продолжить, то вы POST к сервлету:

POST /servlet
fname=Frank&lname=Jones&city=Atlanta

На JSP2 у вас есть скрытая форма:

<form action="/servlet" method="POST">
    <input type="hidden" name="fname" value="Frank"/>
    ...
    <input type="submit" ... />
</form>

Затем, когда это будет сделано, сервлет перенаправит на любую JSP, которую хочет показать.

По сути, вы хотите, чтобы браузер отображал только то, что он ПОЛУЧАЕТ, а не результаты POST.Если вы когда-нибудь видели, когда нажимаете кнопку «Назад», и вы получаете это диалоговое окно «хотите ли вы повторить этот запрос», это потому, что результаты предыдущей страницы получены из POST, а не из GET.

Вы используете параметры в своих запросах, чтобы помочь перенести состояние вперед.Это исключает информацию из вашего сеанса и позволяет таким вещам, как кнопка «обновить», работать для пользователя должным образом.

0 голосов
/ 16 октября 2010

Возможное решение для варианта 1:

В JSP2 поместите параметры запроса в скрытые поля формы, чтобы они могли быть отправлены вашему сервлету. В сервлете вы должны прочитать параметры запроса вручную. Но вам не нужен сеанс, и вы можете вернуться из JSP2 в JSP1, изменить некоторые значения и снова отправить в JSP2. Затем отправка на JSP2 передает измененные значения сервлету.

Обновление:

В вашем втором варианте: причина, по которой свойства компонента остаются неизменными после повторной отправки, заключается в том, что вы поместили тег jsp:setProperty внутри jsp:useBean. С этим созвездием jsp:setProperty вызывается только при создании бина. Во время второго вызова JSP2 компонент workorder уже существует в области сеанса, и вызов jsp:setProperty не происходит.

Вы можете изменить это поведение, если поместите тег jsp:setProperty за пределы jsp:useBean:

<jsp:useBean id="workorder" type="com.mycompany.app.WorkorderBean"
   class="com.mycompany.app.WorkorderBean" scope="session" />
<jsp:setProperty name="workorder" property="*" />  

Затем jsp:setProperty будет вызываться при каждом вызове JSP2 и перезаписывать свойства bean-компонента параметрами запроса.

...