天天看點

struts架構搭建及validator示例

包看就會,如果哪沒看懂,歡迎評論區留言交流或者私信

@

TOC

前置

配置tomcat

0 項目位址

位址

結構

struts架構搭建及validator示例

1 建立web工程

參考連結

    根據需要選擇合适的tomcat

struts架構搭建及validator示例

2 lib下導入jar包

struts

jakarta-oro

    其中jakarta-oro和commons-validator是因為validation架構導入的,其餘是struts所必須的。(當然也可以去我的項目裡面下載下傳jar)

struts架構搭建及validator示例

3 寫代碼

1 建立struts項目

(1)LoginAction.java

package validate;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    private String a;
    public String getA() {
        return a;
    }
    public void setA(String a) {
        this.a = a;
    }
    @Override
    public String execute() throws Exception {
        System.out.println("action方法execute");
        if (getA().equals("admin")) {
            return SUCCESS;
        } else {
            super.addActionError("使用者名錯誤!");
            return INPUT;
        }
    }
}           

(2)struts的相關xml

    利用include标簽,将一個struts.xml配置檔案分割成多個配置檔案,比較清晰

struts-validate.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- name package的名字    extends:繼承的父package名稱   -->
<!-- namespace:package命名空間。如目前login的是http://localhost:8080/login -->
    <package name="validate" extends="struts-default" namespace="/">
        <action name="login" class="validate.LoginAction" method="execute">
            <result name="success">/WEB-INF/pages/validate/success.jsp</result>
            <result name="input">/WEB-INF/pages/validate/index.jsp</result>
        </action>
    </package>
</struts>           

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <include file="/validate/struts-validate.xml"/>
</struts>           

(3)web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>struts-validation</display-name>
  <welcome-file-list>
    <welcome-file>/WEB-INF/pages/validate/index.jsp</welcome-file>
  </welcome-file-list>
    <!-- struts2 -->
    <filter>
        <filter-name>struts2</filter-name>
       <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
       </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>           

(4)jsp

  • validate="true"是開啟驗證,建立struts項目時可将此句删除

    index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="Java"
    import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <body>
        登入
        <s:form action="login" validate="true" method="post" namespace="/">
            <s:textfield name="a" id="a" label="a"></s:textfield>
            <s:textfield name="b" id="b" label="b"></s:textfield>
            <s:submit value="送出"></s:submit>
        </s:form>
        <s:actionerror />
    </body>
</html>           

success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="Java"
    import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <body>
        成功
    </body>
</html>           

2 添加validate

1 相關知識
  • 1 validation.xml和*Action.java放在一起
  • 2 validation.xml命名規則

    (1)

    <ActionClassName>-validation.xml

    ActionClassName放的是要驗證Action類的名字

(2)

<ActionClassName>-<actionName>-validation.xml

    actionName指struts.xml裡面配置的action name,如LoginAction-login-validation.xml

  • 3 s:form具備輸出校驗錯誤的能力
  • 4 前面struts.xml配置input,是為了讓校驗失敗後,傳回index.jsp
2 代碼
  • 對b的校驗采取的是自定義validator

    LoginAction-validation.xml

<?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="a">
        <field-validator type="requiredstring">
             <message>此項必輸</message>
        </field-validator>
        <field-validator type="stringlength">
             <param name="minLength">3</param>
            <message>長度必須大于3</message>
        </field-validator>
    </field>
    <field name="b">
        <field-validator type="bValidator">
            <param name="b">b</param>
            <message>bbbbb</message>
        </field-validator> 
    </field>
</validators>            

BValidator.java

package validate;
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
public class BValidator extends FieldValidatorSupport {
    private String b;
    @Override
    public void validate(Object object) throws ValidationException {
        //擷取字段名
        String fieldName = super.getFieldName();
        String value = (String)super.getFieldValue(fieldName,object);
        System.out.println("自定義validator"+fieldName+","+value);
        if(value == null || value == "") {
            //使LoginAction-validation.xml中b的message可以顯示
            this.addFieldError(fieldName, object);
            //添加校驗錯誤,和上一條語句任選其一即可
            this.getValidatorContext().addFieldError(fieldName, this.getValidatorContext().getText(value+"b為空"+b));
            return;
        }
    }
}           

validators.xml

<?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-config-1.0.dtd">
      <!-- 此DOCTYPE和default.xml中的一緻 -->    
<validators>
<!-- 驗證器注冊 -->
  <validator name = "bValidator" class = "validate.BValidator"/>
</validators>            

4 啟動中遇到的問題

(1)Caught Exception while registering Interceptor class org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor - interceptor - jar:file:/D:/eclipse/tools/apache-tomcat-7.0.86-windows-x64/apache-tomcat-7.0.86/wtpwebapps/struts-validation/WEB-INF/lib/struts2-core-2.3.37.jar!/struts-default.xml:222:127

解決:配置離線dtd(

dtd資源

),當然也可以在我的代碼中找,就在src目錄下面

配置方法:

參考

(2)警告: No configuration found for the specified action: 'Login' in namespace

若是struts中配置了namespace="/",但s:form中沒有配置,則會出現

(3)Local DTD is missing for publicID: -//OpenSymphony Group//XWork Validator 1.0.2

解決:更換LoginAction-validation.xml開頭為

<?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">
           

提升

struts2權威指南pdf完整版+源代碼

連結

提取碼:seks

繼續閱讀