您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > javaweb学习总结Filter高级开发
javaweb学习总结——Filter高级开发在filter中可以得到代表用户请求和响应的request、response对象,因此在编程中可以使用Decorator(装饰器)模式对request、response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求。一、Decorator设计模式1.1、Decorator设计模式介绍当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强:编写子类,覆盖需增强的方法。使用Decorator设计模式对方法进行增强。在阎宏博士的《JAVA与模式》一书中开头是这样描述装饰(Decorator)模式的:装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。那么在实际应用中遇到需增强对象的方法时,到底选用哪种方式比较好呢?这个没有具体的定式,只能是根据具体的需求来采用具体的方式,不过有一种情况下,必须使用Decorator设计模式:即被增强的对象,开发人员只能得到它的对象,无法得到它的class文件。比如request、response对象,开发人员之所以在servlet中能通过sun公司定义的HttpServletRequest\response接口去操作这些对象,是因为Tomcat服务器厂商编写了request、response接口的实现类。web服务器在调用servlet时,会用这些接口的实现类创建出对象,然后传递给servlet程序。此种情况下,由于开发人员根本不知道服务器厂商编写的request、response接口的实现类是哪个?在程序中只能拿到服务器厂商提供的对象,因此就只能采用Decorator设计模式对这些对象进行增强。1.2、Decorator设计模式的实现1.首先看需要被增强对象继承了什么接口或父类,编写一个类也去继承这些接口或父类。2.在类中定义一个变量,变量类型即需增强对象的类型。3.在类中定义一个构造函数,接收需增强的对象。4.覆盖需增强的方法,编写增强的代码。二、使用Decorator设计模式增强request对象ServletAPI中提供了一个request对象的Decorator设计模式的默认实现类HttpServletRequestWrapper,HttpServletRequestWrapper类实现了request接口中的所有方法,但这些方法的内部实现都是仅仅调用了一下所包装的的request对象的对应方法,以避免用户在对request对象进行增强时需要实现request接口中的所有方法。2.1、使用Decorator模式包装request对象解决get和post请求方式下的中文乱码问题编写一个用于处理中文乱码的过滤器CharacterEncodingFilter,代码如下:复制代码1packageme.gacl.web.filter;23importjava.io.IOException;45importjavax.servlet.Filter;6importjavax.servlet.FilterChain;7importjavax.servlet.FilterConfig;8importjavax.servlet.ServletException;9importjavax.servlet.ServletRequest;10importjavax.servlet.ServletResponse;11importjavax.servlet.http.HttpServletRequest;12importjavax.servlet.http.HttpServletRequestWrapper;13importjavax.servlet.http.HttpServletResponse;1415/**16*@ClassName:CharacterEncodingFilter17*@Description:此过滤器用来解决解决get、post请求方式下的中文乱码问题18*@author:孤傲苍狼19*@date:2014-8-31下午11:09:3720*21*/22publicclassCharacterEncodingFilterimplementsFilter{2324privateFilterConfigfilterConfig=null;25//设置默认的字符编码26privateStringdefaultCharset=UTF-8;2728publicvoiddoFilter(ServletRequestreq,ServletResponseresp,29FilterChainchain)throwsIOException,ServletException{3031HttpServletRequestrequest=(HttpServletRequest)req;32HttpServletResponseresponse=(HttpServletResponse)resp;33//得到在web.xml中配置的字符编码34Stringcharset=filterConfig.getInitParameter(charset);35if(charset==null){36charset=defaultCharset;37}38request.setCharacterEncoding(charset);39response.setCharacterEncoding(charset);40response.setContentType(text/html;charset=+charset);4142MyCharacterEncodingRequestrequestWrapper=newMyCharacterEncodingRequest(request);43chain.doFilter(requestWrapper,response);44}4546publicvoidinit(FilterConfigfilterConfig)throwsServletException{47//得到过滤器的初始化配置信息48this.filterConfig=filterConfig;49}5051publicvoiddestroy(){5253}54}5556/**57*@ClassName:MyCharacterEncodingRequest58*@Description:ServletAPI中提供了一个request对象的Decorator设计模式的默认实现类HttpServletRequestWrapper,59*(HttpServletRequestWrapper类实现了request接口中的所有方法,但这些方法的内部实现都是仅仅调用了一下所包装的的request对象的对应方法)60*以避免用户在对request对象进行增强时需要实现request接口中的所有方法。61*所以当需要增强request对象时,只需要写一个类继承HttpServletRequestWrapper类,然后在重写需要增强的方法即可62*@author:孤傲苍狼63*@date:2014-9-2下午10:42:5764*1.实现与被增强对象相同的接口652、定义一个变量记住被增强对象663、定义一个构造函数,接收被增强对象674、覆盖需要增强的方法685、对于不想增强的方法,直接调用被增强对象(目标对象)的方法69*/70classMyCharacterEncodingRequestextendsHttpServletRequestWrapper{71//定义一个变量记住被增强对象(request对象是需要被增强的对象)72privateHttpServletRequestrequest;73//定义一个构造函数,接收被增强对象74publicMyCharacterEncodingRequest(HttpServletRequestrequest){75super(request);76this.request=request;77}78/*覆盖需要增强的getParameter方法79*@seejavax.servlet.ServletRequestWrapper#getParameter(java.lang.String)80*/81@Override82publicStringgetParameter(Stringname){83try{84//获取参数的值85Stringvalue=this.request.getParameter(name);86if(value==null){87returnnull;88}89//如果不是以get方式提交数据的,就直接返回获取到的值90if(!this.request.getMethod().equalsIgnoreCase(get)){91returnvalue;92}else{93//如果是以get方式提交数据的,就对获取到的值进行转码处理94value=newString(value.getBytes(ISO8859-1),this.request.getCharacterEncoding());95returnvalue;96}97}catch(Exceptione){98thrownewRuntimeException(e);99}100}101}复制代码在web.xml文件中配置CharacterEncodingFilter复制代码1!--配置字符过滤器,解决get、post请求方式下的中文乱码问题--2filter3filter-nameCharacterEncodingFilter/filter-name4filter-classme.gacl.web.filter.CharacterEncodingFilter/filter-class5/filter67filter-mapping8filter-nameCharacterEncodingFilter/filter-name9url-pattern/*/url-pattern10/filter-mapping复制代码编写jsp测试页面,如下:复制代码1%@pagelanguage=javapageEncoding=UTF-8%2%--引入jstl标签库--%3%@tagliburi==c%4!DOCTYPEHTML5html6head7title使用字符过滤器解决解决get、post请求方式下的中文乱码问题/title8/head910body11%--使用c:url标签构建url,构建好的url存储在servletDemo1变量中--%12c:urlvalue=/servlet/ServletDemo1scope=pagevar=servletDemo113%--构建的url的附带的中文参数,参数名是:username,值是:孤傲苍狼--%14c:paramname=usernamevalue=孤傲苍狼/c:param15/c:url16%--使用get的方式访问--%17ahref=${servletDemo1}超链接(get方式请求)/a18hr/19%--使用post方式提交表单--%20formaction=${pageContext.request.contextPath}/servlet/ServletDemo1method=post21用户名:inputtype=textname=usernamevalue=孤傲
本文标题:javaweb学习总结Filter高级开发
链接地址:https://www.777doc.com/doc-2880522 .html