标签:
一、Servlet之Request
Web服务器会对收到的每一次客户端http请求分别创建一个用于代表请求的request对象和代表响应的response对象。要获取客户端提交的数据需通过request,要想容器输出数据需通过response。
1、HttpServletRequest
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法可以会的客户的相关信息。
2、Request常用方法(参考官方API)
获得客户机信息:
getRequestURL,返回客户端发出请求时的完整URL
getRequestURI, 返回请求行中的资源名部分
getQueryString, 返回请求行中的查询字符串,通常为?后边携带的参数信息
getRemoteAddr, 返回客户端IP地址
getRemoteHost, 返回客户端的主机名
getRemotePort, 返回客户端的网络端口号
getLocalAddr, 返回Web服务器的IP地址
getLocalName, 返回Web服务器的主机名
getMethod, 返回客户端的请求方式(get/post)
获得客户机请求头:
getHeader()
getHeaders()
getHeaderNames()
获得客户机请求参数:
getParameter()
getParameterValues()
getParameterNames
3、Request请求参数的中文乱码问题
一般浏览器使用什么编码,则传送的数据就以什么编码,但有许多Web浏览器不发送带有“content-type”头信息的字符编码限定符,而由读取http请求的代码类决定自读的编码方式。
默认情况下,如果客户端请求未定义编码限定符,容器(如Tomcat)会用“ISO-8859-1”去创建request reader 和解析post数据。
注意:自从Tomcat5.x开始,GET和POST方法提交的信息,Tomcat采用了不同的方式来处理编码,对于POST请求,Tomcat会仍然使用request.setCharacterEncoding方法所设置的编码来处理,如果未设置,则使用默认的"ISO-8859-1"编码。而对GET请求,并不会考虑使用request.setCharacterEncoding方法设置编码,而会永远使用“ISO-8859-1”编码。
所以,一般的解决方式为:
POST方式:在最开始设置request.setCharacterEncoding("UTF-8")
GET方式: new String(username.getBytes("ISO-8859-1"),"UTF-8")
修改Tomcat的配置可以解决URL中中文编码问题:<Connector URIEncoding="UTF-8"/>
4、转发和包含
一个Servlet对象无法获得另一个Servlet对象的引用,如果需要多个Servlet组件共同协作(数据传递),只能使用Servlet规范提供的请求转发和包含这两种方式:
请求转发:Servlet(源组件)先对客户请求最初一些预处理操作,然后把请求转发给其他web组件(目标组件)来完成包括生成响应结果在内的后续操作。
包含: Servlet(源组件)把其他web组件(目标组件)生成的响应结果包含到自身的响应结果中。
两者共同点:
源组件和目标组件处理的都是同一个酷虎请求,源组件和目标组件共享同一个ServletRequest和ServletResponse对象。
目标组件可以为Servlet、JSP、HTML文档等
都依赖javax.servlet.RequestDispatcher接口。
5、RequestDispatcher请求分发器
它包含两个方法:
forward():把请求转发给目标组件
include():包含目标组件的响应结果
得到RequestDispatcher对象
1、ServletContext对象的getRequestDispatcher(String path1)。path1必须用绝对路径,即以‘/’开头,若用相对路径会抛出IllegalArgumentException异常
2、ServletRequest对象的getRequestDispatcher(String path2)。 path2可以用绝对路径也可以用相对路径。
如果使用forward()方法,只会返回目标组件的响应结果,所以不应该在源组件中提交响应结果,而且,如果在源组件调用了Response的flush或close方法,会抛出IllegalStateException异常
如果使用include()方法,则源组件与目标组件的输出都会被添加到响应结果中,在目标组件对响应头做的修改会被忽略
6、请求范围
web应用范围内的共享数据作为ServletContext对象的属性而存在,只要共享ServletContext对象也就共享了其属性。
请求范围内的共享数据作为ServletRequest对象的属性而存在,只要共享了ServletRequest对象,也就共享了其数据。
二、Servlet之Response
1、HttpServletResponse
HttpServletResponse对象代表服务器的响应,这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。
2、Response常用方法
setStatus();设置状态码
setHeader();设置响应头
getWriter();返回一个响应的打印流
getOutputStream();返回一个响应的字节输出流
注意:getWriter与getOutputStream两个方法相互排斥,调用了其中一个方法后就不能再调用另一个,否侧会抛出异常,Servlet引擎会检查输出流是否关闭,并调用close方法,所以不需要自己关闭。
3、Response中的中文问题
通过设置响应头告知客户端编码方式:response.setHeader("Content-Type","text/html;charset=UTF-8")
通过meta标签模拟请求头::out.write("<meta http-equiv=‘Content-Type‘ content=‘text/html; charset=utf-8‘ />".getBytes())
通过直接方法:response.setContentType("text/html;charset=UTF-8");这条语句的作用是将自己的编码设置为UTF-8,并告诉浏览器使用UTF-8解码
4、Response常见应用
控制浏览器定时刷新:response.setHeader("Refresh","2");也可以定时刷新到某一个URL
控制浏览器缓存当前文档:
response.addDateHeader("Expires",System.currentTimeMillis()+1000*60*60);//缓存一小时,对于一些不怎么变化的数据,利用缓存能减轻服务器的负担
请求重定向:response.sendRedirect(location);
重定向特点:
Servlet源组件生成的响应结果不会被发送到客户端,response.sendRedirect(location)方法一律返回状态码为302的响应结果。
如果源组件在进行重定向之前,已经提交了响应结果,会抛出IllegalStateException异常,所以,不应该在元组件中提交响应结果。
Servlet源组件重定向语句后面的代码也会执行。
源组件和目标组件不共享一个ServletRequest对象。
目标组件不必是同一个服务器上的同一个web应用的组件,它可以是任意一个有效的网页。
三、Servlet高级特性--过滤器
1、过滤器概述:
过滤器是Servlet2.3规范新增的功能,也是Servlet容器管理的对象,其结构同Servlet很类似,比如init()方法,destory()方法, 但是功能不同,过滤器主要是在源数据与目的数据之间起过滤作用的中间组件。
2、过滤器链
在一个Web应用中,可以一次编写多个过滤器,这些过滤器组合起来,称为一个过滤器链,其执行顺序为注册顺序,先注册的会先执行
3、编码转换过滤器
在JavaWeb开发中,初学者经常会遇到java乱码的问题,统一字符编码,是解决乱码问题非常有效的手段,在Web开发中,可以使用过滤器对请求中的参数信息进行编码转换。
4、权限校验过滤器(清楚整个处理流程)
根据不同的权限,用户分别能够访问不同的页面。
Servlet---JavaWeb技术的核心基础,JavaWeb框架的基石(二)
标签:
原文地址:http://www.cnblogs.com/rocomp/p/4814765.html