3.3Struct2(下午)

2023-11-21 19:38
文章标签 3.3 下午 struct2

本文主要是介绍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(下午)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/404609

相关文章

3.3V数字信号转5V信号(低成本)

在调一次LED屏驱动的时候,用到了一款LED驱动芯片TM1629,供电5V,如何将单片机高电平3.3v的数字信号,转换成5V高电平的数字信号给LED屏呢?采用低成本的方案考虑。     1:硬件上,单片机引脚输出端外加5V上拉,上拉电阻10K(可选) 2:单片机输出高电平:将引脚配制成输入模式,因为输入状态单片机处于高阻输出状态,5V上拉,确保给LED驱动芯片的信号为5V高电平  单片机

【计算机组成原理】3.3 主存储器与CPU的连接

3.3 主存储器与CPU的连接 00:00 各位同学大家好,在这一小节中我们要学习主存储器与CPU之间的连接。首先我们会回顾之前小结学习过的内容,我们已经知道了单块存储芯片它对外暴露出来的一些接口,我们首先会探讨单块存储芯片和CPU之间的连接如何实现,接下来会介绍多块存储芯片和CPU之间的连接,分别是位扩展、字扩展和字位同时扩展,这个小节的最后我们还会补充一些关于译码器的知识,补充的内容可能在

Photomator 3.3.22 (macOS Universal) - 照片编辑软件

Photomator 3.3.22 (macOS Universal) - 照片编辑软件 适用于 Mac、iPhone 和 iPad 的终极照片编辑器 请访问原文链接:https://sysin.org/blog/photomator/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Photomator 适用于 Mac、iPhone 和 iPad 的终极照

ZCC4105 48V 1MHz Synchronous Buck With 3.3V LDO Output

1 Features 。输入电压范围7V to 48 V 。输出电压可调节2.5V to 24 V 。1.2 A逐周期峰值限流                      。  内部环路补偿 。1MHz工作频率,支持小型L、C器件                                                    。内部集成同步管,无需外部肖特基二极管自适应恒压/恒流工

Rockchip开发系列 - 3.3.GPIO扩展芯片AW95016A和PCA953X(1)

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 概述硬件信息AW95016A寄存器信息GPIO OUTPUT输出寄存器GPIO INPUT输入寄存器INTERRUPT寄存器 调试 返回总目录:Rockchip开发

3.3 【实战】爬取BOSS直聘招聘信息

第四节:爬取招聘网站信息 课程目标 对boss直聘招聘信息爬取并进行简单的分析 课程内容 编码实现 解析网站:https://www.spidertools.cn/#/curl2Request 1. 爬虫部分 import requestsimport pandas as pdfrom tqdm import tqdmimport timedef get_job_list(p

Aiseesoft PDF Converter Ultimate 3.3.62 + crack

Aiseesoft PDF Converter Ultimate 是一个用于将 PDF 文件转换为其他格式的程序。它允许您将 PDF 转换为 Word、Text、Excel、PowerPoint、ePub、HTML、JPG、TIFF、PNG、GIF 等。 以下是该程序主要功能的简要说明: 支持不同的格式。该程序支持超过 25 种不同的格式,用于从 PDF 转换或转换为 PDF。您可以从下拉列表

cocos2d-x 3.3 引用【#include cocos-ext.h】头文件出现编译错误

cocos2d-x 3.3 引用【#include "cocos-ext.h"】头文件出现编译错误 添加【#include "cocos-ext.h"】 头文件后报错   f:\projects\test_httpclient\cocos2d\extensions\gui\cccontrolextension\cccontrolutils.h(39): fatal error C108

2018 下午 案例

学习笔记(4,5章),RAID RAID 0要提升性能,条带要做得越小越好。因为若是条带深度容量大于写入的数据的长度,这段数据将会落到同一个segment中,相当于本次IO只能从一块硬盘中读取。 但是条带太小,并发IO几率降低。因为如果条带太小,每次IO一定会占用大部分物理盘,队列中的IO只能等待IO结束后才使用物理盘 RAID 5 RAID 4相对于RAID 3 性能几乎没有

惠海H4312 dcdc同步整流降压恒压IC 30V 40V转3.3V/5V/12V小体积大电流单片机供电

1.产品描述 H4312是一种内置30V耐压MOS,并且能够实现精确恒压以及恒流的同步降压型 DC-DC 转换器: 支持 3.1A 持续输出电流输出电压可调,最大可支持 100%占空比;通过调节FB 端口的分压电阻,可以输出2.5V到 24V的稳定电压。 H4312 采用高端电流模式的环路控制原理,实现了快速的动态响应。H4312工作开关频率为 170kHz,具有良好的 EMI 特性。H43