Сохранение отправленных данных формы JSP - PullRequest
7 голосов
/ 28 июня 2009

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

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

Ответы [ 3 ]

6 голосов
/ 18 декабря 2009

Лучшее, что вы можете сделать, - это отправить свой собственный сервлет, который, в свою очередь, запускает другой запрос к внешнему веб-приложению в фоновом режиме с небольшой помощью 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 и / или неприятных скриптлетах.

2 голосов
/ 28 июня 2009

В 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, а значения полей формы получат свои значения из компонента:

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

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

<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") %>" />
1 голос
/ 23 декабря 2009

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

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

Помог ли я вообще?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...