Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1183|回复: 0

struts2--自定义类型转换器

[复制链接]

该用户从未签到

发表于 2011-10-16 17:14:20 | 显示全部楼层 |阅读模式
我转换的目的是这样的,在客户端的一个文本输入框内输入用户名和密码,他们之间以用英文逗号隔开!

整个项目里面只用到了三个类,一个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类型的属性进行赋值了!到此就结束了!我也只是懂个皮毛!不对的地方,一定指出来!我也是总结一下,加深一下印象!
回复

使用道具 举报

该用户从未签到

发表于 2011-10-24 21:05:54 | 显示全部楼层
很好,学习了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-20 05:11 , Processed in 0.410271 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表