我认为您误解了一些Struts2概念和术语。为什么将动作称为“输入”和“结果”?这是不好的做法,并且会引起混淆-
特别是因为“输入”是标准Struts2“结果”的名称。
动作应根据它们执行的 动作 来调用。
基本模式很简单。URL(http请求,GET或POST)对应于用户(浏览器,客户端),要求服务器(webapp,顶部为struts2) 执行某些 *** 作
。该动作可以给出几个 结果 ,每个结果都会向用户返回一些信息(视图)(通常是通过JSP页面生成的HTML)。
网址:
http://...../addnumbers.action
在这里,动作的名称是“ addnumbers”-该请求将执行加法 *** 作(不要被欺骗,并认为它还会显示输入形式-暂时 不会
-只是执行加法 *** 作,顾名思义)
一个典型的实现。在struts.xml中,指定 映射 :
<action name="addnumbers" > <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参数相对应的setter(尽最大努力进行类型转换-
在此从字符串转换为整数)。然后调用该 *** 作的默认方法(“ execute”),结果为“
success”,并
AddNumbersResult.jsp用于生成html页面;在此阶段,Action对象位于“值堆栈”(某种范围)中,以便标记调用其吸气剂。
一旦弄清楚了这一点,仍然存在两个问题:如何显示供用户输入数字的上一个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动作将在参数不足或无效时返回“
input”(而不是“ success”)(想法是该动作是说“您指示我执行此动作X,但我没有这么做”)成功,我需要您给我适当的 输入
-也许您想重试?”)。因此,在我们的案例中,我们为场景获得了完整的struts.xml映射:
<action name="addnumbersForm"> <result>/AddNumbersInputForm.jsp</result> </action> <action name="addnumbers" > <result name="input">/AddNumbersInputForm.jsp</result> <result name="success">/AddNumbersResult.jsp</result> </action>
在我们的AddNumbersInputForm.jsp中,我们可以添加一个标签来显示验证错误(由内部的Struts2或我们的代码生成)。
然后,如果我们按下带有无效参数的Submit按钮,Struts将在其参数拦截器中检测到这一点(如果配置,则还要加上验证),并在调用execute()方法之前返回“
input”。然后,
AddNumbersInputForm.jsp将呈现,但是现在将使用先前的值重新填充文本输入。来自哪里?从 *** 作(如果可以设置字段),或者从请求本身开始。对于任何用户友好的html输入表单,此小魔术都是必不可少的(理解它是必不可少的)。
还有其他一些方法,但是要点是要区分:这里的“用例”只是一个(加两个数字),而 *** 作(在概念上)是两个:第一种只是向用户显示输入形式,即第二个实际上做加法。该概念应反映在 *** 作/
URL的名称中。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)