SSI框架总结
先来点文字性的描写叙述:
MVC对于我们来说,已经不陌生了,它起源于20世纪80年代针对smalltalk语言的一种软件设计模式,如今已被广泛应用。近年来,随着java的盛行,MVC的低耦合性、高重用性、可维护性、软件project的可管理性等诸多长处使其在java平台中非常受欢迎,其间,也诞生了很多优秀的MVC框架,如专注于控制层的Struts、WebWork,
Struts2, JSF等框架,专注于业务逻辑方面的Spring框架、专注于持久层的Hibernate、iBatis、Castor、JORM等框架。因为近期用了一次SSI框架,因此本文主要是对Strtus2、Spring、iBatis三个开源的MVC框架进行一个小结。
Struts2主要来源于webwork框架,与Struts1相比,在数据传递方面,Struts2提供了更加强大OGNL标签功能,使其可以通过在action中定义变量来直接与jsp页面中的数据进行相互传值,省去了Struts1中的formbean;而在跳转控制方面,Struts2简化了配置文件的信息量,使页面和action之间的交换更加的简洁和直观,便于开发者的管理。
Spring功能非常的强大,比方它的控制反转/依赖注入机制,省去了我们自己书写工厂模式的工作,实现类对我们将要用到控制类、业务逻辑类、数据訪问类、以及JNDI或者JDBC数据源的托管;Spring对AOP支持使我们在用户chmod.html' target='_blank'>权限控制、事务处理方面节省了非常多工作量;
iBatis则是一种轻量级的OR Mapping框架,与Hibernate相比,iBatis提供了半自己主动化对象关系 映射的实现,开发者须要编写详细的sql语句,为系统设计提供了更大的自由空间,为sql语句优化提供了便利。
以下这张图就是我们所用到的这三种框架的结合体,以下对其作以简介。
在控制层,利用Strtus2标签功能,在Action中直接与jsp页面上的数据进行交互。在调用业务逻辑层应用时,Struts2提供了对Sping的支持。开发者须要完毕对struts.xml的配置工作和对各个Action类的编写。
在业务逻辑层,利用Spring框架的依赖注入实现对业务逻辑类和DAO类的实例托管;在事务处理方面,利用Spring提供的面向切面的事务处理功能,使对数据的事务控制脱离于数据訪问接口实现;在对象关系映射方面,利用Spring对数据库连接池的托管和对iBatis框架的支持。开发者须要完毕对数据源的配置、对不同模块所相应的application*.xml文件的配置,以及对业务逻辑接口的定义和业务逻辑实现的编写。
在持久层,利用iBatis提供的半自己主动化对象关系映射的实现,开发者须要编写详细的sql语句,为系统设计提供了更大的自由空间。另外,开发者须要完毕对SqlMapConfig.xml和*SqlMap.xml的配置,以及对DAO接口的定义和DAO接口的实现。
在各层之间进行交换的过程中,利用传输数据类进行数据的传递和交互。当中,传输数据类与数据库表一一相应。
SSI框架可以减少我们代码的耦合度,增强了代码的健壮性和可重用性,加快了开发速度,可是也有一些不足之处,比方因为三种框架的配置文件较多,也给我们带来了一些不便,特别是对于较小的应用来说更是如此。
一:首先引入struts2 spring ibatis 各自的jar包 在此就不一一罗列了。
二:加入配置文件
我们首先从web.xml文件说起
web.xml载入过程:
1 启动WEB项目的时候,容器(如:Tomcat)会读他的配置文件web.xml读两个节点
<listener></listener>和<context-param></context-param>
2 紧接着,容器创建一个ServletContext(上下文) 这个WEB项目全部部分都将共享这个上下文
3 容器将<context-param></context-param>转化为键值对并交给ServletContext
4 容器创建<listener></listener>中的类的实例,即创建监听
5 在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这种方法中获得:
ServletContext = ServletContextEvent.getServletContext();
context-param的值 = ServletContext.getInitParameter("context-param的键");
web.xml节点载入顺序
节点的载入顺序与它们在web.xml文件里的先后顺序无关。即不会由于filter写在listener的前面而会先载入filter终于得出的结论是:listener->filter->servlet
同一时候还存在着这样一种配置节点:context-param,它用于向 ServletContext 提供键值对,即应用程序上下文信息。我们的 listener, filter 等在初始化时会用到这些上下文 的信息,那么context-param 配置节是不是应该写在 listener 配置节前呢?实际上 context-param 配置节可写在任何位置,因此真正的载入顺序为:
context-param -> listener -> filter -> servlet
载入spring
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
终于结论:
web.xml 的载入顺序是:[context-param -> listener -> filter -> servlet -> spring] ,而同类型节点之间的实际程序调用的时候的顺序是依据相应的 mapping 的顺序进行调 用的。
打开web.xml文件,依据实际须要加入例如以下内容
<!--上下文參数用于log4j以及spring中使用-->
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param> <!--应用程序上下文參数,指定spring配置文件位置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/beans.xml</param-value>
</context-param> <listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener -class>
</listener> <!--监听器 用于初始化spring框架-->
<listener>
<listener- class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
在这说说SSI整合时的一些配置文件:
1,contextConfigLocation:Spring容器启动时须要载入Spring的配置文件。默认是/WEB-INF文件夹下的applicationContext.xml文件
当然也能够放在classpath下,能够包含多个spring配置文件,这就得依靠contextConfigLocation
<!-- 载入spring的配置文件 假设文件名称为applicationContext.xml而且是在WEB-INF文件夹下 则无需此配置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/beans.xml</param-value>
</context-param>
假设web.xml中没有配置context-param,spring的配置就像如上这段代码演示样例一下,自己主动去WEB-INF文件夹下寻找applicationContext.xml。此时,假设你改动applicationContext.xml的名称,或者移除它,再启动server,你会得到例如以下异常信息:
1.nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]
这证实了其默认配置。默认配置情况下spring仅仅会去WEB-INF文件夹下寻找配置文件,而不会去classpath下寻找。
假设我们不想将配置文件放在WEB-INF文件夹下呢?开发中常常在src以下创建一个config文件夹,用于存放配置文件。此时,相应的param-value改为:classpath:config/applicationContext.xml。
一定要加上classpath,这告诉spring去classes文件夹下的config文件夹以下寻找配置文件。
2,怎样启动Spring容器
两种方法,一种以listener启动 一种以load-on-startup Servlet。
<!-- 配置spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
另外一种
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
3,整合Struts2
<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>
4,Spring整合ibatis配置文件
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:SqlMapConfig.xml</value>
</property>
</bean>
5,Struts.xml
<constant name="struts.objectFactory" value="spring" />
constant配置struts的常量(也可在struts.properties)文件里配置,将struts的对象工厂托由spring管理。
SSI框架总结的更多相关文章
- 疯狂学习java web5(SSI框架)
其实前面的所有只是铺垫,目的只是为了了解现有工程是怎样的.之前直接上来就看,看了很久依然是云里雾里,所以不得已学习点基础知识,前面的基础只是蜻蜓点水一带而过,希望能起部分作用了. 发现struct2有 ...
- 手动搭建SSI框架
SSI框架为struts.spring.ibatis,在该框架中,使用ibatis作为数据持久层,其中ibatis使用最新版本mybatis3. 注:本文使用版本:struts-2.3.4.sprin ...
- ssi框架搭建
Struts2主要来源于webwork框架,与Struts1相比,在数据传递方面,Struts2提供了更加强大OGNL标签功能,使其能够通过在action中定义变量来直接与jsp页面中的数据进行相互传 ...
- ssi框架学习总结
框架简介: 相信大家对于mvc的三层架构已经灰常熟悉了,在这就不细讲了,个人感觉ssi的框架结构还是比较典型的mvc三层架构,还是比较容易上手的.关于这块的入门我想特别感谢下FrankHui童鞋,在他 ...
- SSI框架下,用jxl实现导出功能
SSI框架下,用jxl实现导出功能 先说明一下,这个是SSI框架下,前端用ExtJs,应用在一个企业级的系统中的导出功能,因为是摸索着做的,所以里面有一些代码想整理一下,如果有人看到了,请视自己的架构 ...
- SSI框架中配置log4j
事实上主要是log4j配置,跟SSI关系不大. web.xml中加入 <context-param> <param-name>log4jConfigLocation</p ...
- 使用SSI框架写的简单Demo(查询模块)
在网上看到好多个版本,自己有时间索性就写个Demo记录下整个框架的逻辑流程: 1.首先拷贝整个框架所需要的jar包到WEB-INF/lib包下(这个网上都可以搜到的) 2.配置文件的配置, 2.1.在 ...
- SSI框架【Struts、Spring、iBatis、Hibernate】
1.B/S架构的JavaEE开发设计模式,JavaEE架构分成三个层次即表现层.业务逻辑层.数据持久层:而这三层分别通过Struts.Spring.iBatis开源的框架紧密组合在一起的. Strut ...
- SSH框架与SSI框架的区别
2013-03-04 13:45 1427人阅读 评论(0) 收藏 举报 一.SSH 整个配置如下图所示: 1. <?xml version="1.0" encoding=& ...
随机推荐
- IOS 数据库管理系统(SQLite)
嵌入式数据库 SQLite嵌入式数据库的优势 1.支持事件,你并不需要配置,无需安装,不需要管理员 2.支持部分脂肪SQL92 3.完整的数据库被存储在磁盘上的文件的顶部,相同的数据库文件可以在不同机 ...
- 推荐几个我一直在使用chrome小工具(上)
我用的chrome插件挺多的,所谓工欲善其事必先利其器,我热衷于搜寻好用的工具来让我平时的工作事半功倍. 以下介绍几款我正在用的感觉还不错的插件,假设大家还有其他好用的(肯定有,chrome插件库太庞 ...
- Doug Lea
如果IT的历史,是以人为主体串接起来的话,那么肯定少不了Doug Lea.这个鼻梁挂着眼镜,留着德王威廉二世的胡子,脸上永远挂着谦逊腼腆笑容,服务于纽约州立大学Oswego分校计算机科学系的老大爷. ...
- lol盒子重点内容
//AFN函数 - imageview载入网络图片而且获取图片,获取之后存储到手机 [image setImageWithURLRequest:[NSURLRequest requestWithU ...
- JavaEE(17) - JPA查询API和JPQL
1. 获取查询结果 2. JPQL函数和JPQL表达式 #1. 使用from子句 #2. 查询部分属性 #3. 查询中使用构造器 3. JPQL的关联查询和多态查询 #1. 多态查询 #2. 隐式连接 ...
- MVC 快速开发框架
ASP.NET MVC 快速开发框架之 SqlSugar+SyntacticSugar+JQWidgetsSugar+jqwidgets jqwidgets.js: 是一个功能完整的框架,它具有专业的 ...
- java 突击队注意事项:在路上
情绪: 灵活:让标准成为价格值.为了给你一个想法和标准,你可以有一个不同的使用.不是死扣定理.决这个问题. 看书:分两类,一类依据知识点进行罗列.并且结构清晰,能够看完一章有选择进行总结(不是笔记,总 ...
- css 鼠标提示样式预览表[转]
语法: cursor : auto | all-scroll | col-resize| crosshair | default | hand | move | help | no-drop | no ...
- Codeforces Round #306 (Div. 2) C
意甲冠军 到不超过一个更100该整数字符串.采取随机从数间(不能拿). 问:是否有可能被剩下8除尽.假设能,出口YES和任选一个数字的其余病例的. 不能够,输出NO. 思路 想法题. 首先观察到.10 ...
- typedef和define具体的具体差异
1) #define这是一个预处理指令,简单的更换当预处理程序.不检查的正确性,仍不能正常关机进入的意思,那里只是已被展开时编译源代码会发现可能的错误和错误. 例如: #define PI 3.1 ...