<!-- 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了,这个比当年的使命六还猛呀~但是战地三早在几天前就偷跑了~呵呵~也许吧~ 也许真的是在自己打自己的耳光! -->