`
hhr_michael
  • 浏览: 72566 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

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" 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.UserArrayStrutsConverter
6.配置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步就完成了类型转换的错误处理了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics