您的位置:首页 > 编程语言 > Java开发

Struts2 Chapter2 struts.xml文件的配置

2011-10-25 20:38 267 查看
<!--
Struts2 Chapter2 struts.xml文件的各种配置方法
Goal:如何按照自己的意愿对struts文件的配置已达到自己的目的!也就是说,
让我们自己可以写最少的代码达到调用任意类的写法,并且可以根据自己的意愿,
跳至自己规定的路径,也可以规定跳转方式,以及全局变量等等...!
-->
注意,今天讲的这些东西都是struts.xml文件中的配置,在这之前呢需要理解一下struts2的运行原理:

Struts2运行原理:
请求  --- >自定义过滤器----> filterdispatcher ------> ActionProxy(代理,读取struts.xml的配置文件)---->ActionInvocation(action的调用者,调用具体的Action;在调用之前经过一系列的拦截器)——>执行完Action之后,跳转到对应的页面。

然后,回忆一下struts.xml文件的基本写法:
<struts>
//extends表示继承,namespace表示命名空间(reminds me C#),"/"表示WebRoot根目录
<package name="myPackage(这个名字无所谓,可以自己写)" extends="struts-default" namespace="/">
<action name="DoingMyAction(这个名字要是那边提交的目的地)" class="com.shu.action.DoIt(类名)" method="makeIt(方法名,注,来自于前面的那个类名)">
<result name="执行方法后返回的结果">需要跳转的路径</result>
</action>
</package>
</struts>

一,动态调用方法
我们从Struts2最基本的写法看出来了,如果我们每次调用不同的方法,就要写个action以及里面的内容,这,不是
我们学框架目标吧,所以要达到简化的目的就要使用方法的动态调用!调用方法有两种方式,主要是action中内容不同!
a)第一个动态调用方法的写法:
<action name="动作的名称" class="具体的类名">
<result name="xx">xx</result>
</action>
注意:在action唯一变化的就是不写method,但是在提交的地方就要这样写:动作的名称!方法名.action(这个action过滤后缀按按情况而定)
这样写下来后,当提交被过滤时就会自动调用action,并调用感叹号后的方法名!
eg:
//页面中
<a href="myAction!doSomething.action">click here</a>
//struts.xml中
<action name="myAction" class="com.shu.action.DoIt"></action>
//这样写后,当点击click时就会被过滤,并且会执行com.shu.action.DoIt中的doSomething()方法

b)采用名字模糊匹配动态调用方法:
<action name="*Action" class="类名" method="{1}"></action>
讲解:name中的*号表示进行模糊匹配,只要是以Action结尾的动作名称都会调用action
class还是不变,method变成了{1},这个{1}(从1开始的)表示前面*号中的内容,也就是*代表了需要调用的方法名!
eg:
//页面中:
<a href="doSomethingAction.action">click me</a>
//action中
<action name="*Action" class="com.shu.action.DoIt" method=""{1}></action>
//这样写当点击click me时就会进入action并且调用方法名为doSomething的方法
//还可以把*,方法名,跳转路径合为一体!
<action name="*Action" class="com.shu.action.DoIt" method=""{1}>
<result name="success">{1}.jsp</result>
</action>

二,对返回结果的处理配置方法
a)得到结果后的跳转问题:
我们都知道,页面跳转有两种方式:内部跳转和外部跳转!
内部:requestScope,地址栏不会变为跳转后的地址
外部:不能使用requestScope,并且地址栏会变为跳转后的地址!
其实在result中,还有一个type可以写,这个不写就会有缺省值:内部跳转,
eg:<result name="success">index.jsp</result>
当要使用外部跳转时,需要加上type
eg:<result name="success" type="redirect">index.jsp</result>
redirect:呵呵~javaWeb中的请求重定向!

b)当你跳转的目标也是action时,如果想上面那样在result中写就不太科学了,
这个应该这样写:
<result name="方法返回值" type="redirectAction">
<param name="actionName">需要跳转到的action目标</param>
<param name="namespace">命名空间的目录</param>
</result>

c)接下来这个有点好玩(注意大小写),有点类似于JQuery中的html(),JS中的innerHTML;
<result name="方法返回值" type="plainText">
<param name="location">index.jsp</param>
<param name="charSet">utf-8</param>
</result>
这个方法就会在index.jsp显示index.jsp的网页源码,这个目前还不大清楚有虾米用!

四,全局结果的配置:
我们都知道,有时候有些不同类中的不同的方法返回的值可能是相同的,比如录入信息,有的都会
返回success或者是failed,但是如果我们在result反复写就会导致代码重复,所以,我们要用到全局结果
<global-results>
<result name="返回值">跳至的页面</result>
<result name="返回值">跳至的页面</result>
</global-results>
eg:
<global-results>
<result name="success">success.jsp</result>
<result name="failed">failed.jsp</result>
</global-results>

注:这里不能忘记一点了,就是<global-results></global-results>要写在<action>标签的外面,并且只能是在action前面!

除了全局结果外,这里还有全局异常信息的捕获!
<global-exception-mappings>
<exception-mapping result="返回的结果" exception="异常的类型"></exception-mapping>
</global-exception-mappings>
eg:
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.exception"></exception-mapping>
</global-exception-mappings>

注:如果想在页面中打印异常信息:
1)导入异常标签库:<%@ taglib uri="/struts-tags" prefix="s" %>
2)打印异常的信息:<s:property value="exceptionStack"/>

五,全局变量
这个我就不多说了,你懂得~
<constant name="" value=""></constant>
<!-- 常量:系统默认配置的量(名字不可改) -->
<!-- 常用的常量:struts.custome.i18n.resources(国际化常量) -->
<!-- 常用的常量:struts.i18n.encoding(编码方式常量,系统默认采用utf-8编码) -->

六,遗留的问题!
这个问题从我一开始接触struts开始,包括前面自己写的那个MiniStruts框架,都存在这个问题!!
就是:如果要调用该类的方法,但是该方法又要用到很多字段,这些字段完全可以封装在另一个类中,
但是问题来了~如果字段封装在另一个类中,而方法有封装在另一个类中,那么,当你在action写class
的时候就只能估计一个类了:装字段的类或是装方法的类!写了method就找不到属性字段,这个问题,
相信以后会解决的!呵呵~

<!--
Author:Lovingshu's Forever
Date:2011-10-25 20:36
Remark:今天是战地3发售的日子,但是今天就已经有了战地3的免安装中文版了,也就是说:今天发售,
今天就汉化+PJ了,这个比当年的使命六还猛呀~但是战地三早在几天前就偷跑了~呵呵~也许吧~
也许真的是在自己打自己的耳光!
-->
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: