本文主要是介绍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 {@Overridepublic 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;}@Overridepublic 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方法。* * 模型驱动:需要实例化。*/@Overridepublic DogBean getModel() {dogBean = new DogBean();return dogBean;}@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic void init(FilterConfig arg0) throws ServletException {}@Overridepublic void destroy() {}@Overridepublic 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);}@Overridepublic 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;}@Overridepublic 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>
这篇关于3.3Struct2(下午)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!