Struts2简单搭建学习
本节的目标
1.struts.xml中action的配置
2.几种配置action的方式
struts.xml中action的配置
1.action是package下的一个子节点,我们通过配置action来让struts2知道,用户的请求是哪个action,struts2应该用那个action来应对。
2.action节点下面还有一个子节点是result,result的定义是让逻辑视图与物理视图做对应,不同的逻辑视图都会在result中做映射,然后做不同的页面跳转。
3.action的name也是访问时用到的name,这时候用户可以随意定义,但是,不建议使用“-”,“.”作为连接使用过,如“pkk.user”,"pkk-user",这样有可能会引发一些未知异常信息。我们可以使用“/”来定义,但是使用之前需要启用struts.enable.SlashesInActionNames为true,这时候方可使用。
4.action节点有参数name还有class,但是我们如果不指定action的话,可以走默认的action类ActionSupport来进行处理,当然我们可以通过指定默认的action处理类。因为在平常,我们配置的package,不是直接的继承struts-default,就是间接的继承,都是走ActionSupport处理类。
例子如下:
<!--允许action使用“/”作为名称-->
<constant name="struts.enable.SlashesInActionNames" value="true"/>
<!--访问地址:http://localhost:8081/namespace/testAction!testSuccess.action-->
<package name="backTest" namespace="/namespace" extends="web-default">
<action name="testAction" class="com.pkk.action.TestAction">
<result name="success">index.jsp</result>
<result name="input">/pages/sys/SysVerifyError.jsp</result>
</action>
<!--如果 不设置action就会走默认的action类来进行处理-->
<default-class-ref class="com.pkk.action.BaseAction"/>
</package>
几种配置action的方式
1.动态方法调用
DMI(Dynamic Method Invocation)动态方法调用,就是一个action并不是等同于一个action,简单来说,他是通过
actionName+"!"+MethodName(方法名称).action方式调用
如:action="http://localhost:8081/namespace/ActionName!MethodName.action"
通过这种方式简化了不同的业务处理对应一个action的创建的麻烦,使用动态方法调用,可以做到一个类只配置一个action,或多个类只配置一个action(前提是多类中不包含相同的方法名称),通过actionName+!+MethodName方式调用,启用此方式,需要添加:
<!--方法动态调用-->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
2.为action指定method来实现调用
配置action时也可以指定一个method,method为一个类中的方法,指定后可以进行根据action的name和方法的方法限定一个请求。这时候struts会调用相应的方法,而不是走默认的execute方法来处理请求。
<!--http://localhost:8081/namespace/testAction!testSuccess.action-->
<package name="backTest" namespace="/namespace" extends="web-default">
<action name="testAction" class="com.pkk.action.TestAction" method="userLogin">
<result name="success">index.jsp</result>
<result name="input">/pages/sys/SysVerifyError.jsp</result>
</action>
</package>
3.使用通配符方式
在配置<action/>时,需要指定name,class,method属性,其中name属性支持[通配符],然后可以在class,method属性中使用[表达式],这种使用通配符的方式其实就是另一种的动态方法调用方式,当我们通配一个acttion中的name属性时,相当于一个<action/>元素定义了多个逻辑action。
可以使用表达式的属性有:name,class,result的值,
举例说明:
<package name="back1Test" namespace="/" extends="web-default">
<!--可以接收到请求为 【任意字符_任意字符】的请求,但是必须存在com.pkk.action.第一个“*”Action中的第二个*的方法-->
<action name="*_*" class="com.pkk.action.{1}Action" method="{2}">
<result name="success">index.jsp</result>
<result name="input">/pages/sys/SysVerifyError.jsp</result>
</action>
<!--可以接收到请求为 【任意字符Action】的请求,但是必须存在com.pkk.action.TestAction中的第一个*的方法-->
<action name="*Action" class="com.pkk.action.TestAction" method="{1}">
<result name="success">index.jsp</result>
<result name="input">/pages/sys/SysVerifyError.jsp</result>
</action>
<!--可以接收到请求为 【任意字符_任意字符_任意字符】的请求,但是必须存在com.pkk.action.第一个“*”Action中的第二个*的方法,并且返回值为input,所映射的页面在/pages/sys/第三个星.jsp-->
<action name="*_*_*" class="com.pkk.action.{1}Action" method="{2}">
<result name="success">index.jsp</result>
<result name="input">/pages/sys/{3}.jsp</result>
</action>
<!--可以接收到请求为 【任意请求】的请求,但是必须存在com.pkk.action.TestAction中的第一个*的方法-->
<action name="*" class="com.pkk.action.TestAction" method="{1}">
<result name="success">index.jsp</result>
<result name="input">/pages/sys/SysVerifyError.jsp</result>
</action>
</package>
["注意事项"]:
注意:在上面的定义的通用的action中,注意第四个<action name="*"...>的这个,建议放到所有的action的最后,因为,在struts中,struts在解析请求的映射时,会从上往下进行寻找,例如配置的action中有,*Action和*,两种方式,这时候,我们去请求时,http://localhost:8080/Struts/testAction.do时,会和*Action进行匹配,也会和*进行匹配,当我们把*放到最上面,会首先在name为*的中进行匹配,匹配不到才会从*Action匹配。
4.配置默认的action
当我们请求的方法在struts容器中找不到时,这时候我们可以配置一个默认的action:
<package name="web-default" namespace="/" extends="struts-default,json-default">
<!--配置默认走的action-->
<default-action-ref name="defaultAction"></default-action-ref>
<action name="defaultAction" class="com.pkk.action.BaseAction">
<result>/pages/sys/SysVerifyError.jsp</result>
</action>
</package>