如何在struts2中创建一个在不同类中使用多个方法的动作?
所以例如我想要这样的东西,但我很确定这不起作用:
<action name="person_create" method="personCreate, carCreate" class="PersonActionBean, CarActionBean">
<result name="success">index.jsp</result>
</action>
具体来说,我正在使用struts 2.1.8.1
PersonAction.java - personCreate():
Person person = new Person();
CarAction.java - carCreate():
Car car = new Car();
答案 0 :(得分:2)
或者你可以做这样的事情
public class MainAction extends ActionSupport{
private Car car;
private Persone persone;
public String execute() {
}
// add getters and setters to car and persone objects.
}
你的jsp看起来像这样:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/style.css"/>
</head>
<body>
<s:form action="init">
<s:textfield key="car.name" name="car.name"/>
<s:textfield key="car.year" name="car.year"/>
<s:textfield key="car.name" name="car.name"/>
<s:textfield key="car.year" name="car.year"/></s:textarea>
<s:submit key="init.submit"/>
</s:form>
</body>
</html>
和你的struts.xml文件:
<action name="init" method="execute" class="MainAction">
<result name="success">index.jsp</result>
</action>
当您提交表单时,您的操作类将包含来自表单信息的persone和car对象))
答案 1 :(得分:2)
有两个变量:
1 :你为什么愿意调用2个动作,从MVC的概念来看,你不应该这样做,如果你想要处理不同的对象,你应该建立一个新的层(例如接口或服务层)来做到这一点。
2 :如果必须这样做,您可以定义一个新操作,使用chain
结果类型将其全部调用。这是Chain result type,但要小心。
答案 2 :(得分:1)
如果我清楚地了解你,你想在调用persone_create动作时调用2个动作类。 你能告诉我这个动作课吗? 如果此类具有相同名称的字段,则会出现问题。 因为来自动作类的所有字段(当调用动作类时)都转到ValueStack,结果只有其中一个类具有包含来自jsp页面的信息的所有字段。
答案 3 :(得分:1)
你是对的,它不会这样。考虑一个操作是否返回成功而另一个操作返回错误。在这种情况下struts2框架会执行哪个结果?
相反,你可以做的是调用一个动作方法,该方法将调用其中的另外两个方法。像这样:
<action name="person_create" method="execute" class="MainAction">
<result name="success">index.jsp</result>
</action>
作为该操作的一部分,您可以调用其他方法,例如:
public String execute() {
Person person = new Person();
Car car = new Car();
// Add any additional logic and return appropriate value
}
如果上述内容不是一个合适的解决方案,请编辑您的问题,详细说明您为何要在操作中调用两个单独的方法。我仍然不清楚为什么你会希望这两种方法以这种方式进行一次动作。