Struts2基础知识

本文主要包括以下内容

  1. struts2常用常量的定义与意义
  2. struts2处理流程
  3. 拆分struts
  4. 动态方法调用,使用通配符
  5. 接收请求参数
  6. 中文编码问题
  7. 自定义类型转化器
  8. 访问或添加request/session/application
  9. 常用servlet对象的获取

struts2常用常量的定义与意义

这里写图片描述

这里写图片描述

struts2处理流程

这里写图片描述

每一次请求都会创建一个新的action,所以struts2的action是线程安全的

拆分struts

这里写图片描述

动态方法调用

这里写图片描述

(不建议使用)动态方法调用:http://localhost:8080/struts2day02/customer/addCustomer!updateCustomer(应该执行addCustomer,使用!updateCustomer,在请求addCustomer就执行了updateCustomer)
关闭动态调用的功能:

struts.enable.DynamicMethodInvocation = false  

使用通配符

<package name="orders" namespace="/orders" extends="mypackage"><action name="orders_*" class="cn.itcast.action.OrdersAction" method="{1}"><result type="dispatcher" name="success">/orders/success.jsp</result></action></package>

接收请求参数

采用基本类型接收请求参数(get/post)

在Action类中定义与请求参数同名的属性,struts2便能自动接收请求参数并赋予给同名属性。
请求路径http://localhost:8080/test/view.action?id=100

public class ProductAction{
private Integer id;
public void setId(Integer id){//struts2通过反射技术调用与请求参数同名的属性的settter方法来获取请求参数值
this.id = id;
}
public Integer getId(){return id;}
}

采用复合类型接收请求参数

请求路径:http://localhost:8080/test/view.action?product.id=78

public class ProductAction{
private Product product;
public void setProduct(Product product){this.product = product;}
public Product getProduct(){return product;}
}

struts2首先通过反射技术调用Product的默认构造函数创建product对象,然后再通过反射技术调用product中与请求参数同名的属性的setter方法来获取请求参数值

中文乱码问题

这里写图片描述

过滤器实现

package com.zj.filter;import java.io.IOException;
import java.util.Map;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;public class EncodeFilter implements Filter {private FilterConfig config=null;private ServletContext context=null;private String encode=null;@Overridepublic void destroy() {// TODO 自动生成的方法存根}@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {// TODO 自动生成的方法存根//响应乱码解决arg1.setCharacterEncoding(encode);arg1.setContentType("text/html;charset="+encode);//请求乱码解决arg2.doFilter(new MyHttpServletRequest((HttpServletRequest) arg0), arg1);}@Overridepublic void init(FilterConfig arg0) throws ServletException {// TODO 自动生成的方法存根this.config=arg0;this.context=arg0.getServletContext();this.encode=context.getInitParameter("encode");}private class MyHttpServletRequest extends HttpServletRequestWrapper{private HttpServletRequest request=null;private boolean isNotEncode=true;public MyHttpServletRequest(HttpServletRequest request) {super(request);// TODO 自动生成的构造函数存根this.request=request;}@Overridepublic String getParameter(String name) {// TODO 自动生成的方法存根return getParameterValues(name)==null?null:getParameterValues(name)[0];}@Overridepublic Map<String, String[]> getParameterMap() {// TODO 自动生成的方法存根try{if(request.getMethod().equalsIgnoreCase("post")){request.setCharacterEncoding(encode);return request.getParameterMap();}else if(request.getMethod().equalsIgnoreCase("GET")){Map<String,String[]> map=request.getParameterMap();if(isNotEncode){for(Map.Entry<String, String[]> entry:map.entrySet()){String []vs=entry.getValue();for(int i=0;i<vs.length;i++){vs[i]=new String(vs[i].getBytes("iso8859-1"),encode);}}isNotEncode=false;}return map;}else{return request.getParameterMap();}//return super.getParameterMap();}catch(Exception e){e.printStackTrace();throw new RuntimeException();}}@Overridepublic String[] getParameterValues(String name) {// TODO 自动生成的方法存根return getParameterMap().get(name);}}}

web.xml中注册

<!-- 过滤器配置开始 --><filter><description>全站乱码过滤器</description><filter-name>EncodeFilter</filter-name><filter-class>com.zj.filter.EncodeFilter</filter-class></filter><filter-mapping><filter-name>EncodeFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

解决乱码的另一方法

<!-- 全站参数配置 --><context-param><description>全站编码配置</description><param-name>encode</param-name><param-value>utf-8</param-value></context-param>

自定义类型转化器,解决输入Date类型的问题

1、编写一个类,继承
com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter

2、覆盖掉其中的convertValue方法

public Object convertValue(Map<String, Object> context, Object value,Class toType)context:OGNL表达式的上下文value:实际的值。用户输入的都是字符串,但他是一个String数组。toType:目标类型public class DateConvertor extends DefaultTypeConverter {/*context:ognl表达式的上下文value:用户输入的值( 保存数据时)或者模型中的属性。用户输入的值是String数组toType:目标类型*/@Overridepublic Object convertValue(Map<String, Object> context, Object value,Class toType) {DateFormat df = new SimpleDateFormat("yyyy/MM/dd");if(toType==Date.class){//2013/05/31----->java.util.Date 保存数据时String strValue = ((String[])value)[0];try {return df.parse(strValue);} catch (ParseException e) {throw new RuntimeException(e);}}else{//java.util.Date----->2013/05/31 获取数据时Date dValue = (Date)value;return df.format(dValue);}}}

3、注册类型转换器
3.1局部类型转换器:只对当前的Action有效

    具体做法:在动作类相同的包中,建立一个名称是“动作类名-conversion.properties”的配置文件,    文件中增加以下内容:要验证的字段=验证器的类全名         birthday=cn.itcast.convertor.DateConvertor      

3.2全局类型转换器:对所有的Action都有效

    具体做法:在WEB-INF/classes目录下,建立一个名称为"xwork-conversion.properties"的配置文件,  文件中增加以下内容:目标类型全名=验证器的类全名         java.util.Date=cn.itcast.convertor.DateConvertor      

注意:如果转换失败,Struts2框架会寻找name=input的结果页面

访问或添加request/session/application

/*** */
package cn.itcast.action;import java.io.Serializable;
import java.util.Map;import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;/*** @author wzhting**/
//域范围
public class ScopeAction extends ActionSupport implements Serializable {//向各大域范围存放点数据@Overridepublic String execute() throws Exception {ActionContext ac = ActionContext.getContext();Map<String,Object> applicationMap = ac.getApplication();//这个就是ServletContext对象中维护的那个MapapplicationMap.put("p", "application_p");// ServletContext.setAttribute(key,object);Map<String,Object> sessionMap = ac.getSession();//这个就是HttpSession对象中维护的那个MapsessionMap.put("p", "session_p");// HttpSession.setAttribute(key,object);ac.put("p", "request_p");//相当于ServletRequest.setAttribute(key,obj);  return super.execute();}}

在jsp中可以得到

applicationScope生存周期是整个应用
sessionScope生存周期是整个会话
requestScope生存周期是一次请求

 <body>应用范围:${applicationScope.p}<br/>  会话范围:${sessionScope.p}<br/>请求范围:${requestScope.p}<br/></body>

### 常用servlet对象的获取

### 方式一:通过ServletActionContext直接获取

 //方式一public String execute1(){ServletContext sc = ServletActionContext.getServletContext();System.out.println(sc);ServletRequest request = ServletActionContext.getRequest();System.out.println(request);return SUCCESS;}

### 方式二:实现指定接口,由struts框架运行时注入

 public class WebObjectAction extends ActionSupport implements Serializable,ServletContextAware,ServletRequestAware,ServletResponseAware {private ServletContext context;private HttpServletRequest request;private HttpServletResponse response;//方式二public String execute2(){System.out.println(context);System.out.println(request);System.out.println(response);return SUCCESS;}public void setServletContext(ServletContext context) {//如果动作类实现了ServletContextAware接口,就会自动调用该方法this.context = context;}public void setServletRequest(HttpServletRequest request) {this.request = request;}public void setServletResponse(HttpServletResponse response) {this.response = response;}}

完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶汽车测试在美惹争议,原因为何?

来源&#xff1a;中国汽车报摘要&#xff1a;近日&#xff0c;针对美国总统特朗普提出的&#xff0c;汽车制造商需自愿提交他们在公共道路上测试自动驾驶汽车安全报告一事&#xff0c;回应者寥寥&#xff0c;目前只有三家汽车公司响应了上述要求&#xff0c;提交了相关材料。据…

Struts2基础知识(二)

本文主要包括以下内容 文件上传&#xff0c;多文件上传 自定义拦截器 用户输入验证国际化 文件上传 将头设置为enctype”multipart/form-data” <body><form action"${pageContext.request.contextPath}/upload/upload1.action" method"post" …

想做自动驾驶技术的入,这回分享一个简单好用的开放平台

前言 自动驾驶已经是现在技术开发领域最热门的方向之一&#xff0c;作为程序员&#xff0c;很多人也都想来这个领域试试水。但是这个领域的门槛也挺高&#xff0c;不过想开始的话&#xff0c;其实可以从一些专门针对自动驾驶的开放平台开始入手&#xff0c;目前比较主流的可以…

潘建伟团队再登Nature:全球首次实现器件无关量子随机数,量子保密通信安全再升级...

岳排槐 编辑量子位 出品 | 公众号 QbitAI据消息&#xff0c;潘建伟团队日前成功实现了器件无关的量子随机数&#xff0c;将在数值模拟、密码学等领域广泛应用&#xff0c;并有望形成新的随机数国际标准。相关研究成果于北京时间20日由国际权威学术期刊《自然》在线发表&#xf…

一篇文章搞懂数据仓库:数据治理(目的、方法、流程)

目录 1、什么是数据治理 2、数据治理的目的 3、数据治理的方法 4、数据质量8个衡量标准 5、数据治理流程 1、什么是数据治理 数据治理&#xff08;Data Governance&#xff09;是组织中涉及数据使用的一整套管理行为。由企业数据治理部门发起并推行&#xff0c;关于如何制…

在OEL5上安装配置Oracle Gird Control 10.2.0.5

早期的Grid Control问题实在太多了&#xff0c;以至于把10.2.0.1的Grid Control升级到10.2.0.5几乎是不可能完成的任务&#xff1b;此外10.2.0.5以前的gc不支持11g作为repository database仓库数据库&#xff0c;不仅于此10.2.0.1版本是不支持rhel5或OEL5的&#xff0c;如果想安…

Struts2基础知识(三)

本文主要包括以下内容 OGNL表达式标签 防止表单重复提交 使用第三方插件tomcat启动时struts2容器做的事 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写&#xff0c;它是一个开源项目。Struts2框架使用OGNL作为默认的表达式语言。 相对EL表达…

70行Python代码,获取中国数据库大会(DTCC)全部PPT

大家好&#xff0c;我是明月十四桥&#xff01; 擅长领域&#xff1a;python黑科技、大数据后端研发、数据仓库 今日重点&#xff1a; ① 学会使用python 获取各种网站的ppt&#xff0c;可见即可爬&#xff1b; ② 中国数据库大会一年一届&#xff0c;门票昂贵&#xff0c;干货…

半导体产业格局:行稳而致远,强者将恒强

来源&#xff1a;华泰证券▌中国半导体产业链渐趋完善&#xff0c;产业生态体系逐步成形目前我国垂直分工模式的芯片产业链初步搭建成形&#xff0c;产业上中下游已然打通&#xff0c;涌现出一批实力较强的代表性本土企业。集成电路是基础性、先导性产业&#xff0c;涉及国家信…

Struts2之Crud综合实例

本文是Struts2的综合实例&#xff0c;主要包含以下功能 添加&#xff0c;删除&#xff0c;修改&#xff0c;查询用户上传&#xff0c;下载图片 拦截器实现登陆功能 验证器检查输入 下载图片功能以前没有实现过&#xff0c;步骤如下 在类中增加两个属性 //文件下载private…

教你用python爬英雄联盟官网:①掌握爬虫技术;②Python数据可视化

大家好&#xff0c;我是明月十四桥&#xff01;&#xff01; 擅长领域&#xff1a;python黑科技、大数据后端研发、数据仓库 今日重点&#xff1a; ① 掌握爬虫技术&#xff0c;体会python爬虫流程&#xff0c;可见即可爬&#xff1b; ② 学会使用python数据可视化。 有问题的…

7套干货,Python常用技术学习知识图谱!!(史上最全,建议收藏)

大家好&#xff0c;我是明月十四桥&#xff01; 你要偷偷努力&#xff0c;然后惊艳所有人~ 给大家推荐 7 个宝藏级教程&#xff0c;视频课是永久有效的&#xff0c;可以随时学习&#xff0c;有几门课程还有CSDN官方学习答疑群&#xff0c;课程右边扫码入群&#xff0c;讲师在群…

权威发布 |《科学美国人》:2018全球十大新兴技术

来源&#xff1a;世界经济论坛摘要&#xff1a;尽管这些技术仍处于发展早期&#xff0c;但它们吸引了众多研究团队的关注&#xff0c;并且广受投资者青睐。在未来3~5年间&#xff0c;它们可能会对社会与经济产生重要影响。9月19日&#xff0c;《科学美国人》与世界经济论坛&…

23篇大数据系列(一)java基础知识全集(2万字干货,建议收藏)

大数据系列爽文&#xff0c;从技术能力、业务基础、分析思维三大板块来呈现&#xff0c;你将收获&#xff1a; ❖ 提升自信心&#xff0c;自如应对面试&#xff0c;顺利拿到实习岗位或offer&#xff1b; ❖ 掌握大数据的基础知识&#xff0c;与其他同事沟通无障碍&#xff1b; …

Hibernate基础知识

本文主要包括以下内容 对象的状态 一对多的单向关联一对多的双向关联多对多关联 一对一关联 对象状态的变化 对象的状态 临时状态 new 持久化状态 get,save,update脱管状态 clear close evict 一对多单向操作&#xff0c;以班级表与学生表为例 Classes.java package …

从概念到应用,腾讯视角深入“解剖”AI平台和语音技术

来源&#xff1a;AI科技大本营摘要&#xff1a;9 月 15 日&#xff0c;以“破局人工智能&#xff1a;AI平台及智能语音应用解析”为题的沙龙在上海举办&#xff0c;本次活动由 CSDN、腾讯云联合主办。近年来&#xff0c;人工智能技术快速发展&#xff0c;与其他行业的结合也成为…

23篇大数据系列(二)scala基础知识全集(史上最全,建议收藏)

作者简介&#xff1a; 蓝桥签约作者、大数据&Python领域优质创作者。管理多个大数据技术群&#xff0c;帮助大学生就业和初级程序员解决工作难题。 我的使命与愿景&#xff1a;持续稳定输出&#xff0c;赋能中国技术社区蓬勃发展&#xff01; 大数据系列文章&#xff0c;…

为什么 AI 芯片时代必然到来——从TPU开始的几十倍性能之旅

作者&#xff1a;刘肉酱摩尔定律的终结将使服务于特定领域的架构成为计算的未来。一个开创性的例子就是谷歌在 2015 年推出的张量处理单元&#xff08;TPU&#xff09;&#xff0c;目前已经在为超过十亿人提供服务。TPU 使深度神经网络&#xff08;DNN&#xff09;的计算速度提…

java学习笔记之数组

数组是一种效率最高的存储和随机访问对象引用序列的方式,一旦初始化完成&#xff0c;数组长度将不能变&#xff0c;但可以改变其引用&#xff0c;如&#xff1a; int a[]{1,2}; int b[]{1,2,3,4,5}; ab; 如果输出&#xff0c;将得到&#xff1a; b.length5;a.length5; java数组…

《爬虫写得好,铁窗关到老》教你把握爬虫的法律边界!㊫

作者简介 蓝桥签约作者、大数据&Python领域优质创作者。维护多个大数据技术群&#xff0c;帮助大学生就业和初级程序员解决工作难题。 我的使命与愿景&#xff1a;持续稳定输出&#xff0c;赋能中国技术社区蓬勃发展&#xff01; 最近的IT公司违法案件越来越多&#xff0c;…