2015-09-11 27 views
1

我一直在努力撐了很久。轉換和驗證問題在Struts2

我模擬方案驗證和轉換錯誤在使用Struts 2

在我的應用程序有一個模型類叫做產品,如下圖所示的應用程序:

public class Product { 

private String productId; 
private String productName; 
private int price; 

public Product() {} 

public Product(String productId, String productName, int price) { 
    this.productId = productId; 
    this.productName = productName; 
    this.price = price; 
} 

public String getProductId() { 
    return productId; 
} 

public void setProductId(String productId) { 
    System.out.println("Product.setProductId() : '"+productId+"'"); 
    this.productId = productId; 
    System.out.println("This.pid : "+this.productId); 
} 

public String getProductName() { 
    return productName; 
} 

public void setProductName(String productName) { 
    System.out.println("Product.setProductName() : '"+productName+"'"); 
    this.productName = productName; 
} 

public int getPrice() { 
    return price; 
} 

public void setPrice(int price) { 
    System.out.println("Product.setPrice() : '"+price+"'"); 
    this.price = price; 
} 

} 

我已經叫JSP ProductForm.jsp,我要求用戶輸入產品信息象下面這樣:

<%@taglib uri="/struts-tags" prefix="s" %> 
<html> 
<head> 
    <title>Add Product Form</title> 
    <style type="text/css">@import url(css/main.css);</style> 
</head> 
<body> 
    <div id="global"> 
     <h3>Add a product</h3> 
     <s:form method="post" action="Product_Save.action"> 
      <s:textfield label="Id" key="productId"/> 
      <s:textfield label="Name" key="productName"/> 
      <s:textfield label="Price" key="price"/> 
      <s:submit value="Add Product"/> 
     </s:form> 
     <s:debug/> 
    </div> 
</body> 
</html> 

如果用戶通過點擊按鈕Add Product給予正確的信息數據將根據正常的流動,這是struts.xml配置是如下保存到數據庫:

<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
"http://struts.apache.org/dtds/struts-2.0.dtd"> 
<struts> 
<package name="product_module" extends="struts-default"> 

    <action name="Product_Input"> 
     <result>/jsp/ProductForm.jsp</result> 
    </action> 

    <action name="Product_Save" class="com.way2learnonline.ui.ProductAction"> 
     <result name="success">/jsp/ProductDetails.jsp</result> 
     <result name="input">/jsp/ProductForm.jsp</result> 
     <param name="test">MyTest</param> 
    </action> 

</package> 

</struts> 

我的Action類是ProductAction這是如下圖所示:

public class ProductAction extends ActionSupport implements ModelDriven<Product>{ 

private static final long serialVersionUID = 1L; 

private Product product; 

private String test; 

public ProductAction() {} 

public String execute(){ 
    DatabaseManager databaseManager=new DatabaseManager(); 
    databaseManager.write(product); 
    return Action.SUCCESS; 
} 

@Override 
public void validate() { 

    System.out.println("p : "+product.getProductId()); 
    if(product.getProductId().trim().equals("")){ 
     addFieldError("productId", "Product Id should be present"); 
    } 
    if(product.getPrice()<=0){ 
     addFieldError("price", getText("price.negative")); 
    } 
} 

@Override 
public Product getModel() { 
    product=new Product(); 
    return product; 
} 

public void setTest(String test) { 
    this.test = test; 
} 

public String getTest() { 
    return test; 
} 
} 

如果我們給出無效數據,如價格小於或等於零,或者productId爲空,則會觸發驗證。

如果我們給的價格領域的字母,然後轉換錯誤將被觸發。

但是如果我給字母在價格領域,然後我product對象的所有變量都變成空,而它去validate()方法,這是導致validate()方法空指針異常,當我嘗試從ProductActionproduct對象訪問productId

這裏爲什麼我的ProductAction類的對象變量product變爲空,如果我在ProductForm.jspprice字段中給出字母。

+0

根據[這](http://stackoverflow.com/a/23450365/1654265),它不應該。這裏一定有些奇怪的事情發生。哪個S2版本?你可以嘗試刪除帶參數的構造函數嗎?有趣的問題BTW –

+0

@Aleksandr MI我無法理解你是什麼意思「我懷疑這個代碼將在所有有行動=工作」,「在」 – Jagadeesh

+0

那麼它似乎它做的工作Product_Save.action,但如果你是使用S2標籤最好不要將'.action'的擴展名加到動作名稱上。 –

回答

1

把模型初始化的聲明,而不是在吸氣:

private Product product = new Product(); 

@Override 
public Product getModel() { 
    return product; 
}