首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

struts2+hibernate3+spring2读书笔记五(类型转换)

2012-10-06 
struts2+hibernate3+spring2读书笔记5(类型转换)第6章 类型转换本章导读:类型转换使用广泛,主要用在开发人

struts2+hibernate3+spring2读书笔记5(类型转换)
                              第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" name="code"> 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" name="code"> package amigo.struts.typeconversion;import java.util.Map;import org.apache.struts2.util.StrutsTypeConverter;/** * User对象转换器(扩展struts TypeConverter类) * */public class UserStrutsConverter extends StrutsTypeConverter {/** * 从string类型转换为User对象 * */@Overridepublic Object convertFromString(Map context, String[] values, Class toClass) {// TODO Auto-generated method stubString[]params=(String[])values;User user=new User();String[]userInfo=params[0].split(",");user.setUsername(userInfo[0]);user.setPassword(userInfo[1]);return user;}@Overridepublic String convertToString(Map context, Object o) {// TODO Auto-generated method stubreturn 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数组对象 * */@Overridepublic 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;}}@Overridepublic String convertToString(Map context, Object o) {// TODO Auto-generated method stubreturn 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.UserArrayStrutsConverter
6.配置struts.xml

  
  <!--数组属性转换实例  --><action name="userArrayConvertion" name="code">  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 {@Overridepublic Object convertFromString(Map context, String[] values, Class toClass) {// TODO Auto-generated method stubList<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字符串转换为字符串,因为本实例没有用到,实现暂略. */@Overridepublic String convertToString(Map context, Object o) {// TODO Auto-generated method stubreturn 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" name="code">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" name="code"> 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步就完成了类型转换的错误处理了。

热点排行