3.6.9 请求参数决定结果
配置<result ... />元素时,不仅可以使用${1}表达式形式来指定视图资源,还可以使用${属性名}方式来指定视图资源。在后面这种配置方式下,${属性名}里的属性名就是对应 Action实例里的属性。而且,不仅允许使用这种简单的表达式形式,还可以使用完全的 OGNL 表达式,即使用如下形式:${属性名.属性名.属性名...}。
看如下的配置片段。
<package name="skill" extends="default" namespace="/skill"> ... <!-- 配置了一个名为save的Action,该Action的处理类为lee.SkillAction 处理方法为save --> <action name="save" class="lee.SkillAction" method="save"> <result name="input">/editSkill.jsp</result> <!-- 使用OGNL表达式来指定结果资源 --> <result type="redirect">edit.action?skill=${curSkill.name}</result> </action> <!-- 配置了一个名为delete的Action,该Action的处理类为lee.SkillAction 处理方法为delete --> <action name="delete" class="lee.SkillAction" method="delete"> <result name="error">/editSkill.jsp</result> <!-- 使用OGNL表达式来指定结果资源 --> <result type="redirect">edit.action?skill=${curSkill.name}</result> </action> ... </package>
在上面的配置片段中,使用了${curSkill.name}表达式来指定结果视图资源,对于上面的表达式语法,要求在对应的Action实例里应该包含curSkill属性,且curSkil属性必须包含name属性——否则,${curSkill.name}表达式的值将为null。
提示:
可以通过在Action的name属性中使用通配符,从而将上面的两个Action配置成一个Action。
下面示范一个简单的应用,这个应用可以让用户在文本框内输入请求的资源,系统将自动跳转到对应的资源。该应用的输入页面如图3.25所示。
图3.25 转向的输入页面
处理该请求的 Action 非常简单,它仅仅提供了一个属性来封装请求参数,并提供了一个参数来封装处理后的提示。下面是该Action类的代码。
程序清单:codes\03\3.6\parameterResult\WEB-INF\src\org\crazyit\struts2\action\MyAction.java
// 处理用户请求的Action类 public class MyAction implements Action { // 封装请求参数的target属性 private String target; // 封装处理结果提示的tip属性 private String tip; // target属性对应的getter和setter方法 public String getTarget() { return target; } public void setTarget(String target) { this.target = target; } // tip属性对应的getter和setter方法 public String getTip() { return tip; } public void setTip(String tip) { this.tip = tip; } //处理用户请求的execute方法 public String execute() throws Exception { setTip("恭喜您,您已经成功转向"); return SUCCESS; } }
上面的 execute 方法总是返回一个 SUCCESS 常量,即总是返回 success 字符串。然后在struts.xml文件中配置该Action,配置文件如下。
程序清单:codes\03\3.6\parameterResult\WEB-INF\src\struts.xml
<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.i18n.encoding" value="GBK"/>
<!-- Struts 2的Action必须放在指定的包空间下定义 -->
<package name="crazyit" extends="struts-default">
<!-- 配置处理用户请求的Action -->
<action name="myAction" class="org.crazyit.struts2.action.MyAction">
<!-- 配置Result,使用表达式来指定该结果的资源 -->
<result>/WEB-INF/content/${target}.jsp</result>
</action>
<action name="*">
<result>/WEB-INF/content/{1}.jsp</result>
</action>
</package>
</struts>
上面在配置<result.../>的实际资源时,使用了/WEB-INF/content/${target}.jsp表达式来指定实际的资源——这要求在对应的Action类里应该包含target属性——该属性值将作为转入的实际资源。
浏览者在图3.25所示页面的输入框中输入welcome字符串,单击“转入”按钮,系统将跳转到/welcome.jsp页面,即看到如图3.26所示的页面。
图3.26 由属性决定视图页面
也可以在图3.25所示的页面中输入任意字符串,然后执行跳转。例如输入abc字符串,系统将转入/WEB-INF/content/abc.jsp 页面。系统没有提供 abc.jsp 视图资源,因此将看到如图3.27所示的页面。
图3.27 找不到视图资源的页面
正如图3.27所示页面中椭圆形框标示的地方,我们看到系统已经转入了abc.jsp资源,但因为该资源不存在,所以看到如图3.27所示的页面。