www.91084.com

GVKun编程网logo

从Servlet使用sendRedirect时,jsp页面中的请求属性不可用(jsp从servlet获取数据)

12

本文将分享从Servlet使用sendRedirect时,jsp页面中的请求属性不可用的详细内容,并且还将对jsp从servlet获取数据进行详尽解释,此外,我们还将为大家带来关于Eclipse中的S

本文将分享从Servlet使用sendRedirect时,jsp页面中的请求属性不可用的详细内容,并且还将对jsp从servlet获取数据进行详尽解释,此外,我们还将为大家带来关于Eclipse中的Servlet:请求的资源[/ Register /]不可用、forward、sendRedirect及Jsp和Servlet之间的跳转区别、HttpServletResponse sendRedirect永久、HttpServletResponse.sendRedirect()与RequestDispatch的相关知识,希望对你有所帮助。

本文目录一览:

从Servlet使用sendRedirect时,jsp页面中的请求属性不可用(jsp从servlet获取数据)

从Servlet使用sendRedirect时,jsp页面中的请求属性不可用(jsp从servlet获取数据)

我是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页面中显示由用户输入的值预填充我的表单,这样用户就不必重新输入数据了。**

请引导我的朋友解决这个问题,谢谢!

答案1

小编典典

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

更换

response.sendRedirect("MyFirstJSP.jsp");

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

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

如果在这种情况下使用请求分配器,则可以使用这些值,并且使用这些值填充表单,但是地址栏中的url不会改变,并且始终显示servlet的url。

但是,重定向时您不能将请求属性传递给您的jsp(因为上面已经提到过,这是一个客户端操作)

我建议您执行以下操作:

  • 实现doGet仅用于呈现包含表单的页面
  • 实现doPost以处理提交的表单数据
  • 在HTML表单中使用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)

Eclipse中的Servlet:请求的资源[/ Register /]不可用

Eclipse中的Servlet:请求的资源[/ Register /]不可用

需要将servlet类放在Java包中。您应该始终将可公共重用的Java类放在包中,否则它们对于包中的类(例如服务器本身)是不可见的。

forward、sendRedirect及Jsp和Servlet之间的跳转区别

forward、sendRedirect及Jsp和Servlet之间的跳转区别

<jsp:forward>  使用同一个  request  ,是在服务器端跳转,浏览器显示的是第一个页面的名字,因为客户端(浏览器)不知道它在服务器端跳转了。
Response.sendRedirect  是两个不同的  request  ,是在客户端跳转,浏览器显示的是跳转后的页面的名字。因为它是从客户端跳转到第二个页面的。
 
 
 
使用  forward  时,由于只是发送一次  request  请求,  request  设置的属性(  setAttribute  )依然能保留在下一个页面。
使用  sendRedirect  时,由于发送两次  request  请求,所以在下一个不能获取  request  属性。但可以通过重写  URL  的方式将内容传递过去。
下面举例说明:
tian.jsp    
<%request.setAttribute( "river", "redwater"); 
    request.setAttribute( "country", "daguaiwan"); 
%> 
<jsp:forward page= "fengshan.jsp" /> 
 
 
donglan.jsp    
<%request.setAttribute( "river", "redwater"); 
    request.setAttribute( "country", "daguaiwan"); 
%> 
<a href= "fengshan.jsp">fengshan</a> 
 
 
bama.jsp    
<%request.setAttribute( "river", "redwater"); 
    request.setAttribute( "country", "daguaiwan"); 
    response.sendRedirect( "fengshan.jsp"); 
%> 
 
 
fengshan.jsp 
<%=request.getAttribute( "river")%><br/> 
<%=request.getAttribute( "country")%> 
http://localhost:8080/ForwardRedirect/tiane.jsp 跳转后结果为:
redwater
daguaiwan
http://localhost:8080/ForwardRedirect/donglan.jsp 跳转后结果为:
null
null
http://localhost:8080/ForwardRedirect/bama.jsp 跳转后结果为:
null
null
结果分析:
tiane.jsp 是通过 forward 跳转到 fengshan.jsp 的,这两个页面享用的是同一个 request ,故 fengshan.jsp 可以接收到 tiane.jsp 通过  request 设置的属性。
donglan.jsp 是通过 href 发送了另外的 request 请求, bama.jsp 是通过 sendRedirect 跳转,用的也是另外的 request 请求,故 fengshan.jsp 不可以接收到这两个页面通过 request 设置的属性。
 
Jsp Servlet 之间的跳转:
Jsp 跳转 Servlet 可以使用 <jsp:forward page=”URL” /> 或者 response.sendRedirect(URL) 都可以,它们之间的区别上面已经说明了。
 
Servlet 跳转 Jsp
²         getRequestDispatcher forward(request, response) 方法,这里也只是发送了一次请求,可以在下一个页面接受 request 设置的属性。
²         response.sendRedirect(URL), 这里发送了两次请求,不可以在下一个页面接受 request 设置的属性。
例子如下:
servlettiane.jsp    
<%request.setAttribute( "river", "redwater"); 
    request.setAttribute( "country", "daguaiwan"); 
%> 
<jsp:forward page= "/tiane" /> 
 
servletbama.jsp    
<%request.setAttribute( "river", "redwater"); 
    request.setAttribute( "country", "daguaiwan"); 
    response.sendRedirect( "/ForwardRedirect/tiane"); 
%> 
 
Tiane.java 
public class Tiane  extends HttpServlet { 

   public void doGet(HttpServletRequest request, HttpServletResponse response) 
       throws ServletException, IOException { 
//    response.sendRedirect("/ForwardRedirect/fengshan.jsp"); 
     this.getServletConfig().getServletContext() 
            .getRequestDispatcher( "/fengshan.jsp").forward(request, response); 
  } 

   public void doPost(HttpServletRequest request, HttpServletResponse response) 
       throws ServletException, IOException { 
    doGet(request, response); 
  }    

 
再在web.xml中配置servlet: 
   < servlet >
   < servlet-name >tiane </ servlet-name >
   < servlet-class >com.dvnchina.test.Tiane </ servlet-class >
   </ servlet >
   < servlet-mapping >
   < servlet-name >tiane </ servlet-name >
   < url-pattern >/tiane </ url-pattern >
</ servlet-mapping >
具体的结果我就不分析了,和第一个例子差不多的。

HttpServletResponse sendRedirect永久

HttpServletResponse sendRedirect永久

这将使用 临时的 302 HTTP状态代码重定向请求:

HttpServletResponse response;response.sendRedirect("http://somewhere");

但是是否可以使用 永久的 301 HTTP状态代码重定向它?

答案1

小编典典

您需要Location手动设置响应状态和标题。

response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);response.setHeader("Location", "http://somewhere/");

将状态设置为之前sendRedirect()将无效,否则sendRedirect()将其设置为SC_FOUND之后。

HttpServletResponse.sendRedirect()与RequestDispatch

HttpServletResponse.sendRedirect()与RequestDispatch

HttpServletResponse.sendRedirect()与RequestDispatcher.forward()方法都可以实现获取相应URL资源,但是在web服务器内部的处理机制也是不一样的。sendRedirect实现请求重定向,forward实现的是请求转发。


接下来看下这两种实现方式:

forward

1.在JSP中要跳转到index.jsp页面:

<jsp:forward page="index.jsp"/>

2.在Servlet中要跳转到index.jsp页面:

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

sendRedirect:

1.sendRedirect方式跳转到index.jsp页面:

response.sendRedirect("index.jsp");

两者的区别如下:

1.请求次数不同,这是最本质的区别。在forward方式下,在执行当前JSP对象或者Servlet对象的过程中去调用目标文件对应的对象,相当于方法调用,把request和response对象作为参数传递到目标文件对应的对象,当前文件和目标文件的执行是在用户发送的一次请求中完成的。在 sendRedirect方式下,用于首先请求了当前文件,当前文件把目标文件的地址返回给了客户端,客户端再次发送请求,请求目标文件,实际上是发送了两次请求。

2.传值方式不同。在forward方式下,当前文件和目标文件属于同一次请求,共享request对象,所以可以使用request对象传值。而在redirect方式下,当前文件和目标文件属于不同的请求,每次请求会单独创建request和response对象,这样就不能使用request对象来传值。通常在控制器中调用模型得到数据,然后保存到request中,然后forward到目标文件,目标文件从request中获取需要的信息。如果使用sendRedirect方式在控制器和视图之间传递信息,需要使用在目标文件之后加上“?名字=值”的方式传递。

3.客户端在地址栏中看到的地址不一样,对于forward来说,在地址栏中看到的是第1个文件的名字,对于sendRedirect,在地址栏中看到的是第2个文件的地址。有时候会影响目标文件中的相对路径,例如当前文件是FirstApp文件夹中的index.jsp,目标文件是Second文件夹中的index1.jsp,在index1.jsp 中要访问一个图片,使用相对路径,直接写image.jpg,这个文件与index1.jsp放在一起。如果采用forward方式,地址栏中是index.jsp,这样系统会在First文件夹中找image.jpg,这时候就会出错。

4.forward方法的调用者与被调用者之间共享Request和Response。sendRedirect方法由于两次浏览器服务器请求,所以有两个Request和Response。如果使用request.setAttribute传递一些属性就需要用forward,如果想要跳转到别的应用的资源,就需要用sendRedirect。


我们今天的关于从Servlet使用sendRedirect时,jsp页面中的请求属性不可用jsp从servlet获取数据的分享已经告一段落,感谢您的关注,如果您想了解更多关于Eclipse中的Servlet:请求的资源[/ Register /]不可用、forward、sendRedirect及Jsp和Servlet之间的跳转区别、HttpServletResponse sendRedirect永久、HttpServletResponse.sendRedirect()与RequestDispatch的相关信息,请在本站查询。

本文标签: