传智播客-struts2(3)-Servlet API访问、拦截器以及struts2的小bug

来源:互联网 发布:淘宝互粉群qq群 编辑:程序博客网 时间:2024/04/30 12:32

先讲个小技巧:如何让eclipse辅助提示struts.xml文件的编写。

 

一般情况下,如果计算机连接上了internet,eclipse能根据dtd文件的url地址自动下载和缓存该dtd文档,以后没有连接上internet也可以自动提示,这可以通过查看eclipse的cache看到。事实上,现在很多人开发时可能都是连的internet,但是也有某些情况不能联网,例如有的公司开发时不允许连接外网,如果要上外网需要自带电脑连接特定网关,但是不能与开发机相关联。这时候,开发需要的jar包当然会拷给你,但是开发时就会有很多不便了。例如开发xml这样的配置文件的时候,因为一开始就没有连接过外网,所以开发时是不会有任何提示的,自己一字一字敲代码一是费时,二是很可能敲错,查错时也会很痛苦。这时候就需要用到下面的小技巧了。

 

如果是myeclipse,windwos->preferences->myeclipse->files and editors->xml->xmlcatalog->点“add”,在出现的窗口中的location中选“File system”,然后在struts-2.0解压目录的src/core/src/main/resources目录中选择struts-2.0.dtd,例如D:/java/struts-2.1.8.1/src/core/src/main/resources/struts-2.0.dtd,回到设置窗口的时候不要急着关闭窗口,应把窗口中的Key Type改为URI,Key改为http://struts.apache.org/dtds/struts-2.0.dtd--就是struts.xml文件里开头部分声明的那个地址。

 

如果是eclipse,则是windwos->preferences->xml->xmlcatalog。

 

servlet API访问
1、调用ServletActionContext的各个方法:
getActionMapping()、getPageContext()、getRequest()、getResponse()和getServletContext();
2、实现如下接口,由struts框架运行时分别注入相应的Servlet API对象:
ServletRequestAware、ServletResponseAware和ServletContextAware;

 

上述两种方法导致开发时绑定了servlet-api.jar,但是自有其用处。例如做ajax开发时就可以利用ServletActionContext.getResponse().getWriter().println("xxxxx")这样的方式传递部分数据而不是整个页面。

 

Struts2的拦截器
struts2的拦截器底层机制请参见前文,下文写的是struts2里拦截器的应用。

 

Struts2很多核心的功能都是拦截器来实现。例如,从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。struts-default包(在struts-default.xml文件里定义的)定义了这些拦截器和Result类型。可以这么说,当应用包继承了struts-default包才能使用struts2提供的核心功能。不过也可以自定义拦截器。

 

运用struts2的拦截器,我们需要了解:
1、struts2通过拦截器实现了访问的细粒度(方法)控制。
2、struts-default包里的拦截器不是一个一个应用的,而是以拦截器栈的形式打包应用的,默认使用的是“defaultStack”拦截器栈。
3、自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口,然后用<inteceptor>(配置在<inteceptors>里)及<inteceptor-ref>配置后即可使用了。也可以用<interceptor-stack>自定义拦截器栈。
4、每个包只能指定一个默认拦截器。另外,一旦我们为该包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用。
5、“defaultStack”和“paramsPrepareParamsStack”拦截器栈都提供了大部分功能,只是拦截顺序不一样。一般情况下会使用前者,但是某些涉及参数传递和取值的问题--例如实现了ModelDriven接口的某些时候,试试后者,也许就不用自己再额外编写拦截器类了。

 

struts2的小bug
struts2.1.6版本中存在一个Bug,即接收到的中文请求参数为乱码(以post方式提交),原因是struts2.1.6在获取并使用了请求参数后才调用HttpServletRequest的setCharacterEncoding()方法进行编码设置 ,导致应用使用的就是乱码请求参数。这个bug在struts2.1.8中已经被解决,如果你使用的是struts2.1.6,要解决这个问题,你可以新建一个Filter,把这个Filter放置在Struts2的Filter之前,然后在doFilter()方法里添加以下代码:
public void doFilter(...){
 HttpServletRequest req = (HttpServletRequest) request;
 req.setCharacterEncoding("UTF-8"); //应根据你使用的编码替换UTF-8
 filterchain.doFilter(request, response);
}

 

原创粉丝点击