来自struts2深入详解
内置类型转换
null属性的处理 了解
对list,map和set的支持
对于原始的版本了解一下就行了:如下
因为上面的books是list,但是没有声明books的类型。需要配置books的类型是Book。
Element_books=org.sunxin.struts2.ch11.model.list.Book
这样就完成了,接下来配置xml文件,测试就完事了
set的有些不同
这就是泛型的好处
升级版本 加上泛型,也就是目前最常用的
list
public class RegisterAction extends ActionSupport {
private List<Register> registers;
public List<Register> getRegisters() {
return registers;
}
public void setRegisters(List<Register> registers) {
this.registers = registers;
}
public String execute() throws Exception {
return SUCCESS;
}
}
map
public class RegisterHashMapAction extends ActionSupport {
private Map<String,Register> maps=new HashMap<String, Register>();
public Map<String, Register> getMaps() {
return maps;
}
public void setMaps(Map<String, Register> maps) {
this.maps = maps;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
}
set
public class RegisterSetAction extends ActionSupport {
private Set<Register> registers=new LinkedHashSet<Register>();
public Set<Register> getRegisters() {
return registers;
}
public void setRegisters(Set<Register> registers) {
this.registers = registers;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
}
以上是action加上泛型的升级版本
自定义类型转换器(重要)
Struts2提供常规类型转换器,可以实现常用类型的转换,但是如果目标类型是一个特殊类型,则需要自定义转换器
Struts2 类型转换器实际上都是基于OGNL实现的,在OGNL项目中,有一个TypeConverter接口
自定义类型转换器必须实现 ongl.TypeConverter接口
package ognl;
public interface TypeConverter {
java.lang.Object convertValue(java.util.Map map, java.lang.Object o, java.lang.reflect.Member member, java.lang.String s, java.lang.Object o1, java.lang.Class aClass);
}
package ognl;
public class DefaultTypeConverter implements ognl.TypeConverter {
public DefaultTypeConverter() { /* compiled code */ }
public java.lang.Object convertValue(java.util.Map context, java.lang.Object value, java.lang.Class toType) { /* compiled code */ }
public java.lang.Object convertValue(java.util.Map context, java.lang.Object target, java.lang.reflect.Member member, java.lang.String propertyName, java.lang.Object value, java.lang.Class toType) { /* compiled code */ }
}
package org.apache.struts2.util;
public abstract class StrutsTypeConverter extends com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter {
public StrutsTypeConverter() { /* compiled code */ }
public java.lang.Object convertValue(java.util.Map context, java.lang.Object o, java.lang.Class toClass) { /* compiled code */ }
protected java.lang.Object performFallbackConversion(java.util.Map context, java.lang.Object o, java.lang.Class toClass) { /* compiled code */ }
public abstract java.lang.Object convertFromString(java.util.Map map, java.lang.String[] strings, java.lang.Class aClass);
public abstract java.lang.String convertToString(java.util.Map map, java.lang.Object o);
}
原文:https://blog.csdn.net/u013087513/article/details/60867351
自定义转换器的的步骤:
- 创建一个类实现TypeConverter接口或者继承DefaultTypeConverter
- 重写接口中方法,实现类型转换操作
- 注册类型转换器
1.创建一个自定义类型转换器(有三种方式)
方式一:实现TypeConverter需要重写(不推荐实现接口)
public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType);
如果实现接口,这个方法参数太多(6个)
方式二:可以继承DefaultTypeConverter类
优点:重写的方法参数没有那么多
public Object convertValue(Map<String, Object> context, Object value, Class toType) {
return convertValue(value, toType);
}
方式三:(推荐使用)继承DefaultTypeConverter类的一个子类StrutsTypeConverter
public abstract Object convertFromString(Map context, String[] values, Class toClass);——请求封装
public abstract String convertToString(Map context, Object o);——数据回显
类型转换器一直都是双向转换:
页面提交的请求参数,封装到model——需要转换
model数据 需要在页面上回显——需要转换
2.怎样注册一个自定义类型转换器
注册方式有三种类型:
方式一:局部—针对于action
配置文件所在的位置及名称:在Action类所在包下,创建 Action类名-conversion.properties
配置文件书写:格式 属性名称=类型转换器的全类名
方式二:局部—针对于Model(属性驱动模式二)
配置文件所在位置以及名称:在Model类所在包,创建 Model类名-conversion.properties
配置文件书写:格式 属性名称=类型转换器的全类名
方式三:全局
配置文件所在位置以及名称:在src下创建一个 xwork-conversion.properties
配置文件书写 格式:要转换的类型全名=类型转换器的全类名
注意:
对于struts2中类型转换器,如果表单数据提交时,将数据向model封装,出现了问题,会报错:
No result defined for action cn.itcast.action.RegistAction and result input
上面的意思是说,在RegistAction的配置中没有配置input结果视图.
<action name="regist" class="cn.itcast.action.RegistAction">
<result name="input">/success.jsp</result>
</action>
如果配置了,出现类型转换问题,就会跳转到input指定的视图。
问题:为什么会向input视图跳转?
是因为struts2中的拦截器(interceptor).
在struts2中的conversionError拦截器用于记录类型转换问题
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
在struts2中的workflow拦截器用于得到问题,向input视图跳转。
<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
类型转换中的错误处理:
Struts2提供了一个名为conversionError的拦截器,查看struts-default.xml
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
如果Struts2的类型转换器执行类型转换时出现错误,该拦截器将负责将对应错误封装成表单域错误(FieldError),并将这些错误信息放入ActionContext中
使用类型转换中的错误处理用户定义Action必须继承ActionSupport
在自定义类型转换器中,异常必须抛出不能捕获,conversionError会处理该异常,然后转入名为input的逻辑视图
在Action所在包中,创建 ActionName.properties,在局部资源文件中配置提示信息 :invalid.fieldvalue.属性名= 错误信息
在input逻辑视图所对应jsp页面中,通过<s:fielderror/>
输出类型转换信息
介绍
案例
第一步 前端MyColor.jsp和回显页面ShowColor.jsp
<%--
Created by IntelliJ IDEA.
User: Rain
Date: 2019/4/4
Time: 17:16
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title></title>
</head>
<body>
<h2>请输入你喜欢的颜色</h2>
<s:form action="colors" >
<s:textfield name="color" label="颜色"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: Rain
Date: 2019/4/4
Time: 17:35
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>20177721047任思雨</title>
</head>
<body>
<s:debug/>
<p style="color: <s:property value="color"/> ">这是你选择的文字颜色,代码是:<s:property value="color"/></p>
</body>
</html>
第二步 Action
package action;
import com.opensymphony.xwork2.ActionSupport;
/**
* @ Author : Rain
* @ Classname : ColorAction
* @ Date : 2019/4/4 17:22
* @ Description:
*/
public class ColorAction extends ActionSupport {
private String color;
public void setColor(String color) {
this.color = color;
}
public String getColor() {
return color;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
第三步 ColorConvert.java
package convert;
import ognl.DefaultTypeConverter;
import java.util.Map;
/**
* @ Author : Rain
* @ Classname : ColorConvert
* @ Date : 2019/4/4 17:44
* @ Description:
*/
public class ColorConvert extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
String string = ((String[]) value)[0];
try{
if (toType == String.class){
String[] color = string.split(",");
String str = "#";
for (String x:color)
{
str+= Integer.toHexString(Integer.parseInt(x));
}
return str;
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
第四步 注册转换器
ColorAction-conversion.properties
color=convert.ColorConvert
第五步 struts.xml
<package name="default" namespace="/" extends="struts-default">
<action name="colors" class="action.ColorAction">
<result name="input">/ShowColor.jsp</result>
</action>
</package>
第六步 测试