您的位置:首页 > 编程语言 > Java开发

struts2学习(2种实现验证方式)

2017-11-09 15:43 405 查看


第一种

Struts2中提供了一个com.opensymphony.xwork2.Validateable接口,此接口只有一个方法:validate()。如果有某个类实现了Validatable接口,Struts2就可以直接调用该类中的validate()方法。ActonSupport类实现Validateable接口。本文讨论此验证格式。

本文演示了一个模拟简单登录的场景:用户打开一个JSP页面,输入信息,提交登录。如果用户提交的信息格式有错误,则返回登录页面提示用户。数据格式正确则验证用户名与密码是否正确,登录成功则转向列表页面,显示当前用户的一些信息;如果登录错误则转向错误页面。
将表单参数封装进一个JavaBean(属性驱动);
如果用户输入信息有错误,直接返回提示用户再次输入;
如果用户名,密码错误,转向错误页面;

如果用户名、密码正确,则转向到另一个action类(并且传进一个id参数,用途自定),由此类处理进一步的业务逻辑,然后转向到显示列表的JSP页面。


第二种

参考:struts2:数据校验,通过XWork校验框架实现(validation.xml)


1. 修改Web.xml


2. 创建struts.xml


3. 在struts.xml中注册action和result

<action name="login" class="com.clzhang.ssh.member.action.LoginAction">
<result name="input">/ssh/demo2/login.jsp</result>
<result name="error">/ssh/demo2/wrong.jsp</result>
<result name="list" type="redirectAction">
<param name="idInList">${id}</param>
<param name="actionName">listBook</param>
</result>
</action>
<action name="listBook" class="com.clzhang.ssh.member.action.ListAction">
<result name="showList">/ssh/demo2/bookList.jsp</result>
</action>


result为list的配置指明,登录成功后,做一个redirect操作,由另一个action业务类去处理相关业务逻辑,并且在其中配置了参数传递(id字段);
第二个action的name为listBook,对应处理类为ListAction。


4. 创建登录JSP页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib uri="/struts-tags" prefix="s"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<s:form action="login" method="post">
<s:textfield name="loginInfoRef.username" label="账号"></s:textfield>
<br />
<s:textfield name="loginInfoRef.password" label="密码"></s:textfield>
<br />
<s:submit value="提交"></s:submit>
</s:form>
<br />
</body>
</html>

注意:因为将表单封装进了JavaBean所以,表单中元素的名称有所改变,如:loginInfoRef.username,此名称必须与相关action类中的变量名称一致。


5. 创建登录表单对应的实体类

package com.clzhang.ssh.member.action;
public class LoginInfo {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}


6. 创建登录业务处理action类

package com.clzhang.ssh.member.action;
import com.opensymphony.xwork2.ActionSupport;
/**
* 模拟登录
* 1.如果输入为空,提示错误,返回到登录页面;
* 2.登录错误,转向错误页面;
* 3.登录成功,转向列表页面。
*/
public class LoginAction extends ActionSupport {
public static final long serialVersionUID = 1;
// a.这个参数是转到列表页面需要的
private int id;
// b.将JSP提交的表单封装为一个JavaBean
private LoginInfo loginInfoRef;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public LoginInfo getLoginInfoRef() {
return loginInfoRef;
}

public void setLoginInfoRef(LoginInfo loginInfoRef) {
this.loginInfoRef = loginInfoRef;
}

@Override
// 重载ActionSupport类的方法(Validateable接口)
public void validate() {
super.validate();
// 验证方式一:
if ("".equals(loginInfoRef.getUsername())) {
this.addFieldError("loginInfoRef.username", "对不起,用户名不可以为空!");
}
if ("".equals(loginInfoRef.getPassword())) {
this.addFieldError("loginInfoRef.password", "对不起,密码不可以为空!");
}
// 如果执行了addFieldError()/addActionError()等方法,则会转到input对应的页面
}
@Override
// 重载ActionSuppoer类的方法(Action接口)
public String execute() {
if (loginInfoRef.getUsername().equals("test")
&& loginInfoRef.getPassword().equals("123")) {
System.out.println(loginInfoRef.getUsername() + "成功登录...");
this.setId(100);
return "list";
} else {
System.out.println(loginInfoRef.getUsername() + "成功失败!");
// 这些属于属于Action接口
return ERROR;
}
}
}



7. 创建显示登录错误JSP页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
wrong! :(
</body>
</html>



8. 创建生成列表的action类

package com.clzhang.ssh.member.action;
import java.util.ArrayList;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 登录成功后显示的列表处理
* @author acer
*
*/
public class ListAction extends ActionSupport {
public static final long serialVersionUID = 1;
private ArrayList<String> bookList = new ArrayList<String>();
private int idInList;
Public ArrayList<String> getBookList() {
return bookList;
}
public void setBookList(ArrayList<String> bookList) {
this.bookList = bookList;
}
public int getIdInList() {
return idInList;
}
public void setIdInList(int idInList) {
this.idInList = idInList;
}
public String execute() {
bookList.add("book1");
bookList.add("book2");
bookList.add("book3");
bookList.add("book4");
bookList.add("idInList=" + idInList);
ServletActionContext.getRequest().setAttribute("usernameRequest",
"你现在怎样");
ServletActionContext.getRequest().getSession().setAttribute(
"usernameSession", "我现在不怎样");
ServletActionContext.getServletContext().setAttribute(
"usernameApplication", "你怎样");
return "showList";
}

}



10. 测试

输入地址:http://127.0.0.1:8080/st/ssh/demo2/login.action

第二种

通过XWork校验框架

使用validate方法校验时,如果Web应用中存在大量Action就需要多次重写validate方法,因此可以使用XWork的validator框架来对Struts2进行数据校验,减少代码量。

在com.action包下创建验证文件LoginAction-validation.xml,注:当一个Action中有多个业务处理方法是,命名规则为:actionName-methodName-validation.xml,其中actionName为Action类名,methodName为Action中某个业务处理方法的方法名,并且文件的搜索顺序与方式一种validate()和validateX()一样。

Login-validation.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="userName">
<field-validator type="requiredstring">
<message>the name should not null</message>
</field-validator>
</field>

<field name="userPassword">
<field-validator type="requiredstring">
<message>the password should not null</message>
</field-validator>
</field>
</validators>





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts2.0
相关文章推荐