我认为您误解了一些 Struts2 概念和术语。你为什么称你的行为为“输入”和“结果”?这是不好的做法,并且会引起混淆——特别是因为“输入”是标准 Struts2“结果”的名称。
动作应该根据它们执行的动作来调用。
基本模式很简单。 URL(http 请求、GET 或 POST)对应于用户(浏览器、客户端)要求服务器(webapp,顶部带有 struts2)执行某些操作。该动作可以给出多个结果,每个结果都会向用户返回一些信息(视图)(通常是通过 JSP 页面生成的 HTML)。
一个简单的例子。假设我想添加 2 个数字并显示结果。 (我从here回收了我的答案。
网址:http://...../addnumbers.action
这里操作的名称是“addnumbers” - 这个请求将执行加法(不要被欺骗并认为它也会显示一个输入表单 - 它现在不会 - 它只是执行加法,顾名思义)
一个典型的实现。在 struts.xml 中指定 mapping:
<action name="addnumbers" class="example.AddNumbersAction">
<result name="success">/AddNumbersResult.jsp</result> <!-- 'success' can be omitted here -->
</action>
您的 Java 操作:
public class AddNumbersAction extends ActionSupport {
private int x;
private int x;
private int z;
public String execute() {
z = x + y;
return SUCCESS;
}
// getters and setters ommited
}
还有你的AddNumbersResult.jsp:
<div>
Result of addition:
<s:property value="x"> + <s:property value="y"> = <s:property value="z">
</div>
您可以(您应该!)检查输入 url http://.../mywebapp/addnumbers.action?x=10&y=20 是否按预期工作。
在幕后,Struts2(使用默认配置,默认拦截器堆栈)正在创建AddNumbersAction 的实例并通过反射调用与 http 参数对应的设置器(尽最大努力进行类型转换 - 从字符串此处为整数)。然后调用action的默认方法(“execute”),结果为“success”,使用AddNumbersResult.jsp生成html页面;在这个阶段,Action 对象位于“值栈”(某种范围)中,以便标签调用它的 getter。
一旦你明白了这一点,还有两个问题:如何显示以前的 html 页面供用户输入数字(“输入表单”),以及如何处理无效或不完整的参数。这些问题是相关的。
有几种(少数)方法。一种可能性:添加另一个动作映射:
<action name="addnumbersForm"> <!-- no action specified - will use ActionSupport -->
<result>/AddNumbersInputForm.jsp</result>
</action>
还有你的/AddNumbersInputForm.jsp:
<div>
Please type two integer numbers to be added<p>
<s:actionerrors /> <!-- see below -->
<s:form action="addnumbers">
<s:textfield name="x" label="X value" />
<s:textfield name="y" label="Y value" />
<s:submit />
</s:form>
</div>
由于我们没有指定 Action 类,因此将使用虚拟默认值(并返回“成功”)。一种“什么都不做”的动作。
实际上,一个普通的 html 页面在这里就足够了,但是使用 struts2 标签,我们实现了输入元素与操作字段的“绑定”,因此我们可以处理错误和重试。按照(仅)惯例,当参数不充分或无效时,Struts2 动作将返回“输入”(而不是“成功”)(这个想法是动作说“你指示我执行这个动作 X 但我没有成功了,我需要你给我一个正确的输入,拜托 - 也许你想重试?”)。因此,在我们的例子中,我们得到了场景的完整 struts.xml 映射:
<action name="addnumbersForm">
<result>/AddNumbersInputForm.jsp</result>
</action>
<action name="addnumbers" class="example.AddNumbersAction">
<result name="input">/AddNumbersInputForm.jsp</result>
<result name="success">/AddNumbersResult.jsp</result>
</action>
在我们的 AddNumbersInputForm.jsp 中,我们可以添加一个标签来显示验证错误(由内部的 Struts2 或我们的代码生成)。
然后,如果我们按下带有无效参数的提交按钮,Struts 将在其参数拦截器中检测到这一点(如果您配置它,则加上验证)并在调用 execute() 方法之前返回“输入”。然后,AddNumbersInputForm.jsp 将被渲染,但现在文本输入将重新填充以前的值。从哪里?来自操作,如果可以设置字段,或者来自请求本身。这个小魔法对于任何用户友好的 html 输入表单都是必不可少的(理解它是必不可少的)。
还有其他一些方法,但关键是要区分:“用例”在这里只是一个(添加两个数字),但动作(概念上)是两个:第一个只是向用户提供输入形式,第二个实际上是加法。这个概念应该体现在actions/urls的名字中。