[英]Struts 2: Action classes
所以,我有下一种情况:
我有一个带有表单的页面->此表单已提交到服务器->在服务器上,显示了特殊的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();
}
}
我的测试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
将请求发送到my Action.remove
方法。
接下来,用户将请求发送到my Action.add
方法,但没有id
参数。 -这种情况一定会失败! (例如-我忘记添加验证)。
但是-没有错误操作实例包含字段id
值。
所以,接下来我的一般问题是:
1.一种动作类别-一种方法-这是最佳实践吗?
2.如果在一项操作中使用了几种方法-我需要为清晰的修改字段添加一些服务方法吗? 或者在这种情况下我该怎么办?
谢谢!
获得动作类的单个实例的唯一方法是(a)您正在使用Spring,并且(b)您的动作被声明为默认(单个)作用域。 否则,在没有Spring或没有原型范围的情况下,您将始终根据每个请求获得一个新的动作实例。
1)视情况而定 。 我倾向于将紧密耦合的动作方法集中到一个动作类中,但是我不知道这是否是“最佳实践”,我认为这取决于情况和偏好。 我看不到有很多引人注目的技术优势。
对我来说,这是可读性和功能局部性的问题。
2)如果要在多个请求中获得完全相同的动作实例,则几乎可以肯定您的配置是错误的-我会在做其他很多事情之前先解决此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.