Struts2---类型转换摘记

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

你可能感兴趣的:(exception,struts,String,object,servlet,Class)