一、总体的应用思路
1、在web.xml中配置struts2的servlet,将对此应用的请求拦截下来,转发给FilterDispatcher。
2、在struts.xml中通过constant配置struts2的设置(如指定用spring根据对象set方法给对象进行依赖注
入等)
3、在struts.xml中配置总的package;
配置需要的interceptor,设置默认的interceptor;
配置global results。
配置子package中都会用到的action,如异常action。
配置global exceptions(指定当发生某种异常时result的去向)
include子struts配置文件。
4、在子struts-**.xml中配置各自的具体package(继承自总包)及其中的action。
多个子struts-**.xml中的action的名字可以是一样的。
如都有save这个action,但是可以通过命名空间来知道调用的是哪个action。
在action指定调用哪个类的哪个方法。多个action可以公用一个类,只要指定不同的方法即可。
5、在jsp中通过form的action属性和namespace属性告诉struts我们具体调用的是
哪个命名空间下的哪个action。
6、action中需要与前台jsp交互的数据。只要在action类中定义相应的属性(和前台的标签name一致)
即可。后台向前台传数据时,前台会自动通过get***得到数据。前台向后台传数据时,struts会自动
调用set**方法设置数据给后台的action类。
二、最近项目中的struts2具体应用总结
1、web.xml中配置见以前的总结文章(就是配置一个struts2的servlet(指定了struts的配置文件位置),
和一些字符转换和中文乱码的配置)。在本次应用中,在struts2的前面我们还配置了一个filter,
将我们需要的东西(如请求路径)按照我们需要的格式setAttribute到request中去。
2、struts.xml
<struts>
//配置struts2的一些参数(也可以通过struts.properities配置)
//指定struts2中的使用spring提供的对象工厂创建(这样创建的对象其属性就自动注入了)
<constant name="struts.objectFactory" value="spring"/>
//指定根据名字自动匹配spring中的bean,如在某个action类或者interceptor类中定义了一个对象及其
set/get方法,这样我们就会根据spring配置文件中和这个set***匹配的名字的bean来setter注入他
<constant name="struts.objectFactory.spring.autoWire" value="name"/>
//国际化编码方式
<constant name="struts.i18n.encoding" value="UTF-8"/>
//国际化支持的资源文件(所谓国际化就是说我们按照命名规则,给面向各个国家的资源文件分别定
义,然后通过<s:text name="**.**"/>的方式,struts会自动根据操作系统的国际化类型选择那个资
源文件来加载。)
<constant name="struts.custom.i18n.resources" value="i18n.Message,i18n.errors"/>
<constant name="struts.devMode" value="true"/>
<constant name="struts.mapper.class"
value="org.apache.struts2.dispatcher.mapper.DefaultActionMapper"/>
//action默认的扩展名。也就是说我们调用的action会在后面自动加上.do
<constant name="struts.action.extension" value="do"/>
<constant name="struts.enable.SlashesInActionNames" value="false"/>
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="true"/>
<constant name="struts.configuration.xml.reload" value="true"/>
//定义一个总包,继承自struts-default
<package name="webtools" extends="struts-default">
//装配几个我们用到的拦截器/拦截器栈
<interceptors>
//定义一个判断是否登陆的拦截器,在每个操作之前都要判断是否登陆
<interceptor name="LoginCheck"
class="com.watchdata.mepay.web.interceptor.LoginCheckInterceptor">
</interceptor>
//定义一个权限拦截器,在每个操作之前都要判断是否有此权限(取出此用户的权限列表比较)
<interceptor name="PermissionCheck"
class="com.watchdata.mepay.web.interceptor.PermissionCheckInterceptor"/>
<interceptor-stack name="LoginCheckStack">
<interceptor-ref name="LoginCheck"/>
//加入默认拦截器,因为struts的很多功能都是通过这些拦截器实现的。
<interceptor-ref name="defaultStack"/> //也可以是拦截器栈
</interceptor-stack>
<interceptor-stack name="LoginAndPermissionCheckStack">
<interceptor-ref name="LoginCheckStack"/>
<interceptor-ref name="PermissionCheck"/>
</interceptor-stack>
</interceptors>
//设置本应用默认使用的拦截器(栈)
<default-interceptor-ref name="LoginAndPermissionCheckStack"/>
//设置全局结构,相当于全局变量呗。全局都承认的结果转向
<global-results>
<result name="Exception" type="chain">exceptionAction</result>
<result name="login" >/login.jsp</result>
<result name="nopermission">/main/permissionDeny.jsp</result>
</global-results>
//全局异常:当发生某个异常时对应那个结果。如:发生WebRuntimeException异常--->
到Exception结果,而Exception是个全局结果--->chain类型的exceptionAction--->
转到下面定义的exceptionAction--->最后转到了/exception/exception.jsp
<global-exception-mappings>
<exception-mapping exception="WebRuntimeException" result="Exception"/>
<exception-mapping exception="Exception" result="Exception"/>
</global-exception-mappings>
<action name="exceptionAction" class="com.watchdata.mepay.web.action.ExceptionAction">
<result>/exception/exception.jsp</result>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
//通过include找到子struts配置
<include file="struts/struts-admin.xml"></include>
<include file="struts/struts-group.xml"></include>
<include file="struts/struts-role.xml"/>
<include file="struts/struts-permission.xml"></include>
。。。。。。。。。。。。。。。。。。。
</struts>
3、struts.xml include的子配置
<struts>
//配置子包,继承自前面定义的webtools,定义命名空间/group。定义此命名空间下的action。
不同的包/子配置中可能存在相同名字的action,如都有save,delete等,但是根据他们的命名空间
不同来区分是group的delete还是admin的delete。
而在jsp中调用action时也要指明调用那个命名空间下的action
如:<s:form action="save" namespace="/group" 。。。。。。。>
<package name="group" namespace="/group" extends="webtools">
//多个action可以调用的是一个类,通过method的指定来确定调用类中的哪个方法
//由于指定了使用spring的工厂,所以在创建com.watchdata.mepay.web.action.GroupAction时
会将其中的set**,自动注入
<action name="add"
class="com.watchdata.mepay.web.action.GroupAction" method="add">
<result name="input">/Group/addGroup.jsp</result>
</action>
<action name="save"
class="com.watchdata.mepay.web.action.GroupAction" method="save">
<result name="input">/Group/addGroup.jsp</result>
//chain类型,表明继续调用名字为list的action
<result name="list" type="chain">list</result>
</action>
<action name="edit"
class="com.watchdata.mepay.web.action.GroupAction" method="edit">
<result name="input">/Group/editGroup.jsp</result>
<result name="list" type="chain">list</result>
</action>
</package>
</struts>
4、struts2的表现层(标签):
4.1、判断标签:
//test=""中是一个条件语句,可以带有action中定义的函数如:getFieldErrors(),此例是通过判断是否
//发生错误来决定错误显示表格是否显示style="display:none"
<table id="errTable" width="99%" border="0" cellpadding="0" cellspacing="0" class="Middle"
<s:if test="getFieldErrors()==null||getFieldErrors().size()==0">
style="display:none"
</s:if>
>
4.2、文本显示标签
<s:text name="msgs.group.add" />
//显示标签:显示资源文件中指定的名字为msgs.group.add的字符串
4.3、文本框标签
<s:textfield name="group.groupName" size="45" />
//name表示此标签对应于action中的那个属性。这里指的是对应action中group(复杂类型)对象的groupName属性,后台到前台和前台到后台时,都会自动的注入此值
4.4、多选框列表标签
<s:checkboxlist list="roleList" name="roleId" listKey="roleId" listValue="roleName" />
//list:指定了此多选框列表中显示的多选框项(和选不选中无关),在前台直接定义,后者在后台给一个list类型的值。
//name:对应后台选中值数组。选中的值存入到这个数组中。所以其类型应该和listKey中的类型一致。
//listKey:指定选中项传那个值(roleList中bean的一个属性)
//listValue:指定多选框的显示(roleList中bean的一个属性)
对应的action如:
public class GroupAction extends BaseAction
{
private List<Role> roleList;//Role中有roleId、roleName
private Long[] roleId;
......................
}
4.5、set标签:把一个值赋给一个变量
<s:set name="stateList"
value="#{1:getText('msgs.group.active'),0:getText('msgs.group.suspend')}"></s:set>
4.6、select标签
<s:select name="group.state" list="stateList"></s:select>
list:列表中显示的项
name:选中项对应action中的属性
4.6、submit标签
<s:submit value="%{getText('msgs.btn.submit')}" cssClass="button"></s:submit>