无法从ActionForm转换为AddExpenseForm

问题描述 投票:0回答:1

我是Struts的新手,我试图了解所有工作原理。我知道我必须强制转换表单以访问操作类中的请求参数,并且我还引用了其他各种论坛来试图找出答案,但这没有用。无论我如何尝试,我都会收到相同的错误。预先感谢。

我的动作班:

package action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.ActionForm;

import com.opensymphony.xwork2.ActionSupport;

import dao.ExpenseDAO;
import dao.MemoryExpenseDAO;
import forms.AddExpenseForm;
import value.Expense;

public class AddExpenseAction extends ActionSupport{
    private static final long serialVersionUID = 1L;

    public String execute(ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Exception{



     {
            AddExpenseForm addExpenseForm = (AddExpenseForm) form;

            Expense e = new Expense();
            e.setAmount(addExpenseForm.getAmount());
            e.setDate(addExpenseForm.getDate());
            e.setReason(addExpenseForm.getReason());

            ExpenseDAO dao = MemoryExpenseDAO.getDAO();              
            dao.insertExpense(e);

            HttpSession session = request.getSession();                
            session.setAttribute("expense", e);
            return SUCCESS;


        }
        }
      }

我的表单:

package forms;

public class AddExpenseForm {

    private String date;
    private Double amount;
    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }
    public Double getAmount() {
        return amount;
    }
    public void setAmount(Double amount) {
        this.amount = amount;
    }
    public String getReason() {
        return reason;
    }
    public void setReason(String reason) {
        this.reason = reason;
    }
     private String reason;
   }

我的Struts配置:

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts-config>
     <form-beans>
        <form-bean name="AddExpenseForm" type="forms.AddExpenseForm"/>
        <form-bean name="FindExpenseByDate" type="forms.FindExpenseByDate"/>
     </form-beans>
     <action-mapping>
        <action name="AddExpenseAction" class="action.AddExpenseAction">
            <result name="success">/DisplayExpenses.jsp</result> 
            <result name="error">/error.jsp</result>
        </action>
        <action name="FindExpensesAByDate" class="action.FindExpensesAByDate">
            <result name="success">/FindExpensesByDate.jsp</result>
            <result name="error">/error.jsp</result> 
        </action>
     </action-mapping>]]
</struts-config>

Expense.java

 package value;

public class Expense {

        private String date;
        private String reason;
        private Double amount;
        public String getDate() {
            return date;
        }
        public void setDate(String date) {
            this.date = date;
        }
        public String getReason() {
            return reason;
        }
        public void setReason(String reason) {
            this.reason = reason;
        }
        public Double getAmount() {
            return amount;
        }
        public void setAmount(Double amount) {
            this.amount = amount;
        }
        public boolean verifyIsReImbursable(Double amount) {

            if(amount >10000 && reason.equalsIgnoreCase("hotel"))
                return false;
        return true;


        }
}

ExpenseDAO:

  package dao;

import java.util.Collection;

import value.Expense;

public interface ExpenseDAO {

    public void insertExpense(Expense p);
    public Collection findAllExpense();
    public Collection findExpenseByDate(String date);


}

MemoryExpenseDAO:

    package dao;

import java.util.ArrayList;
import java.util.Collection;

import value.Expense;

public class MemoryExpenseDAO implements ExpenseDAO {

    private static MemoryExpenseDAO theInstance = new MemoryExpenseDAO();
    private ArrayList<Expense> expenses = new ArrayList<Expense>();

    private MemoryExpenseDAO () {

    }

    public static MemoryExpenseDAO getDAO() {
        return theInstance;

    }

    public void insertExpense(Expense p) {
        expenses.add(p);
    }

    @Override
    public Collection findAllExpense() {

        return(Collection)expenses;
    }

    @Override
    public Collection findExpenseByDate(String date) {
        ArrayList<Expense> found = new ArrayList<Expense>();

        for(Expense p: expenses )
        {
            if(p.getDate().equals(date))
                    found.add(p);
        }
        return(Collection)found;
    }
}

enter image description here

此外,我的struts-config文件还有另一个疑问,为什么我不能使用正向标记,如下面的代码所示。我在图像中附加了错误,说“必须为元素类型”操作“声明”属性“类型”。“

 <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>

    <!-- Data Sources -->
    <data-sources>
    </data-sources>

    <!-- Form Beans -->
    <form-beans>
        <form-bean name="AddExpenseForm" type="forms.AddExpenseForm">
        </form-bean>
        <form-bean name="FindExpensesByDateForm" type="forms.FindExpensesByDateForm">
        </form-bean>
    </form-beans>

    <!-- Global Exceptions -->
    <global-exceptions>
    </global-exceptions>

    <!-- Global Forwards -->
    <global-forwards>
    </global-forwards>

    <!-- Action Mappings -->
    <action-mappings>
        <action name="AddExpenseForm" path="/AddExpense" type="actions.AddExpenseAction">
            <forward name="success" path="/DisplayExpense.jsp">
            </forward>
        </action>
java xml jsp struts
1个回答
0
投票

您的AddExpenseForm类不会扩展ActionForm


不相关:

除非您有学习Struts 1的特定原因,否则不要。

Struts 1是在几年前停产的,不应将其用于任何新产品。

© www.soinside.com 2019 - 2024. All rights reserved.