Проблема преобразования и проверки в Struts2
Я давно работаю над стойками.
Я моделирую программные проверки и ошибки преобразования в приложении, используя 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;
}
}
У меня есть 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>
Мой класс действий 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()
метод, когда я пытаюсь получить доступ productId
от product
объект ProductAction
учебный класс.
Вот почему мой product
переменные объекта ProductAction
класс становится нулевым, если я даю алфавиты в price
поле в ProductForm.jsp
,
1 ответ
Поместите инициализацию модели в объявление, а не в получатель:
private Product product = new Product();
@Override
public Product getModel() {
return product;
}