jsp - 使用 servlet 中的 sendRedirect 时,jsp 页面中的请求属性不可用

标签 jsp servlets response.redirect requestdispatcher

我是 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 表达式语言。

这是我的 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 来了解原因,并且我知道 request objects 属性在这里不可用。

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

所以我的查询是

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

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

遇到这个问题的 friend 请多多指教
谢谢你!

最佳答案

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

代替

response.sendRedirect("MyFirstJSP.jsp");


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

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

If I use the request dispatcher in this case then the values are gets available and the form is gets filled with the values but the url in the address bar does not chage and always shows the url to the servlet.



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

我建议执行以下操作:
  • 实现 doGet 以仅呈现包含表单
  • 的页面
  • 实现 doPost 来处理提交的表单数据
  • 在 HTML 表单中使用 POST 而不是 GET 来提交表单

  • 在 doGet 和 doPost 中,使用 转发 呈现 *.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> 
    
  • 获取/SimpleFormServlet
  • doGet() 准备表单模型 (SimpleForm) 并将其添加为名为“form”的请求属性
  • 转发到 simpleForm.jsp
  • 访问模型值并预填表单:${form.fName} 和 ${form.lName}
  • 浏览器仍然显示/SimpleFormServlet(我们喜欢它 ;-))
  • 发布 相对于/SimpleFormSerlvet 的表单(您不必显式设置表单元素的 action 属性)
  • doPost() 将请求参数映射到 SimpleForm。
  • 处理请求并做任何你想做的事情(验证)
  • 然后您可以转发到 simpleForm.jsp(例如验证失败时)或 重定向 到另一个 servlet(例如/SuccessServlet)
  • 关于jsp - 使用 servlet 中的 sendRedirect 时,jsp 页面中的请求属性不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12351107/

    相关文章:

    java - 无法获取 servlet 设置的 jSTL requestScope 变量

    javascript - 在重定向到 ASP.NET c# 中的另一个页面之前显示 ClientScript 警报?

    c# - 如何从我的自定义 C# 类调用 response.redirect

    java - jsp调用servlet时未找到404

    javascript - 如何使搜索结果根据搜索条件打开特定页面

    javascript - 使用单选按钮更改记录。

    java - 调用 servlet 时出错,但加载了其他资源 - Flex + Java 应用程序

    mysql - 使用具有不同日期格式的jsp将日期字段插入数据库

    java - 看起来Servlet中只有一个线程处理所有请求

    c# - 如何在 ASP.NET 中使用 Response.Redirect 从子文件夹到根目录,防止用户查看目录列表