• 【struts2】继承ActionSupport类


      在Struts2中,Action可以不实现任何特殊的接口或者继承特殊的类,仅仅是一个POJO(Plain Old Java Object,简单的Java对象)就可以;也可以实现Xwork2中的Action接口;但是由于Xwork的Action接口非常简单,为程序员提供的帮助有限,因此,在实际开发中,会更多的使用继承ActionSupport类来实现Action的方式,如下所示:

    import com.opensymphony.xwork2.ActionSupport;  
    public class HelloWorldAction extends ActionSupport {  
        //省略了  
    }  

      ActionSupport类本身实现了Action接口,所以继承ActionSupport类就相当于实现了Action接口。除此之外,ActionSupport类还实现了其它几个接口,来为程序员提供更多使用的功能,这些接口和Struts2的一些其他特性相结合,可以实现基本的数据验证功能和国际化。接口如下所示:

    com.opensymphony.xwork2.Validateable;  //提供validate()方法来为Action增加验证的功能
    com.opensymphony.xwork2.Validateaware; //提供方法来保存和恢复action或field级的错误信息
    com.opensymphony.xwork2.TextProvider;  //提供获取本地信息文本的功能
    com.opensymphony.xwork2.LocaleProvider;//提供getLocale()方法来获取本地消息

      1)基本的数据验证

    • 要实现数据验证的功能,只需要在Action类中覆盖实现validate方法即可;在validate方法内部,对请求传递过来的数据进行校验,如果不满足要求,那么添加例外信息到父类用于存放例外的集合中。示例代码如下:
    package cn.javass.hello.struts2impl.action;  
    
    import com.opensymphony.xwork2.ActionSupport;
      
    public class HelloWorldAction extends ActionSupport {  
        private String account;  
        private String password;  
        private String submitFlag;  
        public String execute() throws Exception {  
            this.businessExecute();  
            return "toWelcome";  
        }  
        public void validate(){  
            if(account==null || account.trim().length()==0){  
                this.addFieldError("account", "账号不可以为空");  
            }  
            if(password==null || password.trim().length()==0){  
                this.addFieldError("password", "密码不可以为空");  
            }
            if(password!=null && !"".equals(password.trim()) && password.trim().length()<6){  
                this.addFieldError("password", "密码长度至少为6位");  
            }  
        }  
        /** 
         * 示例方法,表示可以执行业务逻辑处理的方法, 
         */  
        public void businessExecute(){  
            System.out.println("用户输入的参数为==="+"account="+account+",password="+password+",submitFlag="+submitFlag);  
        }
        public String getAccount() {
            return account;
        }
        public void setAccount(String account) {
            this.account = account;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getSubmitFlag() {
            return submitFlag;
        }
        public void setSubmitFlag(String submitFlag) {
            this.submitFlag = submitFlag;
        }  
        
    }  
    View Code

      从上面的示例可以看出,在validate方法中,可以对用户请求中传递过来的数据进行验证,同一个数据可以进行多方面的验证。

      如果验证结果是数据不正确,那么就使用父类提供的addFieldError方法来添加验证的错误消息。addFieldError方法有两个参数,前面的是消息的key值,后面是具体的消息。

    • 细心的你肯定发现了,validate方法是没有返回值的,那么当验证后,如果有数据没有通过验证,该返回到什么页面呢?这就需要在struts.xml中的Action配置里面,添加一个名称为input的result配置,也就是说,如果validate方法中,有数据没有通过验证,那么会自动跳转回到该action中名称为input的result所配置的页面。示例如下:
    <?xml version="1.0" encoding="UTF-8" ?>  
    <!DOCTYPE struts PUBLIC  
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
        "http://struts.apache.org/dtds/struts-2.0.dtd">  
    <struts>  
        <constant name="struts.devMode" value="true" />        <!-- 设置了程序的运行模式 -->
        <constant name="struts.locale" value="zh_CN"/>         <!-- 设置程序运行所使用的locale -->
        <constant name="struts.i18n.encoding" value="utf-8"/>  <!-- 设置程序运行时用的编码方式 -->
        <!-- 正确设置后面两个参数,就可以解决Struts2的中文问题了。 -->
        
      
        <package name="helloworld"  extends="struts-default">  
            <action name="helloworldAction" class="cn.javass.hello.struts2impl.action.HelloWorldAction">  
                <result name="toWelcome">/s2impl/welcome.jsp</result> 
                 <result name="input">/s2impl/login.jsp</result>   
            </action>  
        </package>  
        
    </struts> 
    View Code
    • 当输入信息不满足条件的时候,将错误信息显示在前台页面上,代码如下:
    <%@ page language="java" contentType="text/html; charset=utf-8"  
        pageEncoding="utf-8"%> 
    <%@ taglib prefix="s" uri="/struts-tags"%> 
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; utf-8">  
    <title>Insert title here</title>  
    <style type="text/css">
    ul,li {
        list-style-type:none;
        margin:0px;
        float:left;
    }
    </style>
    </head>  
    <body>  
       
    <form action="/struts2Deepen2/helloworldAction.action" method="post"> 
        <input type="hidden" name="submitFlag" value="login"/>  
        <div> 
            <font color=red><s:fielderror fieldName="account"/></font>
            <br/>
              账号:<input type="text" name="account">
        </div>
        <div>
            <font color=red><s:fielderror fieldName="password"/></font>
            <br/>
                密码:<input type="password" name="password">
        </div>
        <input type="submit" value="提交">  
    </form>  
      
    </body>  
    </html>  
    View Code

      在JSP页面中利用<s:fielderror/>标签在相应的字段处输出错误信息。但是,在实际开发中,<s:fielderror/>它会输出全部的错误信息内容。而如果想选择性地输出指定错误信息。我们可以使用如下代码解决:

    <!-- 方法一 -->
    <s:fielderror>  
      <s:param>username</s:param> <!--显示指定的 username字段的 错误消息-->  
    <s:fielderror/>
    
    <!-- 方法二 -->
    <s:fielderror fieldName="username"/> <!--显示指定的 username字段的 错误消息-->  
    • 通过这个示例,你会发现,validate方法会先于execute方法被执行,只有validate方法执行后,又没有发现验证错误的时候,才会运行execute方法,否则会自动跳转到你所配置的input所对应的页面。

      2)访问本地信息

      在上面的示例中,你会发现在validate方法中,添加验证错误消息的时候,是采用的硬编码方式,也就是直接写死的字符串,这是很不好的:

      ① 不容易修改,比如要改变消息的内容,还得重新修改和编译类;

      ② 不利于国际化,如果要把中文的信息变换成英文的呢,同样要重新修改和编译类。

      可以通过访问本地信息的方式,把这些错误消息放置到Action类外部的配置文件中,在Action类内部只需要按照这些消息的key值去获取消息即可。这样一来,当消息发生变化的时候,只需要修改这个消息的配置文件即可。

    • 先来建立消息的配置文件,在Action类的路径下建立一个同名的properties文件,也就是文件名为HelloWorldAction.properties,然后在里面按照key=value的格式,添加要使用的错误消息。示例如下:
    k1=u5E10u53F7u4E0Du5141u8BB8u4E3Au7A7A
    k2=u5BC6u7801u4E0Du5141u8BB8u4E3Au7A7A
    k3=u5BC6u7801u957Fu5EA6u5FC5u987Bu57286u4F4Du4EE5u4E0A

      可能你会觉得很奇怪,这都是些什么呀?其实是把中文的消息转换成了相应的unicode编码,比如k1后面的value值,其实就是“帐号不允许为空”的unicode编码。只有这样,在程序里面读取到这些值的时候才会正确显示中文。有很多工具可以把中文转换成unicode编码,比如,native2ascii工具就可以实现。

    • Action里面,就修改validate方法,原来是直接写的中文字符串,现在应该修改成从配置文件中获取信息了,示例如下:
     public void validate(){  
            if(account==null || account.trim().length()==0){  
                this.addFieldError("account", this.getText("k1"));  
            }  
            if(password==null || password.trim().length()==0){  
                this.addFieldError("password", this.getText("k2"));  
            }
            if(password!=null && !"".equals(password.trim()) && password.trim().length()<6){  
                this.addFieldError("password", this.getText("k3"));  
            }  
        }  

    效果图如下所示:

      参考资料:

      1)http://www.iteye.com/topic/1124526

      2)http://blog.csdn.net/csscnu/article/details/7877792

  • 相关阅读:
    如何卸载Mysql
    netty4.1.32 pipeline的添加顺序和执行顺序
    protobuf 在win10系统如何编译jar包
    java swing 的各种布局layout
    一些大神的代码功底方面的文章
    图解ByteBuffer
    Eclipse 高亮显示选中的相同变量
    Java synchronized详解(java 线程同步)
    一篇非常全面的 《单例模式》 的讲解的文章
    java中ThreadLocalRandom类和Random类的使用
  • 原文地址:https://www.cnblogs.com/ningvsban/p/3734427.html
Copyright © 2020-2023  润新知