我们都知道,在发出的Http请求信息中,所有的请求参数都是字符串类型的。但是我们在后台处理这些数据时,可能需要将某些参数转化成相应的数据类型后才进行业务逻辑的处理。
在Struts2框架中,提供了内建的类型转换器。这些转换基本能够满足我们日常开发需要。
字符串参数转换成目标数据类型 |
Boolean和boolean:完成字符串和布尔值之间的转换 |
Character和char:完成字符串和字符值之间的转换 |
Integer 和 int:完成字符串和整形值之间的转换 |
Long 和 long:完成字符串和长整型值之间的转换 |
Float 和 float:完成字符串和单精度浮点型值之间的转换 |
Double 和 double:完成字符串和双精度浮点型值之间的转换 |
Date:完成字符串和日期型值之间的转换 |
对象:完成字符串和POJO类型的值之间的转换,基于ONGL表达式实现默认转换。 |
数组:默认情况下只能转换成字符串数组。如果需要转换成对象数组,则需要实现自定义的转换器。 |
集合:默认情况下是转换成字符串的集合。如果使用ONGL表达式,可转换成对象集合。 |
对一些数据基本类型的转换我们很好理解。下面我们就举例来看看如何使用ONGL表达式完成对象、数组、集合的转换。
字符串与对象之间的转换
我们在页面使用ONGL表达式${属性名.属性名…}的形式来表达:
1:此请求参数在Action中将要转换的对象属性。
2:在Action处理完毕后的响应页面中获取Action的属性值。
如:
<form action="login.action"> <label>用户名:</label><input type="text" name="user.userName" /><br> <label>密码:</label><input type="text" name="user.password" /><br> <input type=submit value="登录" /> </form> |
此代码片断中user.userName与user.password分别对应着Action对象user中的usrName和password属性。
public class LoginAction { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public class User { private String userName; private String password;
public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String execute() throws Exception { System.out.println(user.userName); //输出页面上输入的用户名的值 } } |
在点击”登录”按钮后,请求发送到服务器。Struts2框架会将请求参数中的user.userName与user.password请求参数转化成user对象对应的属性。这就完成了字符串到对象类型之间的转换。
字符串与字符串数组之间的转换
我们在页面使用ONGL表达式${属性名}的形式来表达此请求参数在Action中将要转换的对象属性。如:
<form action="login.action"> <label>用户名:</label><input type="text" name="userNames" /><br> <label>用户名:</label><input type="text" name="userNames" /><br> <input type=submit value="登录" /> </form> |
此代码片断中user.userName与user.password分别对应着Action对象userNames中的usrName和password属性。
public class LoginAction { private String[] userNames; public String[] getUserNames() { return userNames; } public void setUserNames(String[] userNames) { this.userNames = userNames; } public String execute() throws Exception { System.out.println(this.getUserNames()[0]); return "success"; } } |
我们在页面使用ONGL表达式${属性名[序号].属性名…}的形式来表达在Action处理完毕后的响应页面中获取Action的属性值。如:
<h1><s:property value="userNames[0]"/>您好!欢迎来到冒险世界。</h1> |
注意:如果只是用ONGL表达式${属性名}的形式来输出信息,则输出的是整个字符串数组中的元素信息,每个元素之间使用“,”隔开。
字符串与集合之间的转换
字符串与List<T>类型之间的转换
我们在页面使用ONGL表达式${属性名[序号].属性名…}的形式来表达:
1:此请求参数在Action中将要转换的对象属性。
2:在Action处理完毕后的响应页面中获取Action的属性值。
如:
<form action="login.action"> <label>用户名:</label><input type="text" name="users[0].userName" /><br> <label>密码:</label><input type="text" name="user[0].password" /><br> <input type=submit value="登录" /> </form> |
此代码片断中user.userName与user.password分别对应着Action对象userNames中的usrName和password属性。
public class LoginAction { private List<User> users; public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; } public String execute() throws Exception { User user = users.get(0); System.out.println(user.userName); //输出页面上输入的用户名的值 } } |
字符串与List类型之间的转换
在不知道List集合中元素类型的情况下,Struts2也将不知道将页面的请求参数转换成何种对象类型放入List集合中的。为了解决这样的问题,Struts2使用一个类型转换器注册文件(.properties文件)来指定集合中的元素类型。在此文件中增加以下信息:
Element_集合类型的属性名=集合类型中元素类型的全限定名。
如:Element_Users=org.struts2.samples.User
这样Struts2在转换时,就可以像字符串与List<T>类型之间的转换一样来转换请求参数了。
字符串与Map<String,T>类型之间的转换
我们在页面使用ONGL表达式${属性名[“key”].属性名…}的形式来表达:
1:此请求参数在Action中将要转换的对象属性。
2:在Action处理完毕后的响应页面中获取Action的属性值。
如:
<form action="login.action"> <label>用户名:</label><input type="text" name="users[‘one’].userName"/><br> <label>密码:</label><input type="text" name="user[‘one’].password" /><br> <input type=submit value="登录" /> </form> |
此代码片断中user.userName与user.password分别对应着Action对象userNames中的usrName和password属性。
public class LoginAction { private Map<String,User> users; public Map<String, User> getUsers() { return users; } public void setUsers(Map<String, User> users) { this.users = users; } public String execute() throws Exception { User user =users.get("one"); System.out.println(user.userName); //输出页面上输入的用户名的值 } } |
字符串与Map类型之间的转换
这种处理方式和处理List类型的集合一样,只需要在转换器的注册文件中指定Map中Value值的类型即可。我们一般都是使用String类型作为key的类型,如果我们需要使用别的类型作为Map中的Key则可以在文件中指定key的类型。如:
Key_users=java.Lang.Long//key对应的类型
Element_users=org.struts2.samples.User//value对应的类型
字符串与Set<T>或Set类型之间的转换
为了更好的支持Set类型,Struts2允许为Set集合类型中的元素指定索引属性。
我们只需要在转换器的注册文件中指定集合元素的索引属性。
索引属性是Set集合中元素对应的某个属性名。
当然如果Action的属性类型是Set类型的话,不要忘记了指定Element_属性名的值。下面我们就以Set类型的属性转换为例:
Element_users=org.struts2.samples.User
KeyProperty_users=username
在指定了索引属性后,我们可以在页面使用ONGL表达式${属性名(‘索引值’).属性名…}的形式来访问Set集合元素中的值
public class LoginAction { private Map<String,User> users; public Map<String, User> getUsers() { return users; } public void setUsers(Map<String, User> users) { this.users = users; } public String execute() throws Exception { User user =users.get("one"); System.out.println(user.userName); //输出页面上输入的用户名的值 } } |
<body> <h1><s:property value="users('scott').userName"/>您好!欢迎来到冒险世界。</h1> </body> |
我们在了解了上面诸多类型转换后,如果还不能满足我们的转换需求。则可以自定义符合我们转换需求的自定义转换器。
在Struts2中有两种方式可以实现自定义转换器。
1:实现TypeConverter接口或者继承DefaultTypeConverter类。
2:继承Struts2的内建抽象类StrutsTypeConverter。
具体信息请查阅相关资料。