Web服务器接收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
Request概念及常用的API
全称为HttpServletRequest,Request表示客户端向服务器发出的请求,所有客户端信息和客户端提交的数据,均封装在Request对象中.
Http三部分:
1.请求行
Get http://llocalhost:8080/test/servlet/req?username=zs http/1.1
方法:
getMethod();获得请求方法
getRequestURL();返回客户端发出请求时的完整url
getRequestURI();返回请求行中的资源名部分
getContextPath();当前应用的虚拟目录
getQueryString();返回请求行中的参数部分
2.请求消息头
方法:
getHeader(String name) 根据头名称得到头信息值
getHeaderNames() 得到所有头信息name
getHeaders(String name) 根据头名称得到相同名称头信息值
3.请求体/请求正文/实体内容
全部发送给服务器,让服务器知道客户端的情况
获取与表单数据相关的方法:
getParameter(name) 根据表单中的name属性的名,获取value属性的值
getParameterValues(String name) 为复选框获取值提供的方法
getParameterNames() 得到表单提交的所有name的方法
getParameterMap() 得到表单提交的所有值的方法
getInputStream 以字节流的方式得到所有表单数据
Request域对象相关的方法:
setAttribute(String name,Object value);设置域对象
getAttribute(String name);获得域对象
removeAttribute(String name);删除域对象中名称为name的value
与请求转发相关的方法:
getRequestDispatcher(String url).forward(request,response); 转发
include(request,response) 请求包含
与请求编码相关的方法:
解决post方法编码:
requset.setCharacterEncoding(“UTF-8”);告诉服务器以什么方式编码
解决get方式编码:
new String(name.getBytes(“ISO-8859-1”),”UTF-8”);
表单提交中文乱码的原因及解决方案
客户端以UTF-8将中文编码,而Tomcat却用ISO-8859-1解码,违背了编码和解决字符集相同的原则,所以服务器收到乱码
解决:
通用方式:
byte[] buf = username.getBytes("ISO8859-1");
username=new String(buf,"UTF-8");
专用方式:即只适合POST
request.setCharacterEncoding("UTF-8");
Request域对象
Request对象有二层含义:
1——代表客户端向服务器的请求对象
2——代表可以暂存数据的域对象
生命周期:
Request何时创建:一次请求来到Servlet
Request何时销毁:服务器将内容响应到客服端,Request就销毁
Request域对象保存时间只在一次请求中,也就是说一次请求完毕后,Request域对象就销毁了,一旦Request域对象销毁,那么存在其中的数据也就不存在了。
Request域对象相关的方法:
setAttribute(String name,Object value);设置域对象
getAttribute(String name);获得域对象
removeAttribute(String name);删除域对象中名称为name的value
Request转发
request.getRequestDispatcher(“路径”).forward(request,response);
forward()后,流程才会真正转向
转发是服务器内部的事,与浏览器无关,所以浏览器的地址栏不会变,原来浏览器以什么方式提交数据,转发到另一个Servlet依然执行对应的方式
Response概念和常用API
服务器向客户端发送响应时,必须通过Response对象,因此想向客户端输出内容的话就要用Response
Http三部分:
1.响应行:
setStatus(int sc)设置响应状态码
2.响应头:
sendRedirect(String location)请求重定向
setHeader(String name,String value)设置响应头信息
例如:
告诉浏览器使用什么码表:
response.setHeader(“content-type”,”text/html;charset=UTF-8”);
告诉客户端不缓存:
response.setHeader(“pragma”,”no-cache”);
response.setHeader(“cache-control”, “no-cache”);
response.setDateHeader(“expires”, 0);
3.响应正文:
getWriter(); 字符输出流
getOutputStream();字节输出流
setCharacterEncoding(String charset);设置将发送到客户端的响应的字符编码
setContentType(String type);设置将发送到客户端的响应的内容类型
浏览器输出中文乱码的原因和解决方案
Response向浏览器输出中文乱码的原因:
字符:response.getWriter().write(“xx”);
默认按ISO8859-1编码,浏览器默认按GB2312解码
字节:response.getOutputStream().write(“xx”.getBytes());
默认按GB2312编码,浏览器默认按GB2312解码,
window平台默认GB2312的编码和解码
解决方案:
字符:response.setHeader(“contenttype”,”text/html;charset=UTF-8”);//浏览器解码
response.setCharacterEncoding(“UTF-8”);//服务器编码
以上二句代码,可以合二为一,如下:
response.setContentType(“text/html;charset=UTF-8”);
服务器按UTF-8编码,浏览器按UTF-8解码
确保编码解码相同
一:服务器输出的内容采用UTF-8来编码
二:通知浏览器接收什么类型的数据
三:通知浏览器用UTF-8来解码
字符:response.getWriter().write(“xx”);
字节:response.setHeader(“content-type”,”text/html;charset=UTF-8”);
告诉浏览器按UTF-8解码
response.getOutputStream().write(“呵呵”.getBytes(“UTF-8”));
服务器按UTF-8解码
重定向
一个Servlet需要将流程交由另一个Servlet
特点:
1.request.sendRedirect(“”);
2.重定向是客户端与服务器的共同行为,不是服务器内部行为,所以浏览器的地址栏会变化
3.在重定向情况下,不共享Request域对象,但可共享Context域对象
4.如果表单原来以post提交,那么重定向后,因为浏览器再次发送http请求了,新一次的Request创建,如果这次以get提交到Servlet,会重写doGet方法
5.位于/WEB-INF这个私有目录下的资源,只能通过转发才可访问,重定向是不能访问的