当浏览器请求HTTP服务器时,使用HTTP来传送请求与相关信息(标头、请求参数、cookie等)。HTTP是基于TCP/IP之上的协议。
当请求来到HTTP服务器,HTTP服务器转交给容器时,容器会创建一个代表当次请求的HttpServletRequest对象,并将请求相关信息设置给对象。同时,容器会创建一个HttpServletResponse对象,作为之后对客户端响应的Java对象。接着容器会根据读取的配置信息,找到处理该请求的Servlet,调用它的service()方法,将创建的HttpServletRequest对象、HttpServletResponse对象传入作为参数,service()方法中会根据HTTP请求的方式调用对象的doXxx()方法。之后容器将HttpServletReuqest和HttpServletResponse对象销毁回收,请求响应结束。
每一次请求/响应后,服务器端不会记得任何客户端的信息,容器每次请求都会创建HttpServletRequest和HttpServletResponse对象,响应之后销毁。下次请求创建的对象就与上一次创建的对象无关了。符合HTTP基于请求/响应、无状态模型。
HTTPServletRequest
//获取客户机信息 StringBuffer getRequestURL() //返回客户端发出请求时完整的URL String getRequestURI() //返回请求行中的资源名部分 String getQueryString() //返回请求行中的参数部分 String getPathInfo() //返回请求URL中额外的路径信息,额外路径信息是请求URL中位于Servlet的路径之后和查询参数之前的内容 Strubg getRemoteAddr() //返回发出请求的客户机的IP地址 String getRemoteHost() //返回发出请求的客户机的完整主机名 String getRemotePort() //返回客户机使用的网络端口号 String getLocalAddr() //返回WEB服务器的IP地址 String getLocalName() //返回WEB服务器的主机名 //获得客户机请求头 String getHeader(String name) Enumeration getHeaders(String name) Enumeration getHeaderNames() //获得客户机请求参数 String getParameter(String name) Enumeration getParameterValues(String name) Enumeration getParameterNames() Map<String,String[]> getParameterMap() //为了避免乱码问题,服务器编码和客户机统一编码,服务器可以从ServletRequest接口继承的方法 setCharacterEncoding(charset) //设置编码,以POST方式传输数据,对GET传输无效,因为该方法只对body标签下的内容有效 //setCharacterEncoding(charset)对GET方式无效,默认的还是使用ISO8859-1这个字符编码来接收数据 //解决办法:在接收到数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组, //然后通过字节数组以指定的编码构建字符串,解决乱码问题 String name = request.getParameter("name"); //接收数据 //获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组, //然后通过字节数组以指定的编码构建字符串,解决乱码问题 name = new String(name.getBytes("ISO8859-1"),"UTF-8");
在web应用中,经常需要多个Servlet完成请求,例如将另一个Servlet请求流程包含进来,或者转发给别的Servlet处理。可以使用HttpServletRequest的getRequestDispatcher()方法取得RequestDispatcher()接口的实现对线实例,调用时指定转发或包含相对的URL网址
RequestDispatcher dispathcer = request.getRequestDispatcher("otherServlet");
取得RequestDispatcher还有两种方式,通过ServletContext的getRequestDispatcher()或getNamedDispatcher()
//使用include()方法将另一个Servlet操作流程包括至目前的Servlet操作流程中 RequestDispatcher dispatcher = req.getRequestDispatcher("otherServlet"); dispatcher.include(req, resp);
在include或者forward包括请求参数的做法仅适用于传递字符串值给另一个Servlet,在调派请求过程中,如果有必须共享的对象,可以设置给请求对象成为属性,成为请求范围属性
setAttribute() //指定名称与对象设置属性 getAttribute() //指定名称取得属性 getAttributeNames() //取得所有属性名称 removeAttribute() //指定名称移除属性
使用forward()方法
request.getRequestDisPatcher("otherServlet").forward(req, resp);
HTTPServletResponse
void addCookie(Cookie cookie); //在响应中增加一个指定的cookie boolean containsHeader(String name); //检查是否设置了指定的响应头。 String encodeRedirectURL(String url); //对sendRedirect方法使用的指定URL进行编码。 String encodeURL(String url); //对包含session ID的URL进行编码。如果不需要编码,就直接返回这个URL。 void sendError(int statusCode); void sendError(int statusCode, String message) //用给定的状态码发给客户端一个错误响应。如果提供了一个message参数,这将作为响应体的一部分被发出,否则,服务器会返回错误代码所对应的标准信息。 //调用这个方法后,响应立即被提交。在调用这个方法后,Servlet不会再有更多的输出。 void sendRedirect(String location); //使用给定的路径,给客户端发出一个临时转向的响应(SC_MOVED_TEMPORARILY)。给定的路径必须是绝对URL。相对URL将不能被接收,会抛出一个IllegalArgumentException。 //这个方法必须在响应被提交之前调用。调用这个方法后,响应立即被提交。在调用这个方法后,Servlet不会再有更多的输出。 void setDateHeader(String name, long date); //用一个给定的名称和日期值设置响应头,这里的日期值应该是反映自1970-1-1日(GMT)以来的精确到毫秒的长整数。如果响应头已经被设置,新的值将覆盖当前的值。 void setHeader(String name, String value); //用一个给定的名称和域设置响应头。如果响应头已经被设置,新的值将覆盖当前的值。 void setIntHeader(String name, int value); //用一个给定的名称和整形值设置响应头。如果响应头已经被设置,新的值将覆盖当前的值。 void setStatus(int statusCode); //这个方法设置了响应的状态码,如果状态码已经被设置,新的值将覆盖当前的值。
forward()与sendRedirect()方法:RequestDispatcher()的forward()方法将请求转发至指定的URL,这个动作在web服务器中进行,浏览器不会知道请求被转发,浏览器地址栏不变。而sendRedirect()方法被称为重定向,要求浏览器重新请求另一个URL,地址栏会发生改变。

浙公网安备 33010602011771号