Bri*_*ler 11 java validation jsp struts2
我目前正在尝试学习Struts2.
我创建了一个表单,一个处理它的动作,一个用于验证它的XML,以及struts.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>
Run Code Online (Sandbox Code Playgroud)
<!-- /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>
Run Code Online (Sandbox Code Playgroud)
// /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; }
}
Run Code Online (Sandbox Code Playgroud)
<!-- // /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>
Run Code Online (Sandbox Code Playgroud)
我需要做什么或改变才能让struts首次显示表单而不抱怨所有空白字段?
Dew*_*wfy 13
是的,我知道这个问题.通常我正在使用以下解决方法.
标记execute着org.apache.struts2.interceptor.validation.SkipValidation
@SkipValidation
public String execute() throws Exception { return SUCCESS; }
Run Code Online (Sandbox Code Playgroud)
所以第一遍将忽略验证方法.但输入将被验证.
Rob*_*lan 13
@SkipValidation解决方法可以做到这一点,但是Struts验证已经内置了关于它何时运行(或不运行)的规则 - 最好学习规则,这样你就不需要额外的配置了.这也是值得学习的,所以你不糊涂的时候验证不,当你需要它运行...
所以,简短的回答:如果你改变这个
<action name="loginUser" class="hu.flux.user.LoginUserAction" method="execute">
Run Code Online (Sandbox Code Playgroud)
对此
<action name="loginUser" class="hu.flux.user.LoginUserAction" method="input">
Run Code Online (Sandbox Code Playgroud)
(注意方法参数) - 这将解决问题(在你的动作类中实现方法).
答案很简单:在struts-core JAR文件的根目录下打开struts-default.xml并浏览.验证由"验证"拦截器处理.然后是另一个名为"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>
Run Code Online (Sandbox Code Playgroud)
excludeMethods引用了action方法参数,并且正是您正在尝试执行的操作.
您还可以设置自己的拦截器堆栈(以默认方式或其他示例为模型)并定义其他排除方法.名称中支持通配符.