2013-06-21 21 views
-1

我想我在struts驗證中遇到了一個奇怪的情況,因爲它有時會起作用,有時不起作用。我使用maven。在第一次安裝,我得到它的工作。但是在maven clean之後,它再也不能工作了。Struts驗證無法正常工作[奇怪]

  • 當我安裝我的項目(maven install)時,xml驗證(CustomerAction-validation.xml)未複製到目標文件夾中的操作類包。我不知道爲什麼。
  • 如果我在「客戶表單」操作中刪除<interceptor-ref name="prepare"/>,將會報錯。雖然我使用默認攔截器。沒有定製。
  • 有關登錄表單的其他問題(與驗證無關)。如何將表單發佈到另一個名稱空間。我嘗試使用namespace="/web",但它不起作用。這就是爲什麼我用s:url嘗試,但它使我不能使用s:form

這是我的項目結構

project structure

的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>struts.test</groupId> 
<artifactId>validation</artifactId> 
<packaging>war</packaging> 
<version>0.0.1-SNAPSHOT</version> 
<name>validation Maven Webapp</name> 
<url>http://maven.apache.org</url> 

<properties> 
    <junit.version>3.8.1</junit.version> 
    <struts2.version>2.3.1.2</struts2.version> 
    <struts2-tiles-plugin.version>2.3.14</struts2-tiles-plugin.version> 
    <tiles.version>2.0.7</tiles.version> 
    <commons-logging.version>1.1.3</commons-logging.version> 
    <commons-collection.version>3.2.1</commons-collection.version> 
    <xwork.version>2.1.3</xwork.version> 
    <dojo.version>2.1.8</dojo.version> 
</properties> 
<dependencies> 

    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 

    <!-- Struts 2 --> 
    <dependency> 
     <groupId>org.apache.struts</groupId> 
     <artifactId>struts2-core</artifactId> 
     <version>${struts2.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.struts</groupId> 
     <artifactId>struts2-tiles-plugin</artifactId> 
     <version>${struts2-tiles-plugin.version}</version> 
    </dependency>     

    <dependency> 
     <groupId>org.apache.tiles</groupId> 
     <artifactId>tiles-api</artifactId> 
     <version>${tiles.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.tiles</groupId> 
     <artifactId>tiles-core</artifactId> 
     <version>${tiles.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.tiles</groupId> 
     <artifactId>tiles-jsp</artifactId> 
     <version>${tiles.version}</version> 
    </dependency> 


    <!-- Struts 2 Dojo Ajax Tags --> 
    <dependency> 
     <groupId>org.apache.struts</groupId> 
     <artifactId>struts2-dojo-plugin</artifactId> 
     <version>${dojo.version}</version> 
    </dependency> 

    <!-- Struts 2 JSON Plugins --> 
    <dependency> 
     <groupId>org.apache.struts</groupId> 
     <artifactId>struts2-json-plugin</artifactId> 
     <version>${dojo.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>commons-logging</groupId> 
     <artifactId>commons-logging</artifactId> 
     <version>${commons-logging.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>com.opensymphony</groupId> 
     <artifactId>xwork</artifactId> 
     <version>${xwork.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.freemarker</groupId> 
     <artifactId>freemarker</artifactId> 
     <version>2.3.19</version> 
    </dependency> 

    <dependency> 
     <groupId>ognl</groupId> 
     <artifactId>ognl</artifactId> 
     <version>3.0.6</version> 
    </dependency> 

    <dependency> 
     <groupId>commons-beanutils</groupId> 
     <artifactId>commons-beanutils</artifactId> 
     <version>1.8.3</version> 
    </dependency> 

    <dependency> 
     <groupId>commons-digester</groupId> 
     <artifactId>commons-digester</artifactId> 
     <version>2.1</version> 
    </dependency> 

</dependencies> 

<build> 
    <finalName>validation</finalName> 
    <plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

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> 

<constant name="struts.enable.DynamicMethodInvocation" value="false" /> 
<constant name="struts.devMode" value="false" /> 
<constant name="struts.custom.i18n.resources" value="ApplicationResources" /> 

<package name="default" extends="struts-default" namespace="/web"> 
    <result-types> 
     <result-type name="tiles" 
      class="org.apache.struts2.views.tiles.TilesResult" /> 
    </result-types> 
    <action name="login" class="struts.test.validation.action.LoginAction"> 
     <result name="success" type="tiles">/welcome.tiles</result> 
     <result name="error">Login.jsp</result> 
    </action> 
    <action name="savecustomer" class="struts.test.validation.action.CustomerAction" method="saveCustomer"> 
     <result name="success" type="tiles">/customer.success.tiles</result> 
     <result name="input" type="tiles">/customer.tiles</result> 
    </action> 
    <action name="customer-form" class="struts.test.validation.action.CustomerAction" method="addCustomer"> 
     <interceptor-ref name="prepare"/> 
     <result name="success" type="tiles">/customer.tiles</result> 
     <result name="input" type="tiles">/customer.tiles</result> 
    </action> 
</package> 

</struts> 

CustomerAction-validation.xml中

<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" 
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> 
<validators> 
<field name="customer.name"> 
    <field-validator type="requiredstring"> 
     <param name="trim">true</param> 
     <message key="errors.required" /> 
    </field-validator> 
</field> 
<field name="customer.email"> 
    <field-validator type="requiredstring"> 
     <param name="trim">true</param> 
     <message key="errors.required" /> 
    </field-validator> 
</field> 
<field name="customer.type"> 
    <field-validator type="requiredstring"> 
     <param name="trim">true</param> 
     <message key="errors.required" /> 
    </field-validator> 
</field> 
</validators> 

CustomerAction類

public class CustomerAction extends ActionSupport{ 
/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
private CustomerDto customer; 
private List<String > listCustoType; 

public String addCustomer(){ 
    listCustoType = new ArrayList<String>(); 
    listCustoType.add("Type1"); 
    listCustoType.add("Type2"); 
    return SUCCESS; 
} 

public String saveCustomer() { 
    System.out.println(customer.getName()+" "+customer.getEmail()); 
    return SUCCESS; 
} 
public CustomerDto getCustomer() { 
    return customer; 
} 
public void setCustomer(CustomerDto customer) { 
    this.customer = customer; 
} 
public List<String> getListCustoType() { 
    return listCustoType; 
} 
public void setListCustoType(List<String> listCustoType) { 
    this.listCustoType = listCustoType; 
} 

} 

CustomerDto類

public class CustomerDto { 

private Integer id; 
private String name; 
private String email; 
private String type; 
    //getter & setter 

客戶表

<%@ page contentType="text/html; charset=UTF-8"%> 
<%@ taglib prefix="s" uri="/struts-tags"%> 
<html> 
<body> 
<h2>Customer Form</h2> 
<s:form action="savecustomer" method="post" validate="true" namespace="/web"> 
<s:select 
    label="Customer Type" 
    list="listCustoType" 
    name="customer.type" 
    headerKey="-1" 
    headerValue=""/> 
<s:textfield name="customer.name" key="customer.name" size="20" /> 
<s:textfield name="customer.email" key="email" size="20" /> 
<s:submit method="addCustomer" key="label.add.customer" align="center" /> 
</s:form> 
</body> 
</html> 

登錄形式

<form action='<s:url value='/'/>web/login' method="post"> 
<s:textfield name="username" key="label.username" size="20" /> 
<s:password name="password" key="label.password" size="20" /> 
<s:submit method="execute" key="label.login" align="center" /> 
</form> 

我完成的項目,我上傳here

回答

0

在Maven項目,非Java工件打算部署在類路徑上需要在:

src/main/resources 

因爲你已經把他們安置在他們將不會被部署Java源代碼目錄樹。

在您的具體情況:

src/main/resources/struts/test/validation/action/CustomerValidation-validation.xml 

這是同樣的模式在資源目錄的其他 XML文件,部署到classpath中。

+0

我試過了,現在xml驗證存在於類包上。但它仍然不起作用。我的項目中是否還有其他錯誤? –

0

剛剛遇到了我的驗證文件未被複制的問題。爲了解決這個問題,你需要添加maven-war-plugin並正確配置它以包含XML文件。下面是我添加到我的pom.xml文件中得到它在我的項目工作:

 </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <webResources> 
        <resource> 
         <!-- this is relative to the pom.xml directory --> 
         <directory>src/main/java/com/project/controller/</directory> 
         <targetPath>WEB-INF/classes/com/project/controller/</targetPath> 
         <includes> 
          <include>**/*.xml</include> 
         </includes> 
        </resource> 
       </webResources> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

您可以在Maven的戰爭插件是如何工作的here更多閱讀起來。