获取原始表单数据
- POST请求不仅可以传输文本信息还可以传输二进制数据
- 如果想得到请求中参数的原始字节数据,可以使用HttpServletRequest对象提供的getInputSteam()或getReader()方法直接访问表单数据
获取原始表单数据的两种情况
- 数据不是由HTML表单提交,而是来自某个客户端程序,需要自己读取和分析这些数据。
- 数据来自于上传的文件时,需要自己读取数据
请求派发
- 每个客户的请求可以传递给很多Servlet以及Web应用程序中的其它资源
- 整个过程完全是在服务器端完成
- 不需要任何客户端浏览器的行为
- 不需要在客户端浏览器和服务器端之间传递特殊信息
- 通过javax.servlet.RequestDispatcher对象实现
提示:重定向让客户端浏览器来完成,而请求派发是在服务器端做工作 |
请求派发的实现
- 调用ServletRequest对象的方法:
- getRequestDispatcher(path):方法返回给定路径的RequestDispatcher对象
- getNamedDispatcher(name) :返回某个名称的Servlet的RequestDispatcher对象
提示:RequestDispatcher对象还可以通过ServletContext对象的getRequestDispatcher()得到,路径值必须是以根目录"/"开始 |
- RequestDispatcher对象提供了两种方法:
- forward(ServletRequest, ServletResponse):派发请求和响应对象到RequestDispatcher 对象所确定的新资源(Servlet、JSP或者HTML等)
- include(ServletRequest, ServletResponse)该方法关键是能包含服务器端的资源
request.getRequestDispatcher("/sucess.html").include(request, response); request.getRequestDispatcher("/sucess.html").forward(request, response); |
forward跳转示意图
include包含示意图
请求范围
- 变量可以保存在请求范围中
- 在请求范围之外就不能进行访问了
public class Servlet1 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("key", "value"); //重定向跳转到Servlet2,Servlet2获取的值为null //response.sendRedirect("Servlet2"); //forward跳转到Servlet2,Servlet能获取值为value //request.getRequestDispatcher("Servlet2").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } } public class Servlet2 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.err.println(request.getAttribute("key")); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }