這裏使用的簡單驗證是Struts2中最簡單的驗證.
javascript
可是不得不說,struts2的驗證系統仍是沒有JSF的好用.css
首先是struts.xml文件配置html
<package name="default" namespace="/" extends="struts-default"> <!-- action name is Visit URL's path,you can write 'hello.jsp' or 'hello' or 'hello.action' --> <!-- <action name="hello"> result不寫name,其實name就是 name="success" <result> /hello.jsp </result> </action> --> <!-- 若是不寫class,默認執行的是Action所要繼承的類:ActionSupport --> <action name="index" class="org.credo.action.IndexAction"> <!-- result不寫name,其實name就是 name="success" --> <result> /index.jsp </result> <result name="error"> /userinfo/success.jsp </result> </action> </package>
這裏新添加了result name=error的配置.而不寫默認是success.java
其次是action的配置.web
package org.credo.action; import com.opensymphony.xwork2.ActionSupport; public class IndexAction extends ActionSupport{ /** * 企業開發通常都必須使用繼承ActionSupport接口來作. */ private static final long serialVersionUID = 1L; private String name; public String execute(){ System.out.println("name:"+name); if(name == null || !name.trim().equals("admin")){ this.addFieldError("name", "name is error"); this.addFieldError("name", "name is too long"); this.addFieldError("name2", "name is too long"); return ERROR; } return SUCCESS; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
在這裏,能夠看到this.addFieldError這個添加驗證錯誤的信息.apache
接着就是UI頁面:數組
<form action="index" method="post"> 姓名:<input type="text" name="name"></input> <input type="submit" value="submit" /> </form> </body> </html>
這裏是一個簡單的文版框,submit以後,用post傳入到action類中.進行自動驗證.session
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'MyJsp.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <s:text name="success">Success</s:text> <s:fielderror fieldName="name" theme="simple"/><br/> 123,filedName等於this.addFieldError("name", "name is error");中的"name",樣式默認就爲"simple"<br/> <br/> <s:property value="errors" /><br/> <s:property value="errors.name[1]"/> //errors是map,name是數組,so.... <br/> //下面是struts ValueStack debug,s:property能夠經過NAME獲取值. <s:debug></s:debug> </body> </html>
上面是跳轉到的錯誤頁面.app
這裏使用了2個struts2的標籤.一個是<s:filedName>一個是<s:property>jsp
第一個的說明很徹底了.而第二個對應的是<s:debug>中的errors(是一個map)的value(是一個數組).filedName同理.
這裏就是後臺你手動傳入的參數.
全部的struts2的驗證,這個是最基本的,也是最經常使用的一個.
首要的目的是獲取到request,session,application. HttpServletRequest,HttpServletSession,ServletContext的引用.
取得Map類型request,session,application,真實類型 HttpServletRequest, HttpSession, ServletContext的引用:
公用代碼以下:
UI界面index.jsp代碼:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <html> <body> This is my login page. <br> <br> 取得Map類型request,session,application,真實類型 HttpServletRequest, HttpSession, ServletContext的引用: <br/> <form action="" name="loginForm" id="loginFormId" method="post"> 用戶名:<input type="text" name="name" id="nameId" /> 密 碼:<input type="password" name="pwd" id="pwdId" /><br/> <input type="button" value="submit1" onclick="javascript:document.loginForm.action='login/login1';document.loginForm.submit();" /> <input type="button" value="submit2" onclick="javascript:document.loginForm.action='login/login2';document.loginForm.submit();" /> <input type="button" value="submit3" onclick="javascript:document.loginForm.action='login/login3';document.loginForm.submit();" /> <input type="button" value="submit4" onclick="javascript:document.loginForm.action='login/login4';document.loginForm.submit();" /> </form> </body> </html>
UI界面跳轉的頁面代碼:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> Successful~~~~! <br> s:property是用標籤訪問ActionContext中的值,也就是StackContext.<br/> Stack Context--->These items are available using the #key notation!<br/> 因此可使用Struts標籤,來像下面代碼那樣直接獲取值.<br/> <s:property value="#request.r1" />||<%=request.getAttribute("r1") %><br> <s:property value="#session.s1" />||<%=session.getAttribute("s1") %><br> <s:property value="#application.a1" />||<%=application.getAttribute("a1") %><br> <s:property value="#attr.r1" /><br> <s:property value="#attr.s1" /><br> <s:property value="#attr.a1" /><br> attr這個屬性用的不多,由於不肯定性,你該明白你把你的數據放在什麼地方了.<br/> 若是request和session都有值的name,獲取會獲取第一個,由此出現問題. <s:debug></s:debug> </body> </html>
struts.xml配置文件:
<package name="login" namespace="/login" extends="struts-default"> <action name="login*" class="org.credo.action.LoginAction{1}"> <result>/login/success.jsp</result> </action> </package>
(一)最經常使用的方法:
package org.credo.action; import java.util.Map; import org.apache.struts2.interceptor.ApplicationAware; import org.apache.struts2.interceptor.RequestAware; import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionSupport; /** * 依賴注入DI/控制反轉IOC,本例是最經常使用的方法!!!!! */ public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{ private static final long serialVersionUID = 1L; private Map<String,Object> request; private Map<String,Object> session; private Map<String,Object> application; //依賴注入(DI),request依賴於容器(Struts2)調用RequestAwre方法注入數據. //控制反轉 (IOC),把本身作的事情交給了別人去作. public String execute(){ request.put("r1", "r1"); session.put("s1", "s1"); application.put("a1", "a1"); return SUCCESS; } @Override public void setApplication(Map<String, Object> application) { this.application= application; } @Override public void setSession(Map<String, Object> session) { this.session=session; } @Override public void setRequest(Map<String, Object> request) { this.request=request; } }
(二)方法2:
package org.credo.action; import java.util.Map; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; //這種方法依賴於Struts2,依賴於容器. @SuppressWarnings("rawtypes") public class LoginAction1 extends ActionSupport{ /** * 首要的目的是獲取到request,session,application. HttpServletRequest,HttpServletSession,ServletContext的引用. * public class ActionContext implements Serializable { * static ThreadLocal actionContext = new ThreadLocal(); *如山是ActionContext的實現,是一個實現了序列化的本地線程.也就是說Context是整個線程中的運行環境. */ private static final long serialVersionUID = 1L; private Map request; private Map session; private Map application; //ActionContext就是<s:debug>顯示的StackContext. //ActionContext public LoginAction1(){ //ActionContext.getContext()不是一個單例.是一個本地線程,ThreadLocal,可是在這個線程裏他是單例. request=(Map) ActionContext.getContext().get("request"); session=ActionContext.getContext().getSession(); application=ActionContext.getContext().getApplication(); //request,session,application在頁面中訪問的是HttpServletRequest,HttpServletSession,ServletContext } // 後臺MAP形式的request,session,application, //而前臺的HttpServletRequest,HttpServletSession,ServletContext是Struts2把後臺數據都填充到其中. @SuppressWarnings("unchecked") public String execute(){ request.put("r1", "r1"); session.put("s1", "s1"); application.put("a1", "a1"); return SUCCESS; } }
(三)方法3:
package org.credo.action; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; //固定寫法,基本不用. public class LoginAction3 extends ActionSupport{ /** * */ private static final long serialVersionUID = 1L; private HttpServletRequest request; private HttpSession session; private ServletContext application; public LoginAction3(){ request=ServletActionContext.getRequest(); session=request.getSession(); application=session.getServletContext(); } public String execute(){ request.setAttribute("r1", "r1"); session.setAttribute("s1", "s1"); application.setAttribute("a1", "a1"); return SUCCESS; } }
(四)方法4:
package org.credo.action; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts2.interceptor.ServletRequestAware; import com.opensymphony.xwork2.ActionSupport; public class LoginAction4 extends ActionSupport implements ServletRequestAware{ /** * 這個也是IOC的,可是實現的是ServletRequestAware接口.也不經常使用. */ private static final long serialVersionUID = 1L; private HttpServletRequest request; private HttpSession session; private ServletContext application; @Override public void setServletRequest(HttpServletRequest request) { this.request= request; this.session=request.getSession(); this.application=session.getServletContext(); } public String execute(){ request.setAttribute("r1", "r1"); session.setAttribute("s1", "s1"); application.setAttribute("a1", "a1"); return SUCCESS; } }