4.3.1 使用OGNL转换成Map集合

请看下面的Action类片段。

程序清单:codes\04\4.3\ognlToObjectMap\WEB-INF\src\org\crazyit\struts2\action\LoginAction.java

public class LoginAction implements Action
{
    // 封装请求参数的Map对象
    private Map<String ,User> users;
    private String tip;
    // users属性的setter和getter方法
    public void setUsers(Map<String ,User> users)
    {
          this.users = users;
    }
    public Map<String ,User> getUsers()
    {
          return this.users;
    }
    // 省略tip的setter和getter方法
    ...
    // 处理用户请求的execute方法
    public String execute() throws Exception
    {
          if (getUsers().get("one").getName().equals("crazyit")
                && getUsers().get("one").getPass().equals("leegang"))
          {
                setTip("登录成功");
                return SUCCESS;
          }
          else
          {
                setTip("登录失败");
                return ERROR;
          }
    }
}

该Action对应的JSP输入页面的表单定义代码如下。

程序清单:codes\04\4.3\ognlToObjectMap\WEB-INF\content\loginForm.jsp

<form action="login.action" method="post">
<table align="center" width="360">
    <caption><h3>直接封装成对象Map</h3></caption>
    <tr>
          <td>第一个用户名:<input type="text"
                name="users['one'].name"/></td>
    </tr>
    <tr>
          <td>第一个密码:<input type="text"
                name="users['one'].pass"/></td>
    </tr>
    <tr>
          <td>第二个用户名:<input type="text"
                name="users['two'].name"/></td>
    </tr>
    <tr>
          <td>第二个密码:<input type="text"
                name="users['two'].pass"/></td>
    </tr>
    <tr align="center">
          <td><input type="submit" value="转换"/>
                <input type="reset" value="重填" /></td>
    </tr>
</table>
</form>

上面的粗体字代码示范了如何利用OGNL表达式来定义表单域的name属性:将表单域的name属性设置为“Action属性名['key值'].属性名”的形式,其中“Action属性名”是Action类里包含的Map类型属性,后一个属性名则是Map对象里复合类型对象的属性名。通过这种方式,Struts 2可以将HTTP请求参数转换成Map属性。

类似地,如果我们需要访问Action的Map类型属性,也可以使用OGNL表达式,如下面代码片段所示。

程序清单:codes\04\4.3\ognlToObjectMap\WEB-INF\content\welcome.jsp

key为one的用户名为:<s:property value="users['one'].name"/><br />
key为one的密码为:<s:property value="users['one'].pass"/><br />
key为two的用户名为:<s:property value="users['two'].name"/><br />
key为two的密码为:<s:property value="users['two'].pass"/><br />