Struts2 中的转换和验证问题
Conversion and validation issue in Struts2
我已经在 struts 上工作了很长时间。
我正在使用 Struts 2.
模拟应用程序中的编程验证和转换错误
在我的应用程序中,我有一个名为 Product 的模型 class,如下所示:
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>
我的操作class是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()
方法中出现空指针异常当我尝试从 ProductAction
class.
的 product
对象访问 productId
时
这就是为什么如果我在 ProductForm.jsp
的 price
字段中输入字母,ProductAction
class 的 product
对象变量会变为空。
将模型初始化放在声明中,而不是getter:
private Product product = new Product();
@Override
public Product getModel() {
return product;
}
我已经在 struts 上工作了很长时间。
我正在使用 Struts 2.
模拟应用程序中的编程验证和转换错误在我的应用程序中,我有一个名为 Product 的模型 class,如下所示:
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>
我的操作class是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()
方法中出现空指针异常当我尝试从 ProductAction
class.
product
对象访问 productId
时
这就是为什么如果我在 ProductForm.jsp
的 price
字段中输入字母,ProductAction
class 的 product
对象变量会变为空。
将模型初始化放在声明中,而不是getter:
private Product product = new Product();
@Override
public Product getModel() {
return product;
}