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

JavaWeb -- Struts 数据传输:OGNL和类型转换的更多相关文章

  1. OGNL和类型转换

    转载 JavaWeb -- Struts 数据传输:OGNL和类型转换 1. 数据传输:OGNL和类型转换 OGNL和struts2 OGNL:Object-Graph Navigation Lang ...

  2. Struts 2 OGNL

    1.什么是OGNL? 2.Struts 2 OGNL 表达式      ======================  华丽丽的分割线  ======================  1.什么是OG ...

  3. struts基于ognl的自动类型转换需要注意的地方

    好吧,坎坷的过程我就不说了,直接上结论: 在struts2中使用基于ognl的自动类型转换时,Action中的对象属性必须同时添加get/set方法. 例如: 客户端表单: <s:form ac ...

  4. Struts(十九):类型转换、类型转换错误消息及显示

    类型转换概念 1.从html表单页面到一个Action对象,类型转化是从字符串到一个非字符串:html并没有“类型”的概念,每个表单输入的信息都只可能是一个字符串或者一个字符串数组,但是在服务器端,必 ...

  5. Struts学习总结-02 类型转换

    一 类型转换 input.jsp <%@ page language="java" import="java.util.*" pageEncoding=& ...

  6. struts的ognl.NoConversionPossible错误

    JSP页面便利集合的时候,代码如下 <s:iterator value="storageList" id="stList" status="st ...

  7. Struts(二十一):类型转换与复杂属性、集合属性配合使用

    背景: 本章节主要以复杂属性.集合属性类型转化为例,来学习这两种情况下怎么使用. 复杂对象属性转换场景: 1.新建struts_04 web.xml <?xml version="1. ...

  8. struts与ognl结合【重要】

    -----------------------------ognl表达式------------------------ OGNL:对象视图导航语言.  ${user.addr.name} 这种写法就 ...

  9. java框架篇---struts之OGNL详解

    OGNL(Object Graph Navigation Language),是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性.调用Java对象树的方法. ...

随机推荐

  1. jQuery.each(object, [callback])数组对象操作--jQuery 对象访问 $().each(callback)

    jQuery.each(object, [callback]) 通用例遍方法,可用于例遍对象和数组. 不同于例遍 jQuery 对象的 $().each() 方法,此方法可用于例遍任何对象.回调函数拥 ...

  2. 3年工作经验的Java程序员面试经

    转发自用~ 一.Java基础部分 1.使用length属性获取数组长度,public.private.protected.friendly区别 2.Collection和Collections区别 3 ...

  3. java操作mongoDB数据库的简单实例

    首先导入mongoDB的jar包 http://pan.baidu.com/s/1bnGMJRD //DataBase.java package com.mongodb.test; import ja ...

  4. mfc 对话框程序 托盘实现

    1 在头文件里面定义 消息 #define WM_SHOWTASK WM_USER+10 在主窗口类里面定义 一个变量 两个函数 a 变量 托盘结构体的变量 NOTIFYICONDATA m_nid; ...

  5. IO 之 File 类

    位于 java.io 包 用来将文件或者文件夹封装成对象 方便对文件和文件夹的属性信息进行操作 File 对象可以作为参数传递给流的构造函数 构造函数 // 可以将一个已存在的, 或者不存在的文件或者 ...

  6. .net 存储过程中的 output参数取值问题

    当存储过程中多个结果需要返回时经常需要用到output类型的参数,如果存储过程没有返回结果集只是输出output类型参数时使用如下代码: db.AddOutParameter(dbCmd, " ...

  7. 我的Android进阶之旅------>Android studio 如何修改工程的包名

    关于用Android Studio修改Android APP的应用包名的问题,今天遇到了一个坑,这里记录一下. 这里用一个简单的Demo来展示在Android Studio中如何修改Android P ...

  8. CSDN2015博客之星评选之拉票环节

    最近接到CSDN邀请,参加了CSDN 2015博客之星 的评选活动,下面是给我拉票的链接地址: http://vote.blog.csdn.net/blogstar2015/candidate?use ...

  9. MySQL(多表的表记录的查询)

    一.外键约束 1.创建外键 --- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMAR ...

  10. HDU1158:Employment Planning(线性dp)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1158 这题又是看了题解,题意是一项工作需要n个月完成,雇佣一个人需要m1的钱,一个人的月工资为sa,辞退一 ...