往http请求中写入属性,在请求对象生存期内有效,随着请求的结束资源就会被回收。
Servlet代码
public class ServletDemo06 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("name","张大头");
req.setAttribute("password","123456");
RequestDispatcher requestDispatcher = req.getRequestDispatcher("demo07");
requestDispatcher.forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
public class ServletDemo07 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置响应内容类型
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
String title = "HTTP请求转发";
String docType =
"<!DOCTYPE html> \n";
out.println(docType +
"<html>\n" +
"<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<table width=\"100%\" border=\"1\" align=\"center\">\n" +
"<tr bgcolor=\"#949494\">\n" +
"<th>Header 名称</th><th>Header 值</th>\n"+
"</tr>\n");
String name = (String) req.getAttribute("name");
String password = (String) req.getAttribute("password");
out.print("<tr><td>姓名</td>\n");
out.println("<td> " + name + "</td></tr>\n");
out.print("<tr><td>密码</td>\n");
out.println("<td> " + password + "</td></tr>\n");
out.println("</table>\n</body></html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
web.xml注册Servlet,配置映射路径
<servlet-mapping>
<servlet-name>demo06</servlet-name>
<url-pattern>/demo06</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>demo07</servlet-name>
<servlet-class>com.ace.demo.ServletDemo07</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo07</servlet-name>
<url-pattern>/demo07</url-pattern>
</servlet-mapping>
结果
请求的URL并没有变
注意事项
- 不能在forword转发前写数据给客户端,否则将抛出IllegalStateException;
- 如果已向Servlet引擎的缓冲区写入数据,但还未发送给客户端,那么forward可以正常执行,缓冲区会被清空,否则也会抛出异常;
- 在forward之前往HttpServletResponse对象写入的响应头在转发后保持有效;