• 6-struts2核心业务(国际化,数据验证,模型驱动)


    目录:

    1. 国际化
    2. 数据验证
    3. 模型驱动

     国际化:

      文字国际化:指在程序不做任何修改的情况下,就可以在不同国家地区和语言环境下,按照当地习惯修改显示字符。

    实现国际化方式

    1. 以前使用ResourceBundle类中的getBundle()方法绑定指定国家的资源包(资源包规则:包名_语言简写_国家简称.properties)
    2. jsp页面中:<fmt:setBundle name="包名_语言简写_国家简称.properties"/>    绑定资源<fmt:message key="user"/>
    3. struts2:
      • 准备不同国家的资源包:
        • 中国: message_zh_CN.properties 
        • 美国: message_en_US.properties
        • 英国:  message_en_GB.properties   
        在struts.xml中指定资源包加载的常量
      • struts.custom.i18n.resources=message。在struts.xml文件中配置相应常量struts.custom.i18n.resources,指定国际化资源文件的基名,服务器在加载struts.xml时回自动加载前缀是message的国际化资源文件。
      • <?xml version="1.0" encoding="UTF-8" ?>
        
        <!DOCTYPE struts PUBLIC
                "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
                "http://struts.apache.org/dtds/struts-2.5.dtd">
        
        <struts>
            <!-- 指定国际化资源包加载的路径 -->
            <constant name="struts.custom.i18n.resources" value="resources.message"></constant>
        </struts>
        View Code
    4. 在页面上使用资源包的内容
      • <s:text name="user"/>
      • <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
        <%@ taglib uri="/struts-tags" prefix="s"%>
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        <html>
        <head>
        
        
        <title>国际化资源包</title>
        
        </head>
        
        <body>
            <%--获取国际化资源包内容 --%>
            <form action="#">
                <s:text name="user"></s:text><input type="text" name="name">
                <s:text name="password"></s:text><input type="password" name="password">
                <input type="submit" value='<s:text name="login"></s:text>'>
            </form>
            
            
        </body>
        </html>
        success.jsp
        package i_18i;
        
        import com.opensymphony.xwork2.ActionSupport;
        
        public class UserAction extends ActionSupport{
            @Override
            public String execute() throws Exception {
                String name = super.getText("user");
                System.out.println(name);
                return "success";
            }
        }
        UserAction.java

    表单数据验证:

    对异常输入的过滤就是数据校验。

    • 数据校验一般分为两种:
      1. 前台校验:客户端校验,通过javaScript编程方式进行表单数据校验。
      2. 后台校验:服务器端校验,使用struts2通过xml配置方式进行表单数据校验

    struts2给开发者提供了四种方式的后台数据校验:

    1. 用代码方式对action的所有方法进行验证
      • action类继承ActionSupport并重写validate方法   (validate()方法对当前Action下的所有方法都会有效!!!!)          

         之后会在执行action逻辑代码之前执行validate方法

      • struts.xml文件中对应的action配置加上input视图,然后struts2就会自动把错误信息转发到input视图的页面上去
      • input视图页面上,打印出错误信息
      • package b_validate;
        
        import com.opensymphony.xwork2.ActionSupport;
        
        public class UserAction extends ActionSupport {
        
            private User user;
        
            /**
             * 如果validate方法中出现异常,则会返回错误页面 如果validate方法没有出现异常,则直接调用action中的业务逻辑代码
             */
            @Override
            public void validate() {
                // 在这里写表单数据验证逻辑
                if (user.getName() == null || user.getName().equals("")) {
                    // 保存错误信息,显示错误信息
                    super.addFieldError("user.error.requried", "用户名不能为空");
                }
                if (user.getPassword() == null || user.getPassword().equals("")) {
                    // 密码为空
                    // 把错误信息放入错误信息Map集合
                    super.addFieldError("password.error.requried", "密码不能为空!");
                }
        
            }
        
            public String register() throws Exception {
                String name = super.getText("user");
                System.out.println("****" + name);
                return "success";
            }
        
            public User getUser() {
                return user;
            }
        
            public void setUser(User user) {
                this.user = user;
            }
        
        }
        UserAction.java
        <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
        <%@ taglib uri="/struts-tags" prefix="s"%>
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        <html>
        <head>
        
        
        <title>validate</title>
        
        </head>
        
        <body>
        <%--打印错误信息 --%>
        <font color="red"><s:fielderror></s:fielderror></font>
            <form action="${pageContext.request.contextPath}/validate/user_register" method="post">
                <s:text name="user"></s:text><input type="text" name="user.name">
                <s:text name="password"></s:text><input type="password" name="user.password">
                <input type="submit" value='<s:text name="login"></s:text>'>
            </form>
            
            
        </body>
        </html>
        register.jsp
        <?xml version="1.0" encoding="UTF-8" ?>
        
        <!DOCTYPE struts PUBLIC
                "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
                "http://struts.apache.org/dtds/struts-2.5.dtd">
        
        <struts>
            <package name="validate" extends="struts-default" namespace="/validate">
            <global-allowed-methods>register</global-allowed-methods>
                <action name="user_*" class="b_validate.UserAction" method="{1}">
                    <result>/success.jsp</result>
                    <result name="input">/register.jsp</result>
                </action>
            </package>
        </struts>
        struts_validate.xml
        package b_validate;
        
        public class User {
            private String name;
            private String password;
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            public String getPassword() {
                return password;
            }
            public void setPassword(String password) {
                this.password = password;
            }
            
            
        }
        User.java

    2. 用代码方式对action的指定方法进行验证
      •  方式一中的验证方法名称改为  validate+需要验证的方法名称,只有此处与方式一不同,其他都相同。

          例如: validateRegister()   ->  只能验证register()方法

        • package b_validate;
          
          import com.opensymphony.xwork2.ActionSupport;
          
          public class UserAction extends ActionSupport {
          
              private User user;
              
              public void validateRegister(){
                  // 在这里写表单数据验证逻辑
                  if (user.getName() == null || user.getName().equals("")) {
                      // 保存错误信息,显示错误信息
                      super.addFieldError("user.error.requried", "用户名不能为空");
                  }
                  if (user.getPassword() == null || user.getPassword().equals("")) {
                      // 密码为空
                      // 把错误信息放入错误信息Map集合
                      super.addFieldError("password.error.requried", "密码不能为空!");
                  }
              }
          
              public String register() throws Exception {
                  String name = super.getText("user");
                  System.out.println("****" + name);
                  return "success";
              }
              
          
              public User getUser() {
                  return user;
              }
          
              public void setUser(User user) {
                  this.user = user;
              }
          
          }
          UserAction.java
          <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
          <%@ taglib uri="/struts-tags" prefix="s"%>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
          <head>
          <title>validate</title>
          <style type="text/css">
              ul, ul li{
                  display: inline;
              }
          </style>
          </head>
          
          <body>
              <%--打印所有错误信息 --%>
              <font color="red"><s:fielderror></s:fielderror></font>
              <form
                  action="${pageContext.request.contextPath}/validate/user_register"
                  method="post">
                  
                  <s:text name="user"></s:text>
                  <input type="text" name="user.name">
                  <s:fielderror fieldName="user.error.requried"></s:fielderror><br>
                  
                  <s:text name="password"></s:text>
                  <input type="password" name="user.password">
                  <s:fielderror fieldName="password.error.requried"></s:fielderror><br>
                  
                  <input type="submit" value='<s:text name="login"></s:text>'>
              </form>
          
          
          </body>
          </html>
          register.jsp

          以上这两种方式都是使用代码在程序写死了!!!------->进行改进:

    3. 用xml配置方式对action的所有方法进行验证
      • 编写一个xml文件,名称:  Action文件名-validation.xml。 该xml文件必须放在Action文件的同一目录
      • <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
        <%@ taglib uri="/struts-tags" prefix="s"%>
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        <html>
        <head>
        <title>validate</title>
        <style type="text/css">
            ul, ul li{
                display: inline;
            }
        </style>
        </head>
        
        <body>
            <form
                action="${pageContext.request.contextPath}/validate/user_register"
                method="post">
                
                <s:text name="user"></s:text>
                <input type="text" name="user.name">
                <s:fielderror fieldName="user.name"></s:fielderror><br>
                
                <s:text name="password"></s:text>
                <input type="password" name="user.password">
                <s:fielderror fieldName="user.password"></s:fielderror><br>
                
                <input type="submit" value='<s:text name="login"></s:text>'>
            </form>
        
        
        </body>
        </html>
        register.jsp
        package b_validate;
        
        import com.opensymphony.xwork2.ActionSupport;
        
        public class UserAction extends ActionSupport {
        
            private User user;
            
            public String register() throws Exception {
                String name = super.getText("user");
                System.out.println("****" + name);
                return "success";
            }
            
            public User getUser() {
                return user;
            }
        
            public void setUser(User user) {
                this.user = user;
            }
        
        }
        UserAction.java
        package b_validate;
        
        public class User {
            private String name;
            private String password;
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            public String getPassword() {
                return password;
            }
            public void setPassword(String password) {
                this.password = password;
            }
            
            
        }
        User.java
        <?xml version="1.0" encoding="utf-8"?>
        <!DOCTYPE validators PUBLIC 
                  "-//Apache Struts//XWork Validator 1.0.2//EN"
                  "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
        
        <validators>
            <!-- 验证用户名 -->
            <field name="user.name">
                <!-- type表示xwork中定义的可以使用的验证类型
                (在/com/opensymphony/xwork2/validator/validators/default.xml中查看) -->
                <field-validator type="requiredstring">
                    <!-- 当出现错误时的提示信息 -->
                    <message>用户名必须非空</message>
                </field-validator>
            </field>
            
            <!-- 密码验证 -->
            <field name="user.password">
                <field-validator type="requiredstring">
                    <message>密码需非空</message>
                </field-validator>
                <!-- 4-12位字母或数字 -->
                <field-validator type="regex">
                    <!-- 注入正则表达式字符串 -->
                    <param name="regexExpression">^[a-zA-Z0-9]{4,12}$</param>
                    <message>密码需为4-12位字母或数字</message>
                </field-validator>
            </field>
        </validators>
        UserAction-validation.xml
        <field-validator type="requiredstring"></field-validator>

        中的type属性在下面的包中查看,

        一般直接使用type="regex",直接如上述例子所示使用param标签注入regexExpression即可

    4. 用xml配置方式对action的指定方法进行验证
      • 编写一个xml文件,名称: Action文件名-访问方法路径-validation.xml   (例如:UserAction-user_register-validation.xml


    模型驱动:

    请求数据封装第三种方式补充说明

    1. 表单: name                 ->            基本数据类型: String name
    2. 表单: user.name         ->            javabean数据类型: User user     (User:  String name)
    3. 表单: name                  ->           javabean数据类型: User user     (User:  String name) (使用模型驱动方式)这样可以前两种方式的优点,表单可以不用改变名字,后台又可以使用javaBean进行封装。

    模型驱动:

    action实现ModelDriven接口,后面泛型进行约束,只能封装同一个类型对象

    package c_modelDriver;
    
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    
    /**
     * 使用模型驱动获得请求数据
     * 
     * @author claire
     * 
     */
    public class UserAction extends ActionSupport implements ModelDriven<User> {
    
        // 注意:使用模型驱动的方式,存放数据的模型引用不能为空,之后不需要user的set,get方法
        private User user = new User();
    
        /**
         * 该方法可以把值栈种的请求参数封装到User对象中
         */
        @Override
        public User getModel() {
            // TODO Auto-generated method stub
            return user;
        }
    
        public String register() throws Exception {
            System.out.println(user);
            return "success";
        }
    
    }
    UserAction.java
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ taglib uri="/struts-tags" prefix="s"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>model</title>
    </style>
    </head>
    
    <body>
        <form
            action="${pageContext.request.contextPath}/model/user_register"
            method="post">
            
            <s:text name="user"></s:text>
            <input type="text" name="name">
            
            <s:text name="password"></s:text>
            <input type="password" name="password">
            
            <input type="submit" value='<s:text name="login"></s:text>'>
        </form>
    
    
    </body>
    </html>
    model.jsp
  • 相关阅读:
    loj#2020. 「AHOI / HNOI2017」礼物
    loj#117. 有源汇有上下界最小流
    loj#6491. zrq 学反演
    loj#6261. 一个人的高三楼
    loj#528. 「LibreOJ β Round #4」求和
    2018-2019 ACM-ICPC Brazil Subregional Programming Contest
    2015-2016 ACM-ICPC, NEERC, Moscow Subregional Contest J
    2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15)C
    addEventListener() 和 removeEventListener()
    9个图片滑块动画
  • 原文地址:https://www.cnblogs.com/clairexxx/p/10216212.html
Copyright © 2020-2023  润新知