zoukankan      html  css  js  c++  java
  • JavaWeb -- Struts 数据传输:OGNL和类型转换

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

    OGNLstruts2

    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


     





     

  • 相关阅读:
    cocos2d与cocos2d-X中的draw和update
    poj1673
    hdu2128之BFS
    常用的js效验
    OMCS的语音视频带宽占用
    UML类图详细介绍
    [置顶] 获取激活码,激活myeclipse
    CBO学习----03--选择率(Selectivity)
    notepad++ 文件对比插件
    永远不要在Linux 执行的 10 个最危险的命令
  • 原文地址:https://www.cnblogs.com/xj626852095/p/3648025.html
Copyright © 2011-2022 走看看