Struts2类型转换器

来自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
自定义转换器的的步骤:

  1. 创建一个类实现TypeConverter接口或者继承DefaultTypeConverter
  2. 重写接口中方法,实现类型转换操作
  3. 注册类型转换器

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>

第六步 测试
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值