【问题标题】:Request Attributes not available in jsp page when using sendRedirect from a servlet从 servlet 使用 sendRedirect 时,请求属性在 jsp 页面中不可用
【发布时间】:2012-09-10 11:51:20
【问题描述】:

我是 jsp 和 servlet 的新手。我的场景如下

我有一个 jsp 页面,里面有一个表单。有两个字段。 jsp页面的代码片段如下。

MyFirstJSP.jsp 文件

<body>
<h1> This is my first jsp and servlet project</h1>
<%
//System.out.println(request.getAttribute("fname"));

if(request.getAttribute("fname")!=null){
    System.out.println(request.getAttribute("fname"));
}else{
    System.out.println("No request ");
}
%>
<form action="MyFirstServlet" method="get">
First Name<input type="text" name="fname" value= ${fname}><br>
Last Name<input type="text" name="lname" value= ${lname}>
<input type="submit" value="Send">
</form>
</body>

当我提交此表单时,会调用 MyFirstServlet 来检查用户输入的名字。如果名字等于“abc”,则 servlet 将属性设置为请求对象并将其重定向到调用 jsp 页面,即上面的页面。它将从请求对象中获取值并将其填写到表单的相应字段中。 我也有 Java Expression 语言来达到同样的效果。

这是我的 MyFirstServlet.java servlet 文件的代码片段

/**
 * Servlet implementation class MyFirstServlet
 */
public class MyFirstServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

/**
 * @see HttpServlet#HttpServlet()
 */
public MyFirstServlet() {
    super();
    // TODO Auto-generated constructor stub
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {       // TODO Auto-generated method stub
    String firstname=request.getParameter("fname");
    if(firstname.equalsIgnoreCase("abc")){
        System.out.println("Setting attributes");
        request.setAttribute("fname",firstname);
        request.setAttribute("lname",request.getParameter("lname"));
        response.sendRedirect("MyFirstJSP.jsp");
    }else{
        System.out.Println("No problem");
    }
}
/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    PrintWriter p=response.getWriter();
    p.println("Success!");
    doGet(request,response);
}
}

但是当我执行代码时,servlet 会重定向到 jsp 页面,但不会用相应的值填充表单字段。 为了找到原因,我添加了 if-else-block 来了解原因,并且我知道请求对象属性在此处不可用。

如果我在这种情况下使用请求调度程序,则值可用并且表单会填充值,但地址栏中的 url 不会更改,并且始终显示 servlet 的 url。

所以我的查询是

**1)为什么请求对象对使用 sendRedirect 的 jsp 页面不可用。

2)如果servlet发送重定向到调用jsp,是否有任何其他方式在jsp页面中显示我的表单,预先填充用户输入的值,以便用户无需重新输入数据到表单中。**

请朋友们指导我解决这个问题 谢谢!

【问题讨论】:

标签: jsp servlets response.redirect requestdispatcher


【解决方案1】:

您需要转发到服务器端的jsp页面,因为重定向是客户端操作(查看位置标头1)请求属性迷路了。

替换

response.sendRedirect("MyFirstJSP.jsp");

request.getRequestDispatcher("MyFirstJSP.jsp").forward(request, response);

编辑:对不起,我跳过了这部分

如果我在这种情况下使用请求调度程序,则值可用并且表单会填充值,但地址栏中的 url 不会更改,并且始终显示 servlet 的 url。

尽管如此,在重定向时您不能将请求属性传递给您的 jsp(正如我在上面已经提到的,这是一个客户端操作)

我建议执行以下操作:

  • 实现 doGet 以仅呈现包含表单的页面
  • 实现 doPost 以处理提交的表单数据
  • 在 HTML-Form 中使用 POST 而不是 GET 来提交表单

在 doGet 和 doPost 中,使用 forward 来呈现 *.jsp 页面。

GET /MyFirstServlet -> 转发到 MyFirstJSP.jsp

POST /MyFirstServlet -> 转发到 MyFirstJSP.jsp

这是最常用和最干净的方法。

编辑 2:简单示例

SimpleFormServlet.java

public class SimpleFormServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

private static final String VIEW_NAME = "/WEB-INF/jsp/simpleForm.jsp";
private static final String MODEL_NAME = "form";

public SimpleFormServlet() {
    super();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setAttribute(MODEL_NAME, new SimpleForm());
    request.getRequestDispatcher(VIEW_NAME).forward(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    final SimpleForm form = map(request);

    if(form.getfName().equalsIgnoreCase("abc")){
        request.setAttribute(MODEL_NAME, form);
        // put additional attributes on the request
        // e.g. validation errors,...
        request.getRequestDispatcher(VIEW_NAME).forward(request, response);
    }else{
        System.out.println("No problem");
        response.sendRedirect("/SuccessServlet");
    }
}

private SimpleForm map(final HttpServletRequest request) {
    SimpleForm form = new SimpleForm();
    form.setfName(request.getParameter("fName"));
    form.setlName(request.getParameter("lName"));
    return form;
}

public static class SimpleForm implements Serializable {
    private static final long serialVersionUID = -2756917543012439177L;

    private String fName;
    private String lName;

    public String getfName() {
        return fName;
    }
    public void setfName(String fName) {
        this.fName = fName;
    }
    public String getlName() {
        return lName;
    }
    public void setlName(String lName) {
        this.lName = lName;
    }

}

}

/WEB-INF/jsp/simpleForm.jsp

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>

<form method="POST">
    First Name<input type="text" name="fName" value="${form.fName}"><br>
    Last Name<input type="text" name="lName" value="${form.lName}">
    <input type="submit" value="Send">
</form>

</body>
</html> 
  1. GET /SimpleFormServlet
  2. doGet() 准备表单模型 (SimpleForm) 并将其添加为名为“form”的请求属性
  3. 转发到 simpleForm.jsp
  4. 访问模型值并预填表单:${form.fName} 和 ${form.lName}
  5. 浏览器仍然显示 /SimpleFormServlet(我们喜欢它 ;-))
  6. POST 相对于 /SimpleFormSerlvet 的表单(您不必显式设置表单元素的 action 属性)
  7. doPost() 将请求参数映射到 SimpleForm。
  8. 处理请求并做任何你想做的事(验证)
  9. 然后您可以转发到 simpleForm.jsp(例如验证失败时)或重定向到另一个 servlet(例如 /SuccessServlet)

【讨论】:

  • 谢谢!朋友您的回复,但我关心的一个问题是浏览器地址栏中的 url,如果我使用请求调度程序,则不会更改。我的要求是该值应该可用于 jsp 页面以重新填写表单以及浏览器地址栏中的 url 应更改为 jsp 页面 url。
  • @Param-Ganak:然后使用会话范围
  • @Param-Ganak:抱歉,我刚刚编辑了我的帖子(请不要将 Session 范围用于诸如表单属性和参数之类的东西)
  • @reagten 谢谢朋友的指导!我检查了您编辑的回复,但由于我是 jsp 和 servlet 的初学者,我不完全理解您的建议。您是否有任何演示代码来演示您想要建议的内容。
  • 我正在为你准备一个简单的例子。等一下;-)
【解决方案2】:

我知道现在回答为时已晚,但这会对某人有所帮助。 redirect 是一种客户端操作,因此我们无法getAttribute 值,但我们可以通过使用 URL Rewriting 概念来解决它。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {       // TODO Auto-generated method stub
String firstname=request.getParameter("fname");
if(firstname.equalsIgnoreCase("abc")){
    //System.out.println("Setting attributes");

    response.sendRedirect("MyFirstJSP.jsp?fname="+firstname+"&lname="+request.getParameter("lname")+"");
}
else{
    System.out.Println("No problem");
  }
}

然后使用 request.getParameter() 将值提取为 MyFirstJSP.jsp 中的字符串。

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多