一、Struts的工作原理及核心过滤器
1、StrutsPrepareAndExecuteFilter过滤器其实是包含2部分的
StrutsPrepareFilter:做准备
StrutsExecuteFilter:进入Struts2的核心处理。如果是Struts2的请求就会进入该过滤器,处理完后,不放行(由结果类负责显示)。如果是非Struts2的请求,比如默认jsp的请求,直接放行。
如果用不到其他过滤器,配置StrutsPrepareAndExecuteFilter即可;
如果用到其他过滤器,还需要使用Struts2准备好的环境,使用StrutsPrepareFilter,StrutsExecuteFilter2个过滤器,其他过滤器放在两者之间。如下
showcase,各种应用的案例,在struts2-showcase里面找各种案例
2、Struts2中实现了一种可以访问jar包或类路径下的静态资源(css、js等)的方式。
文档中介绍了,可以把静态资源放到org.apache.struts2.static或者template包中,可以直接访问,例如
访问template.aaa中的bbb.css,则
http://localhost:8080/day22_03_strutsStatics/struts/aaa/bbb.css
或者自己对静态资源访问的地址进行设置,在web.xml中设置
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>packages</param-name>
<param-value>com.itheima.statics</param-value>
</init-param>
</filter> |
则访问com.itheima.statics中的资源ccc.css,的地址为
http://localhost:8080/day22_03_strutsStatics/struts/ccc.css
二、在动作类中获取Servlet相关对象的引用
方式一:ServletActionContext的静态方法可以得到Servlet相关的对象
//用Servlet相关的对象request response servletContext HttpSession
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
ServletContext sc = ServletActionContext.getServletContext();
HttpSession session = request.getSession(); |
方式二:实现ServletRequestAware接口,struts2框架就会把request对象注入进来,通过拦截器servletConfig。
Action实现如下接口,struts框架则会为其注入相应的Servlet API对象:
ServletRequestAware
ServletResponseAware
ServletContextAware
实现其他对象或者功能,参考拦截器servletConfig。
三、自定义拦截器
注意:当拦截器拦截,返回结果集后,则后面的都不会执行,直接返回结果集。
1、执行效率统计拦截器
建立拦截器ElapsedTimeInterceprot实现Interceptor接口
//动作方法及结果处理耗时统计拦截器
public class ElapsedTimeInterceprot implements Interceptor {
public String intercept(ActionInvocation invocation) throws Exception {
long beginTime = System.nanoTime();//纳秒:1毫秒=1000000纳秒
String result = invocation.invoke();//放行:拦截前要做的事放在invocation.invoke()之前,拦截后放在之后
//结果处理完毕后执行
long endTime = System.nanoTime();
System.out.println(invocation.getInvocationContext().getName()+"动作执行耗时:"+(endTime-beginTime)+"纳秒");
return result;
}
public void destroy() {
}
public void init() {
}
} |
进行配置文件设置
<package name="p1" extends="struts-default">
<interceptors>
<interceptor name="elapsedTime" class="com.itheima.interceptors.ElapsedTimeInterceprot"></interceptor>
</interceptors>
|