坠落凡间的struts2(3)---struts2的类型转换
来源:互联网 发布:相片美化软件 编辑:程序博客网 时间:2024/04/27 16:57
struts2中的通配符
在struts2的配置文件中可以使用通配符,这样可以减化配置文件,但是降低了可读性
我们使用通配符那就必须有一个统一的约定.否则通配符将无法成立
看下面的例子.
(1)先看我们的action配置
<package name="user" extends="struts-default" namespace="/">
<action name="user_*" class="com.test.action.UserAction" method="{1}">
<result>/user_{1}.jsp</result>
</action>
</package>
带红字的解释下,第一个带"*" 表示的是 后面匹配任意字符...这个很容易理解
{1}表示的是第一个"*"的内容...注意,这里的大括号,比如,如果是user_add .那么{1}就是表示 add ..
当然,这里只有一个"*".你可以有两个,甚至三个四个..比如这样写 *_* 这样就是两个"*" .那么我们也可以用{1},{2}来分别的表示他们.
看下面的例子.
(1)先看我们的action配置
<package name="user" extends="struts-default" namespace="/">
<action name="user_*" class="com.test.action.UserAction" method="{1}">
<result>/user_{1}.jsp</result>
</action>
</package>
带红字的解释下,第一个带"*" 表示的是 后面匹配任意字符...这个很容易理解
{1}表示的是第一个"*"的内容...注意,这里的大括号,比如,如果是user_add .那么{1}就是表示 add ..
当然,这里只有一个"*".你可以有两个,甚至三个四个..比如这样写 *_* 这样就是两个"*" .那么我们也可以用{1},{2}来分别的表示他们.
对于这样的花东西我们可以不使用,但一定要知道。
struts2中的模型驱动
struts2分为模型驱动和属性驱动,一般我们使用的都是属性驱动
而模型驱动,一般开发中基本不用,但我们还是需要知道,至少是用法。
模型类:
package org.senssic.model;public class MPer {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
action类需要实现ModelDriven接口
package org.senssic.action;import org.senssic.model.MPer;import com.opensymphony.xwork2.ModelDriven;public class MAction implements ModelDriven<MPer> {private final MPer mPer = new MPer();//即是这个地方是mPer在jsp中也是使用model.xxx获取模型类的属性的private String name;//如果存在action中覆盖model中的属性,在struts的stack中哪个在头先会被现实,一般是不能覆盖model中的属性显示的public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic MPer getModel() {// TODO Auto-generated method stubreturn mPer;}public String execute() throws Exception {mPer.setName("啦啦啦德玛西亚。");mPer.setAge(20);this.name = "aaaaaaaa";return "success";}}jsp文件:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>名字:${name}<br>年龄:${age}或者<br>名字:${model.name}<br>年龄:${model.age}<s:debug></s:debug></body></html>注:如果存在action中覆盖model中的属性,在struts的stack中哪个在头先会被现实,一般是不能覆盖model中的属性显示的
action的异常处理
异常类:需要继承exception类
package org.senssic.exception;public class MyEeption extends Exception {private static final long serialVersionUID = 1L;public MyEeption(String msg) {super(msg);}}
action类:
package org.senssic.action;import org.senssic.exception.MyEeption;public class EAction {public String execute() throws Exception {int i = 5;if (i > 4) {throw new MyEeption("你的数字大于5啦啦啦");}return "success";}}
struts.xml中的配置:
struts2的类型转换器
有三种方式可以写转换器
实现TypeConverter接口
继承DefaultTypeConverter类
继承StrutsTypeConverter类
继承DefaultTypeConverter类
继承StrutsTypeConverter类
三种方式的原理是一样的,因为strutsTypeConverter是继承DefaultTypeConverter,而DefaultTypeConverter是实现TypeConverter接口的,
内部通过拦截器实现调用的,我们写转换器只需要实现public Object convertValue(Map<String, Object> context, Object value,Class toType) 方法
一般继承DefaultTypeConverter,但是使用StrutsTypeConverter更为方便,直接将上面的那个函数拆分成两个函数利于理解
转换文件的配置:
局部转换配置文件XXX-conversion.properties:
在Action类目录下放置ActionName-conversion.properties文件 。
在properties文件中的内容为:
Action属性名称=类型转换器的全类名
score=org.senssic.convertion.MConvertion
全局转换配置文件xwork-conversion.properties:
在WEB-INF/classes下放置xwork-conversion.properties文件 。
在properties文件中的内容为:
待转换的类型=类型转换器的全类名
org.senssic.type.Score=org.senssic.convertion.MConvertion
在Action类目录下放置ActionName-conversion.properties文件 。
在properties文件中的内容为:
Action属性名称=类型转换器的全类名
score=org.senssic.convertion.MConvertion
全局转换配置文件xwork-conversion.properties:
在WEB-INF/classes下放置xwork-conversion.properties文件 。
在properties文件中的内容为:
待转换的类型=类型转换器的全类名
org.senssic.type.Score=org.senssic.convertion.MConvertion
继承DefaultTypeConverter类
需要转换的类型:
package org.senssic.type;public class Liger {private String tiger;private String lion;private int day;public String getTiger() {return tiger;}public void setTiger(String tiger) {this.tiger = tiger;}public String getLion() {return lion;}public void setLion(String lion) {this.lion = lion;}public int getDay() {return day;}public void setDay(int day) {this.day = day;}}
转换处理器:
package org.senssic.action;import java.util.Map;import org.senssic.type.Liger;import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;public class TypeConverter extends DefaultTypeConverter {@Overridepublic Object convertValue(Map<String, Object> context, Object value,Class toType) {// 转向String类型的if (toType == String.class) {Liger liger = (Liger) value;return liger.getTiger() + "-" + liger.getLion() + "-"+ liger.getDay();} else if (toType == Liger.class) {String[] param = ((String[]) value)[0].split("-");Liger liger = new Liger();liger.setTiger(param[0]);liger.setLion(param[1]);liger.setDay(Integer.parseInt(param[2])); return liger;}return super.convertValue(context, value, toType);}}
jsp页面输入数据:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><s:form action="/converter"> <s:textfield name="liger" ></s:textfield> <s:submit value="提交"></s:submit></s:form><s:debug></s:debug></body></html>
jsp页面输出:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>${msg}<br>老虎的名字:${liger.tiger}<br>狮子的名字:${liger.lion}<br>他们在一起的时间:${liger.day}<s:debug></s:debug></body></html>
action处理类:
package org.senssic.action;import org.senssic.type.Liger;public class ConverterAction {private Liger liger;private String msg;public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Liger getLiger() {return liger;}public void setLiger(Liger liger) {this.liger = liger;}public String execute() throws Exception {this.msg = "狮虎兽是因为老虎和狮子呆在一起时间长了,产生的一种动物。需要条件,一个狮子,一个老虎,一个时间";/* * this.liger = new Liger(); liger.setTiger("小白虎"); * liger.setLion("小黑狮"); liger.setDay(3); */return "success";}}
局部转换器:
输入:
输出:
继承StrutsTypeConverter类
package org.senssic.converter;import java.util.Map;import org.apache.struts2.util.StrutsTypeConverter;import org.senssic.type.Liger;public class TypeConverter extends StrutsTypeConverter {@Overridepublic Object convertFromString(Map paramMap, String[] paramArrayOfString,Class paramClass) {String[] pStrings = paramArrayOfString[0].split("-");Liger liger = new Liger();liger.setTiger(pStrings[0]);liger.setLion(pStrings[1]);liger.setDay(Integer.parseInt(pStrings[2]));return liger;}@Overridepublic String convertToString(Map paramMap, Object paramObject) {Liger liger = (Liger) paramObject;return liger.getTiger() + "-" + liger.getLion() + "-" + liger.getDay();}}
测试结果同上,注意全局转换的写法:
注:
类型转换出错提示
改写错误提示信息
全局信息
资源文件中加入:xwork.default.invalid.fieldvalue={0} 转换出错
属性信息
增加ActionName.properties文件
增加invalid.fieldvalue.属性名=出错信息
改写错误提示信息
全局信息
资源文件中加入:xwork.default.invalid.fieldvalue={0} 转换出错
属性信息
增加ActionName.properties文件
增加invalid.fieldvalue.属性名=出错信息
- 坠落凡间的struts2(3)---struts2的类型转换
- 坠落凡间的struts2(5)---拦截器
- 坠落凡间的struts2(2)---struts2的文件配置
- 坠落凡间的struts2(1)---struts2的配置与安装
- 坠落凡间的struts2(7)---struts2的国际化
- 坠落凡间的struts2(8)---struts2的标签
- 坠落凡间的struts2(9)---struts2和struts1区分
- 坠落凡间的struts2(4)---数据的校验
- 坠落凡间的struts2(6)---文件的上传下载
- 白羊座,一个坠落于凡间的精灵
- 【Struts2】:Struts2的类型转换
- Struts2的类型转换
- struts2的类型转换
- struts2的类型转换
- Struts2的类型转换
- Struts2的类型转换
- struts2 的类型转换
- struts2的类型转换
- android 内存优化 性能优化 .
- 总结
- Ehcache 集群示例系列3:JGroups UDP协议方式
- 错过第一现场后还从dump中分析出线索吗
- asp.net中水印的实现代码
- 坠落凡间的struts2(3)---struts2的类型转换
- Lucene 4.4 使用通配符搜索
- 【DDL】DDL的隐式commit和自治事务
- PHICH
- ORA-20011: Approximate NDV failed: ORA-29913: error in executing ODCIEXTTABLEOPEN callout
- GDI+ 编译问题
- wireshark设置抓服务器的包
- List<T> 排序问题分享
- asset中获取文件并读取数据