我是jsp和servlet的新手。我的方案如下
我有一个jsp页面,里面有一个表单。有两个字段。 jsp页面的代码snipet如下。
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文件的代码snipet
/**
* 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 sendredirects到调用jsp,那么在jsp页面中显示我的表单是否有任何其他方式预填充用户输入的值,以便用户无需重新输入数据到表单。**
请指导我这个问题的朋友 谢谢!
答案 0 :(得分:17)
您需要转发到服务器端的jsp页面,因为重定向是客户端操作(请查看位置标题1)请求属性丢失。
替换
response.sendRedirect("MyFirstJSP.jsp");
与
request.getRequestDispatcher("MyFirstJSP.jsp").forward(request, response);
编辑:对不起,我跳过了这部分
如果我在这种情况下使用请求调度程序,那么值将可用,表单将填充值,但地址栏中的url不会变化并始终显示servlet的URL。
然而,在重定向时你不能将请求属性传递给你的jsp(正如我上面提到的那样,它是一个客户端动作)
我建议你做以下事情:
在doGet和doPost中,使用转发来呈现* .jsp页面。
GET / MyFirstServlet - &gt;转发到MyFirstJSP.jsp
POST / MyFirstServlet - &gt;转发到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 :(得分:6)
我知道回答为时已晚,但这对某人有帮助。 重定向是客户端操作,因此我们无法获取属性值,但我们可以使用网址重写概念解决此问题。
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中将值提取为字符串。