从servlet到struts2

Servlet

Servlet优点

1、Servlet是mvc的基础,其他的框架比如struts1,struts2,webwork都是从servlet基础上发展过来的。所以掌握servlet是掌握mvc的关键。
2、Servlet把最底层的api暴漏给程序员,使程序员更能清楚的了解mvc的各个特点。
3、程序员可以对servlet进行封装。Struts2就是从servlet中封装以后得到的结果。
4、市场上任何一个mvc的框架都是servlet发展过来的,所以要想学好struts2这个框架,了解servlet的运行机制很关键。

Servlet缺点

1、每写一个servlet在web.xml中都要做相应的配置。如果有多很servlet,会导致web.xml内容过于繁多。
2、这样的结构不利于分组开发。
3、在servlet中,doGet方法和doPost方法有HttpServletRequest和HttpServletResponse参数。这两个参数与容器相关,如果想在servlet中作单元测试,则必须初始化这两个参数。
4、如果一个servlet中有很多个方法,则必须采用传递参数的形式,分解到每一个方法中。

重构Servlet

重构的目标

1、 只写一个Servlet或者过滤器(我们这里选择过滤器)
2、 不用再写任何的Servlet,这样web.xml文件中的额代码会减少很多
3、 原来需要写Servlet,现在只需要写action
4、 在action中把HttpServletRequest参数和HttpServletResponse参数传递过去
5、 在过滤器中通过java的反射机制调用action

重构的代码简单实现

1、 写一个UserAction

public class UserAction {
	public String execute(HttpServletRequest request,
			HttpServletResponse response){
		return "index.jsp";
	}
}

2、 监听器ActionListener implement ServletContextListener

public class ActionListener implements ServletContextListener{
	public void contextDestroyed(ServletContextEvent arg0) {
		//在摧毁的时候,清空application域中的所有的action的配置
		arg0.getServletContext().setAttribute("actions", null);
	}
	public void contextInitialized(ServletContextEvent arg0) {
		/**
		 * 1、创建一个Map
		 * 2、把key,value放入到map中
		 * 3、把map放入到application中
		 */
		Map<String, String> map = new HashMap<String, String>();
		map.put("userAction", "cn.bin.action.UserAction");
		arg0.getServletContext().setAttribute("actions", map);
	}
}

3、通过ActionServlet中java的反射机制进行调用

public void doGet(HttpServletRequest request,HttpServletResponse 
			response)throws ServletException, IOException {
		//1、获取url
		//2、对url进行解析,把“userAction”的部分解析出来
		//3、获取到application
		//4、从application中把Map提取出来
		//5、根据“userAction”从map中把value提取出来
		//6、利用java的反射机制进行调用
		// itcastsh08_super_servlet/userAction.action
		String uri = request.getRequestURI();
		//处理字符串得到map所需要的key值userAction
		String[] str = uri.split("/");
		String str1 = str[str.length-1];
		String actionName = str1.substring(0, str1.indexOf("."));
		//通过key值得到value值(action的类名)
		Map<String, String> map = 
				(Map<String, String>)this.getServletContext().getAttribute("actions");
		String actionClassName = map.get(actionName);
		try {
			//得到请求的action所对应的execute方法
			Class classt = Class.forName(actionClassName);
			String httprequest = "javax.servlet.http.HttpServletRequest";
			Class requestClass = Class.forName(httprequest);
			String httpresponse = "javax.servlet.http.HttpServletResponse";
			Class responseClass = Class.forName(httpresponse);
			Method method = classt.getMethod("execute", requestClass,responseClass);
			String result = 
					(String) method.invoke(classt.newInstance(), request,response);
			request.getRequestDispatcher(result).forward(request, response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

4、web.xml的配置

<listener>
    <listener-class>cn.itcast.sh08.listener.ActionListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>ActionServlet</servlet-name>
    <servlet-class>cn.itcast.sh08.servlet.ActionServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ActionServlet</servlet-name>
    <url-pattern>*.action</url-pattern>
  </servlet-mapping>

第一个实例

创建工程,导入jar包

  1. ognl-3.0.4.jar ognl是一个表达式,是为了显示数据的,功能类似于el表达式
  2. struts2-core-2.3.12.jar 核心包
  3. xwork-core-2.3.12.jar webwork的核心包
  4. asm
  5. asm-common
  6. asm-tree
  7. commons-fileupload
  8. commons-io
  9. commons-lang
  10. freemaker
  11. javassist

编写web.xml文件

<filter>
    <filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

3.3、HelloWorldAction (java类)

public class HelloWorldAction {
	public String execute(){
		System.out.println("hello world");
		return "index";
	}
}

3.4、编写struts.xml文件

<struts>
	<package name="helloworld" namespace="/" extends="struts-default">
		<action name="helloworldAction" class="cn.bin.action.HelloWorldAction">
			<result name="index">index.jsp</result>
		</action>
	</package>
</struts>

运行: http://localhost:8080/项目名/配置的name名称

sturts.xml文件解析

package

1、package代表一个模块,name为模块的名称,而且值是唯一的;

<package name="system" namespace="/" extends="struts-default">
        user和部门应该在system模块中
		<action name="userAction"></action>
		<action name="departmentAction"></action>
  </package>

extends

package的功能是用来管理action的,一般情况下package是针对模块划分的,

extends="struts-default"实际上是把package中name为"struts-default"的包中的所有的功能继承过来了
struts-default 在 struts-default.xml 文件中

namespace

1、namespace与URL有关
2、如果namespace=”/”; 那么在url中项目名称后面紧接着跟action中name的名称
http://localhost:8080/struts/helloworldAction
3、如果namespace为"/base"; 那么就应该在项目名称后面加上base
http://localhost:8080/struts/base/helloworldAction 可以请求到页面

http://localhost:8080/struts/base/a/helloworldAction 也可以请求到
但是这个会先找 base/a 下的 helloworldAction
其次是寻找 base 下的 helloworldAction
4、在url中加了几层命名空间,则在转向到jsp页面时,jsp的路径也会加几个命名空间的名字的路径
5、如果采用上述的命名空间的形式,命名空间有什么的名称,在webroot下就应该建立什么样的文件夹

struts.xml与struts-default.xml

  1. 两个配置文件都是在服务器启动的时候加载的
  2. struts.xml 文件放在src根目录
    struts-default 文件放在Struts核心包的根目录下
    struts.xml文件是供程序员使用的
    struts-default.xml文件是运行struts2底层的xml文件
  3. 加载顺序的先后:先加载struts-default.xml文件,后加载struts.xml文件
  4. 因为dtd都一样,如果出现相同的元素,后者覆盖前者

result——结果集

  1. action类中的方法必须返回一个字符串。
  2. 返回的字符串要和struts的配置文件中的result标签中的name属性的名称对应。
    Name的值可以省略,其默认值是“success”
    3. type 为结果集的类型 可以省略,默认值为转发 type=”dispatcher” (继承struts-default)

include

保证了应用可以有多个xml文件,这样子好处是可以保证人手一份xml文件,不会出现冲突的问题

action类的书写

最简单的javabean

public class HelloWorldAction {
	public String execute(){
		System.out.println("hello world");
		return "index";
	}
}

5.2、实现接口Action

public class HelloWorld2Action implements Action{
	public String execute(){
		System.out.println("hello world");
		return SUCCESS;
	}
}

5.3、继承ActionSupport

public class HelloWorld3Action extends ActionSupport{
	public String execute() throws Exception {
		return super.execute();
	}
}

ActionSupport中含有一些功能:

1、国际化
2、表单验证
如果让一个action类继承了ActionSupport就能直接使用ActionSupport中的国际化、表单验证等功能

通配符

映射一

多个请求路径指向同一个action的add方法

a_add 、 b_add 、 c_add的路径都指向PatternAction的add方法。

<action name="*_add" method="add" class="cn.itcast.sh08.struts2.action.UserAction">
			<result>index.jsp</result>
</action>

映射二

请求不同action的中的方法是相同的

<action name=”*_add” method=”add” class=” cn.itcast.struts2.action.pattern.{1}”/>

说明:*和{1}是相对应的关系

映射三

在TeacherAction中有增、删、改、查的方法。

<action name="teacherAction_*" method="{1}"
	class="cn.itcast.struts2.action.pattern.TeacherAction">
</action>

说明:*和method的属性值保持一致。
扩展:

<action name="*_*" method="{2}"
	class="cn.itcast.struts2.action.pattern.{1}">
</action>

第一个匹配{1},第二个匹配{2}
统配的程度越高,匹配的范围越大,越容易出问题

免责声明:
一切资料仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。资料来自网络,版权争议与本人无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我联系处理。

全网视频教程加微信a518958666获取
基于SpringCloud 微服务架构 广告系统设计与实现
系统学习docker
docker前后端分离实战
Docker+Kubernetes(k8s)微服务容器化实战
Go语言实战抽奖系统
Go语言开发分布式任务调度 轻松搞定高性能Crontab
20小时快速入门go语言
Java从零到企业级电商项目实战
SSM主流框架入门与综合项目实战
Socket网络编程进阶与实战

  1. 基于Python玩转人工智能最火框架 TensorFlow应用实践
  2. webapp书城开发
  3. 组件方式开发 Web App全站
  4. 前端到后台ThinkPHP开发整站
  5. MySQL性能管理及架构设计
  6. 响应式开发一招致胜
  7. 掌握React Native技术转型随意切换
  8. Yii 2.0开发一个仿京东商城平台
  9. Python高效编程技巧实战
  10. 快速开发轻量级App
  11. 6小时 jQuery开发一个前端应用
  12. Android架构师之路 网络层架构设计与实战
  13. 程序猿的内功修炼,学好算法与数据结构
  14. Vue.js高仿饿了么外卖App 1.0到2.0版本完美升级
  15. Android 专项测试 Python篇
  16. 微信小程序入门与实战 常用组件API开发技巧项目实战
  17. Android 5.0+高级动画开发 矢量图动画 轨迹动画路径变换
  18. Android自动化测试实战 Java篇 主流工具 框架 脚本
  19. Python升级3.6 强力Django+杀手级Xadmin打造在线教育平台
  20. 高性能可扩展MySQL数据库设计及架构优化 电商项目
  21. 带领新手快速开发Android App
  22. Angular JS 仿拉勾网 WebApp 开发移动端单页应用
  23. 组件化封装思想实战Android App
  24. React.js入门基础与案例开发
  25. Yii 2.0进阶版 高级组件 优化京东平台
  26. 双平台真实开发GitHub App React Native技术全面掌握
  27. 玩转算法面试 leetcode题库分门别类详细解析
  28. Thinkphp 5.0 仿百度糯米开发多商家电商平台
  29. ThinkPHP5.0正式版第二季:实战开发企业站【完结】
  30. 最容易上手的Vue 2.0入门实战教程
  31. 聚焦Python分布式爬虫必学框架Scrapy 打造搜索引擎
  32. Angular 4.0从入门到实战 打造股票管理网站
  33. Java Spring带前后端开发完整电商平台
  34. Node.js项目线上服务器部署与发布
  35. Java大牛 带你从0到上线开发企业级电商项目
  36. ThinkPHP 5.0开发微信小程序商场打通全栈项目架构
  37. ES6零基础教学 解析彩票项目
  38. React高级实战 打造大众点评 WebApp
  39. BAT大咖助力 全面升级Android面试
  40. 全程MVP手把手 打造IM即时通讯Android APP
  41. 微信服务号+Yii 2.0构建商城系统全栈应用
  42. 机器学习入门 Scikit-learn实现经典小案例
  43. 腾讯大牛亲授 Web 前后端漏洞分析与防御技巧
  44. IT段子手详解MyBatis遇到Spring 秒学Java SSM开发大众点评 难度中级
  45. Vue 2.0 高级实战-开发移动端音乐 WebApp
  46. 全新升级 Kotlin系统入门与进阶
  47. 对接真实数据 从0开发前后端分离企业级上线项目
  48. Android应用发展趋势必备武器 热修复与插件化
  49. Laravel 快速开发简书
  50. 以慕课网日志分析为例 进入大数据 Spark SQL 的世界
  51. Get全栈技能点 Vue2.0/Node.js/MongoDB 打造商城系统
  52. Python操作三大主流数据库
  53. 前端JavaScript面试技巧
  54. Java SSM快速开发仿慕课网在线教育平台
  55. Android通用框架设计与完整电商APP开发
  56. Spring Boot企业微信点餐系统
  57. 开发微信全家桶项目 Vue/Node/MongoDB高级技术栈全覆盖
  58. Web自动化测试 Selenium基础到企业应用
  59. 高性能的 PHP API 接口开发
  60. 企业级刚需Nginx入门,全面掌握Nginx配置+快速搭建高可用架构
  61. Angular 打造企业级协作平台
  62. Python Flask 构建微电影视频网站
  63. Spring Boot带前后端 渐进式开发企业级博客系统
  64. 从零开发Android视频点播APP
  65. 前端跳槽面试必备技巧
  66. 10小时入门大数据
  67. 让你页面速度飞起来 Web前端性能优化
  68. Google面试官亲授 升级Java面试
  69. LoadRunner 工具使用 企业级性能测试实战
  70. 360大牛带你横扫PHP职场 全面解读PHP面试
  71. Python前后端分离开发Vue+Django REST framework实战
  72. Spring Security技术栈开发企业级认证与授权
  73. PHP开发高可用高安全App后端
  74. 看得见的算法 7个经典应用诠释算法精髓
  75. 全网最热Python3入门+进阶 更快上手实际开发
  76. Android互动直播APP开发
  77. JMeter 深入进阶性能测试体系 各领域企业实战
  78. Node.js入门到企业Web开发中的应用
  79. SSM到Spring Boot 从零开发校园商铺平台
  80. 深度学习之神经网络核心原理与算法
  81. BAT大厂APP架构演进实践与优化之路
  82. PHP秒杀系统 高并发高性能的极致挑战
  83. Java开发企业级权限管理系统
  84. Redux+React Router+Node.js全栈开发
  85. Redis从入门到高可用,分布式实践
  86. ES6+ 开发电商网站的账号体系 JS SDK
  87. Spark Streaming实时流处理项目实战
  88. 快速上手Linux 玩转典型应用
  89. Python接口测试框架实战与自动化进阶
  90. Python3数据科学入门与实战
  91. Android高级面试 10大开源框架源码解析
  92. 移动端App UI 设计入门与实战
  93. 精通高级RxJava 2响应式编程思想
  94. Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式
  95. Webpack + React全栈工程架构项目实战精讲
  96. 快速上手Ionic3 多平台开发企业级问答社区
  97. 全面系统讲解CSS 工作应用+面试一步搞定
  98. 跨平台混编框架 MUI 仿豆瓣电影 APP
  99. Kotlin打造完整电商APP 模块化+MVP+主流框架
  100. BAT大牛亲授 基于ElasticSearch的搜房网实战
  101. Python3入门机器学习 经典算法与应用
  102. Java秒杀系统方案优化 高性能高并发实战
  103. 四大维度解锁 Webpack3.0 工具全技能
  104. 手工测试企业项目实践及面试提升
  105. 基于Storm构建实时热力分布项目实战
  106. Java深入微服务原理改造房产销售平台
  107. 全网稀缺Python自动化运维项目实战
  108. 前端成长必经之路-组件化思维与技巧
  109. 基于Python玩转人工智能最火框架 TensorFlow应用实践
  110. Koa2框架从0开始构建预告片网站
  111. React16+React-Router4 从零打造企业级电商后台管理系统
  112. Google资深工程师深度讲解Go语言
  113. 微信小游戏入门与实战 刷爆朋友圈
  114. Elastic Stack从入门到实践
  115. Python移动自动化测试面试
  116. Python3数据分析与挖掘建模实战
  117. Tomcat+Memcached/Redis集群 构建高可用解决方案
  118. 系统学习Docker 践行DevOps理念
  119. Spring Cloud微服务实战
  120. 揭秘一线互联网企业 前端JavaScript高级面试
  121. OpenCV+TensorFlow 入门人工智能图像处理
  122. 基于Golang协程实现流量统计系统
  123. 移动端自动化测试Appium 从入门到项目实战Python版
  124. UI动效设计从入门到实战 PC与移动界面设计必学
  125. Java并发编程与高并发解决方案
  126. Vue核心技术 Vue+Vue-Router+Vuex+SSR实战精讲
  127. 韩天峰力荐 Swoole入门到实战打造高性能赛事直播平台
  128. Docker+Kubernetes(k8s)微服务容器化实践
  129. Python Flask高级编程
  130. ZooKeeper分布式专题与Dubbo微服务入门
  131. App界面设计利器Sketch 精选案例合集
  132. Python高级编程和异步IO并发编程
  133. 新浪微博资深大牛全方位剖析 iOS 高级面试
  134. Vue2.5开发去哪儿网App 从零基础入门到实战项目
  135. 最全面的Java接口自动化测试实战
  136. HBase+SpringBoot实战分布式文件存储
  137. Gradle3.0自动化项目构建技术精讲+实战
  138. 玩转数据结构 从入门到进阶
  139. MyCAT+MySQL 搭建高可用企业级数据库集群
  140. 验证码图像识别,快速掌握TensorFlow模型构建与开发
  141. SpringBoot2.0不容错过的新特性 WebFlux响应式编程
  142. 响应式开发一招致胜
  143. jquery源码分析
  144. AngularJS全栈开发知乎
  145. 揭秘一线互联网企业 前端JavaScript高级面试
  146. JavaScript版 数据结构与算法
  147. Koa2 实现电影微信公众号前后端开发
  148. Koa2+Nodejs+MongoDb 入门实战视频教程
  149. Node.js 从零开发 web server博客项目 前端晋升全栈工程师必备
  150. Vue.js 源码全方位深入解析
  151. Vue核心技术 Vue+Vue-Router+Vuex+SSR实战精讲
  152. Vue全家桶+SSR+Koa2全栈开发美团网
  153. 飞速上手的跨平台App开发
  154. 前端JS基础面试技巧
  155. 前端跳槽面试必备技巧
  156. 让你页面速度飞起来 Web前端性能优化
  157. 微信小程序商城构建全栈应用
  158. 移动Web APP开发之实战美团外卖
  159. Thinkphp 5.0 仿百度糯米开发多商家电商平台
  160. ThinkPHP5.0正式版第二季:实战开发企业站
  161. ThinkPHP 5.0开发微信小程序商场打通全栈项目架构
  162. 前端到后台ThinkPHP开发整站
  163. PHP从基础语法到原生项目开发
  164. PHP高性能 高价值的PHP API
  165. 360大牛全面解读PHP面试
  166. PHP开发高可用高安全App后端
  167. PHP秒杀系统 高并发高性能的极致挑战
  168. Swoole入门到实战打造高性能赛事直播平台
  169. YII 2.0开发一个仿京东商城平台



更多课程请加微信a518958666获取

╭══════════════════════════════════════════╮ ║
 ║ 说明:教程版权归原作者所有,本人只是负责搜集整理,本人 ║
║ 不承担任何技术及版权问题。本人分享的任何教程仅提 ║
║ 供学习参考,不得用于商业用途,请在下载后在24小时 ║
║ 内删除。 ║
║ ║
║ 1.请遵守中华人民共和国相关法律、条例 ║
║ 2.本人提供的各类视频教程仅供研究学习,本人不承担观看 ║
║ 本教程后造成的一切后果 ║
║ 3.本人不保证提供的教程十分安全或是完全可用,请下载后 ║
║ 自行检查 ║
║ 4.本人提供的教程均为网上搜集,如果该程序涉及 ║
║ 或侵害到您的版权请立即写信通知我们。 ║
║ 5.如不同意以上声明,请立即删除,不要使用,谢谢合作 ║
║ ║
╰═════════════════════════════════════════╯

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页