我如何告诉 Struts2 在表单第一次显示时不要验证它?

Posted

技术标签:

【中文标题】我如何告诉 Struts2 在表单第一次显示时不要验证它?【英文标题】:How can I tell Struts2 not to validate a form the first time it displays? 【发布时间】:2011-05-03 10:42:53 【问题描述】:

我目前正在尝试学习 Struts2。

我在 struts.xml 中创建了一个表单、一个处理它的操作、一个验证它的 XML 和操作。

每次显示表单时,即使是第一次,Struts2 都会尝试验证,因此在用户有机会完成之前显示错误。

以下是相关代码:

<!-- /WebContent/views/user/login.jsp -->
<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Login Page</title>
<s:head />
</head>
<body>
    <h1>Login Page</h1>
    <s:form action="executeUser">
        <s:textfield key="userBean.userName" />
        <s:password key="userBean.password" />
        <s:submit align="center" />
    </s:form>
</body>
</html>

<!-- /src/struts.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <constant name="struts.devMode" value="true" />

    <package name="overviewofstruts" extends="struts-default">
        <action name="loginUser" class="hu.flux.user.LoginUserAction" method="execute">
            <result name="input">/views/user/login.jsp</result>
        </action>

        <action name="executeUser" class="hu.flux.user.LoginUserAction" method="execute">
            <result name="input">/views/user/login.jsp</result>
            <result name="success">/views/user/login_thankyou.jsp</result>
        </action>
    </package>

</struts>

// /src/hu/flux/user/LoginUserAction.java
package hu.flux.user;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class LoginUserAction extends ActionSupport 

    private User userBean;
    public void setUserBean(User userBean)  this.userBean = userBean; 
    public User getUserBean()  return userBean; 

    public String login() throws Exception  return this.execute(); 
    public String execute() throws Exception  return  SUCCESS; 
    public String input() throws Exception  return INPUT; 


<!-- // /src/hu/flux/user/LoginUserAction-validation.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
 <validator type="requiredstring">
    <param name="fieldname">userBean.userName</param>
    <message>Username is required.</message>
 </validator>
 <validator type="requiredstring">
    <param name="fieldname">userBean.password</param>
    <message>Password is required.</message>
 </validator>


我需要做什么或改变才能让 struts 第一次显示表单而不抱怨所有空白字段?

【问题讨论】:

我认为***.com/questions/12765997/… 的回答可以帮助到你。 【参考方案1】:

是的,我知道这个问题。通常我使用以下解决方法。

org.apache.struts2.interceptor.validation.SkipValidation标记execute

@SkipValidation
public String execute() throws Exception  return  SUCCESS; 

所以第一次通过将忽略验证方法。但是 input 将被验证。

【讨论】:

【参考方案2】:

@SkipValidation 解决方法可以做到这一点,但是 Struts 验证已经有关于何时运行(或不运行)的内置规则——最好学习这些规则,这样您就不需要额外的配置。它也值得学习,因此当您需要验证时运行时您不会感到困惑......

所以,简短的回答:如果你改变这个

<action name="loginUser" class="hu.flux.user.LoginUserAction" method="execute">

到这里

<action name="loginUser" class="hu.flux.user.LoginUserAction" method="input">

(注意方法参数)——这将解决问题(在你的动作类中实现方法)。

长答案:打开 struts-default.xml,位于 struts-core JAR 文件的根目录并浏览。验证由“验证”拦截器处理。然后还有一个叫做“workflow”的拦截器,如果验证失败,它会自动显示“输入”结果,所以一起看看。​​

找到,你会看到:

<interceptor-ref name="validation">
    <param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
    <param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>

excludeMethods 指的是操作方法参数,并且正是您想要做的事情。

您还可以设置自己的拦截器堆栈(以默认或其他示例之一为模型)并定义其他排除方法。名称中支持通配符。

【讨论】:

以上是关于我如何告诉 Struts2 在表单第一次显示时不要验证它?的主要内容,如果未能解决你的问题,请参考以下文章

Struts2表达式封装Action获取不到表单数据的一次记录

struts2框架之重复提交问题

如何从无提交按钮调用 Struts2 操作

在javascript-ajax中提交表单时如何显示进度条

使用 Xamarin 表单选择产品时如何显示产品详细信息

制作页面告诉浏览器不要缓存/保留输入值