其他知识点点击链接:
1:Struts2学习笔记(一)初步了解Struts2以及配置
2:Struts2学习笔记(三)之输入校验(使用直接编码方式)
3:Struts2学习笔记(四)之Struts2访问Servlet API
从页面输入的都是字符串,后台来的一般都是对象,那我们需要从页面得到数据和页面显示字符串之间进行一个转换,类型转换分为局部属性转换和全局转换,这里讲的类型转换比较简单,就算个抱砖引玉吧......
Struts2的类型转换,对于8个原生数据类型以及String等常见类型,Struts2 可以使用内建的类型转换器实现自动的转换;但对于自定义的对象类型来说,就需要我们自己指定类型转换的方式了。
首先先学习局部属性类型转换,DefaultTypeConverter与StrutsTypeConverter,我们可以继承这两个类都可以实现类型的转换,不过StrutsTypeConverter类是实现了DefaultTypeConverter类,所以一般我们要去进行类型转换,都会继承StrutsTypeConverter类,来看下使用....
步骤:
1:最基本的Struts的配置信息,省略.....(了解请点击:Struts2的基本配置)
2:新建一个继承与DefaultTypeConverter或者StrutsTypeConverter的类;
3:在当前要转换的属性的类的该包下面新建一个配置文件..该配置文件的名字规则为XXXX-conversion.properties(XXX代表当前要转换属性的类名) 看下类结构图片:
其中配置文件中的配置信息如下:
接下来先使用继承与DefaultTypeConverter的方法来实现一下类型转换
①:页面代码如下:
登陆的JSP关键代码: <body> <h1> 使用逗号隔开用户名和密码信息 </h1> <form action="userAction1"> user info1: <input type="text" name="user"> <br /> <input type="submit" value="submit"> </form> </body> 显示登陆成功信息JSP页面关键代码 <%@ taglib prefix="s" uri="/struts-tags" %> <body> <s:property value="user"/> </body>
package com.jiangqq.action; import com.jiangqq.bean.User; import com.opensymphony.xwork2.ActionSupport; public class UserAction1 extends ActionSupport { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String execute() throws Exception { System.out.println("Username = "+user.getUsername()); System.out.println("Password = "+user.getPassword()); return SUCCESS; } }
public class UserConverter1 extends DefaultTypeConverter { @Override public Object convertValue(Map context, Object value, Class toType) { if (User.class == toType) // 从页面的字符串--->后台对象转换 { String[] str = (String[]) value; String firstValue = str[0]; // 分割字符串的类 StringTokenizer st = new StringTokenizer(firstValue, ","); User user = new User(); user.setUsername(st.nextToken()); user.setPassword(st.nextToken()); return user; } else if (String.class == toType) // 从后台对象-->到页面字符串转换 { User user = (User) value; String username = user.getUsername(); String password = user.getPassword(); return "username = " + username + " password = " + password; } return null; }
当然我们还可以继承于StrutsTypeConverter抽象类来进行类型转换,查看StrutsTypeConverter的源代码,我们发现
StrutsTypeConverter类实现了DefaultTypeConverter类:在StrutsTypeConverter中进行类型转换的方法和我们在上面实现的差不多,下图是关联的StrutsTypeConverter代码:
看下StrutsTypeConverter类中几个主要的方法: 这里我们去实现第一个与第二个抽象方法去进行转换
1:abstract Object convertFromString(Map context, String[] values, Class toClass)
2:abstract String convertToString(Map context, Object o)
3;convertValue(Map context, Object o, Class toClass)
把上面的例子,使用实现StrutsTypeConverter抽象类,来进行类型转换的方法代码如下....
package com.jiangqq.converter; /** * 使用继承StrutsTypeConverter的抽象类进行类型转换 */ import java.util.Map; import java.util.StringTokenizer; import org.apache.struts2.util.StrutsTypeConverter; import com.jiangqq.bean.User; public class UserConverter2 extends StrutsTypeConverter { // 页面字符串往后台对象转换 @Override public Object convertFromString(Map arg0, String[] arg1, Class arg2) { String[] str = (String[]) arg1; String firstValue = str[0]; // 分割字符串的类 StringTokenizer st = new StringTokenizer(firstValue, ","); User user = new User(); user.setUsername(st.nextToken()); user.setPassword(st.nextToken()); return user; } // 后台对象往页面字符串转换 @Override public String convertToString(Map arg0, Object arg1) { User user = (User) arg1; String username = user.getUsername(); String password = user.getPassword(); return "username = " + username + " password = " + password; } }
至此已经讲完了局部类型转换,下面说下全局的类型转换
全局类型转换。在src目录下新建xwork-conversion.properties,该文件的内容是待转换的类=转换器的名字,即
com.jiangqq.bean.User=com.jiangqq.converter.UserConverter3如下图:
接下来的进行转换的类和上面继承StrutsTypeConverter类其中的实现方法一样,全局类型,只要有User的对象,就去使用UserConverter3.java去进行类型转换,方法和上面的一样
例子代码下载链接:http://download.csdn.net/detail/jiangqq781931404/4182080