OGNL表达式允许开发者无须任何特殊处理,只需要在定义表单域时使用OGNL表达式来定义表单域的name属性。这个时候的表单域的name的属性不是一般的值。例如,定义个User的对象,那么表单域中namer 属性可能是name.name和name.pass形式,这种就是OGNL的表达式。
1.普通例子
1) 定义:LoginAction.java
public class LoginAction extends ActionSupport
{
// 使用User类型的成员变量封装请求参数
private User user;
private String tip;
// user的setter和getter方法
public void setUser(User user)
{
this.user = user;
}
public User getUser()
{
return this.user;
}
public String execute() throws Exception
{
// 通过user的name属性和pass属性来判断控制逻辑
if (getUser().getName().equals("owen")
&& getUser().getPass().equals("owen") )
{
addActionMessage("登录成功");
return SUCCESS;
}
addActionMessage("登录失败!!");
return ERROR;
}
}
2) input.jsp
<body>
<h3>利用OGNL的进行类型转换</h3>
<s:form action="login">
<!-- 该表单域封装的请求参数名为user.name -->
<s:textfield name="user.name" label="用户名"/>
<!-- 该表单域封装的请求参数名为user.pass -->
<s:textfield name="user.pass" label="密码"/>
<tr>
<td colspan="2"><s:submit value="转换" theme="simple"/>
<s:reset value="重填" theme="simple"/></td>
</tr>
</s:form>
</body>
2. MAP的例子
1) LoginAction.java
public class LoginAction extends ActionSupport
{
// Action类里包含一个Map类型的成员变量
// Map的value类型为User类型
private Map<String , User> users;
// users的setter和getter方法
public void setUsers(Map<String , User> users)
{
this.users = users;
}
public Map<String , User> getUsers()
{
return this.users;
}
public String execute() throws Exception
{
// 在控制台输出Struts 2封装产生的Map对象
System.out.println(getUsers());
// 根据Map集合中key为one的User实例来决定控制逻辑
if (getUsers().get("one").getName().equals("owen")
&& getUsers().get("one").getPass().equals("owen") )
{
addActionMessage("登录成功!");
return SUCCESS;
}
addActionMessage("登录失败!!");
return ERROR;
}
}
2) JSP界面
<body>
<h3>直接封装成Map</h3>
<s:form action="login">
<s:textfield name="users['one'].name" label="第one个用户名"/>
<s:textfield name="users['one'].pass" label="第one个密码"/>
<s:textfield name="users['two'].name" label="第two个用户名"/>
<s:textfield name="users['two'].pass" label="第two个密码"/>
<tr>
<td colspan="2"><s:submit value="转换" theme="simple"/>
<s:reset value="重填" theme="simple"/></td>
</tr>
</s:form>
</body>
3. List的例子
1) LoginAction.java
public class LoginAction extends ActionSupport
{
// Action类里包含一个List类型的成员变量
// List集合的元素为User类型
private List<User> users;
// users属性的setter和getter方法
public void setUsers(List<User> users)
{
this.users = users;
}
public List<User> getUsers()
{
return this.users;
}
public String execute() throws Exception
{
// 在控制台输出Struts 2封装产生的List对象
System.out.println(getUsers());
// users属性的第一个User实例来决定控制逻辑
if (getUsers().get(0).getName().equals("owen")
&& getUsers().get(0).getPass().equals("owen") )
{
addActionMessage("登录成功!");
return SUCCESS;
}
addActionMessage("登录失败!!");
return ERROR;
}
}
2) JSP界面
<body>
<h3>直接封装成List</h3>
<s:form action="login">
<s:textfield name="users[0].name" label="第一个用户名"/>
<s:textfield name="users[0].pass" label="第一个密码"/>
<s:textfield name="users[1].name" label="第二个用户名"/>
<s:textfield name="users[1].pass" label="第二个密码"/>
<tr>
<td colspan="2"><s:submit value="转换" theme="simple"/>
<s:reset value="重填" theme="simple"/></td>
</tr>
</s:form>
</body>
3) 获取方法
<body>
<s:actionmessage/>
第一个User实例的用户名为:<s:property value="users[0].name"/><br/>
第一个User实例的密码为:<s:property value="users[0].pass"/><br/>
第二个User实例的用户名为:<s:property value="users[1].name"/><br/>
第二个User实例的密码为:<s:property value="users[1].pass"/><br/>
</body>