Проблема преобразования и проверки в 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;
}
Другие вопросы по тегам