Struts2簡單的驗證,訪問web元素

(五)Struts2簡單的驗證

這裏使用的簡單驗證是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的驗證,這個是最基本的,也是最經常使用的一個.

(六)Struts2訪問web元素

首要的目的是獲取到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;
	}
	
}
相關文章
相關標籤/搜索