2009-06-28 5 views
7

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

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

+2

Один вопрос: если не используется ни база данных, ни какой-либо файл, как вы предлагаете «сохранить предоставленные данные»? – duffymo

ответ

2

В 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 данные формы отправляются (затем перенаправляются обратно), у вас будет следующий код, который будет выталкивать опубликованные данные формы в 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") %>" /> 
6

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

+0

Он работает после того, как поместил его в этот тег , когда я использовал его непосредственно, тогда он отобразился как это: 'Foo: $ {param.foo}' – Ali786

+0

@ ali: видимо, вы используете JSP 1.x вместо 2.x. JSP 1.x - болезненный динозавр (более десяти лет). Возможно, вы захотите обновить свою среду или искать другой проект. – BalusC

+0

Работал как шарм. Благодаря! –

1

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

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

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