精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-06
最后修改:2011-01-10
package详解
1.1. action A)name action的名称,是外界反问的唯一性标识 B)class action所对应的类 C)method 在一个action中可能有很多个方法,那么我们就可以结合这个属性去访问 一个action中不同的方法体。
如:在LoginAction中有两个方法体,分别是login和checkValid,如何访问呢? <action name="login" class="com.sun.demo.LoginAction" method="login"/> <action name="checkValid" class="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名称,后面是方法名。
以上method和DMI的区别在于前者每个方法可以返回不同的结果,且在每个方法中可以使用不同的拦截器,而后者最终的结果都是一样的,它们使用的拦截器也是一样的,具体使用那种方式进行设置依据开发的实际需要进行选择。
在这里有必要提醒一下: 在设置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="addNote" class="com.sun.NoteAction" method="addNote" /> <action name="updateNote" class="com.sun.NoteAction" method="updateNote"/> <action name="deleteNote" class="com.sun.NoteAction" method="deleteNote"/>
仔细观察就会发现,这些action的名称有些相同的特征,我们可以通过通配符来处理。 <action name="*Note" class="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会不会发生错误呢?【不会】 总结: 当action的name属性中没有任何通配符时,其优先级最高。 只要有通配符,不论是什么通配符,一律按顺序向下执行。 我们一般依照没有通配符,有通配符,没有匹配的顺序进行编写。
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--> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-01-08
LZ的格式能整理下就更好了!这样帖子 看得 好累!
|
|
返回顶楼 | |
发表时间:2011-01-08
Javakeith 写道 LZ的格式能整理下就更好了!这样帖子 看得 好累!
我也有同感,一看帖子被楼主糟蹋成这样,我觉得内容对我来说已经不重要了! |
|
返回顶楼 | |
发表时间:2011-01-10
讲解的很清楚,也说明了一些重要注意的地方。收获挺大不过确实 看起来有点累
|
|
返回顶楼 | |
发表时间:2011-01-10
学习楼主的认真钻研的精神,我们将努力
|
|
返回顶楼 | |
发表时间:2011-01-10
十分感谢各位的建议,以后我一定改正啊
|
|
返回顶楼 | |
浏览 6304 次