SSH深度历险(七) 剖析SSH核心原理(一)
接触SSH有一段时间了,但是对于其原理,之前说不出来莫模模糊糊(不能使用自己的语言描述出来的就是没有掌握),在视频和GXPT学习,主要是实现了代码,一些原理性的内容还是欠缺的,这几天我自己也一直在反问着自己,学习本不应该是这个样子了,道理倘若不懂:就是常说的老牛只知道低头拉磨,不抬头看路,映射到学习中,如果我们只是一味的写代码,而不懂原理的话,这样的生命力是不持久的,是短暂的,后劲会很不足,反问的学习促使我对这些逐步的深入了思考,参考了很多的网友博客与PDF资料,自己感悟而成,现和大家分享。
首先要明白什么是框架?
框架本身就是结合着JDK,又添加了本身框架必须需要的jar包而成,是解决某种特殊问题(共性)而是建立的框架。框架是众多程序员在开发过程中,遇到问题思考之后,不断的抽出共性的内容而形成的解决某一个特定领域问题的思想结晶。
框架的好处?
是无数程序员在经过了无数次尝试后,总结出来处理特定问题的特定方法,使程序员用最少的努力获得最佳的效果的工具
Web开发模型
我们现在都是分层开发,各层管各层的事,现在主要接触的是MVC思想分层模式,表示层,业务层,持久层,一切以业务为核心的分层方式
SSH是什么?
Struts2、Spring、Hibernate三个框架,SSH的一个集成框架,是目前较流行的一种Web应用程序开源框架。SSH正是为了应对各个层次的编程问题的最佳实践。现在的理解来看Struts对应表示层,Hibernate对应持久层,而Spring(主要是容器来协调管理Struts,Hibernate来指导工作的,现在可以这么认为是业务逻辑层)
Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。
基本的原理流程:
1:客户端在浏览器中输入一个url地址。
2:这个url请求通过http协议发送给jboss。
3:jboss根据url找到对应项目里面的web.xml文件。
4:在web.xml里面会发现有struts2的配置。
5:然后会找到struts2对应的struts.xml配置文件。
6:根据url解析struts.xml配置文件就会找到对应的class。
7:调用完class返回一个字String,根据struts.xml返回到对应的jsp。
结合高校的代码实现
jsp页面,前台页面请求
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><div class="accordion" fillSpace="sidebar">
<div class="accordionHeader">
<h2><span>Folder</span>新生入学管理</h2>
</div>
<div class="accordionContent">
<ul class="tree treeFolder">
<li><a href="${contextPath}/dormitory/queryDormitoryAction" target="navTab" rel="uas_system_dormitory">宿舍信息</a>
</li>
</ul>
</div>
</div></span></span></span></span>
web.xml,有struts的配置,经过filter过滤器,读取到struts配置
<span style="font-size:18px;"><filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<!--<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> -->
<init-param>
<param-name>config</param-name>
<param-value>struts-default.xml,struts-plugin.xml,config/struts-common.xml
</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping></span>
struts-dormitory.xml配置,其
<span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<package name="uas-dormitory" namespace="/dormitory" extends="default">
<action name="queryDormitoryAction" class="dormitoryAction"
method="queryDormitory">
<result name="dormitory_list">/page/dormitory/dormitory_list.jsp</result>
</action> <!-- /primer/helloWorldAction.action package:包 * name:包名,唯一的,必选项 * namespace:命名空间,唯一的,相当于房间号。可选项,省略情况下是"/"。页面中请求连接的前半部分
* extends:继承 * extends="struts-default":struts2框架底层提供的核心包struts2-core-2.3.3.jar下的struts-default.xml文件
* 为什么要继承这个struts-default.xml文件? * 因为struts2框架底层提供的struts-default.xml声明了所有的拦截器和拦截器栈,
知道在struts2框架运行时执行struts-default.xml文件中的拦截器栈。 * 如果不继承struts-default.xml文件,就没有办法使用struts2框架提供的所有拦截器 --> <action name="addDormitoryAction" class="dormitoryAction"
method="addDormitory" />
<action name="delDormitoryAction" class="dormitoryAction"
method="delDormitory" />
<action name="delDormitoryByArrayAction" class="dormitoryAction"
method="delDormitoryByArray" />
<action name="updateDormitoryAction" class="dormitoryAction"
method="updateDormitory" /> <!-- 如果找不到对应的action名的时候,配置默认要执行的action * name:指定action的名称 --> <action name="showAddDormitoryAction" class="dormitoryAction"
method="showAddDormitory">
<result name="dormitory_add">/page/dormitory/dormitory_add.jsp</result>
<!-- action: * name:对应页面中请求连接的后面半部分 * class:对应要执行的类的完整路径 -->
</action>
<!-- result:结果类型 * name:对应的是执行的类的方法的返回值 public String execute() throws
Exception { System.out.println("HelloWorldAction ************* execute()");
return "success"; } * 后半部分的文本内容:要转向到的页面 -->
<!-- 没有为action指定class * 在struts2框架底层的struts-default.xml文件中,配置了默认执行的类 com.opensymphony.xwork2.ActionSupport
public String execute() throws Exception { return SUCCESS; } * 实际上,默认执行的是底层提供的ActionSupport类的execute()方法
* result结果类型,默认是根据struts2框架底层提供的ActionSupport类的execute()方法返回值,进行跳转 --> <action name="showUpdateDormitoryAction" class="dormitoryAction"
method="showUpdateDormitory">
<result name="dormitory_update">/page/dormitory/dormitory_update.jsp</result>
</action>
</package>
</struts></span>
spring-dormitory.xml
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" <jee:jndi-lookup jndi-name="DormitoryBeanImpl/remote"
id="dormitory-dormitorybean" lookup-on-startup="true" cache="true"
proxy-interface="mgr.uas.dormitory.service.IDormitoryBean"
environment-ref="evn">
</jee:jndi-lookup>
</beans> </span></span></span>
这里主要应用了Spring框架的IOC原理
IOC:控制反转,它是不是什么技术,它是一种设计模式。所谓控制反转就是由容器控制程序间的关系,而不是传统实现中,由编程代码直接操控。说白了就是由容器控制对象间的依赖关系。
DI:Dependency Injection依赖注入 ,即组件(对象)之间的依赖关系由容器在运行期间决定。其实依赖注入和控制反转是对同一概念的不同描述。
Spring通过这种控制反转(IoC)的设计模式促进了松耦合(其实也就是代理模式)。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。我们可以把IoC模式看做是工厂模式的升华(和学习三层时候的运用反射道理是一样的),可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用Java的“反射”编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。
个人理解
其实控制反转就是不需要我们手动new一个对象了,它把我们所要实例化的对象都写在了配置文件xml中了,一般这个类都是我们应用的业务类。框架内部已经将xml中配置的类自动实例化成对象,当我们调用某个类A,并且这个类中存在另一个类B时,我们就说A依赖于B,容器就会将B对象注入到A类中,大多数情况下都是通过A类中的setB()方法注入进来的。
以前是由类中的代码查找类并new对象,现在是xml文件控制的对象的生成,控制权由程序代码转移到了xml文件中。这样做还是有好处的,假如在A中需要5个对象,那么A类中就会new5个对象,不管以后A中用不用到这5个类,只要用到A类,就会把这5个类全部new出来。如果我们在xml文件中定义类的话,当类需要用到其中的三个类时,就会用对应的set类()方法将对象注入进来,不用的就不注入进来。
由此看来,第一个方法时将类A和5个类紧紧联系起来,不管用不用到5个类都new一下,真浪费,而第二个方法是第一个类你需要我得时候我就注入进来被你用,你不需要就和我没关系。这样类A和其中的5个类是分别独立的互不干预,当有关系的时候,容器自动注入关系。
总结
系统的效率和灵活性一直都是双向矛盾的,我们是在不断的寻找合适的平衡点,反转依赖注入的方式使程序的效率有些降低,但是系统的灵活性,可维护性大大的提高,在后者来说的利远远大于前者,在效率的方面我们可以提高服务器的性能与cpu、内存等等配置来解决这些不足。
Don't call us,we'll call you(用这句话来形容IoC十分贴切),生活中处处都有学习的影子。
内容未完,下篇继续……
SSH深度历险(七) 剖析SSH核心原理(一)的更多相关文章
- SSH深度历险(十一) AOP原理及相关概念学习+xml配置实例(对比注解方式的优缺点)
接上一篇 SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP,本篇我们主要是来学习使用配置XML实现AOP 本文采用强制的CGLB代理方式 Security ...
- SSH深度历险(十) AOP原理及相关概念学习+AspectJ注解方式配置spring AOP
AOP(Aspect Oriented Programming),是面向切面编程的技术.AOP基于IoC基础,是对OOP的有益补充. AOP之所以能得到广泛应用,主要是因为它将应用系统拆分分了2个部分 ...
- 周爱民带你深入剖析JavaScript核心原理
作为前端工程师必备技能,JavaScript 的重要性不言而喻.虽然易上手,但却有着诸多复杂微妙的机制,想要真正掌握绝非易事. 专栏面向JavaScript语言的实际应用者与深度爱好者,以讲述Java ...
- SSH深度历险(八) 剖析SSH核心原理+Spring依赖注入的三种方式
在java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依 ...
- SSH深度历险(一)深入浅出Hibernate架构(一)-------映射解析——七种映射关系
ORM,全称是(Object Relational Mapping),即对象关系映射.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据 ...
- SSH深度历险(九) Struts2+DWZ+Uploadify实现多文件(文件和图片等等)上传
在gxpt_uas系统中,要实现文件(文件和图片等等,可以灵活配置)的批量上传至mongodb,在学习这个过程中,学习了mongodb,并实现了批量上传的功能,实现思路:在DWZ的基础上参考官方的实例 ...
- SSH深度历险(六) 深入浅出----- Spring事务配置的五种方式
这对时间在学习SSH中Spring架构,Spring的事务配置做了详细总结,在此之间对Spring的事务配置只是停留在听说的阶段,总结一下,整体把控,通过这次的学习发觉Spring的事务配置只要把思路 ...
- SSH深度历险(二) Jboss+EJB的第一个实例
学习感悟:每次学习新的知识,都会通过第一个小的实例入手,获得成就感,经典的Hello Workd实例奠定了我们成功的大门哈,这些经典的实例虽小但是五脏俱全呢,很好的理解了,Ejb的核心. 今天主要以这 ...
- SSH深度历险(四) Maven初步学习
这几天接触这个词,很多遍了,只是浅显的体会到它在GXPT中的好处,功能之强大,又通过网络查询了资料进一步的认识学习了,和大家分享. Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理 ...
随机推荐
- [SDOI2009]Bill的挑战
题目描述 题解: 因为要求的T长度一定,可定义f[i][j] 为前i位状态为j的方案,can[i][j]表示第i为字母j,可行的状态 每次往后推就行了 #include <algorithm&g ...
- [bzoj4161]Shlw loves matrix I
来自FallDream的博客,未经允许,请勿转载,谢谢. 给定数列 {hn}前k项,其后每一项满足 hn = a1*h(n-1) + a2*h(n-2) + ... + ak*h(n-k) 其中 a1 ...
- Python笔记(十一):多线程
(二)和(三)不感兴趣的可以跳过,这里参考了<深入理解计算机系统>第一章和<Python核心编程>第四章 (一) 多线程编程 一个程序包含多个子任务,并且子任务之间相 ...
- js中json字符串与json对象的相互转换
web前端开发过程中,数据传输json是以字符串的形式传递,而js操作的是JSON对象. 一.JSON字符串转换为JSON对象 var obj = JSON.parse(str[, reviver]) ...
- CSS中的ul与li样式详解 list-type
转自新浪博客http://blog.sina.com.cn/u/2539885750 ul和li列表是使用CSS布局页面时常用的元素.在CSS中,有专门控制列表表现的属性,常用的有list-style ...
- Eclipse插件安装4种方法
第一种:直接复制法 假设Eclipse的安装目录在C:\eclipse,解压下载的eclipse 插件或者安装eclipse 插件到指定目录AA(如:c:\AA)文件夹,打开AA 文件夹,在AA文件夹 ...
- 初识Redis系列之二:安装及简单使用
仅介绍windows下的安装 一:下载地址:https://github.com/MSOpenTech/redis/releases. Redis 支持 32 位和 64 位.这个需要根据你系统平台的 ...
- spark升级后 集成hbase-1.0.0-cdh5.4.5异常
.具体场景如下: spark1.6 升级 spark2.2 后 分析查询hbase 数据报异常: 具体错误如下: ERROR TableInputFormat: java.io ...
- 剑指架构师系列-MySQL常用SQL语句
(1)分清HAVING与WHERE的区别: HAVING 子句使你能够指定过滤条件,从而控制查询结果中哪些组可以出现在最终结果里面.WHERE 子句对被选择的列施加条件,而 HAVING 子句则对 G ...
- cassandra 3.x官方文档(4)---分区器
写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...