struts2+hibernate3+spring2读书笔记五(类型转换)
struts2+hibernate3+spring2读书笔记5(类型转换)
第6章 类型转换
本章导读:
类型转换使用广泛,主要用在开发人员将一个字符串转换成更复杂些的对象类型时。因为web中的类型非常单一(在HTTP中所有的信息是String类型),而java是强类型的语言,因些mvc框架一般都会提供字符类型到其他对象类型的转换,Struts2提供了基于ognl表达式的功能强大的转换机制,而且还提供了良好的扩展性,允许开发人员创建自定义的类型转换器。
一.不使用struts2的类型转换器进行类型转换
1.建立工程
2.编写pojo类:User.java 内容如下:
3.编写Action类:simpleConvertionAction.java
4.编写注册页面:simpleReg.jsp
5.注册成功页面:simpleRegSuccess.jsp
6.注册失败页面:error.jsp
7.Struts2配置文件:struts.xml
呵呵,以上7步就完成了不使用struts的类型转换,下面我们来看看继承DefaultConverter类型转换。
二.继承DefaultConverter类进行型转换
1. 编写用户信息转换的类型转换器:UserConveerter.java,该类型转换器用于将用户信息进行解析,解析后将其放置到user对象中,代码如下:
3. 编写jsp页面:defaultConversionReg.jsp,该页面提供给用户输入注册信息:用户名和密码,两者之间以英文逗号隔开,该页面将请求提供给DefaultConvertionAction.该页面的代码如下:
4. 类型转换文件:DefaultConvertionAction-conversion.properties,内容为:
该文件是局部的类型转换器放在需要进行转换的Acion类的同一个包中。
5. 修改struts.xml文件 ,具体内容如下:
经过以上五步后,完成了继承DefaultConverter类进行型转换
三.继承StrutsTypeConverter类进行类型转换
1. 编写类型转换器:UserStrutsConverter.java
以上两步实现了继承StrutsTypeConverter类进行类型转换
四.数组的类型转换
在前面的内容中,讲解了当请求参数为单个值时如何进行类型转换,本实例讲解当属性的类型为数组时如何进行转换。
1. 编写数组属性类型转换器:UserArrayStrutsConverter.java
2.编写Action类:UserArrayConvertionAction.java
5.配置类型转换器:
在xwork-conversion.properties中修改转换器为:
经过以上六步后,数组的类型转换完成。
五.集合的类型转换
常用的集合包括List和Map,本实例讲解当Action中user为List集合时,如何实现类型转换(和数组类似)
1. 编写list集合类型转换器:UserListStrutsConverter.java,代码如下:
2. 编写Action类:UserListConvertionAction.java 具体代码如下:
4.第四步:编写注册成功页面:userListRegSuccess.jsp 代码如下:
5.配置类型转换器(局部的类型转换器),在包目录下建立类型转换文件UserListConvertionAction-conversion.properties,具体内容如下:
6.配置struts.xml
以上六步完成了集合的类型转换。
六.类型转换的错误处理
1. 编写Action类:ExceptionConverter.java
2.编写jsp页面:exceptinConversionReg.jsp
3.修改Struts2配置文件:struts.xml
4.建立局部资源文件:ExceptionConvertionAction.properties(在ExceptionConvertionAction所在的包里新建)
最后经过以上4步就完成了类型转换的错误处理了。
第6章 类型转换
本章导读:
类型转换使用广泛,主要用在开发人员将一个字符串转换成更复杂些的对象类型时。因为web中的类型非常单一(在HTTP中所有的信息是String类型),而java是强类型的语言,因些mvc框架一般都会提供字符类型到其他对象类型的转换,Struts2提供了基于ognl表达式的功能强大的转换机制,而且还提供了良好的扩展性,允许开发人员创建自定义的类型转换器。
一.不使用struts2的类型转换器进行类型转换
1.建立工程
2.编写pojo类:User.java 内容如下:
package amigo.struts.typeconversion; import java.util.Date; /** * 用户的POJO类 * */ public class User { /**用户名*/ private String username; /**密码*/ private String password; /**性别*/ private int gender; /**年龄*/ private int age; /**出生日期*/ private Date birthDate; /**联系电话*/ private String tel; /**Email*/ private String email; 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 int getGender() { return gender; } public void setGender(int gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getBirthDate() { return birthDate; } public void setBirthDate(Date birthDate) { this.birthDate = birthDate; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
3.编写Action类:simpleConvertionAction.java
package amigo.struts.typeconversion; import java.text.SimpleDateFormat; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.interceptor.ServletRequestAware; import com.opensymphony.xwork2.ActionSupport; public class SimpleConvertionAction extends ActionSupport implements ServletRequestAware { private User user; private HttpServletRequest request; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public HttpServletRequest getRequest() { return request; } public void setServletRequest(HttpServletRequest request) { this.request = request; } /** * 完成用户注册. * 在组装User对象时需要进行gender、age和birthDate属性的强制转换 * */ public String execute(){ try{ String username=request.getParameter("username"); String password=request.getParameter("password"); String gender=request.getParameter("gender"); String age=request.getParameter("age"); String birthDate=request.getParameter("birthDate")==null?"":request.getParameter("birthDate"); String tel=request.getParameter("tel"); String email=request.getParameter("email"); user = new User(); user.setUsername(username); user.setPassword(password); user.setTel(tel); user.setEmail(email); //gender、age和birthDate进行强制类型转换 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); user.setGender(Integer.parseInt(gender)); user.setAge(Integer.parseInt(age)); user.setBirthDate(sdf.parse(birthDate)); return this.SUCCESS; }catch(Exception ex){ request.setAttribute("errorMessage","操作失败:"+ex.getMessage()) ; ex.printStackTrace(); return this.ERROR; } } }
4.编写注册页面:simpleReg.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>用户注册</title> </head> <body> <s:form action="simpleConversion"> <s:textfield name="username" label="用户名"></s:textfield> <s:password name="password" label="密码"></s:password> <s:select label="性别" name="gender" list="#{'1':'男','0':'女'}" listKey="key" listValue="value" value="0"> </s:select> <s:textfield name="age" label="年龄"></s:textfield> <s:textfield name="birthDate" label="出生日期"></s:textfield> <s:textfield name="tel" label="联系电话"></s:textfield> <s:textfield name="email" label="Email"></s:textfield> <s:submit></s:submit> </s:form> </body> </html>
5.注册成功页面:simpleRegSuccess.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>注册成功</title> </head> <body> 注册成功!注册信息如下: 用户名:<s:property value="user.username"/><br/> 密码: <s:property value="user.password"/><br/> 性别: <s:property value="user.gender"/><br/> 年龄: <s:property value="user.age"/><br/> 出生日期:<s:property value="user.birthDate"/><br/> 联系电话:<s:property value="user.tel"/><br/> Email: <s:property value="user.email"/><br/> </body> </html>
6.注册失败页面:error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>操作失败界面</title> </head> <body> <s:property value="#request.errorMessage"/> </body> </html>
7.Struts2配置文件:struts.xml
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <include file="struts-default.xml"/> <package name="amigo" extends="struts-default"> <action name="simpleConversion" class="amigo.struts.typeconversion.SimpleConvertionAction"> <result name="success">/typeConversion/simpleRegSuccess.jsp</result> <result name="error">/typeConversion/error.jsp</result> </action> </package> </struts>
呵呵,以上7步就完成了不使用struts的类型转换,下面我们来看看继承DefaultConverter类型转换。
二.继承DefaultConverter类进行型转换
1. 编写用户信息转换的类型转换器:UserConveerter.java,该类型转换器用于将用户信息进行解析,解析后将其放置到user对象中,代码如下:
package amigo.struts.typeconversion; import java.util.Map; import ognl.DefaultTypeConverter; /** * User对象转换器 * */ public class UserConverter extends DefaultTypeConverter { public Object convertValue(Map context,Object value,Class toType){ if(toType==User.class){ String[]params=(String[])value; User user=new User(); String[]userInfo=params[0].split(","); user.setUsername(userInfo[0]); user.setPassword(userInfo[1]); return user; } return null; } }2. 编写Action类:DefaultConvertionAction.java,该类包含一个user属性,user对象的转换由转换器类UserConverter.java类完成,DefaultConvertionAction.java的代码如下:
package amigo.struts.typeconversion; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.interceptor.ServletRequestAware; import com.opensymphony.xwork2.ActionSupport; public class DefaultConvertionAction extends ActionSupport implements ServletRequestAware{ private User user; private HttpServletRequest request; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public HttpServletRequest getRequest() { return request; } public void setServletRequest(HttpServletRequest request) { this.request = request; } /** * 完成用户注册 * 使用UserConverter转换器 * */ public String execute(){ try{ System.out.print(this.getUser().getUsername()); System.out.print(this.getUser().getPassword()); return SUCCESS; }catch(Exception ex){ request.setAttribute("errorMessage", "操作失败:"+ex.getMessage()); ex.printStackTrace(); return ERROR; } } }
3. 编写jsp页面:defaultConversionReg.jsp,该页面提供给用户输入注册信息:用户名和密码,两者之间以英文逗号隔开,该页面将请求提供给DefaultConvertionAction.该页面的代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>DefaultTypeConverter扩展实例</title> </head> <body> <s:form action="defaultConvertion"> 说明:用户名、密码信息以英文逗号隔开<br/> <s:textfield name="user" label="用户信息"></s:textfield> <s:submit></s:submit> </s:form> </body> </html>
4. 类型转换文件:DefaultConvertionAction-conversion.properties,内容为:
user=amigo.struts.typeconversion.UserConverter
该文件是局部的类型转换器放在需要进行转换的Acion类的同一个包中。
5. 修改struts.xml文件 ,具体内容如下:
<action name="defaultConvertion" class="amigo.struts.typeconversion.DefaultConvertionAction"> <result >/typeConversion/simpleRegSuccess.jsp</result> <result name="error">/typeConversion/error.jsp</result> </action>
经过以上五步后,完成了继承DefaultConverter类进行型转换
三.继承StrutsTypeConverter类进行类型转换
1. 编写类型转换器:UserStrutsConverter.java
package amigo.struts.typeconversion; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; /** * User对象转换器(扩展struts TypeConverter类) * */ public class UserStrutsConverter extends StrutsTypeConverter { /** * 从string类型转换为User对象 * */ @Override public Object convertFromString(Map context, String[] values, Class toClass) { // TODO Auto-generated method stub String[]params=(String[])values; User user=new User(); String[]userInfo=params[0].split(","); user.setUsername(userInfo[0]); user.setPassword(userInfo[1]); return user; } @Override public String convertToString(Map context, Object o) { // TODO Auto-generated method stub return null; } }2.修改类型转换器配置文件,将User对象的类型转换器修改为
user=amigo.struts.typeconversion.UserStrutsConverter
以上两步实现了继承StrutsTypeConverter类进行类型转换
四.数组的类型转换
在前面的内容中,讲解了当请求参数为单个值时如何进行类型转换,本实例讲解当属性的类型为数组时如何进行转换。
1. 编写数组属性类型转换器:UserArrayStrutsConverter.java
package amigo.struts.typeconversion; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; /** * User对象转换器(扩展struts TypeConverter类) * */ public class UserArrayStrutsConverter extends StrutsTypeConverter { /** * 从string类型转换为User数组对象 * */ @Override public Object convertFromString(Map context, String[] values, Class toclass) { User[] userArray=new User[values.length]; for(int i=0;i<values.length;i++){ User user=new User(); String[]userInfo=values[i].split(","); System.out.print(userInfo[1]); user.setUsername(userInfo[0]); System.out.print(user.getUsername()); user.setPassword(userInfo[1]); System.out.print(user.getPassword()); userArray[i]=user; } if(values.length==1){ return userArray[0]; }else{ return userArray; } } @Override public String convertToString(Map context, Object o) { // TODO Auto-generated method stub return null; } }
2.编写Action类:UserArrayConvertionAction.java
package amigo.struts.typeconversion; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.interceptor.ServletRequestAware; import com.opensymphony.xwork2.ActionSupport; public class UserArrayConvertionAction extends ActionSupport implements ServletRequestAware { private User[] user; private HttpServletRequest request; public User[] getUser() { return user; } public void setUser(User[] user) { this.user = user; } public HttpServletRequest getRequest() { return request; } public void setServletRequest(HttpServletRequest request) { this.request = request; } public String execute(){ try{ return this.SUCCESS; }catch(Exception ex){ request.setAttribute("errorMessage","操作失败:"+ex.getMessage()); ex.printStackTrace(); return this.ERROR; } } }3.编写填写注册信息页面:userArrayReg.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>用户注册页面:</title> </head> <body> <s:form action="userArrayConvertion"> 说明:用户名、密码信息以英文逗号隔开<br/> <s:textfield name="user" label="用户信息1"></s:textfield> <s:textfield name="user" label="用户信息2"></s:textfield> <s:submit></s:submit> </s:form> </body> </html>4.编写注册成功页面:userArrayRegSuccess.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>注册成功</title> </head> <body> 数组类型转换成功! <s:iterator value="user" status="st"> <br/>用户<s:property value="#st.index"/>的信息:<br/> 用户名:<s:property value="user[#st.index].username"/><br/> 密码:<s:property value="user[#st.index].password"/> </s:iterator> </body> </html>
5.配置类型转换器:
在xwork-conversion.properties中修改转换器为:
Amigo.struts.typeconversion.User=amogo.struts.typeconversion.UserArrayStrutsConverter6.配置struts.xml
<!--数组属性转换实例 --> <action name="userArrayConvertion" class="amigo.struts.typeconversion.UserArrayConvertionAction"> <result >/typeConversion/userArrayRegSuccess.jsp</result> <result name="error">/typeConversion/error.jsp</result> </action>
经过以上六步后,数组的类型转换完成。
五.集合的类型转换
常用的集合包括List和Map,本实例讲解当Action中user为List集合时,如何实现类型转换(和数组类似)
1. 编写list集合类型转换器:UserListStrutsConverter.java,代码如下:
package amigo.struts.typeconversion; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; public class UserListStrutsConverter extends StrutsTypeConverter { @Override public Object convertFromString(Map context, String[] values, Class toClass) { // TODO Auto-generated method stub List<User> userlist = new ArrayList<User>(); for(int i=0;i<values.length;i++){ User user = new User(); String[] userInfo = values[i].split(","); user.setUsername(userInfo[0]); user.setPassword(userInfo[1]); userlist.add(user); } if(values.length==1){ return userlist.get(0); }else{ return userlist; } } /** * 从User字符串转换为字符串,因为本实例没有用到,实现暂略. */ @Override public String convertToString(Map context, Object o) { // TODO Auto-generated method stub return null; } }
2. 编写Action类:UserListConvertionAction.java 具体代码如下:
package amigo.struts.typeconversion; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.interceptor.ServletRequestAware; import com.opensymphony.xwork2.ActionSupport; public class UserListConvertionAction extends ActionSupport implements ServletRequestAware { private List<User> user; private HttpServletRequest request; public List<User> getUser() { return user; } public void setUser(List<User> user) { this.user = user; } public HttpServletRequest getRequest() { return request; } public void setServletRequest(HttpServletRequest request) { this.request = request; } public String execute(){ try{ return this.SUCCESS; }catch(Exception ex){ request.setAttribute("errorMessage","操作失败:"+ex.getMessage()); ex.printStackTrace(); return this.ERROR; } } }3. 编写填写注册信息页面:userListReg.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>用户注册页面:</title> </head> <body> <s:form action="userListConvertion"> 说明:用户名、密码信息以英文逗号隔开<br/> <s:textfield name="user" label="用户信息1"></s:textfield> <s:textfield name="user" label="用户信息2"></s:textfield> <s:submit></s:submit> </s:form> </body> </html>
4.第四步:编写注册成功页面:userListRegSuccess.jsp 代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>注册成功</title> </head> <body> <table width="50%"> <tr style="backgroup-color:powderblue;font-weight:bold;"> <td>序号</td> <td>用户名</td> <td>密码</td> </tr> <s:iterator value="user" status="st"> <tr> <td><s:property value="#st.index"/></td> <td><s:property value="user[#st.index].username"/></td> <td><s:property value="user[#st.index].password"/></td> </tr> </s:iterator> </table> </body> </html>
5.配置类型转换器(局部的类型转换器),在包目录下建立类型转换文件UserListConvertionAction-conversion.properties,具体内容如下:
User=amigo.struts.typeconversion.UserListStrutsConverter
6.配置struts.xml
<!-- List集合转换实例 --> <action name="userListConvertion" class="amigo.struts.typeconversion.UserListConvertionAction"> <result >/typeConversion/userListRegSuccess.jsp</result> <result name="error">/typeConversion/error.jsp</result> </action>
以上六步完成了集合的类型转换。
六.类型转换的错误处理
1. 编写Action类:ExceptionConverter.java
package amigo.struts.typeconversion; import java.util.Date; import com.opensymphony.xwork2.ActionSupport; /** * 演示Struts中类型转换的错误处理 * */ public class ExceptionConverter extends ActionSupport { /** * 用户名. * */ private String username; /** * 年龄 * */ private int age; /** * 出生日期 * */ private Date birthDate; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getBirthDate() { return birthDate; } public void setBirthDate(Date birthDate) { this.birthDate = birthDate; } public String execute(){ return null; } }
2.编写jsp页面:exceptinConversionReg.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>演示Struts中类型转换的错误处理</title> </head> <body> <s:form action="exceptionConvertion"> <s:textfield name="username" label="用户名"></s:textfield> <s:textfield name="age" label="年龄"></s:textfield> <s:textfield name="birthDate" label="出生日期"></s:textfield> <s:submit></s:submit> </s:form> </body> </html>
3.修改Struts2配置文件:struts.xml
<!-- 演示类型转换的错误处理实例 --> <action name="exceptionConvertion" class="amigo.struts.typeconversion.ExceptionConverter"> <result name="input">/typeConversion/exceptionConversionReg.jsp</result> </action>
4.建立局部资源文件:ExceptionConvertionAction.properties(在ExceptionConvertionAction所在的包里新建)
invalid.fieldvalue.age=\u5e74\u9f84\u8f93\u5165\u4e0d\u5408\u6cd5\uff0c\u7c7b\u578b\u8f6c\u6362\u5931\u8d25(内容为:年龄输入不合法,类型转换失败) invalid.fieldvalue.birthDate=\u51fa\u751f\u65e5\u671f\u5e94\u4e3ayyyy-MM-dd\u683c\u5f0f (内容为:出生日期应为yyyy-MM-dd格式)
最后经过以上4步就完成了类型转换的错误处理了。