本文将分享从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获取数据)
- Eclipse中的Servlet:请求的资源[/ Register /]不可用
- forward、sendRedirect及Jsp和Servlet之间的跳转区别
- HttpServletResponse sendRedirect永久
- HttpServletResponse.sendRedirect()与RequestDispatch
从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>
- GET / SimpleFormServlet
- doGet()准备表单模型(SimpleForm)并将其添加为名为“ form”的请求属性
- 转发到simpleForm.jsp
- 访问模型值并预填写以下表单:$ {form.fName}和$ {form.lName}
- 浏览器仍显示/ SimpleFormServlet(我们喜欢它;-))
- POST 形式相对到/ SimpleFormSerlvet(你没有明确设置表单元素的action属性)
- doPost()将请求参数映射到SimpleForm。
- 处理请求并执行您想做的任何事情(验证)
- 那么您可以转发到simpleForm.jsp(例如当验证失败时)或 重定向 到另一个Servlet(例如,/ SuccessServlet)
Eclipse中的Servlet:请求的资源[/ Register /]不可用
需要将servlet类放在Java包中。您应该始终将可公共重用的Java类放在包中,否则它们对于包中的类(例如服务器本身)是不可见的。
forward、sendRedirect及Jsp和Servlet之间的跳转区别




















daguaiwan
null
null










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);
}
}
< 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永久
这将使用 临时的 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()与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的相关信息,请在本站查询。
本文标签: