当前位置: 首页 > 面试题库 >

Struts 2验证和输入字段重新填充

郭凡
2023-03-14
问题内容

如果我有以下struts.xml配置:

<action name="input">
   <result>/jsp/input.jsp</result>
</action>

<action name="result">
    <result>/jsp/result.jsp</result>
    <result name="input">/jsp/input.jsp</result>
</action>

一个只有一个字段的简单表格:

<s:form action="result">
    <s:textfield name="firstName" label="First Name"/>
    <s:submit/>
</s:form>

验证失败时,假设我每次提交操作(结果)都验证firstName的长度大于3。验证失败时,它将返回输入页面,在本例中为input.jsp,但字段firstName已经填充(我刚提交了不正确的值Struts
2怎么做呢?我想知道,因为据我了解,当我提交默认方法时,将输入数据POST到操作中,那些与验证匹配的请求参数名称将得到验证。如果验证失败,它将返回只有可用请求参数的输入页面(作为POST的响应),所以我唯一想到的是输入字段中填充了这些请求参数,例如如果我进行以下测试,假设我将使用以下方法进行模拟:

http://domain/myApp/input.action?firstName =
alfredo

将不会填充输入字段firstName。

但是,当结果来自验证时,它将被填充。我想知道Struts 2是否为了获得应在请求参数上的那些值,请推送请求参数对象(#parameters)并以此方式填充。

有人可以向我解释吗?Struts 2如何实现重新填充?

谢谢。


问题答案:

我认为您误解了一些Struts2概念和术语。为什么将动作称为“输入”和“结果”?这是不好的做法,并且会引起混淆-
特别是因为“输入”是标准Struts2“结果”的名称。

动作应根据它们执行的 动作 来调用。

基本模式很简单。URL(http请求,GET或POST)对应于用户(浏览器,客户端),要求服务器(webapp,顶部为struts2) 执行某些操作
。该动作可以给出几个 结果 ,每个结果都会向用户返回一些信息(视图)(通常是通过JSP页面生成的HTML)。

网址: http://...../addnumbers.action

在这里,动作的名称是“ addnumbers”-该请求将执行加法操作(不要被欺骗,并认为它还会显示输入形式-暂时 不会
-只是执行加法操作,顾名思义)

一个典型的实现。在struts.xml中,指定 映射

   <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参数相对应的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" class="example.AddNumbersAction">
     <result name="input">/AddNumbersInputForm.jsp</result>
     <result name="success">/AddNumbersResult.jsp</result>
   </action>

在我们的AddNumbersInputForm.jsp中,我们可以添加一个标签来显示验证错误(由内部的Struts2或我们的代码生成)。

然后,如果我们按下带有无效参数的Submit按钮,Struts将在其参数拦截器中检测到这一点(如果配置,则还要加上验证),并在调用execute()方法之前返回“
input”。然后,AddNumbersInputForm.jsp将呈现,但是现在将使用先前的值重新填充文本输入。来自哪里?从操作(如果可以设置字段),或者从请求本身开始。对于任何用户友好的html输入表单,此小魔术都是必不可少的(理解它是必不可少的)。

还有其他一些方法,但是要点是要区分:这里的“用例”只是一个(加两个数字),而操作(在概念上)是两个:第一种只是向用户显示输入形式,即第二个实际上做加法。该概念应反映在操作/
URL的名称中。



 类似资料:
  • 您如何验证有效的 HTML JavaScript 即使我对表单中的其他字段使用相同的方法,对空字段的验证也不起作用。

  • 问题内容: 我正在使用JavaFX和Scene Builder,并且有一个带有文本字段的表单。这些文本字段中的三个从字符串解析为双精度。 我希望它们是学校成绩,因此只能将其设置为1.0到6.0之间。不应允许用户写“ 2.34.4”之类的内容,但可以写“ 5.5”或“ 2.9”之类的内容。 验证已解析字段: 如何测试用户输入的值是否正确? 我已经在Stackoverflow和Google上进行了搜索

  • 问题内容: 问候,我有这个输入字段, 我想在单击提交按钮时调用IsEmpty函数。 我尝试了下面的代码,但是没有用。有什么建议吗? 问题答案:

  • 我在jquery中使用ajax调用将用户输入从刀片服务器发送到控制器。 我有一个输入字段 fname代表firstname,lname代表lastname 在我的jquery中,我有一个电话 field是字段的名称,val是用户在输入中输入的值。 updateProfilePage是一个ajax调用 在我的路由文件中,这调用了我的存储函数。我纠结的是如何验证用户输入的值。这是我在控制器中的存储方法

  • 问题内容: 我是这个C ++世界的新手,正在尝试为数字密码编写输入验证功能。这是我到目前为止所得到的: 对于不正确的值,它工作得很好,但在有效输入时不会中断循环。知道我在这里缺少什么吗?干杯!! James Kanze脚本的ErroR: 新代码: 使用 和 验证作为字符串 感谢所有人(尤其是James Kanze)的帮助。这件事在这里很有效。 那里还有进一步改进的空间吗?干杯!! 问题答案: 这看

  • 我是一个学生,我有一个小问题验证输入。 我试过的是把字符串解析成double的测试,但我做不到。我不知道如何测试双倍是否只是数字。 请给我一个我该做什么的线索。