Struts2解析
Posted Lazy的笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2解析相关的知识,希望对你有一定的参考价值。
struts2是一个
mvc框架
是一个aop容器
struts2的插件机制
1、在web.xml文件中
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在该过滤器中:
public class StrutsPrepareAndExecuteFilter implements StrutsStatics, Filter {
public void init(FilterConfig filterConfig) throws ServletException {
//1、加载了org/apache/struts/default.properties文件
//2、
private static final String DEFAULT_CONFIGURATION_PATHS
=
"struts-default.xml,struts-plugin.xml,struts.xml";
说明:
1、加载了三种struts2的配置文件
struts-default.xml
struts-plugin.xml
struts.xml
2、配置文件的特点:
struts-default.xml文件是系统默认的配置文件
struts-plugin.xml是插件机制的配置文件
struts.xml是开发中用到的配置文件
这三种配置文件都是classpath的根目录存放
这三种配置文件的dtd约束都一样,所以在这三种配置文件中可以出现相同的元素
如果出现相同的元素,后者覆盖前者
struts-plugin.xml文件可以有很多个,而且通常情况下是在lib下的jar包中出现
}
}
2、对象工厂ObjectFactory(产生结果集、action、拦截器)【指向spring对象工厂的bean】
//该方法是struts2创建action的最低层的方法
public Object buildAction(String actionName, String namespace, ActionConfig config, Map<String, Object>
extraContext) throws Exception {
return buildBean(config.getClassName(), extraContext);
}
//该方式是创建结果集的最低层的方法
public Result buildResult(ResultConfig resultConfig, Map<String, Object> extraContext) throws Exception {
}
//该方式是创建拦截器的最低层的方法
public Interceptor buildInterceptor(InterceptorConfig interceptorConfig, Map<String, String>
interceptorRefParams) throws ConfigurationException {
}
3、静态注入
1、在struts2的配置文件中有这么一些元素
bean
可以配置多个bean
<bean type="com.opensymphony.xwork2.util.ValueStackFactory"
name="struts"
class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory" />
说明:
1、值栈的产生工厂是OgnlValueStackFactory
2、该类在tomcat容器启动的时候就被加载了,所以只加载一次
3、通过该类就把值栈的产生工厂赋值到struts2容器中了,这个过程称为注入
4、所以这种行为称为"静态注入"
package
声明一个action
声明一个拦截器
声明一个结果集
4、改变action的产生方式
1、在default.properties文件中有一个配置项:
struts.objectFactory该配置项指明了对象工厂
2、写一个类继承ObjectFactory,重写buildAction方法
public class CreateActionBean extends ObjectFactory{
@Override
public Object buildAction(String actionName, String namespace,
ActionConfig config, Map<String, Object> extraContext)
throws Exception {
// TODO Auto-generated method stub
System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
return null;
}
}
3、在struts2的配置文件中利用bean元素把CreateActionBean放入到struts2容器中
<bean type="com.opensymphony.xwork2.ObjectFactory"
name="aaa"
class="cn.itcast.shoa.struts.action.CreateActionBean" />
4、在配置文件中引入常量struts.objectFactory
<constant name="struts.objectFactory" value="aaa"></constant>
5、分析struts2的插件机制
1、提供了一个jar包
struts2-spring-plugin-2.3.1.2.jar
2、在jar包的根目录下存放了一个文件
<bean type="com.opensymphony.xwork2.ObjectFactory"
name="spring"
class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
<constant name="struts.objectFactory" value="spring" />
重新定义了对象工厂
3、如果一个框架想要和struts2进行整合,提供一个struts-plugin.xml文件,
再提供了一个jar包,该配置文件在jar包的根目录下,然后把该jar包放入到
lib下就可以了
<struts>
<package name="person" namespace="/" extends="struts-default">
<!-- 通配符来使用,class是要根据spring配置文件中的bean的id相对应
在spring配置文件中只是将PersonAction这个类放入IoC容器中,而没有将struts配置文件放入
spring配置文件,其中的原理是什么。spring中的工厂有一个org.apache.struts2.spring.StrutsSpringObjectFactory
, 当服务器启动时,struts2已经与spring整合,struts2会调用里面spring中已经加载的bean,所以这里的class的值是与spring
中的bean的id对应-->
<action name="personAction_*" method="{1}" class="personAction">
</action>
</package>
</struts>
以上是关于Struts2解析的主要内容,如果未能解决你的问题,请参考以下文章