OGNL和类型转换
- 
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 - /**
- * 地址类
- */
- public class Address {
- private String province;
- private String city;
- private String street;
- public String getProvince() {
- return province;
- }
- public void setProvince(String province) {
- this.province = province;
- }
- public String getCity() {
- return city;
- }
- public void setCity(String city) {
- this.city = city;
- }
- public String getStreet() {
- return street;
- }
- public void setStreet(String street) {
- this.street = street;
- }
- public String toString() {
- return province + "-" + city + "-" + street;
- }
- }
 注册提交Jsp, reg,jsp - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>reg.jsp</title>
- </head>
- <body>
- <s:debug />
- <s:form namespace="/ognl" action="OgnlAction_reg" method="post">
- <s:textfield name="names" label="UserName" />
- <s:textfield name="names" label="UserName" />
- <s:textfield name="ages[0]" label="UserAge" />
- <s:textfield name="ages[1]" label="UserAge" />
- <s:textfield name="namesListNoGen" label="namesListNoGen" />
- <s:textfield name="namesListNoGen" label="namesListNoGen" />
- <s:textfield name="agesListNoGen[0]" label="agesListNoGen" />
- <s:textfield name="agesListNoGen[1]" label="agesListNoGen" />
- <s:textfield name="userList[0].name" label="userList[0].name" />
- <s:textfield name="userList[1].name" label="userList[1].name" />
- <s:textfield name="userList[0].age" label="userList[0].age" />
- <s:textfield name="userList[1].age" label="userList[1].age" />
- <s:textfield name="userMap[100].name" label="userMap[100].name" />
- <s:textfield name="userMap[100].age" label="userMap[100].age" />
- <s:textfield name="userMap[200].name" label="userMap[200].name" />
- <s:textfield name="userMap[200].age" label="userMap[200].age" />
- <s:textfield name="comAddress" label="comAddress"/>
- <s:submit />
- </s:form>
- <s:property value="comAddress"/>
- <s:url includeContext="true" />
- </body>
- </html>
 action - /**
- * OgnlAction
- */
- public class OgnlAction extends ActionSupport {
- private static final long serialVersionUID = -6933309304624396640L;
- private String[] names = new String[2];
- private Integer[] ages = new Integer[2];
- /**
- * 不带泛型的集合
- */
- private List namesListNoGen ;
- private List agesListNoGen ;
- /* javabean集合 */
- private List userList ;
- /* map */
- private Map userMap;
- /* 公司地址 */
- private Address comAddress ;
- public Address getComAddress() {
- return comAddress;
- }
- public void setComAddress(Address comAddress) {
- this.comAddress = comAddress;
- }
- public List getUserList() {
- return userList;
- }
- public void setUserList(List userList) {
- this.userList = userList;
- }
- public Integer[] getAges() {
- return ages;
- }
- public void setAges(Integer[] ages) {
- this.ages = ages;
- }
- public String[] getNames() {
- return names;
- }
- public void setNames(String[] names) {
- this.names = names;
- }
- public String reg() {
- return "success";
- }
- public String toRegView() {
- System.out.println("toRegView");
- return "loginView";
- }
- /**
- * 保存数据,
- */
- public String saveData(){
- ServletActionContext.getRequest().setAttribute("username", "requestTom");
- ServletActionContext.getRequest().getSession().setAttribute("username", "sessionTom");
- ServletActionContext.getServletContext().setAttribute("username", "applicationTom");
- ServletActionContext.getContext().getValueStack().set("username", "vsTom");
- //
- popUserList();
- return "showView" ;
- }
- /**
- * 组装用户集合
- */
- private void popUserList(){
- userList = new ArrayList<User>();
- User u = null ;
- for(int i = 0 ; i < 10 ; i ++){
- u = new User();
- u.setId(1 + i);
- u.setName("tom" + i);
- u.setAge(20 + i);
- userList.add(u);
- }
- }
- public List getNamesListNoGen() {
- return namesListNoGen;
- }
- public void setNamesListNoGen(List namesListNoGen) {
- this.namesListNoGen = namesListNoGen;
- }
- public List getAgesListNoGen() {
- return agesListNoGen;
- }
- public void setAgesListNoGen(List agesListNoGen) {
- this.agesListNoGen = agesListNoGen;
- }
- public Map getUserMap() {
- return userMap;
- }
- public void setUserMap(Map userMap) {
- this.userMap = userMap;
- }
- }
 地址转换器 - /**
- * 地址类型转换器
- */
- public class AddressConverter extends StrutsTypeConverter {
- /**
- * 将字符串转换成地址对象
- */
- public Object convertFromString(Map context, String[] values, Class toClass) {
- if(values != null && values.length > 0){
- String str = values[0];
- String[] ss = str.split("-");
- if(ss != null && ss.length > 2){
- Address a = new Address();
- a.setProvince(ss[0]);
- a.setCity(ss[1]);
- a.setStreet(ss[2]);
- return a ;
- }
- }
- return null;
- }
- /**
- * 将地址对象转换成字符串信息
- */
- public String convertToString(Map context, Object o) {
- if(o instanceof Address){
- return o.toString();
- }
- return null;
- }
- }
 OgnlAction-conversion.properties 转换类型配置, 放在action同目录,命名方式固定 - Element_agesListNoGen=java.lang.Integer
- Element_userList=cn.itcast.struts2.model.User
- Element_userMap=cn.itcast.struts2.model.User
- Key_userMap=java.lang.Integer
- #comAddress=cn.itcast.struts2.ognl.AddressConverter
 xwork-conversion.properties 类型转换,全局配置文件,放在src目录下,命名固定 - cn.itcast.struts2.model.Address=cn.itcast.struts2.ognl.AddressConverter
 
OGNL和类型转换的更多相关文章
- JavaWeb -- Struts 数据传输:OGNL和类型转换
		1. 数据传输:OGNL和类型转换 OGNL和struts2 OGNL:Object-Graph Navigation Language. OGNL是集成进struts框架中比较强大的技术有助于数据传 ... 
- struts1和struts2的区别
		1. 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类:Struts 1的一个具体问题是使用抽象类编程而不是接口.Struts 2 Action类可以实现一个Acti ... 
- 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)
		轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ... 
- Struts与Struts2的区别
		Struts与Struts2的区别 首先看一张Struts2的发展路线图: 从Struts2的发展过程来看,Struts2继承了Struts与Webwork的特性,形成了新的框架.但是它的 ... 
- Struts2相关面试题
		Struts2面试题 1.struts2工作流程 Struts 2框架本身大致可以分为3个部分: 核心控制器FilterDispatcher.业务控制器Action和用户实现的企业业务逻辑组件. 核心 ... 
- 浅谈 Struts2 面试题收藏
		Struts2面试题 一.工作原理 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 这个请求经过一系列的过滤器(Fi ... 
- java SSH框架详解(面试和学习都是最好的收藏资料)
		Java—SSH(MVC)1. 谈谈你mvc的理解MVC是Model—View—Controler的简称.即模型—视图—控制器.MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开.MVC ... 
- Struts2与Struts的区别
		Struts2与Struts的区别 从Struts2的发展过程来看,Struts2继承了Struts与WebWork的血脉,Struts2取两者之精华,形成新德框架,但是struts2还是更多的继承了 ... 
- struts2 Advanced Learning
		catalog . 引言 . struts2的类型转换 . struts2的输入校验 . struts2的拦截器机制 . 使用struts2的Ajax支持 . struts2 OGNL表达式 . st ... 
随机推荐
- sublime  汇总
			此文内容有原创,还有各种其他博客抄来的经验,技巧,纯属个人使用心得. http://www.cnblogs.com/figure9/p/sublime-text-complete-guide.html ... 
- import caffe时出错:can not find module skimage.io
			import caffe时出错:can not find module skimage.io //以下内容在ubuntu16.4上实际验证过.注意大小写的.----20170605 在命令行输入Py ... 
- 基于LRU Cache的简单缓存
			package com.test.testCache; import java.util.Map; import org.json.JSONArray; import org.json.JSONExc ... 
- Python中十六进制和字符串的转换(转载)
			调用Python内置int()函数把该字串转为数字.以下为在Python解释器编程环境下的操作示范: 把十六进制的字串转为十进制数字:Python代码>>> print int('f ... 
- ios 博客集合
			ryantang03 http://blog.csdn.net/ryantang03/article/category/1073221 kmyhy http://blog.csdn.net ... 
- 用live555将内网摄像机视频推送到外网服务器,附源码
			最近很多人问,如何将内网的摄像机流媒体数据发布到公网,如果用公网与局域网间的端口映射方式太过麻烦,一个摄像机要做一组映射,而且不是每一个局域网都是有固定ip地址,即使外网主机配置好了每一个摄像机的映射 ... 
- EasyDarwin开源流媒体服务器性能瓶颈分析及优化方案设计
			EasyDarwin现有架构介绍 EasyDarwin的现有架构对网络事件的处理是这样的,每一个Socket连接在EasyDarwin内部的对应存在形式就是一个Session,不论是RTSP服务对应的 ... 
- Linux环境编程之同步(三):读写锁
			概述 相互排斥锁把试图进入我们称之为临界区的全部其它线程都堵塞住.该临界区通常涉及对由这些线程共享一个或多个数据的訪问或更新.读写锁在获取读写锁用于读某个数据和获取读写锁用于写直接作差别. 读写锁的分 ... 
- MARA 附加结构(增强字段)
- mac10.10 打造Python多版本虚拟环境
			一.简介 1.在操作系统mac10.10(yosemite)中搭建Python多版本虚拟环境: 2.多版本虚拟环境包含三个含义: 在一个操作系统中安装多个版本的Python,不同版本可以随意切换,例如 ... 
