JavaWeb -- Struts 数据传输:OGNL和类型转换

1. 数据传输:OGNL和类型转换

OGNL和struts2

OGNL:Object-Graph Navigation Language.

OGNL是集成进struts框架中比较强大的技术有助于数据传输和类型转换.OGNL由表达式语言和类型转换器组成.

内置类型转换器

用ognl表达式映射表单字段名到属性

<s:form action="Register">

<s:textfield name="user.username" label="Username"/>

<s:password name="user.password" label="Password"/>

<s:textfield name="user.portfolioName" label="Enter a name "/>

<s:textfield name="user.age" label="Enter your age as a double "/>

<s:textfield name="user.birthday" label="birthday. (mm/dd/yy)"/>

<s:submit/>

</s:form>

private User user;//get/set

User{

private String username;

private String password;

private String portfolioName;

private Double age;

private Date birthday;//get/set

内置类型转换器

List

private List lastNames ;

private List middleNames ;

不必预初始化集合.默认转换成字符串.

<s:textfield name="middleNames[0]" label="middleNames"/>

<s:textfield name="middleNames[1]" label="middleNames"/>

<s:textfield name="middleNames[2]" label="middleNames"/>

<s:textfield name="lastNames" label="lastNames"/>

<s:textfield name="lastNames" label="lastNames"/>

<s:textfield name="lastNames" label="lastNames"/>

若想显式指定数据类型,可通过属性文件的方式指定[XxxAction-conversion.properties].属性文件和Action类放在一起.

内置类型转换器

Map<String,String>

<s:textfield name="maidenNames.mary" label="Maiden Name"/>

<s:textfield name="maidenNames.jane" label="Maiden Name"/>

<s:textfield name="maidenNames.hellen" label="Maiden Name"/>

<s:textfield name="maidenNames['beth']" label="Maiden Name"/>

<s:textfield name="maidenNames['sharon']" label="Maiden Name"/>

<s:textfield name="maidenNames['martha']" label="Maiden Name"/>

private Map maidenNames ;

Map<String,User>

Element_myUsers=manning.utils.User

<s:textfield name="myUsers['chad'].username" label="names"/>

<s:textfield name="myUsers.chad.birthday" label="birthday"/>

private Map myUsers ;

自定义类型转换器

实现ognl.TypeConverter接口

继承类org.apache.struts2.util.StrutsTypeConverter.

public abstract Object convertFromString(Map context, String[] values,Class toClass);

public abstract String convertToString(Map context, Object o);

在字符串和Date对象间转换(续)

public class DateTypeConverter extends StrutsTypeConverter {

public Object convertFromString(Map context, String[] values, Class toClass) {

String date = values[0];

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

return sdf.parse(date);

}

public String convertToString(Map context, Object o) {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

return sdf.format((Date)o);

}

}

配置自定义类型转换器

属性相关:

属性文件同action类放在一起, action中list map使用泛型定义,无需配置转换类型

private Date birthday;

[CustomConverterTest-conversion.properties]

birthday=manning.utils.DateTypeConverter

全局类型转换: 放在 src目录下

[classpath]/xwork-conversion.properties

manning.utils.Circle=manning.utils.DateTypeConverter

----------------  实例 address 转换, 输入 aa-bb-cc 转为 Address-----------

address.java   domain

  1. /**
  2. * 地址类
  3. */
  4. public class Address {
  5. private String province;
  6. private String city;
  7. private String street;
  8. public String getProvince() {
  9. return province;
  10. }
  11. public void setProvince(String province) {
  12. this.province = province;
  13. }
  14. public String getCity() {
  15. return city;
  16. }
  17. public void setCity(String city) {
  18. this.city = city;
  19. }
  20. public String getStreet() {
  21. return street;
  22. }
  23. public void setStreet(String street) {
  24. this.street = street;
  25. }
  26. public String toString() {
  27. return province + "-" + city + "-" + street;
  28. }
  29. }

注册提交Jsp, reg,jsp

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html>
  3. <head>
  4. <title>reg.jsp</title>
  5. </head>
  6. <body>
  7. <s:debug />
  8. <s:form namespace="/ognl" action="OgnlAction_reg" method="post">
  9. <s:textfield name="names" label="UserName" />
  10. <s:textfield name="names" label="UserName" />
  11. <s:textfield name="ages[0]" label="UserAge" />
  12. <s:textfield name="ages[1]" label="UserAge" />
  13. <s:textfield name="namesListNoGen" label="namesListNoGen" />
  14. <s:textfield name="namesListNoGen" label="namesListNoGen" />
  15. <s:textfield name="agesListNoGen[0]" label="agesListNoGen" />
  16. <s:textfield name="agesListNoGen[1]" label="agesListNoGen" />
  17. <s:textfield name="userList[0].name" label="userList[0].name" />
  18. <s:textfield name="userList[1].name" label="userList[1].name" />
  19. <s:textfield name="userList[0].age" label="userList[0].age" />
  20. <s:textfield name="userList[1].age" label="userList[1].age" />
  21. <s:textfield name="userMap[100].name" label="userMap[100].name" />
  22. <s:textfield name="userMap[100].age" label="userMap[100].age" />
  23. <s:textfield name="userMap[200].name" label="userMap[200].name" />
  24. <s:textfield name="userMap[200].age" label="userMap[200].age" />
  25. <s:textfield name="comAddress" label="comAddress"/>
  26. <s:submit />
  27. </s:form>
  28. <s:property value="comAddress"/>
  29. <s:url includeContext="true" />
  30. </body>
  31. </html>

action

  1. /**
  2. * OgnlAction
  3. */
  4. public class OgnlAction extends ActionSupport {
  5. private static final long serialVersionUID = -6933309304624396640L;
  6. private String[] names = new String[2];
  7. private Integer[] ages = new Integer[2];
  8. /**
  9. * 不带泛型的集合
  10. */
  11. private List namesListNoGen ;
  12. private List agesListNoGen ;
  13. /* javabean集合 */
  14. private List userList ;
  15. /* map */
  16. private Map userMap;
  17. /* 公司地址 */
  18. private Address comAddress ;
  19. public Address getComAddress() {
  20. return comAddress;
  21. }
  22. public void setComAddress(Address comAddress) {
  23. this.comAddress = comAddress;
  24. }
  25. public List getUserList() {
  26. return userList;
  27. }
  28. public void setUserList(List userList) {
  29. this.userList = userList;
  30. }
  31. public Integer[] getAges() {
  32. return ages;
  33. }
  34. public void setAges(Integer[] ages) {
  35. this.ages = ages;
  36. }
  37. public String[] getNames() {
  38. return names;
  39. }
  40. public void setNames(String[] names) {
  41. this.names = names;
  42. }
  43. public String reg() {
  44. return "success";
  45. }
  46. public String toRegView() {
  47. System.out.println("toRegView");
  48. return "loginView";
  49. }
  50. /**
  51. * 保存数据,
  52. */
  53. public String saveData(){
  54. ServletActionContext.getRequest().setAttribute("username", "requestTom");
  55. ServletActionContext.getRequest().getSession().setAttribute("username", "sessionTom");
  56. ServletActionContext.getServletContext().setAttribute("username", "applicationTom");
  57. ServletActionContext.getContext().getValueStack().set("username", "vsTom");
  58. //
  59. popUserList();
  60. return "showView" ;
  61. }
  62. /**
  63. * 组装用户集合
  64. */
  65. private void popUserList(){
  66. userList = new ArrayList<User>();
  67. User u = null ;
  68. for(int i = 0 ; i < 10 ; i ++){
  69. u = new User();
  70. u.setId(1 + i);
  71. u.setName("tom" + i);
  72. u.setAge(20 + i);
  73. userList.add(u);
  74. }
  75. }
  76. public List getNamesListNoGen() {
  77. return namesListNoGen;
  78. }
  79. public void setNamesListNoGen(List namesListNoGen) {
  80. this.namesListNoGen = namesListNoGen;
  81. }
  82. public List getAgesListNoGen() {
  83. return agesListNoGen;
  84. }
  85. public void setAgesListNoGen(List agesListNoGen) {
  86. this.agesListNoGen = agesListNoGen;
  87. }
  88. public Map getUserMap() {
  89. return userMap;
  90. }
  91. public void setUserMap(Map userMap) {
  92. this.userMap = userMap;
  93. }
  94. }

地址转换器

  1. /**
  2. * 地址类型转换器
  3. */
  4. public class AddressConverter extends StrutsTypeConverter {
  5. /**
  6. * 将字符串转换成地址对象
  7. */
  8. public Object convertFromString(Map context, String[] values, Class toClass) {
  9. if(values != null && values.length > 0){
  10. String str = values[0];
  11. String[] ss = str.split("-");
  12. if(ss != null && ss.length > 2){
  13. Address a = new Address();
  14. a.setProvince(ss[0]);
  15. a.setCity(ss[1]);
  16. a.setStreet(ss[2]);
  17. return a ;
  18. }
  19. }
  20. return null;
  21. }
  22. /**
  23. * 将地址对象转换成字符串信息
  24. */
  25. public String convertToString(Map context, Object o) {
  26. if(o instanceof Address){
  27. return o.toString();
  28. }
  29. return null;
  30. }
  31. }

OgnlAction-conversion.properties 转换类型配置, 放在action同目录,命名方式固定

  1. Element_agesListNoGen=java.lang.Integer
  2. Element_userList=cn.itcast.struts2.model.User
  3. Element_userMap=cn.itcast.struts2.model.User
  4. Key_userMap=java.lang.Integer
  5. #comAddress=cn.itcast.struts2.ognl.AddressConverter

xwork-conversion.properties 类型转换,全局配置文件,放在src目录下,命名固定

  1. cn.itcast.struts2.model.Address=cn.itcast.struts2.ognl.AddressConverter

OGNL和类型转换的更多相关文章

  1. JavaWeb -- Struts 数据传输:OGNL和类型转换

    1. 数据传输:OGNL和类型转换 OGNL和struts2 OGNL:Object-Graph Navigation Language. OGNL是集成进struts框架中比较强大的技术有助于数据传 ...

  2. struts1和struts2的区别

    1. 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类:Struts 1的一个具体问题是使用抽象类编程而不是接口.Struts 2 Action类可以实现一个Acti ...

  3. 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)

    轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...

  4. Struts与Struts2的区别

    Struts与Struts2的区别 首先看一张Struts2的发展路线图:       从Struts2的发展过程来看,Struts2继承了Struts与Webwork的特性,形成了新的框架.但是它的 ...

  5. Struts2相关面试题

    Struts2面试题 1.struts2工作流程 Struts 2框架本身大致可以分为3个部分: 核心控制器FilterDispatcher.业务控制器Action和用户实现的企业业务逻辑组件. 核心 ...

  6. 浅谈 Struts2 面试题收藏

    Struts2面试题 一.工作原理 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 这个请求经过一系列的过滤器(Fi ...

  7. java SSH框架详解(面试和学习都是最好的收藏资料)

    Java—SSH(MVC)1. 谈谈你mvc的理解MVC是Model—View—Controler的简称.即模型—视图—控制器.MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开.MVC ...

  8. Struts2与Struts的区别

    Struts2与Struts的区别 从Struts2的发展过程来看,Struts2继承了Struts与WebWork的血脉,Struts2取两者之精华,形成新德框架,但是struts2还是更多的继承了 ...

  9. struts2 Advanced Learning

    catalog . 引言 . struts2的类型转换 . struts2的输入校验 . struts2的拦截器机制 . 使用struts2的Ajax支持 . struts2 OGNL表达式 . st ...

随机推荐

  1. 【转】VMware 11.0 简体中文版|附永久密钥

    VMware 11.0 简体中文版|附永久密钥 昨天,VMware虚拟机11.0 简体中文版正式发布,值得注意的是新版抛弃了32位系统支持,安装包体积大幅减小, 新增Windows 10 技术预览版支 ...

  2. Fckeditor常见漏洞的挖掘与利用整理汇总

    查看编辑器版本号 FCKeditor/_whatsnew.html ------------------------------------------------------------- 2. V ...

  3. Spring AOP和IOC(转载)

    spring 的优点?1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实 ...

  4. Edit conflicts

    Edit conflicts 当副本修改处和服务器版本相同处被修改并下载到本地时,就会发生文件冲突. 操作步骤如下所示: Ø 执行"SVN Update" Ø 若发生冲突,会出现如 ...

  5. win7 PLSQL Developer 10/11/12 连接 Oracle 10/11/12 x64位数据库配置详解(与32位一样,只要注意对应Oracle Instant Client版本) tns 错误和 nls错误

    环境win7 x64 PLSQL Developer 10 与 11 Oracle Instant Client 10 与 12 参考http://blog.csdn.net/chen_zw/arti ...

  6. Jquey模糊选择

    Jquey模糊选择   属性字头选择器(Attribute Contains Prefix Selector): jQuery 属性字头选择器的使用格式是 jQuery(‘[attribute|=va ...

  7. 使用MSSQL同步&发布数据库快照遇到错误:对路径“xxxxx”访问被拒绝的解决方法

    使用MSSQL同步 数据库同步做后后测试:先在同步那台服务器(服务器A)数据库里修改里面数据库,然后再去被同步那台服务器(服务器B)看下数据有没被同步过去 发布数据库快照遇到错误:对路径“xxxxx” ...

  8. SpringBoot-(4)-Filter的使用

    一,Filter Filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到 ...

  9. 剑指Offer:树的子结构【26】

    剑指Offer:树的子结构[26] 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路 分为两步: 第一步:在树A中找到和树B的根节点的值一 ...

  10. Protocol_ISIS

    集成ISIS协议 作者:Danbo 2015-7-5 ISIS的意思是表示中间系统,并且是为OSI无连接网络协议(OSI Conectionless Network Protocol,CLNP)设计的 ...