私は長い間ストラットに取り組んできました。
Struts 2 を使用して、アプリケーションでプログラムによる検証と変換エラーをシミュレートしています。
私のアプリケーションには、以下に示すような Product というモデル クラスがあります。
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;
}
}
ProductForm.jsp
以下のようにユーザーに製品情報を入力するように求める場所で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;
}
}
price がゼロ以下である、または productId が空であるなどの無効なデータを指定すると、検証がトリガーされます。
価格フィールドにアルファベットを指定すると、変換エラーが発生します。
しかし、価格フィールドにアルファベットを指定すると、product
オブジェクトがメソッドに移動している間にすべての変数がnullになり、クラスのオブジェクトからアクセスしようとするとメソッドvalidate()
でnullポインター例外が発生します。validate()
productId
product
ProductAction
のフィールドにアルファベットを指定すると、クラスのproduct
オブジェクト変数がProductAction
nullになるのはなぜですか。price
ProductForm.jsp