我是 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 中,使用 转发 呈现 *.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>
关于jsp - 使用 servlet 中的 sendRedirect 时,jsp 页面中的请求属性不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12351107/