struts2学习笔记【七】/ struts.xml--package

package详解

 

1.1. action

A)name action的名称,是外界反问的唯一性标识

B)class action所对应的类

C)method 在一个action中可能有很多个方法,那么我们就可以结合这个属性去访问 一个action中不同的方法体。

 

     如:在LoginAction中有两个方法体,分别是logincheckValid,如何访问呢?

        <action name="login" class="com.sun.demo.LoginAction" method="login"/>

        <action name="checkValidclass="com.sun.demo.LoginAction" method="checkValid"/>

 

     你会发现这两个action的配置加载了同一个类com.sun.demo.LoginAction不同的是属性name和属性method的区别,在访问的时候,根据name去访问到对应的类文件,然后再根据对应的method去访问相应的方法体。

 

DMI【动态调用action的不同方法】:

我们不再根据method属性来访问不同的方法了,而是在前台View页面进行设置:

<action name="login" class="com.sun.demo.LoginAction"/>

VIEW:

<a href="/login!login.action">登录</a>

<a href="/login!checkValid.action">验证</a>

用感叹号【!】来做标识,依次向下执行,前面为action名称,后面是方法名。

 

以上methodDMI的区别在于前者每个方法可以返回不同的结果,且在每个方法中可以使用不同的拦截器,而后者最终的结果都是一样的,它们使用的拦截器也是一样的,具体使用那种方式进行设置依据开发的实际需要进行选择。

 

在这里有必要提醒一下:

在设置action属性method时,其多对用的Action类中的方法名可以为“do方法名”,如:

<action 

name="login" class="com.sun.demo.LoginAction" method="login"/>

com.sun.demo.LoginAction类中对应的方法可以写成这样doLogin

 

通配符映射:

* 代表0-N个字符,但是不包括"/"

** 代表0-N个字符,包括"/"

\  转义字符

 

在一个包中可能存在多个action,如:

<action name="addNoteclass="com.sun.NoteAction" method="addNote" />

<action name="updateNoteclass="com.sun.NoteAction" method="updateNote"/>

<action name="deleteNoteclass="com.sun.NoteAction" method="deleteNote"/>

 

仔细观察就会发现,这些action的名称有些相同的特征,我们可以通过通配符来处理。

<action name="*Noteclass="com.sun.NoteAction" method="{1}Note"/>

当我们访问addNote时,add字段就会填补*通配符,同时依据占位符的顺序去查询对应的方法。

 

对于以上这种action名称的设定,我们一般是在指明对与什么表进行操作的情况下,但是当有多个表时,我们的操作就显得有点麻烦了,现在我们又有了新的设定,如下:

<action name="*_*class="com.sun.{1}Action" method="{2}Note"/>

也就是设定多个通配符,同时采用占位符遍历的方式去访问各个action中的方法。{0}表示**的整体信息

注意:在用占位符去匹配某个Action的时候,得注意首字母的大小写

 

通配符的变种:

默认action 

<action name="*"> ....</action>

<action name="main">....</action>

*号可以匹配任何的字符串,所以以上的两个默认的Action会不会发生错误呢?【不会】

总结:

actionname属性中没有任何通配符时,其优先级最高。

只要有通配符,不论是什么通配符,一律按顺序向下执行。

我们一般依照没有通配符,有通配符,没有匹配的顺序进行编写。

 

 

D)Converter

 

1.2. default-action-ref

<default-action-ref name="login" />

"Login"是一个action的引用,在访问action的时候,如果action不存在,那么就会访问默认的action。但是这个必须放在所有action的最前面,另外值得关注的是,这样的默认处理只是对于action的访问就行了设置,对于访问不存在的页面是无法进行处理的,这就需要在web.xml 中就行设置了。

 

<error-page>

   <error-code>404</error-code>

   <location>/error.jsp</location>

</error-page>

 

不过这样的设置有时候会出问题,不是总是正确的,这个得参考一下浏览器的高级设置

 

1.3. default-class-ref

当访问不到指定的action类时,就会调用这个默认的action类进行处理。

 

1.4. default-interceptor-ref

当访问不到指定的interceptor类时,就会调用这个默认的interceptor进行处理。

 

1.5. global-exception-mappings

设置全局异常转向,可以被直接访问。

 

1.6. global-results

设置全局处理结果转向,可以在action类中进行直接的转向。

 

1.7. Interceptors拦截器

struts2中,许多人都action都有一个共同需要关心的问题,比如对页面的输入进行验证,对上传的文件进行预处理,防止重复提交,在页面显示前进行下拉列表的初始化,“拦截器”使得其变得相应容易些。

 

拦截器在action被调用前后都会被调用去执行一些code,struts2框架的大部分功能均是通过拦截器来实现的,如防止重复提交,类型转换,对象封装,校验,文件上传,页面预装载等,每个拦截器都是独立装载的,我们可以根据需要为每一个action配置其所需要的拦截器,例如:一个action需要来进行类型转换和文件上传,那么我们就可以为其设置两个拦截器。

测试一下:

找到xwork.jar包下的com.opensymphony.xwork2.interceptor包下的TimerInterceptor.class.

怎么配置拦截器:

在某个包下编写如下代码:

<interceptors>

    <interceptor name="timer"  class="com.opensymphony.xwork2.interceptor.TimerInterceptor "/>

</interceptors>

 

在该包下的任何一个action中,若想要使用该拦截器,那么只要在action中添加如下代码

<interceptor-ref name="timer"></interceptor-ref>

 

然后再去运行项目文件,我们发现报错了,为什么呢????

在这里要特别的提醒一下:

我们之前的项目中,package继承了struts-default,这其中实现了各种拦截器,是系统默认创建的,在我们自己不去手动配置拦截器时,系统会默认的调用struts-default中的拦截器,而当我们自己手动配置了拦截器后,系统就不再去调用默认的那些配置了,在上面的例子中,我们的拦截器是配置在一个页面提交的action中的,所以还需要一个参数拦截器,可是我们没有配置所以报错了,而在自己不手动配置拦截器的情况下,在struts-default中这些必须的拦截器配置都是有的,懂了吧。但是我们在配置的时候倒是不妨多参考一下其中的各种信息。

 再配置一个拦截器:

<interceptor name="params"  class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

 

在需要传递参数的action中引用该拦截器:

<interceptor-ref name="params"></interceptor-ref>

 

当然了,我们也可以在action中引用默认的拦截器:

<interceptor-ref name="defaultStack"></interceptor-ref>

 

别的包,子包也可以继承父包,那么在父包中定义的拦截器在子包中也可以使用。

 

当某些action共同使用多个相同的拦截器时,可以将这些重复使用的拦截器放在一个拦截器栈中:

<interceptors>

   <interceptor-stack name="自定义名称">

      <interceptor-ref name="name1"></interceptor-ref>

      <interceptor-ref name="name2"></interceptor-ref>

...........

   </interceptor-stack>

</interceptors>

 

1.8. result-types

<!--EndFragment-->

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值