struts2--自定义类型转换器

我转换的目的是这样的,在客户端的一个文本输入框内输入用户名和密码,他们之间以用英文逗号隔开!

整个项目里面只用到了三个类,一个User类,用类封装用户信息;一个LoginAction,这个拦截用户请求,来实现页面的跳转;最后一个是TypeConverter,这个类是用来实现类型转换的 他们在包user下面!

代码是这样的

User类:
package user;

public class User {
private String name = "";
private String pwd = "";
public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
}
public String getPwd() {
  return pwd;
}
public void setPwd(String pwd) {
  this.pwd = pwd;
}

}
LoginAction类:
package user;

import com.opensymphony.xwork2.Action;


public class LoginAction implements Action{
private User user;
private String tip;
public String getTip() {
  return tip;
}
public void setTip(String tip) {
  this.tip = tip;
}
public User getUser() {
  return user;
}
public void setUser(User user) {
  this.user = user;
}
public String execute() throws Exception{
  if(getUser().getName().equals("hello")&&getUser().getPwd().equals("java")){
   setTip("登录成功");
   return "success";
  }else{
   setTip("登录失败,类型转换失败");
   return "error";
  }
}
}
TypeConverter类:
package user;

import java.util.Map;

import ognl.DefaultTypeConverter;

public class TypeConverter extends DefaultTypeConverter{
public Object convertValue(Map context, Object value, Class toType){
  //如果要把字符串转换成User类型
  if(User.class==toType){
   User user = new User();
   String [] params = (String[]) value;
   String[] userValues = params[0].split(",");
   user.setName(userValues[0]);
   user.setPwd(userValues[1]);
   return user;
  }
  //如果要将复合类型转换成String类型
  else if(String.class==toType){
   User user = (User)value;
   return "<"+user.getName()+","+user.getPwd()+">";
  }
  return null;
}
}
这就是后台的全部代码,还有一个属性配置文件,就不贴出来了!

刚开始我不知道前台传值的时候,那个文本框的name属性的值要对应那个值,这点我貌似有些笨了,当然是action里面的属性了!
刚开始的时候我就纳闷不知道是哪个,没有和后台对应上,结果总是出现空指针异常!细节一定要把握好!
在上面的代码中,action里面有一个User类的对象user,这个对象便成为了接受前台参数的action属性

在接受这个的同时需要类型转换器转换了,上面的类型转换器是基于OGNL的,有点麻烦!
转换器里面需要实现convertValue方法,里面有三个参数,一个是Map类型的,一个是Object类型的,一个是Class类型的!
第一个参数代表了转换器的上下文,第二个是接受前台传过来的值,第三个是要转换的目标类型!

至于第一个参数,我现在还不明白,我就不明白上下文是什么概念,知道的话,帮忙解答一下,谢谢了!!!!

在转换器类里面,流程是这样的,value是前台传过来的参数,或许要纳闷为什么数组类型的了!是这样的,假如前台要传过来一个多选的下拉列表的值,我们知道我们可以使用request.getValues(name)这个可以获得传过来的所有值,说到这里大概可以理解为什么用数组了吧,因为,request.getValues()方法的返回值类型是数组类型的,我们需要满足大多数的情况,所以struts2的发明者只用数组来接受参数!貌似很智能啊!

得到了前台的参数后,我们就可以通过String类的split方法,将这个字符长以英文逗号为分割点,来获取不同的数据!

前面已经说了项目要求了--输入用户名和密码,两者用英文逗号隔开!在user类里面已经写了user属性的setXXX方法!

将前台参数分割后就可以对user类型的属性进行赋值了!到此就结束了!我也只是懂个皮毛!不对的地方,一定指出来!我也是总结一下,加深一下印象!

你可能感兴趣的:(struts2)