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

 

posted @ 2019-01-03 18:46  clairexxxx  阅读(157)  评论(0)    收藏  举报