struts2应用总结

 

一、总体的应用思路

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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值