3.3Struct2(下午)

4:Action中如何獲取客戶的請求數據。

5:在Struts工程使用Servlet。

6:Struts中的作用域。

7:get請求時的中文亂碼處理(過濾器)

接着上篇

4、Action中如何獲取客戶的請求數據。

A:使用Request對象來獲取

get和post請求

B:使用屬性驅動來獲取,使用Action中的屬性來接收Request中的請求參數。

原則:請求參數的名稱要與屬性的名稱一致。

問題:當控件比較多,屬性驅動可以使用javaBean來接收頁面請求的參數;

屬性不使用Bean:名稱與屬性一致。

屬性使用Bean:名稱 == javaBean屬性名稱.Bean屬性

C:使用模型驅動來獲取。(使用哪個模型驅動,就得實現ModelDriven相應的接口。)

總結:3種取值可以混合使用來獲取REquest中的值。

注意模型驅動和屬性驅動的區別:

屬性驅動:dogBean不需要實例化。只需要SET./GET方法。

模型驅動:需要實例化。

具體代碼:

Request對象獲取

package com.action.request;

import java.util.Arrays;

import com.util.BaseAction;

public class RequestAction_1 extends BaseAction {

	@Override
	public String execute() throws Exception {
		return null;
	}

	/**
	 * 獲取GET中的請求參數
	 * 
	 * @return
	 * @throws Exception
	 */
	public String get() throws Exception {
		String userid = this.request.getParameter("userid");
		String username = this.request.getParameter("username");
		String[] like = this.request.getParameterValues("like");
		System.out.println("userid = " + userid);
		System.out.println("username = " + username);
		System.out.println("like = " + Arrays.asList(like));
		return null;
	}

	/**
	 * 獲取POST中的請求參數
	 * 
	 * @return
	 * @throws Exception
	 */
	public String post() throws Exception {
		String userid = this.request.getParameter("userid");
		String username = this.request.getParameter("username");
		System.out.println("post===>userid = " + userid);
		System.out.println("post===>username = " + username);
		return null;
	}
}
屬性驅動

package com.action.request;

import java.util.List;

import com.bean.DogBean;
import com.util.BaseAction;

public class RequestAction_2 extends BaseAction {
	/**
	 * 接收單個參數
	 */
	private String userid;
	private String username;
	/**
	 * 接收多個名稱相同的參數
	 */
	private List<String> like;

	public String getUserid() {
		return userid;
	}

	public void setUserid(String userid) {
		this.userid = userid;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public List<String> getLike() {
		return like;
	}

	public void setLike(List<String> like) {
		this.like = like;
	}

	private DogBean dogBean;

	public DogBean getDogBean() {
		return dogBean;
	}

	public void setDogBean(DogBean dogBean) {
		this.dogBean = dogBean;
	}

	@Override
	public String execute() throws Exception {
		return null;
	}

	/**
	 * 獲取GET中的請求參數
	 * 
	 * @return
	 * @throws Exception
	 */
	public String get() throws Exception {

		String userid = this.getUserid();
		String username = this.getUsername();
		List<String> likeList = this.getLike();
		if (username != null && !username.equals("")) {
			username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
		}

		System.out.println("userid = " + userid);
		System.out.println("username = " + username);
		System.out.println("likeList = " + likeList);
		return null;
	}

	/**
	 * 獲取POST中的請求參數
	 * 
	 * @return
	 * @throws Exception
	 */
	public String post() throws Exception {
		String userid = this.getUserid();
		String username = this.getUsername();
		List<String> likeList = this.getLike();

		int dogid = this.getDogBean().getDogid();
		String dogname = this.getDogBean().getDogname();
		String dogcolor = this.getDogBean().getDogcolor();

		System.out.println("post===>userid = " + userid);
		System.out.println("post===>username = " + username);
		System.out.println("post===>likeList = " + likeList);
		
		
		System.out.println("post===>dogid = " + dogid);
		System.out.println("post===>dogname = " + dogname);
		System.out.println("post===>dogcolor = " + dogcolor);
		return NONE;
	}
}
模型驅動:

package com.action.request;

import com.bean.DogBean;
import com.opensymphony.xwork2.ModelDriven;
import com.util.BaseAction;

public class RequestAction_3 extends BaseAction implements ModelDriven<DogBean> {
	private DogBean dogBean;
	
	/**
	 * 注意與屬性驅動的區別:
	 * 
	 * 屬性驅動:dogBean不需要實例化。只需要SET./GET方法。
	 * 
	 * 模型驅動:需要實例化。
	 */
	@Override
	public DogBean getModel() {
		dogBean = new DogBean();
		return dogBean;
	}

	@Override
	public String execute() throws Exception {
		return null;
	}

	/**
	 * 獲取GET中的請求參數
	 * 
	 * @return
	 * @throws Exception
	 */
	public String get() throws Exception {

		int dogid = dogBean.getDogid();
		String dogname = dogBean.getDogname();
		String dogcolor = dogBean.getDogcolor();

		System.out.println("dogid = " + dogid);
		System.out.println("dogname = " + dogname);
		System.out.println("dogcolor = " + dogcolor);
		return null;
	}

	/**
	 * 獲取POST中的請求參數
	 * 
	 * @return
	 * @throws Exception
	 */
	private String username;
	
	
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String post() throws Exception {
		int dogid = dogBean.getDogid();
		String dogname = dogBean.getDogname();
		String dogcolor = dogBean.getDogcolor();
		
		String username = this.getUsername();

		System.out.println("post===>dogid = " + dogid);
		System.out.println("post===>dogname = " + dogname);
		System.out.println("post===>dogcolor = " + dogcolor);
		
		System.out.println("post====>username = " +username);
		return NONE;
	}

}
index.xml中的關鍵代碼:

	A:使用Request對象來獲取
		<a href="<%=path%>/request/requestAction_1!get?userid=ID中文&username=中文&like=愛好1&like=愛好2">GET請求</a>
		
		
		POST請求
		<form method="post" action="<%=path%>/request/requestAction_1!post">
			userid:<input type="text" name="userid" value="2"/>
			
			username:<Input type="text" name="username" value="post提交的中文"/>
			
			<input type="submit" value="提交數據"/>
		</form>
		
	
	
	B:使用屬性驅動來獲取,使用Action中的屬性來接收Request中的請求參數。
	
		原則:請求參數的名稱要與屬性的名稱一致。
		
		<a href="<%=path%>/request/requestAction_2!get?userid=1&username=中文&like=test1&like=test2">GET請求</a>
		
		<form method="post" action="<%=path%>/request/requestAction_2!post">
			<fieldset style="width:70%;">
				<legend>屬性不使用Bean</legend>
				userid:<input type="text" name="userid" value="2"/>
				
				username:<Input type="text" name="username" value="post提交的中文"/>
				
				checkbox:<input type="checkbox" name="like" value="愛好1" checked="checked"/>愛好1
						<input type="checkbox" name="like" value="愛好2"/>愛好2
						<input type="checkbox" name="like" value="愛好3" checked="checked"/>愛好3
						<input type="checkbox" name="like" value="愛好4"/>愛好4				
			</fieldset>

			<fieldset style="width:70%;">
				<legend>屬性使用Bean</legend>
				dogid:<input type="text" name="dogBean.dogid" value="10"/>
				
				dogname:<Input type="text" name="dogBean.dogname" value="dog_名稱"/>
				
				dogcolor:<input type="text" name="dogBean.dogcolor" value="白色"/>
	
			</fieldset>				
			<input type="submit" value="提交數據"/>
		</form>
		
		問題:當控件比較多,屬性驅動可以使用javaBean來接收頁面請求的參數;
		
		屬性不使用Bean:名稱與屬性一致。
		
		屬性使用Bean:名稱 == javaBean屬性名稱.Bean屬性
	
	C:使用模型驅動來獲取。

		<a href="<%=path%>/request/requestAction_3!get?dogid=2&dogname=wang&dogcolor=black">GET請求</a>

		<form method="post" action="<%=path%>/request/requestAction_3!post">
			dogid:<input type="text" name="dogid" value="30"/>
			
			dogname:<Input type="text" name="dogname" value="dog_名稱"/>
			
			dogcolor:<input type="text" name="dogcolor" value="黑色"/>
			
			username:<input type="text" name="username" value="admin"/>
				
			<input type="submit" value="提交數據"/>
		</form>
		
	總結:3種取值可以混合使用來獲取REquest中的值。

5、在Struts工程中使用Servlet

解決方法1:由於Struts默認的後綴名是.action或者空。可以將Serlvet的後綴名給改掉。

解決方法2:重寫Struts的過濾器,根據路徑請求來進行判斷。

步驟(先寫一個過濾器繼承StrutsPrepareAndExecuteFilter這個過濾器,然後再修改web.xml中的Struct原本StrutsPrepareAndExecuteFilter過濾器的配置)

過濾器代碼:

package com.filter;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponseWrapper;

import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;

public class StrutsFilter extends StrutsPrepareAndExecuteFilter {

	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		/**
		 * 判斷請求路徑是否包含Servlet的關鍵字。
		 * 
		 * 
		 */
		HttpServletRequest request = (HttpServletRequest) req;
		String requestURI = request.getRequestURI();
		if (requestURI.indexOf("/servlet") != -1) {
			//跳到下一個過濾器,如果沒有下一個過濾器,就直接到達我們所請求的路徑中去
			chain.doFilter(req, res);
		} else {
			//說明是Struct,所以要調用父類的過濾器。
			super.doFilter(req, res, chain);
		}

	}

}
web配置:

	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>com.filter.StrutsFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

6、Struts中的作用域

A:使用Servlet中setAttribute/getAttribute/removeAttribute

B:使用Struts中封裝的Map作用域

A例子:

package com.action.scope;

import java.util.Date;

import com.util.BaseAction;

public class ScopeAction_1 extends BaseAction {

	@Override
	public String execute() throws Exception {
		/**
		 * 使用原生的作用域的操作。
		 */
		request.setAttribute("req_key", "Request作用域中的值");
		session.setAttribute("session_key", new Date().toLocaleString());
		servletContext.setAttribute("app_key", "ServletContext作用域");
		return "scope_1";
	}

}
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ 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>
<title>Insert title here</title>
</head>
<body>

<pre>
	輸出原生作用域中的數據。
	
	request = ${requestScope.req_key}
	
	session = ${sessionScope.session_key}
	
	application = ${applicationScope.app_key}
</pre>


</body>
</html>
B例子:

package com.action.scope;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.util.BaseAction;

public class ScopeAction_2 extends BaseAction {

	@Override
	public String execute() throws Exception {
		/**
		 * 作用域中的3個操作(set/get/remove),類似於Map對象中的(Put/get/remove)的操作。
		 * 
		 * 
		 * Struts中將3個相應的作用域封裝爲3個相應的Map數據結構。
		 * 
		 * 
		 */
		ActionContext context = ActionContext.getContext();
		Map<String, Object> sessionMap = context.getSession();
		Map<String, Object> applicationMap = context.getApplication();
		Map<String, Object> requestMap = context.getContextMap();

		sessionMap.put("session_id", session.getId());
		sessionMap.remove("session_id");

		applicationMap.put("app_id", Math.random() * 100);
		applicationMap.remove("app_id");

		requestMap.put("req_key_2", "作用域中的數據___Request");
		requestMap.remove("req_key_2");
		
		
		return "scope_2";
	}

}

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ 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>
<title>Insert title here</title>
</head>
<body>

<pre>
	輸出Struts中封裝的Map作用域中的數據。
	
	sessionID = 	${sessionScope.session_id}

	app_id = 		${applicationScope.app_id}
	
	req_key_2 = 	${requestScope.req_key_2}
</pre>


</body>
</html>
C例子頁面輸出:
package com.action.response;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.struts2.dispatcher.SessionMap;

import com.opensymphony.xwork2.ActionContext;
import com.util.BaseAction;

public class ResponseAction extends BaseAction {

	/**
	 * 接收單個參數
	 */
	private String userid;
	private String username;
	/**
	 * 接收多個名稱相同的參數
	 */
	private List<String> like;

	public String getUserid() {
		return userid;
	}

	public void setUserid(String userid) {
		this.userid = userid;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public List<String> getLike() {
		return like;
	}

	public void setLike(List<String> like) {
		this.like = like;
	}

	public String execute() throws Exception {
		this.userid = "100";
		this.username = "用戶名";
		this.like = new ArrayList<String>();
		this.like.add("aaa");
		this.like.add("bb");
		this.like.add("cc");

		/**
		 * 放到作用域
		 */

		ActionContext context = ActionContext.getContext();
		this.request.setAttribute("userid", this.userid);

		Map<String, Object> sessionMap = context.getSession();

		sessionMap.put("username", this.username);

		return "res";
	}
}

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insert title here</title>
</head>
<body>

<pre>
1:使用EL表達式+jstl標籤
	
	取成員變量
		userid = ${userid}
		
		username = ${username}
		
		like = ${like}
	
	取作用域
		userid = ${requestScope.userid}
		
		username = ${sessionScope.username}
		
	<c:if test="${sessionScope.username != null && sessionScope.username != ''}">
		Session作用域的username不爲空
	</c:if>


2:使用struts中OGNL表達式和Strust標籤。

	取成員變量
		userid = 	<s:property value="userid"/>
		
		username = 	<s:property value="username"/>
		
		like = 		<s:property value="like"/>
	
	取作用域
		userid = 	<s:property value="#request.userid"/>
		
		username =  <s:property value="#session.username"/>
		
		<s:if test="#session.username != null && #session.username != ''">
			struts====>Session作用域的username不爲空
		</s:if>

注意點:2種不能混用。不能在標籤中引用其他的表達式
(就是不能在JSTL標籤中使用OGNL標籤,不能在struct標籤中使用EL表達式
但一個頁面中是可以存在JSTL標籤中使用EL表達式和Struct標籤中使用OGNL表達式的)

	<%-- 
		<s:property value="${userid}"/>
	--%>
	
</pre>


</body>
</html>

7:寫一個過濾器用於get請求時的中文亂碼處理

package com.filter;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class EncodingFilter implements Filter {
	@Override
	public void init(FilterConfig arg0) throws ServletException {

	}

	@Override
	public void destroy() {

	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) res;
		String method = request.getMethod();
		if (method.equals("POST")) {
			request.setCharacterEncoding("UTF-8");
		} else {
			/**
			 * GET請求,改變request中的getParameter和getParameterValue這兩
			 * 個函數,在這兩個函數中就進行中文的處理
			 */
			request = new GetRequest(request);
		}
		response.setCharacterEncoding("UTF-8");
		chain.doFilter(request, response);
	}
    //HttpServletRequestWrapper是HttpServletRequest的實現類
	class GetRequest extends HttpServletRequestWrapper {

		public GetRequest(HttpServletRequest request) {
			super(request);
		}

		@Override
		public String getParameter(String name) {
			String oldValue = super.getParameter(name);
			String newValue = null;
			if (oldValue != null && oldValue != "") {
				try {
					newValue = new String(oldValue.getBytes("ISO-8859-1"),
							"UTF-8");
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}
			}
			return newValue;
		}

		@Override
		public String[] getParameterValues(String name) {
			String[] oldVaueArray = super.getParameterValues(name);
			String[] newValueArray = null;
			if (oldVaueArray != null && oldVaueArray.length > 0) {
				newValueArray = new String[oldVaueArray.length];
				for (int i = 0; i < oldVaueArray.length; i++) {
					String str = oldVaueArray[i];
					if (str != null && !str.equals("")) {
						try {
							String new_str = new String(
									str.getBytes("ISO-8859-1"), "UTF-8");
							newValueArray[i] = new_str;
						} catch (UnsupportedEncodingException e) {
							e.printStackTrace();
						}
					}
				}
			}
			return newValueArray;
		}
	}

}
還得在web.xml中配置下:
	<filter>
		<filter-name>EncodingFilter</filter-name>
		<filter-class>com.filter.EncodingFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>EncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章