在劫

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

当浏览器请求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,地址栏会发生改变。

 

posted on 2018-11-21 05:00  在劫  阅读(139)  评论(0)    收藏  举报