SSH架构
说说项目架构整个变化过程吧
拿用户注册来举例:
数据库里面有一张User表
需要把注册信息存储到User表中
1. 最开始是两层架构
就是cliect + jsp + DB

就是在view里面直接操作数据库,就是在视图上建立数据库连接,然后把每个字段存储到数据库中
2. 加入Domain Model
构造一个Entity类
cliect + jsp + Entity + DB
对Entity的管理交给Jsp

建立一个User类,view中先对User进行实例化,然后再进行存储
这一步没有什么意义
3. 加入管理层
cliect + jsp + Entity + Service + DB
把对User的管理交给Service层
管理层,也就是业务逻辑层

4. 加入Hibernate
使用Hibernate对数据库进行操作

这种做法是在项目中引入了Hibernate
Hibernate的作用是把数据插入到数据库中。
但是,
如果要跨数据库呢
如果要把数据存储到Xml文件中或者网络上呢而不需要数据库呢
所以UserManage对User的存储就不能写死成了Hibernate或者JDBC或者xml
所以要引入DAO层
5. 加入DAO层
cliect + jsp + UserManage + UserManageImpl+ User+ +UserDAO + UserDAOimpl + DB
把对数据的存储操作抽象成一个接口,这个接口里面定义增删改查的方法,然后有不同的实现类,实现不同的存储方式
可以把业务逻辑类也抽象出来,不过这种做法并不多

6. 加入Struct
也就是引入MVC
Controller就是Struct的filter
Action先执行业务逻辑,然后根据配置的view在,返回结果
M是由两层构成的,bussinuiss layer和DAO layer

7. 加入spring

spring其实是贯穿于整个过程的
在抽象需要实例化的地方用spring的IOC
在各个业务处理的时候可以用spring的AOP
在这里面,UserManage拿userDAO的时候使用的是注入(必须给他一个实现类)
Action用UserManage的时候也是注入
所以
spring和struct2结合的主要地方是Action
实际上,spring是struct的一个插件
在struct的文档插件一节可以看到spring插件
所以,spring才是主导,struct向spring要需要的Action。(即要的时候向插件来要)
8. 配置
要加入spring
web.xml中要有监听器,在application启动的时候,找到bean所对应的xml的文件,并初始化所有的bean
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
<!-- default: /WEB-INF/applicationContext.xml -->
</listener>
默认寻找的路径是 WEB-INF/applicationContext.xml
如果改了路径或者改了名称,需要配置
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value> -->
<param-value>classpath:beans.xml</param-value>
</context-param>
classpath 表示是在src文件夹下
*的意思是可能配置文件有多个,比如不同的业务配置不同的文件,这里一下子读进来
这样,在启动的时候就启动了spring容器
Action和spring的关系可以有两种方式
1. Action交给spring容器管理
把Action配到spring中去
加入struct2-spring-plugin.jar包
然后找到相应的Action,加上@Compont和@Resource,这样就交给了spring管理
@Component("u")
@Scope("prototype")
public class UserAction extends ActionSupport implements ModelDriven {
private UserManager userManager;
......
@Resource
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
}
<package name="registration" extends="struts-default">
<action name="u" class="u">
<result name="success">/registerSuccess.jsp</result>
<result name="fail">/registerFail.jsp</result>
</action>
</package>
这里面Action上的component值必须和struct.xml中的action的class相同
同时还加上@Scope("prototype") 非单例模式
action交给spring管理,spring的bean默认是单例模式,
但是strct每次收到一个请求,都要建立一个ActionContext,ValueStack,Action,然后把action放进valuestack
如果定义成单例显示不符
但是如果在action中不涉及成员变量的读写操作,可以用单例,稍微提高点效率
struct2-spring-plugin.jar这个jar包里有一个文件struct-plugin.xml:
<struts>
<bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" /> <!-- Make the Spring object factory the automatic default -->
<constant name="struts.objectFactory" value="spring" /> ....... </structs>
有一个name=spring的bean是一个springFactory
一般情况下,Struct需要一个Action的时候,会去找自己的StructFactory,但是在执行上面后,会去找spring拿,而springFactory会自动找到配置文件
比如struct中Action的name为User
它会根据这个名称到spring容器中找到name为User的bean
Struct启动时,读取文件de顺序
- 1.Structs-default.xml
- 2.Structs-plugh.xml
- 3.structs.xml
- 4.struct.properties
- 5.web.xml
而spring启动是在web.xml中,也就是说应用启动时,spring容器就已经初始化了,当struct需要时,直接去容器中拿。
2.Action由struct容器管理
这种做法是Action上什么也不用加,action对象的产生是放在struct容器中的,不由spring管理
public class UserAction extends ActionSupport implements ModelDriven {
private UserManager userManager;
.........
public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
}
<struts>
<package name="registration" extends="struts-default">
<action name="u" class="com.bjsxt.registration.action.UserAction">
<result name="success">/registerSuccess.jsp</result>
<result name="fail">/registerFail.jsp</result>
</action>
</package>
</struts>
就是在Action上什么标记也不加,那么Action就会在struct容器里
但是service和DAO改加还是要加,还是要放在spring容器里面
那么在struct容器里产生的时候,会自动到spring容器里找需要注入的东西,当然由于什么标记都没加,就是ByName找的
那如果想匹配指定的name怎么办呢,就不需要写set方法了,直接在Action的属性上加
public class UserAction extends ActionSupport implements ModelDriven {
@Resource(“u”);
private UserManager userManager;
.........
}
当然,第一种方法比较好测试
SSH架构的更多相关文章
- .Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) 通过MVC控制器导出导入Excel文件(可用于java SSH架构)
.Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) [原文地址] 通过MVC控制器导出导入Excel文件(可用于java SSH架构) public cl ...
- WebLogic使用SSH架构部署遇到org.hibernate.hql.internal.ast.HqlTok
其实这个问题在以前就遇到过,当时解决了,但今天在部署一个测试轻应用的时候一直没有想起来,特此记录一下. 这个问题出现在使用WebLogic(我使用的是10.3.5版本)发布SSH架构的应用.在操作数据 ...
- SSH 架构
这几天学习了 ssh 架构,中间出了好多错误,现在终于整理好了,就记录下来 ssh机构的框架构成,以及它们的作用 struts2 :这个框架主要用做控制处理的,其核心是 Contraller ,即 A ...
- SSH架构实现在线支付功能
在线支付是指卖方与卖方通过因特网上的电子商务网站进行交易时,银行为其提供网上资金结算服务的一种业务,她为企业和个人提供了一个安全.快捷.方便的电子商务应用环境和网上资金结算工具,在线支付不仅帮助企业实 ...
- ssh架构简单解释和vo po解释
Struts.spring.Hibernate在各层的作用 1)struts 负责 web层. ActionFormBean 接收网页中表单提交的数据,然后通过Action 进行处理,再Forwa ...
- SSH架构简单总结
Struts.spring.Hibernate在各层的作用 1)struts 负责 web层. ActionFormBean 接收网页中表单提交的数据,然后通过Action 进行处理,再Forw ...
- ssh架构之hibernate(五)hql语句狂练
1.练习题 1.查询所有商品的名称[查询特定属性](只有一个参数的话可以使用List<String>接收数据)2.查询所有商品的名称和供应商[查询特定属性](多个参数可以使用List< ...
- ssh架构之hibernate(四)二级缓存
二级缓存使用步骤: 1.拷贝jar包 2.配置Hibernate.cfg.xml文件 a.#开启二级缓存 hibernate.cache.use_second_level_cache=true b.# ...
- ssh架构之hibernate(三)关系映射
1.单向多对一 1.映射文件配置 2.model: 测试 1.查询测试 执行顺序,先查询多方,在查询一方,一方采用延迟加载 注意:如果不使用一方的数据,就关闭session,报错,同延迟加载中的报错类 ...
随机推荐
- 破解https和https原理
http://blog.csdn.net/cch5487614/article/details/6364711 http://www.jb51.net/network/68135.html
- mac中的xampp配置xdebug
[xdebug] zend_extension=/Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20121212/ ...
- [转载]如何重装Grub,使其可以引导双系统
引言: GRUB是一个多重操作系统的启动管理器.用来引导不同的系统,如windows,Linux.一般来说要先装Windows,后装Linux,这样grub才能生效(grub存在于linux的安装中) ...
- word 2013 没有控件菜单怎么办,添加控件菜单
方法/步骤 打开word软件,然后点击菜单栏中最左边的“文件”菜单项,如下图红色方框所示 2 点击文件后,就打开word的设置对话框,然后在左边的设置列表中点击“自定义功能区”,打开自定义功能区设 ...
- NS实现采用的技术大多是PHP,如果采用java、 .net是否同样适用?
SNS采用的技术可不都是PHP (不局限于国内),特别是国外的新兴公司,基本上没有再用PHP的了,国内到还是蛮常用的.简单说说我知道的几个案例:Facebook (PHP):Facebook采用PHP ...
- 实现js的类似alert效果的函数
这个简单的类似alert的函数,效果还行,至于css样式,那没的说了,笔者确实尽力了,如果读者觉得太烂,你可以随便改函数的样式的,反正,笔者觉得还可以,呵呵. <!DOCTYPE html PU ...
- 《Linux命令行大全》系列(二、导航)
文件系统的导航,是一个不断访问树形结构中节点的过程. 文件系统树 Linux只有一个倒立的文件系统树 不同设备可以挂载到这同一个树上 文件和子目录是此树的组成部分,最顶层的即根目录 目录 根据树节点间 ...
- jQuery实现iframe的自适应高度
假设我们在当前页面要嵌套一个iframe 1 <iframe id="myframe" src="test.html" height="240& ...
- discuz 门户栏目URL跳转异常的问题
“SEO设置-URL静态化”的问题.
- eclipse安装CDT插件遇到的问题
转自eclipse安装CDT插件遇到的问题 已经安装了集成java版本的eclipse,eclipse-java-indigo-SR1-win32.zip,在添加CDT插件时,遇到了问题. cdt-m ...