您需要 转发 到服务器端的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)



