1.所有的MVC框架,都是属于表现层的解决方案,都需要负责收集用户请求参数,并将请求参数传给应用的控制器组件。但是所有的请求参数都
是,也只能是字符串数据类型。java是强类型的语言,MVC框架必须将这些字符串请求参数转换成响应的数据类型。
传统类型转换范例:
平时的 web 开发 假如我们现在有一个简单的注册实例
用户名:改注册信息是一个String类型
密 码:同上
年 龄: int 类型
生 日: java.util.Date
通常的写法 写一个pojo 把 请求的参数封装中对象
Java代码
public class UserBean{
private String name;
private String password;
private int age;
private Date birth;
// sttter and getter
.......
}
public class UserBean{
private String name;
private String password;
private int age;
private Date birth;
// sttter and getter
.......
} 页面收集到的书信息 提交到Servlet,该Servlet 将这些请求封装成UserBean 的值对象
Java代码
public class Regist extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("GBK");
String name = request.getParameter("username");
String pass = request.getParameter("pass");
String strAge = reqeust.getParameter("birth");
// 下面 进行类型 转换
// 字符串 类型
int age = Integer.parseInt(strAge);
// 使用 SimpleDateFormat 将字符串 转向日期转换
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD");
Date birth = null;
try{
birth = sdf.parse(strBirth);
}catch(Exception e){
}
// ..................
}
public class Regist extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("GBK");
String name = request.getParameter("username");
String pass = request.getParameter("pass");
String strAge = reqeust.getParameter("birth");
// 下面 进行类型 转换
// 字符串 类型
int age = Integer.parseInt(strAge);
// 使用 SimpleDateFormat 将字符串 转向日期转换
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD");
Date birth = null;
try{
birth = sdf.parse(strBirth);
}catch(Exception e){
}
// ..................
} 以上 是普通的类型转换,但是如果 我们需要把一个字符串 转换成一个复杂对象时,怎么转换?我们用以上的方式来做 当然也可以作,
不过很麻烦 ,struts2为我们提供了这一机制,当然以上普通的类型转换 Struts2能为我们自动的转换。
Struts2的类型转换是基于OGNL的,在OGNL中有一个接口TypeConverter,这个接口就是定义类型转换的。
2.struts2的类型转换是基于OGNL表达式的,只要我们把HTML输入项(表单元素和其他GET/POST的参数)命名为合法的OGNL表达式,就可以充分
利用struts2的类型转换机制。
3.一般的我们使用struts2的时候会使用model类,这个model类非常类似于模型驱动下的model类,实际上,我们就是希望在servlet中使用VO(
值对象)来封转请求参数,这个VO提供模型驱动下model的部分功能。
我们必须把氢气参数转换成VO类里各属性对于的数据类型。
4.实现类转换器继承一个类DefaultTypeConverter,实现其convertValue方法。
public Object convertValue(Map context, Object value, Class toType) {
// 从 string 转换为 Point类型
System.out.println("point/t"+toType);
if (Point.class == toType) {
Point point = new Point();
String[] pStrings = (String[])value;
String[] xString = pStrings[0].split(",");
int x = Integer.parseInt(xString[0]);
int y = Integer.parseInt(xString[1]);
point.setX(x);
point.setY(y);
return point;
} else if(String.class == toType){
//从Point类型 转换为 String
System.out.println("stirng/t"+toType);
Point point =(Point)value;
int x = point.getX();
int y = point.getY();
String result = "x"+x+"y"+y;
return result;
}
return null;
}
}
注:String[] pStrings = (String[])value;
获取过来的是一个字符串数组,可以这么认为DefaultTypeConverter是通过HttpServletRequest的getParameter Values(name)方法来获取
请求参数值的,因此它获取的请求参数总是字符串数组,如果请求参数只包含一个单个的值,则该请求参数的值是一个长度为1的字符串数组。
5.一个更简单的类型转换类StrutsTypeConverter。该类已经实现了DefaultTypeConverter的convertValue方法,实现该方法时,它将两个不同
转换方向替换成不同方法---当需要把字符串转换成符合类型时,调用convertFromString抽象方法;当需要把复合类型转换成字符时,调用
convertToString抽象方法。
public class UserConverter extends StrutsTypeConverter {
public Object convertFromString(Map context, String[] values, Class toClass){
User user = new User();
String[] userValues = values[0].split(",");
user.setName(userValues[0]);
user.setPass(userValues[1]);
return user;
}
@Override
public String convertToString(Map context, Object o){
User user = (User)o;
return "<" + user.getName() + "," + user.getPass() + ">";
}
}
6.类型转换器最终作用于action的每个属性,因此,action每包含一个需要类型转换的属性(不管该属性是单个属性,还是以数组形式存在)
,类型转换器的convertvalue方法执行一次。
7.Struts2还提供了 关于集合类型的转换
public class Point {
private int x;
private int y;
//省略getter and setter
}
页面端:
<s:textfield name="point" label="坐标"></s:textfield>
<s:textfield name="point" label="坐标"></s:textfield>
<s:textfield name="point" label="坐标"></s:textfield> Action :
public class PointAction extends ActionSupport {
private List<Point> point;
@Override
public String execute() throws Exception {
return SUCCESS;
}
public List<Point> getPoint() {
return point;
}
public void setPoint(List<Point> point) {
this.point = point;
}
}
类型转换器
public class PointActionConver extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
System.out.println("11111111111111111111");
List<Point> list = new ArrayList<Point>();
for(String value:values){
Point point = new Point();
String[] paramvalueStrings = value.split(",");
int x = Integer.parseInt(paramvalueStrings[0]);
int y= Integer.parseInt(paramvalueStrings[1]);
point.setX(x);
point.setY(y);
list.add(point);
}
return list;
}
@Override
public String convertToString(Map context, Object o) {
// TODO Auto-generated method stub
System.out.println("222222222222222222222");
List<Point> list = (List<Point>)o;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("[");
for(Point point:list){
int x = point.getX();
int y = point.getY();
stringBuilder.append("x=").append(x).append(",y=").append(y).append("/n");
}
stringBuilder.append("]");
return stringBuilder.toString();
}
}
8.当要转换集合类型是 配置文件信息 要添加上
List: Element_xxx=需要转换的类(包名+类型);
Map:Element_xxx=复合类型 KeyProperty_xxx=name (其中name为set索引属性名)
例如:Element_materialList=com.conversion.pojo.Point