【Java EE (Struts2 + Spring + Hibernate)开发】:Struts2(二)之【类型转换】
2015-11-27 09:21
495 查看
【Java EE (Struts2 + Spring + Hibernate)开发】: Struts2(二)之【类型转换】
本文地址:http://blog.csdn.net/shanglianlm/article/details/49975505
直接封装成Map
直接封装成List
局部类型转换文件 LoginAction-conversion.properties
局部类型转换文件文件名应该为 ActionName-conversion.properties。
List 类型
Map 类型
本文地址:http://blog.csdn.net/shanglianlm/article/details/49975505
1 详解 Struts 2 的类型转换
1-1 Struts 2 内建的类型转换器
1-2 基于 OGNL 的类型转换
public class LoginAction implements Action { //User类型属性封装请求参数 private User user; private String tip; //user属性的setter和getter方法 public void setUser(User user) { this.user = user; } public User getUser() { return this.user; } //tip属性的setter和getter方法 public void setTip(String tip) { this.tip = tip; } public String getTip() { return this.tip; } public String execute() throws Exception { //通过user属性的name属性和pass属性来判断控制逻辑 if (getUser().getName().equals("crazyit.org") && getUser().getPass().equals("leegang") ) { setTip("登录成功"); return SUCCESS; } else { setTip("登录失败!!"); return ERROR; } } }
<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>
直接封装成Map
public class LoginAction implements Action { //Action类里包含一个Map类型的参数 //Map的value类型为User类型 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方法 public void setTip(String tip) { this.tip = tip; } public String getTip() { return this.tip; } public String execute() throws Exception { //在控制台输出Struts 2封装产生的List对象 System.out.println(getUsers()); //根据Map集合中key为one的User实例来决定控制逻辑 if (getUsers().get("one").getName().equals("crazyit.org") && getUsers().get("one").getPass().equals("leegang") ) { setTip("登录成功!"); return SUCCESS; } else { setTip("登录失败!!"); return ERROR; } } }
<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>
直接封装成List
<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>
1-3 指定集合元素的类型
Struts 2 允许开发者通过局部类型文件来指定集合元素的类型。类型转换文件就是一个普通的 Properties (*.properties) 文件,里面包含了类型转换的相关配置信息。public class LoginAction implements Action { //Action类里包含一个List类型的参数 //List集合元素为User类型 private List users; private String tip; //users属性的setter和getter方法 public void setUsers(List users) { this.users = users; } public List getUsers() { return this.users; } //tip属性的setter和getter方法 public void setTip(String tip) { this.tip = tip; } public String getTip() { return this.tip; } public String execute() throws Exception { //在控制台输出Struts 2封装产生的List对象 System.out.println(getUsers()); //因为没有使用泛型,所以要进行强制类型转换 User firstUser = (User)getUsers().get(0); //users属性的第一个User实例来决定控制逻辑 if (firstUser.getName().equals("crazyit.org") && firstUser.getPass().equals("leegang") ) { setTip("登录成功!"); return SUCCESS; } else { setTip("登录失败!!"); return ERROR; } } }
局部类型转换文件 LoginAction-conversion.properties
Element_users=org.crazyit.app.domain.User
局部类型转换文件文件名应该为 ActionName-conversion.properties。
List 类型
Element_<ListPropName>=<ElementType>
Map 类型
Key_<MapPropName>=<KeyType> Element_<MapPropName>=<ValueType>
1-4 自定义类型转换器
public class LoginAction implements Action { private User user; private String tip; //user属性的setter和getter方法 public void setUser(User user) { this.user = user; } public User getUser() { return this.user; } //tip属性的setter和getter方法 public void setTip(String tip) { this.tip = tip; } public String getTip() { return this.tip; } public String execute() throws Exception { if (getUser().getName().equals("crazyit.org") && getUser().getPass().equals("leegang") ) { setTip("登录成功!"); return SUCCESS; } else { setTip("登录失败!!"); return ERROR; } } }
public class UserConverter extends DefaultTypeConverter { //类型转换器必须重写convertValue方法,该方法需要完成双向转换 public Object convertValue(Map context , Object value, Class toType) { //当需要将字符串向User类型转换时 if (toType == User.class ) { //系统的请求参数是一个字符串数组 String[] params = (String[])value; //创建一个User实例 User user = new User(); //只处理请求参数数组第一个数组元素, //并将该字符串以英文逗号分割成两个字符串 String[] userValues = params[0].split(","); //为User实例赋值 user.setName(userValues[0]); user.setPass(userValues[1]); //返回转换来的User实例 return user; } else if (toType == String.class ) { //将需要转换的值强制类型转换为User实例 User user = (User) value; return "<" + user.getName() + "," + user.getPass() + ">"; } return null ; } }
1-5 注册类型转换器
1-6 基于 Struts 2 的自定义类型转换器
public class UserConverter extends StrutsTypeConverter { //实现将字符串类型转换成复合类型的方法 public Object convertFromString(Map context , String[] values , Class toClass) { //创建一个User实例 User user = new User(); //只处理请求参数数组第一个数组元素, //并将该字符串以英文逗号分割成两个字符串 String[] userValues = values[0].split(","); //为User实例赋值 user.setName(userValues[0]); user.setPass(userValues[1]); //返回转换来的User实例 return user; } //实现将复合类型转换成字符串类型的方法 public String convertToString(Map context, Object o) { //将需要转换的值强制类型转换为User实例 User user = (User) o; return "<" + user.getName() + "," + user.getPass() + ">"; } }
1-7 处理 Set 集合
public class LoginAction extends ActionSupport { private Set users; private Date birth; //user属性的setter和getter方法 public void setUsers(Set users) { this.users = users; } public Set getUsers() { return this.users; } //birth属性的setter和getter方法 public void setBirth(Date birth) { this.birth = birth; } public Date getBirth() { return this.birth; } //没有提供execute()方法, //将直接使用ActionSupport的execute()方法 }
public class UserConverter extends StrutsTypeConverter { public Object convertFromString(Map context , String[] values, Class toClass) { Set result = new HashSet(); for (int i = 0; i < values.length ; i++ ) { //创建一个User实例 User user = new User(); //只处理请求参数数组第一个数组元素, //并将该字符串以英文逗号分割成两个字符串 String[] userValues = values[i].split(","); //为User实例的属性赋值 user.setName(userValues[0]); user.setPass(userValues[1]); //将User实例添加到Set集合中 result.add(user); } return result; } public String convertToString(Map context, Object o) { //如果待转换对象的类型是Set if (o.getClass() == Set.class) { Set users = (Set)o; String result = "["; for (Object obj : users ) { User user = (User)obj; result += "<" + user.getName() + "," + user.getPass() + ">"; } return result + "]"; } else { return ""; } } }
public class User { private String name; private String pass; //name属性的setter和getter方法 public void setName(String name) { this.name = name; } public String getName() { return this.name; } //pass属性的setter和getter方法 public void setPass(String pass) { this.pass = pass; } public String getPass() { return this.pass; } public boolean equals(Object obj) { //待比较的两个对象是同一个对象,直接返回true if(this == obj) { return true; } //只有当obj是User对象 if (obj != null && obj.getClass() == User.class) { User user = (User)obj; //两个对象的name属性相等即认为二者相等。 if (this.getName().equals(user.getName())) { return true; } } return false; } //根据name属性来计算hashCode。 public int hashCode() { return name.hashCode(); } }
1-8 类型转换中的错误处理
public class LoginAction extends ActionSupport { private User user; private String tip; //user属性的setter和getter方法 public void setUser(User user) { this.user = user; } public User getUser() { return this.user; } //tip属性的setter和getter方法 public void setTip(String tip) { this.tip = tip; } public String getTip() { return this.tip; } public String execute() throws Exception { if (getUser().getName().equals("crazyit.org") && getUser().getPass().equals("leegang") ) { setTip("登录成功!"); return SUCCESS; } else { setTip("登录失败!!"); return ERROR; } } }
<struts> <!-- 配置国际化资源文件 --> <constant name="struts.custom.i18n.resources" value="mess"/> <package name="lee" extends="struts-default"> <action name="login" class="org.crazyit.app.action.LoginAction"> <!-- 配置名为input的逻辑视图, 当转换失败后转入该逻辑视图 --> <result name="input">/input.jsp</result> <result name="success">/welcome.jsp</result> <result name="error">/welcome.jsp</result> </action> <action name=""> <result>.</result> </action> </package> </struts>
public class LoginAction extends ActionSupport { private User user; //user属性的setter和getter方法 public void setUser(User user) { this.user = user; } public User getUser() { return user; } //没有execute方法,直接使用ActionSupport的execute方法 }
public class LoginAction extends ActionSupport { private List<User> users; //users属性的setter和getter方法 public void setUsers(List<User> users) { this.users = users; } public List<User> getUsers() { return users; } }
<s:fielderror /> <h3>类型转换的错误处理</h3> <s:form action="login"> <s:iterator value="{0, 1, 2}" status="stat"> <!-- 将会依次生成多个请求参数 --> <s:textfield name="users[%{#stat.index}]" label="第%{#stat.index}个用户信息"/> </s:iterator> <tr> <td colspan="2"><s:submit value="转换" theme="simple"/> <s:reset value="重填" theme="simple"/></td> </tr> </s:form>
2 使用 Struts 2 的输入校验
2-1 编写校验规则文件
2-2 国际化提示信息
2-3 使用客户端校验
2-4 字段校验器配置风格
2-5 非字段校验器配置风格
2-6 短路校验器
2-7 校验文件的搜索规则
2-8 校验顺序和短路
2-9 内建校验器
2-10 基于 Annotation 的输入校验
2-11 手动完成输入校验
3 使用 Struts 2 控制文件上传
3-1 Struts 2 的文件上传
3-2 实现文件上传的 Action
3-3 配置文件上传的 Action
3-4 手动实现文件过滤
3-5 拦截器实现文件过滤
3-6 输出错误提示
3-7 文件上传的常量配置
4 使用 Struts 2 控制文件下载
4-1 实现文件下载的 Action
4-2 配置 Action
4-3 下载前的授权控制
5 详解 Struts 2 的拦截器机制
5-1 拦截器在 Struts 2 中的作用
5-2 Struts 2 内建的拦截器
5-3 配置拦截器
5-4 使用拦截器
5-5 配置默认拦截器
5-6 实现拦截器类
5-7 使用拦截器
5-8 拦截方法的拦截器
5-9 拦截器的执行顺序
5-10 拦截结果的监听器
5-11 覆盖拦截器栈里特定拦截器的参数
5-12 使用拦截器完成权限控制
6 使用 Struts 2 的 Ajax 支持
6-1 使用 stream 类型的 Result 实现 Ajax
6-2 JSON 的基础知识
6-3 实现 Action 逻辑
6-4 JSON 插件与 json 类型的 Result
6-5 实现 JSP 页面
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- 一个jar包里的网站