Java Struts 2:动作类

Java Struts 2:动作类,java,struts2,Java,Struts2,所以,我有下一个情况: 我在服务器上有一个带有表单->此表单已提交到服务器->的页面,在最后一步中,为用户再次显示带有表单的此页面,为处理提交的表单->提供特殊的struts 2操作 当我尝试测试此工作流时,我看到一个奇怪的时刻: 当我第一次打开页面时-表单字段-为空,但在服务器上提交表单并重新加载页面后-字段-不为空!字段包含我在前面步骤中填写的数据 下面是我的测试动作: import java.util.ArrayList; import java.util.List; import co

所以,我有下一个情况:

我在服务器上有一个带有表单->此表单已提交到服务器->的页面,在最后一步中,为用户再次显示带有表单的此页面,为处理提交的表单->提供特殊的struts 2操作

当我尝试测试此工作流时,我看到一个奇怪的时刻:

当我第一次打开页面时-表单字段-为空,但在服务器上提交表单并重新加载页面后-字段-不为空!字段包含我在前面步骤中填写的数据

下面是我的测试动作:

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport {

    private List<Integer> books;
    private String title;
    private String description;

    public List<Integer> getBooks() {
        return this.books;
    }

    public void setBooks(List<Integer> books) {
        this.books = books;
    }

    public String getTitle() {
        return this.title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return this.description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    private static final long serialVersionUID = 1L;

    public String show() {

        // filling books variable

        List<Integer> l = new ArrayList<Integer>();

        l.add(1);
        l.add(2);
        l.add(3);

        this.books = l;
        return Action.SUCCESS;
    }

    public String save() {

        // processing title and description variables here!

        return show();

    }

}
import java.util.ArrayList;
导入java.util.List;
导入com.opensymphony.xwork2.Action;
导入com.opensymphony.xwork2.ActionSupport;
公共类TestAction扩展了ActionSupport{
私人书目;
私有字符串标题;
私有字符串描述;
公共列表getBooks(){
归还这本书;
}
公共书籍(列表书籍){
这本书=书;
}
公共字符串getTitle(){
返回此.title;
}
公共无效集合标题(字符串标题){
this.title=标题;
}
公共字符串getDescription(){
返回此.description;
}
公共void集合描述(字符串描述){
this.description=描述;
}
私有静态最终长serialVersionUID=1L;
公共字符串显示(){
//填充书本变量
列表l=新的ArrayList();
l、 增加(1);
l、 增加(2);
l、 增加(3);
本书=l;
回报行动。成功;
}
公共字符串保存(){
//在这里处理标题和描述变量!
返回显示();
}
}
我的测试jsp文件:

<%@ taglib prefix="s" uri="/struts-tags"%>

<html>
<body>

    <s:property value="books" />


    <s:form action="saveAction">
        <s:textfield id="title" label="Title" name="title" />
        <s:textfield id="description" label="Description"
            name="description" />
        <s:submit />
    </s:form>


</body>
</html>

这一小部分是我的struts.xml和动作标记:

    <action name="showAction" class="action.TestAction" method="show">
        <result>pages/test.jsp</result>
    </action>

        <action name="saveAction" class="action.TestAction" method ="save">
        <result>pages/test.jsp</result>
    </action>

pages/test.jsp
pages/test.jsp
所以,我开始调查这个问题,以及我的结果:

Action类只实例化一次,在所有用户请求处理完Action类的实例之后

所以,如果在我的Action类中我只有很少的Action方法,那么所有这些方法都可以访问所有字段

这是个好主意吗

例如:用户向my
操作发送请求。删除带有一些
id的
方法

接下来,用户向my
操作发送请求。添加
方法,但不带
id
参数。-这种情况必须失败!(例如,我忘记了添加验证)

但是-没有错误-操作实例包含字段
id
的值

那么,我接下来的一般性问题是:

1。一个行动类-一种方法-这是最佳实践?

2。如果在一个操作中使用了几个方法-我需要为清除修改的字段添加一些服务方法?或者在这种情况下我必须做什么?


谢谢

获得action类的单个实例的唯一方法是(a)使用Spring,以及(b)将操作声明为默认(单例)作用域。否则,如果没有Spring或使用prototype作用域,每个请求都会得到一个新的操作实例

1)视情况而定。我倾向于将紧密耦合的动作方法合并到一个动作类中,但我不知道这是否是“最佳实践”——我认为这取决于情况和偏好。我看不到彼此之间有多少引人注目的技术优势

对我来说,这是一个可读性和功能位置的问题


2)如果您在多个请求上获得完全相同的操作实例,那么您的配置几乎肯定是错误的——我会在执行其他操作之前解决这个问题。

获得操作类的单个实例的唯一方法是(a)使用Spring,并且(b)将您的操作声明为默认(单例)范围。否则,如果没有Spring或使用prototype作用域,每个请求都会得到一个新的操作实例

1)视情况而定。我倾向于将紧密耦合的动作方法合并到一个动作类中,但我不知道这是否是“最佳实践”——我认为这取决于情况和偏好。我看不到彼此之间有多少引人注目的技术优势

对我来说,这是一个可读性和功能位置的问题


2)如果您在多个请求中获得完全相同的操作实例,那么您的配置几乎肯定是错误的——我会在执行其他操作之前解决这个问题。

@user471011。。。如我所说,使用“原型”作用域。给我机会解释一下,我的意思是:例如,我们有一本BO Book,我们有列表方法:show()、add()、remove(),用于处理Book。在本例中:一个操作-BookAction和BookAction contains方法:显示、添加、删除。。。或者更好的不同操作:BookAddAction、BookRemoveAction..@user471011我理解你所说的“每个操作多个方法”或“多个操作”的意思。我是说这没什么区别,这取决于你喜欢哪一个,哪一个更可读,等等。在任意情况下,两者都不如另一个——这取决于。@user471011。。。如我所说,使用“原型”作用域。给我机会解释一下,我的意思是:例如,我们有一本BO Book,我们有列表方法:show()、add()、remove(),用于处理Book。在本例中:一个操作-BookAction和BookAction contains方法:显示、添加、删除。。。或者更好的不同操作:BookAddAction、BookRemoveAction..@user471011我理解你所说的“每个操作多个方法”或“多个操作”的意思。我是说这没什么区别,这取决于你喜欢哪一个,哪一个更可读,等等。在任意情况下,两者都不比另一个好——这取决于你。