Сохранение отправленных данных формы JSP

У меня есть веб-форма (JSP), которая отправляет данные в другое приложение, размещенное на другом сервере. После отправки данных формы это приложение перенаправляется обратно на ту же страницу JSP. Теперь я хочу сохранить введенные данные. Какие существуют подходы к сохранению отправленных данных в веб-форме. Я бы не предпочел хранить данные в БД или любом другом файле.

PS: я хотел бы сохранить отправленные данные формы, когда запрос снова перенаправляется на ту же страницу JSP. Поэтому пользователю не нужно повторно вводить данные. Например, данные могут храниться в сеансе или запросе и т. д.


person Sourabh    schedule 28.06.2009    source источник
comment
Один вопрос: если не задействована ни база данных, ни какой-либо файл, как вы предлагаете сохранять отправленные данные?   -  person duffymo    schedule 28.06.2009


Ответы (3)


Лучшее, что вы можете сделать, это отправить свой собственный сервлет, который, в свою очередь, запускает другой запрос к внешнему веб-приложению в фоновом режиме с небольшой помощью java.net.URLConnection. Наконец, просто отправьте обратно на страницу результатов в том же запросе, чтобы вы могли просто получить доступ к параметрам запроса с помощью EL. Существует неявная переменная EL ${param}, которая дает вам доступ к параметрам запроса, таким как Map, где имя параметра является ключом.

Итак, со следующей формой

<form action="myservlet" method="post">
    <input type="text" name="foo">
    <input type="text" name="bar">
    <input type="submit">
</form>

и примерно следующий метод сервлета

protected void doPost(HttpServletRequest request, HttpServletResponse response) {
    String foo = request.getParameter("foo");
    String bar = request.getParameter("bar");

    String url = "http://external.com/someapp";
    String charset = "UTF-8";
    String query = String.format("foo=%s&bar=%s", URLEncoder.encode(foo, charset), URLEncoder.encode(bar, charset));

    URLConnection connection = new URL(url).openConnection();
    connection.setUseCaches(false);
    connection.setDoOutput(true); // Triggers POST.
    connection.setRequestProperty("accept-charset", charset);
    connection.setRequestProperty("content-type", "application/x-www-form-urlencoded;charset=" + charset);

    try (OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(), charset)) {
        writer.write(query);
    }

    InputStream result = connection.getInputStream();
    // Do something with result here? Check if it returned OK response?

    // Now forward to the JSP.
    request.getRequestDispatcher("result.jsp").forward(request, response);
}

вы должны иметь доступ к вводу в result.jsp следующим образом

<p>Foo: <c:out value="${param.foo}" /></p>
<p>Bar: <c:out value="${param.bar}" /></p>

Просто как тот. Нет необходимости в jsp:useBean и/или неприятных сценариях.

person BalusC    schedule 18.12.2009
comment
Он работает после помещения его в этот тег ‹core:out value=${param.foo}/›, когда я использовал его напрямую, тогда он отображался как есть `Foo: ${param.foo}` - person Ali786; 29.09.2014
comment
@ali: очевидно, вы используете JSP 1.x вместо 2.x. JSP 1.x — болезненный динозавр (ему более десяти лет). Возможно, вы захотите обновить свою среду или найти другой проект. - person BalusC; 29.09.2014
comment
Работал как шарм. Спасибо! - person Bruno Gasparotto; 02.09.2015

В JSP такие вещи обычно обрабатываются с помощью javabean для хранения значений формы, а затем с помощью тега jsp:useBean. Например, вы должны создать следующий javabean:

package com.mycompany;
public class FormBean {
   private String var1;
   private String var2;
   public void setVar1(String var) { this.var1 = var; }
   public String getVar1() { return this.var1; }
   public void setVar2(String var) { this.var2 = var; }
   public String getVar2() { return this.var2; }
}

В вашей форме jsp вы должны использовать тег useBean, и ваши значения полей формы будут получать свои значения из bean-компонента:

<jsp:useBean id="formBean" class="com.mycompany.FormBean" scope="session"/>
...
...
<input type="text" name="var1" value="<%=formBean.getVar1()%>" />

В вашем jsp данные формы отправляются (а затем перенаправляются обратно), у вас будет следующий код, который будет помещать отправленные данные формы в bean-компонент.

<jsp:useBean id="formBean" class="com.mycompany.FormBean" scope="session"/>
<jsp:setProperty name="formBean" property="*"/> 

Другой вариант — просто вставить данные формы в сеанс на странице сохранения:

String var1 = request.getParameter("var1");
String var2 = request.getParameter("var2");

session.setAttribute("var1", val1);
session.setAttribute("var2", val2);
...

и укажите его в своей форме (нулевая проверка опущена):

<input type="text" name="var1" value="<%= session.getAttribute("var1") %>" />
person John Wagenleitner    schedule 28.06.2009

Если я правильно понимаю проблему (большое «если»), у вас есть ФОРМА, которая имеет метод POST и ДЕЙСТВИЕ, которое указывает непосредственно на удаленный сервер. Когда пользователь нажимает «Отправить», браузер не вовлекает ваш хост в эту транзакцию, данные передаются получателю «ДЕЙСТВИЕ». Это сделало бы ваши возможности ограниченными реализацией отношения обратного вызова с удаленной службой (возможно, вне вашего контроля), настройкой локального прокси-сервлета для перехвата данных и пересылки POST вместе с предполагаемым получателем (что сделало бы POST исходящим от сервер, а не клиент (это может вызвать проблемы)), или использовать какой-либо шаблон проектирования AJAX для отправки данных формы в два места вместо одного, которое диктует тег FORM.

Кроме того, вам потребуется какая-либо форма локального сохранения, например база данных или файл.

Я вообще помог?

person Jason Sperske    schedule 23.12.2009