从servlet到struts2
ServletServlet优点1、Servlet是mvc的基础,其他的框架比如struts1,struts2,webwork都是从servlet基础上发展过来的。所以掌握servlet是掌握mvc的关键。2、Servlet把最底层的api暴漏给程序员,使程序员更能清楚的了解mvc的各个特点。3、程序员可以对servlet进行封装。Struts2就是从servlet中封装以后得...
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包
- ognl-3.0.4.jar ognl是一个表达式,是为了显示数据的,功能类似于el表达式
- struts2-core-2.3.12.jar 核心包
- xwork-core-2.3.12.jar webwork的核心包
- asm
- asm-common
- asm-tree
- commons-fileupload
- commons-io
- commons-lang
- freemaker
- 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
- 两个配置文件都是在服务器启动的时候加载的
- struts.xml 文件放在src根目录
struts-default 文件放在Struts核心包的根目录下
struts.xml文件是供程序员使用的
struts-default.xml文件是运行struts2底层的xml文件 - 加载顺序的先后:先加载struts-default.xml文件,后加载struts.xml文件
- 因为dtd都一样,如果出现相同的元素,后者覆盖前者
result——结果集
- action类中的方法必须返回一个字符串。
- 返回的字符串要和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网络编程进阶与实战
- 基于Python玩转人工智能最火框架 TensorFlow应用实践
- webapp书城开发
- 组件方式开发 Web App全站
- 前端到后台ThinkPHP开发整站
- MySQL性能管理及架构设计
- 响应式开发一招致胜
- 掌握React Native技术转型随意切换
- Yii 2.0开发一个仿京东商城平台
- Python高效编程技巧实战
- 快速开发轻量级App
- 6小时 jQuery开发一个前端应用
- Android架构师之路 网络层架构设计与实战
- 程序猿的内功修炼,学好算法与数据结构
- Vue.js高仿饿了么外卖App 1.0到2.0版本完美升级
- Android 专项测试 Python篇
- 微信小程序入门与实战 常用组件API开发技巧项目实战
- Android 5.0+高级动画开发 矢量图动画 轨迹动画路径变换
- Android自动化测试实战 Java篇 主流工具 框架 脚本
- Python升级3.6 强力Django+杀手级Xadmin打造在线教育平台
- 高性能可扩展MySQL数据库设计及架构优化 电商项目
- 带领新手快速开发Android App
- Angular JS 仿拉勾网 WebApp 开发移动端单页应用
- 组件化封装思想实战Android App
- React.js入门基础与案例开发
- Yii 2.0进阶版 高级组件 优化京东平台
- 双平台真实开发GitHub App React Native技术全面掌握
- 玩转算法面试 leetcode题库分门别类详细解析
- Thinkphp 5.0 仿百度糯米开发多商家电商平台
- ThinkPHP5.0正式版第二季:实战开发企业站【完结】
- 最容易上手的Vue 2.0入门实战教程
- 聚焦Python分布式爬虫必学框架Scrapy 打造搜索引擎
- Angular 4.0从入门到实战 打造股票管理网站
- Java Spring带前后端开发完整电商平台
- Node.js项目线上服务器部署与发布
- Java大牛 带你从0到上线开发企业级电商项目
- ThinkPHP 5.0开发微信小程序商场打通全栈项目架构
- ES6零基础教学 解析彩票项目
- React高级实战 打造大众点评 WebApp
- BAT大咖助力 全面升级Android面试
- 全程MVP手把手 打造IM即时通讯Android APP
- 微信服务号+Yii 2.0构建商城系统全栈应用
- 机器学习入门 Scikit-learn实现经典小案例
- 腾讯大牛亲授 Web 前后端漏洞分析与防御技巧
- IT段子手详解MyBatis遇到Spring 秒学Java SSM开发大众点评 难度中级
- Vue 2.0 高级实战-开发移动端音乐 WebApp
- 全新升级 Kotlin系统入门与进阶
- 对接真实数据 从0开发前后端分离企业级上线项目
- Android应用发展趋势必备武器 热修复与插件化
- Laravel 快速开发简书
- 以慕课网日志分析为例 进入大数据 Spark SQL 的世界
- Get全栈技能点 Vue2.0/Node.js/MongoDB 打造商城系统
- Python操作三大主流数据库
- 前端JavaScript面试技巧
- Java SSM快速开发仿慕课网在线教育平台
- Android通用框架设计与完整电商APP开发
- Spring Boot企业微信点餐系统
- 开发微信全家桶项目 Vue/Node/MongoDB高级技术栈全覆盖
- Web自动化测试 Selenium基础到企业应用
- 高性能的 PHP API 接口开发
- 企业级刚需Nginx入门,全面掌握Nginx配置+快速搭建高可用架构
- Angular 打造企业级协作平台
- Python Flask 构建微电影视频网站
- Spring Boot带前后端 渐进式开发企业级博客系统
- 从零开发Android视频点播APP
- 前端跳槽面试必备技巧
- 10小时入门大数据
- 让你页面速度飞起来 Web前端性能优化
- Google面试官亲授 升级Java面试
- LoadRunner 工具使用 企业级性能测试实战
- 360大牛带你横扫PHP职场 全面解读PHP面试
- Python前后端分离开发Vue+Django REST framework实战
- Spring Security技术栈开发企业级认证与授权
- PHP开发高可用高安全App后端
- 看得见的算法 7个经典应用诠释算法精髓
- 全网最热Python3入门+进阶 更快上手实际开发
- Android互动直播APP开发
- JMeter 深入进阶性能测试体系 各领域企业实战
- Node.js入门到企业Web开发中的应用
- SSM到Spring Boot 从零开发校园商铺平台
- 深度学习之神经网络核心原理与算法
- BAT大厂APP架构演进实践与优化之路
- PHP秒杀系统 高并发高性能的极致挑战
- Java开发企业级权限管理系统
- Redux+React Router+Node.js全栈开发
- Redis从入门到高可用,分布式实践
- ES6+ 开发电商网站的账号体系 JS SDK
- Spark Streaming实时流处理项目实战
- 快速上手Linux 玩转典型应用
- Python接口测试框架实战与自动化进阶
- Python3数据科学入门与实战
- Android高级面试 10大开源框架源码解析
- 移动端App UI 设计入门与实战
- 精通高级RxJava 2响应式编程思想
- Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式
- Webpack + React全栈工程架构项目实战精讲
- 快速上手Ionic3 多平台开发企业级问答社区
- 全面系统讲解CSS 工作应用+面试一步搞定
- 跨平台混编框架 MUI 仿豆瓣电影 APP
- Kotlin打造完整电商APP 模块化+MVP+主流框架
- BAT大牛亲授 基于ElasticSearch的搜房网实战
- Python3入门机器学习 经典算法与应用
- Java秒杀系统方案优化 高性能高并发实战
- 四大维度解锁 Webpack3.0 工具全技能
- 手工测试企业项目实践及面试提升
- 基于Storm构建实时热力分布项目实战
- Java深入微服务原理改造房产销售平台
- 全网稀缺Python自动化运维项目实战
- 前端成长必经之路-组件化思维与技巧
- 基于Python玩转人工智能最火框架 TensorFlow应用实践
- Koa2框架从0开始构建预告片网站
- React16+React-Router4 从零打造企业级电商后台管理系统
- Google资深工程师深度讲解Go语言
- 微信小游戏入门与实战 刷爆朋友圈
- Elastic Stack从入门到实践
- Python移动自动化测试面试
- Python3数据分析与挖掘建模实战
- Tomcat+Memcached/Redis集群 构建高可用解决方案
- 系统学习Docker 践行DevOps理念
- Spring Cloud微服务实战
- 揭秘一线互联网企业 前端JavaScript高级面试
- OpenCV+TensorFlow 入门人工智能图像处理
- 基于Golang协程实现流量统计系统
- 移动端自动化测试Appium 从入门到项目实战Python版
- UI动效设计从入门到实战 PC与移动界面设计必学
- Java并发编程与高并发解决方案
- Vue核心技术 Vue+Vue-Router+Vuex+SSR实战精讲
- 韩天峰力荐 Swoole入门到实战打造高性能赛事直播平台
- Docker+Kubernetes(k8s)微服务容器化实践
- Python Flask高级编程
- ZooKeeper分布式专题与Dubbo微服务入门
- App界面设计利器Sketch 精选案例合集
- Python高级编程和异步IO并发编程
- 新浪微博资深大牛全方位剖析 iOS 高级面试
- Vue2.5开发去哪儿网App 从零基础入门到实战项目
- 最全面的Java接口自动化测试实战
- HBase+SpringBoot实战分布式文件存储
- Gradle3.0自动化项目构建技术精讲+实战
- 玩转数据结构 从入门到进阶
- MyCAT+MySQL 搭建高可用企业级数据库集群
- 验证码图像识别,快速掌握TensorFlow模型构建与开发
- SpringBoot2.0不容错过的新特性 WebFlux响应式编程
- 响应式开发一招致胜
- jquery源码分析
- AngularJS全栈开发知乎
- 揭秘一线互联网企业 前端JavaScript高级面试
- JavaScript版 数据结构与算法
- Koa2 实现电影微信公众号前后端开发
- Koa2+Nodejs+MongoDb 入门实战视频教程
- Node.js 从零开发 web server博客项目 前端晋升全栈工程师必备
- Vue.js 源码全方位深入解析
- Vue核心技术 Vue+Vue-Router+Vuex+SSR实战精讲
- Vue全家桶+SSR+Koa2全栈开发美团网
- 飞速上手的跨平台App开发
- 前端JS基础面试技巧
- 前端跳槽面试必备技巧
- 让你页面速度飞起来 Web前端性能优化
- 微信小程序商城构建全栈应用
- 移动Web APP开发之实战美团外卖
- Thinkphp 5.0 仿百度糯米开发多商家电商平台
- ThinkPHP5.0正式版第二季:实战开发企业站
- ThinkPHP 5.0开发微信小程序商场打通全栈项目架构
- 前端到后台ThinkPHP开发整站
- PHP从基础语法到原生项目开发
- PHP高性能 高价值的PHP API
- 360大牛全面解读PHP面试
- PHP开发高可用高安全App后端
- PHP秒杀系统 高并发高性能的极致挑战
- Swoole入门到实战打造高性能赛事直播平台
- YII 2.0开发一个仿京东商城平台
…
…
更多课程请加微信a518958666获取
╭══════════════════════════════════════════╮ ║
║ 说明:教程版权归原作者所有,本人只是负责搜集整理,本人 ║
║ 不承担任何技术及版权问题。本人分享的任何教程仅提 ║
║ 供学习参考,不得用于商业用途,请在下载后在24小时 ║
║ 内删除。 ║
║ ║
║ 1.请遵守中华人民共和国相关法律、条例 ║
║ 2.本人提供的各类视频教程仅供研究学习,本人不承担观看 ║
║ 本教程后造成的一切后果 ║
║ 3.本人不保证提供的教程十分安全或是完全可用,请下载后 ║
║ 自行检查 ║
║ 4.本人提供的教程均为网上搜集,如果该程序涉及 ║
║ 或侵害到您的版权请立即写信通知我们。 ║
║ 5.如不同意以上声明,请立即删除,不要使用,谢谢合作 ║
║ ║
╰═════════════════════════════════════════╯
更多推荐
所有评论(0)