【问题标题】:Struts 2: Action classesStruts 2:动作类
【发布时间】:2012-01-30 12:28:44
【问题描述】:

所以,我有下一个情况:

我有一个带有表单的页面 -> 这个表单提交到服务器 -> 在服务器上,呈现特殊的 struts 2 Action 来处理提交的表单 -> 并在最后一步让用户再次显示这个带有表单的页面。

当我尝试测试这个工作流程时,我发现一个奇怪的时刻:

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

这是我的测试操作:

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();

    }

}

我的测试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>

所以,我开始调查这个问题,以及我的结果:

Action 类只实例化一次,并且在所有用户请求都使用此 Action 类实例。

所以,如果在我的 Action 类中我的操作方法很少 - 所有这些方法都可以访问所有字段。

这是个好主意?

例如:用户使用一些id 向我的Action.remove 方法发送请求。

接下来,用户向我的Action.add 方法发送请求,但没有id 参数。 ——这种情况一定要失败! (例如 - 我忘记添加验证)。

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

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

1.一个动作类 - 一种方法 - 这是最佳实践吗?

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

谢谢!

【问题讨论】:

    标签: java struts2


    【解决方案1】:

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

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

    对我来说,这是一个可读性和功能局部性的问题。

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

    【讨论】:

    • @user471011 ... 正如我所说,使用“原型”范围。
    • 给我机会解释一下,我的意思是:例如,我们有一本 BO Book,我们有列表方法:show()、add()、remove() 用于 Book。在这种情况下:一个动作 - BookAction 和 BookAction 包含方法:显示、添加、删除...或更好的不同动作:BookAddAction、BookRemoveAction..?
    • @user471011 我理解您所说的“每个操作有多个方法”或“多个操作”是什么意思。我是说它没有太大区别,这取决于您更喜欢哪个,哪个更具可读性等等。在任意情况下,两者都不比另一个更好——这取决于。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多