request和response对象既然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。
请求行、请求头、请求体包含在request对象中
①获得客户机请求头
getHeader(string name)方法:String
getHeaders(String name)方法:Enumeration
getHeaderNames()方法
②获得客户机请求参数(客户端提交的数据)
getParameter(String)方法
getParameterValues(String name)方法
getParameterNames方法+BeanUtils框架
③获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。
getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
getRemoteAddr方法返回发出请求的客户机的IP地址。
getRemoteHost方法返回发出请求的客户机的完整主机名。
getRemotePort方法返回客户机所使用的网络端口号。
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名。
同时request是一个域对象,转发时域有效。(转发就是将请求转给另外一个地方处理,所以使用request对象)
转发方法:
request.getRequestDispatcher(path).forward(request,response); (由于转发时服务器内部的事情,所以path路径/表示web应用)此request对象未发生变化,为同一个request对象,而response对象是去掉了响应体的对象。
状态行、响应头、响应体包含在response对象中
①设置状态
setStatus(int sc);
②设置响应头
setHeader(name, value);
③输出响应体
getPrintWriter().write();
重定向方法:
response.sendRedirect(location) (给浏览器响应,让浏览器重新向服务器提交location地址的请求 由于客户端访问的,所以/表示webapps
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
中文乱码问题:
request:浏览器向web服务器提交HTTP请求,HTTP请求以浏览器默认编码方式编码成字节传送(HTTP请求包含请求行,请求头,请求体),web服务器默认以ISO8859-1解码方式解码。①对于请求体(POST方法),调用setCharacterEncoding()方法(该方法只对请求体有效)通知服务器以指定的解码方式解码(替代了默认的解码方式) ②对于请求头(GET方法),解决方法是先让服务器采用默认的ISO8859-1编码,然后获得该请求头中的参数,然后再用ISO8859-1编码,最后用指定解码方式解码正确恢复参数。
response:response对象向web服务器输出字符,字符输出流默认采用ISO8859-1编码。①对于响应体,调用setContentType("text/html;charset=UTF-8")来指定web服务器编码方式,同时也通知了浏览器端以该种方式解码。②对于响应头,只能调用URLEncoding.encode()方法将中文变成%ab%cd%ef...的形式,然后以默认的编码方式编码,浏览器端会正确显示。
request:
public class Request extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取HTTP请求参数,因为是GET请求,所以参数不在请求体,不能使用setCharacterEncoding()方法。
//因此必须对于刚开始获得的参数先用ISO8895-1编码再用UTF-8解码的方式获得原来的参数。
String virtualName = request.getParameter("name");
String realName = new String(virtualName.getBytes("ISO8859-1"), "UTF-8");
//设置服务器编码方式及浏览器端解码方式
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(realName);
}
}
response:
public class Response extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置为下载方式,默认下载名称为小王.jpg。由于这是响应头信息,因此只能使用URLEncoder.encode()方法
String name = URLEncoder.encode("小王.jpg", "UTF-8");
<span style="white-space:pre"> </span>//fileName指的是默认下载的名称
response.setHeader("Content-Disposition", "attachment;fileName="+name);
}
}