(
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>