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

第6章 类型转换
本章导读:
类型转换使用广泛,主要用在开发人员将一个字符串转换成更复杂些的对象类型时。因为web中的类型非常单一(在HTTP中所有的信息是String类型),而java是强类型的语言,因些mvc框架一般都会提供字符类型到其他对象类型的转换,Struts2提供了基于ognl表达式的功能强大的转换机制,而且还提供了良好的扩展性,允许开发人员创建自定义的类型转换器。

[b]一.不使用struts2的类型转换器进行类型转换[/b]
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类型转换。


[b]二.继承DefaultConverter类进行型转换[/b]

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类进行型转换


[b]三.继承StrutsTypeConverter类进行类型转换[/b]

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类进行类型转换


[b]四.数组的类型转换[/b]
在前面的内容中,讲解了当请求参数为单个值时如何进行类型转换,本实例讲解当属性的类型为数组时如何进行转换。

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>

经过以上六步后,数组的类型转换完成。


[b]五.集合的类型转换[/b]
常用的集合包括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>

以上六步完成了集合的类型转换。

[b]六.类型转换的错误处理[/b]

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步就完成了类型转换的错误处理了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值