Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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所示的页面。