Struts2中㡰自定义数据转换器,自定义拦截器,避免表单重复提交的总结

1.自定义拦截器
      
开发自定义类型转换的开发步骤(  继承StrutsTypeConverter类,重写两个方法 )
    * 编写类型转换器
        > 实现TypeConverter接口,实现一个方法
            * Object convertValue(Map<String,Object> context,Object target, Member member,String propertyName,Object value,Class toType);

        > 继承DefaultTypeConverter类,重写一个方法
            * Object convertValue(Map<String,Object> context,Object value,Class toType)

        > 继承StrutsTypeConverter类,重写两个方法
            * Object convertFromString(Map context,String[] values,Class toClass)
                > 从字符串转换成具体类型
                > values数组,存入的值就是用户输入的值(要转换的值 1981/12/1)
                > toClass 要转换的数据的类型 Date.class

            * String convertToString(Map context,Object o)
                > 把具体的类型转换成字符串
                > o 代表的要转换的数据(Date类型的数据)

        > 注意:类型转换本身就是一个双向的过程:
            * JSP ---> Action   String ---> 某个类型
            * Action ---> JSP   某个类型 ---> String               

    * 类型转换的代码,以 1990/10/10 为例,自定义日期转换器,完成转换,下面这段代码是第二种方法,也就是继承了DefaultTypeConverter类。
        public Object convertValue(Map<String, Object> context, Object value,
            Class toType) {
            // 根据toType判断 是请求封装 还是 数据回显
            DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
            if (toType == Date.class) {
                // 请求参数封装 (value是字符串)
                String[] params = (String[]) value;
                String strVal = params[0]; // 转换为 日期类型
                try {
                    return dateFormat.parse(strVal);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            } else {
                // 回显(value是 Date)
                Date date = (Date) value;
                return dateFormat.format(date);
            }
            return null;
        }

    * 注册类型转换器(包含两种方式)
        > 局部注册:针对某个表单中的某个字段生效的!
            * 属性驱动的方式:使用set方法接收数据
                > 注意:在Action所在的包下创建一个文件,文件的格式是:Action类名-conversion.properties文件,该文件中配置要转换数据的字段和对应的转换器全路径
                    * 例如:birthday=cn.itcast.demo3.MyDateConverter

            * 模型驱动的方式:实现ModelDriven接口的方式
                > 注意:在实体类所在的包下创建一个文件,文件的格式是:实体类名-conversion.properties文件,该文件中配置要转换数据的字段和对应的转换器全路径
                    * 例如:birthday=cn.itcast.demo3.MyDateConverter

        > 全局注册:针对整个项目的所有的日期类型都会生效的!
            * 在src的目录下,创建一个xwork-conversion.properties  (名称是固定的)
                > 例如:java.util.Date=cn.itcast.demo3.MyDateConverter
=======================================================================
2.自定义拦截器( 继承AbstractInterceptor实现类 )

1.编写拦截器,需要实现Interceptor接口,实现接口中的三个方法。
    * interceptor接口有很多的实现类,编写最简单的方式就是继承AbstractInterceptor实现类。     
    * 代码例如:
        public String intercept(ActionInvocation invocation) throws Exception {
            User user = (User) ServletActionContext.getRequest().getSession().getAttribute("existUser");
            if(user == null){
                ActionSupport as = (ActionSupport) invocation.getAction();
                as.addActionError("您没有登陆!");
                return as.LOGIN;
            }else{
                // 放行
                return invocation.invoke();
            }
        }

    * 需要在struts.xml中进行拦截器的配置,配置一共有两种方式:
        > 第一种方式
            * 在<package>包中定义拦截器,出现在<package>包的上方
                <interceptors>
                    <interceptor name="loginInterceptor" class="cn.itcast.interceptor.LoginInterceptor"></interceptor>
                </interceptors>         

            * 在某个action中引入拦截器
                <interceptor-ref name="loginInterceptor"></interceptor-ref>

                * 注意:如果引入了自己定义的拦截器,那么Struts2框架默认的拦截器就不会再执行了,所以需要引入Struts2默认的拦截器。
                    <interceptor-ref name="defaultStack"></interceptor-ref>             

        > 第二种方式
            * 在<package>包中定义拦截器的时候,自己直接定义一个拦截器栈
                <interceptors>
                    <interceptor name="loginInterceptor" class="cn.itcast.interceptor.LoginInterceptor"/>
                    <interceptor-stack name="myStack">
                        <interceptor-ref name="loginInterceptor"/>
                        <interceptor-ref name="defaultStack"/>
                    </interceptor-stack>
                </interceptors>

            * 在Action包中引入自己定义的拦截器栈
                <action name="book_*" class="cn.itcast.action.BookAction" method="{1}">
                    <interceptor-ref name="myStack"/>
                </action>


=========================================================================
3 .防止表单的重复提交

 
在Struts2的框架中防止表单的再次提交呢!
    * 在页面中的表单标签中使用<s:token/>的标签,通过查询浏览器的源代码能发现使用<s:token>会生成一个唯一的字符串。在隐藏域中。
    * 后台需要在Action的标签中引入token的拦截器,
        <interceptor-ref name="defaultStack"/>
        <interceptor-ref name="token"/>
    * 在action标签中配置result结果视图
        <result name="invalid.token">/demo6/error.jsp</result>














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值