struts2 原理详解
1.Struts 2 的基本流程
Struts 2 框架由 3 个部分组成:核心控制器 FilterDispatcher、业务控制器和用户实现的业务逻辑组件。在这 3 个部分里,Struts 2 框架
提供了核心控制器 FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。
2.核心控制器:FilterDispatcher
FilterDispatcher 是 Struts 2 框架的核心控制器,该控制器作为一个 Filter 运行在 Web 应用中,它负责拦截所有的用户请求,当用户请
求到达时,该 Filter 会过滤用户请求。如果用户请求以 action 结尾,该请求将被转入 Struts 2 框架处理。
Struts 2 框架获得了*.action 请求后,将根据*.action 请求的前面部分决定调用哪个业务逻辑组件,例如,对于 login.action 请求,Struts 2
调用名为 login 的 Action 来处理该请求。
Struts 2 应用中的 Action 都被定义在 struts.xml 文件中,在该文件中定义 Action 时,定义了该 Action 的 name 属性和 class 属性,其中
name 属性决定了该 Action 处理哪个用户请求,而 class 属性决定了该 Action 的实现类。
Struts 2 用于处理用户请求的 Action 实例,并不是用户实现的业务控制器,而是 Action 代理——因为用户实现的业务控制器并没有与
Servlet API 耦合,显然无法处理用户请求。而 Struts 2 框架提供了系列拦截器,该系列拦截器负责将 HttpServletRequest 请求中的请求
参数解析出来,传入到 Action 中,并回调 Action 的 execute 方法来处理用户请求。
显然,上面的处理过程是典型的 AOP(面向切面编程)处理方式。图 3.19 显示了这种处理模型。
图 3.19 Struts 2 的拦截器和 Action
从图 3.19 中可以看出,用户实现的 Action 类仅仅是 Struts 2 的 Action 代理的代理目标。用户实现的业务控制器(Action)则包含了对用
户请求的处理。用户的请求数据包含在 HttpServletRequest 对象里,而用户的 Action 类无需访问 HttpServletRequest 对象。拦截器负
责将 HttpServletRequest 里的请求数据解析出来,并传给业务逻辑组件 Action 实例。
3.业务控制器
正如从图 3.19 所看到的,业务控制器组件就是用户实现 Action 类的实例,Action 类里通常包含了一个 execute 方法,该方法返回一个
字符串——该字符串就是一个逻辑视图名,当业务控制器处理完用户请求后,根据处理结果不同,execute 方法返回不同字符串 ——每
个字符串对应一个视图名。
程序员开发出系统所需要的业务控制器后,还需要配置 Struts 2 的 Action,即需要配置 Action 的如下三个部分定义:
— Action 所处理的 URL。
— Action 组件所对应的实现类。
— Action 里包含的逻辑视图和物理资源之间的对应关系。
每个 Action 都要处理一个用户请求,而用户请求总是包含了指定 URL。当 Filter Dispatcher 拦截到用户请求后,根据请求的 URL 和 Action
处理 URL 之间的对应关系来处理转发。
4.Struts 2 的模型组件
实际上,模型组件已经超出了 MVC 框架的覆盖范围。对于 Struts 2 框架而言,通常没有为模型组件的实现提供太多的帮助。
文本框: 图 3.20 控制器调用模型组件 Java EE 应用里的模型组件,通常指系统的业务逻辑组件。而隐藏在系统的业务逻辑组件下面的,
可能还包含了 DAO、领域对象等组件。
通常,MVC 框架里的业务控制器会调用模型组件的方法来处理用户请求。也就是说,业务逻辑控制器不会对用户请求进行任何实际处理,
用户请求最终由模型组件负责处理。业务控制器只是中间负责调度的调度器,这也是称 Action 为控制器的原因。
图 3.20 显示了这种处理流程。
提示 在图 3.20 中看到 Action 调用业务逻辑组件的方法。当控制器需要获得业务逻辑组件实例时,通常并不会直接获取业务逻辑组件实
例,而是通过工厂模式来获得业务逻辑组件的实例;或者利用其他 IoC 容器(如 Spring 容器)来管理业务逻辑组件的实例。
5.Struts 2 的视图组件
Struts 2 已经改变了 Struts 1 只能使用 JSP 作为视图技术的现状,Struts 2 允许使用其他的模板技术,如 FreeMarker、Velocity 作为视
图技术。
当 Struts 2 的控制器返回逻辑视图名时,逻辑视图并未与任何的视图技术关联,仅仅是返回一个字符串,该字符串作为逻辑视图名。
当我们在 struts.xml 文件中配置 Action 时,不仅需要指定 Action 的 name 属性和 class 属性,还要为 Action 元素指定系列 result 子元素,
每个 result 子元素定义一个逻辑视图和物理视图之间的映射。前面所介绍的应用都使用了 JSP 技术作为视图,故配置 result 子元素时没
有指定 type 属性,默认使用 JSP 作为视图资源。
如果需要在 Struts 2 中使用其他视图技术,则可以在配置 result 子元素时,指定相应的 type 属性即可。例如,如果需要使用 FreeMarker,
则为 result 指定值为 freemarker 的 type 属性;如果想使用 Velocity 模板技术作为视图资源,则为 result 指定值为 velocity 的 type 属性……
6.Struts 2 的运行流程
经过上面介绍,我们发现 Struts 2 框架的运行流程非常类似于 WebWork 框架的流程。
提示 在 Struts 2 的官方站点,我们可以找到如下说法:Essentially,Struts 2.0 is the technical equivalent of WebWork 2.3。Aside from
the package and property renaming,it isn't much different than,say,migrating from WebWork 2.1 to 2.2——意思是说:Struts 2.0
技术等同于 WebWork 2.3 框架,除了包和属性被改名外。从 WebWork 2.2 迁移到 Struts 2 不会比从 WebWork 2.1 迁移到 WebWork 2.2
更复杂。
这里我们可以看到,Struts 2 其实就是 WebWork 2.2 的升级版,这也就不难理解:为什么 WebWork 和 Struts 2 如此相似!
因此,Struts 2 的运行流程与 WebWork 的运行流程完全相同,读者可以参看图 1.8 来了解 Struts 2 的运行流程。
struts2 的基本流程
2009-09-28 15:44:28| 分类: ssh 框架 | 标签: |字号大中小 订阅
FilterDispatcher 是 Struts 2 框架的核心控制器,该控制器作为一个 Filter 运行在 Web 应用中,它负责拦截所有的用户请求,当用户请求
到达时,该 Filter 会过滤用户的请求。如果用户请求以 action 结尾,该请求将被转入 Struts 2 框架处理。Struts 2 框架获得了*.action 请
求后,将根据*.action 请求的前面部分决定调用哪个业务逻辑组件,例如,对于 login.action 请求,Struts2 调用名为 login 的 action 来处
理该请求。Struts2 应用中的 Action 都被定义为 struts.xml 文件中,在该文件中定义 Action 时,定义了改 Action 的 name 属性和 class
属性,其中 name 属性决定了该 Action 处理哪个用户请求,而 class 属性决定了该 Action 的实现类。Struts 2 用于处理用户请求的 Action
实例,并不是用户实现的业务控制器,而是 Action 代理————因为用户实现的业务控制器并没有与 Servlet API 耦合,显然无法处理用
户请求。而 Struts 2 框架提供了系列拦截器,该系列拦截器负责将 HttpServletRequest 请求中的参数解析出来,传入到 Action 中,并回
调 Action 的 execute 方法来处理用户请求。
3.在 Spring 中,Bean 有几种作用域?
参考答案:
id="role"
class="spring.chapter2.maryGame.Role"
Spring 中 bean 的作用域
如何使用 spring 的作用域:
这里的 scope 就是用来配置 spring bean 的作用域,它标识 bean 的作用域。
在 spring2.0 之前 bean 只有 2 种作用域即:singleton(单例)、non-singleton
(也称 prototype), Spring2.0 以后,增加了 session、request、global session
三种专用于 Web 应用程序上下文的 Bean。因此,默认情况下 Spring2.0 现在有
五种类型的 Bean。当然,Spring2.0 对 Bean 的类型的设计进行了重构,并设计
出灵活的 Bean 类型支持,理论上可以有无数多种类型的 Bean,用户可以根据自
己的需要,增加新的 Bean 类型,满足实际应用需求。
1、singleton 作用域
当一个 bean 的作用域设置为 singleton, 那么 Spring IOC 容器中只会存在一个
共享的 bean 实例,并且所有对 bean 的请求,只要 id 与该 bean 定义相匹配,则
只会返回 bean 的同一实例。换言之,当把一个 bean 定义设置为 singleton 作用
域时,Spring IOC 容器只会创建该 bean 定义的唯一实例。这个单一实例会被存
储到单例缓存(singleton cache)中,并且所有针对该 bean 的后续请求和引用
都将返回被缓存的对象实例,这里要注意的是 singleton 作用域和 GOF 设计模式
中的单例是完全不同的,单例设计模式表示一个 ClassLoader 中只有一个 class
存在,而这里的 singleton 则表示一个容器对应一个 bean,也就是说当一个 bean
被标识为 singleton 时候, spring 的 IOC 容器中只会存在一个该 bean。
配置实例:
或者
2、prototype
class="spring.chapter2.maryGame.Role"
class="spring.chapter2.maryGame.Role"
id="role"
id="role"
prototype 作用域部署的 bean,每一次请求(将其注入到另一个 bean
中,或者以程序的方式调用容器的 getBean()方法)都会产生一个新的 bean 实
例,相当一个 new 的操作,对于 prototype 作用域的 bean,有一点非常重要,
那就是 Spring 不能对一个 prototype bean 的整个生命周期负责,容器在初始化、
配置、装饰或者是装配完一个 prototype 实例后,将它交给客户端,随后就对该
prototype 实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化
生命周期回调方法,而对 prototype 而言,任何配置好的析构生命周期回调方法
都将不会被调用。清除 prototype 作用域的对象并释放任何 prototype bean 所
持有的昂贵资源,都是客户端代码的职责。(让 Spring 容器释放被 singleton
作用域 bean 占用资源的一种可行方式是,通过使用 bean 的后置处理器,该处
理器持有要被清除的 bean 的引用。)
配置实例:
或者
singleton="false"/>
3、request
request 表示该针对每一次 HTTP 请求都会产生一个新的 bean,同时该 bean
仅在当前 HTTP request 内有效。
request、session、global session 使用的时候首先要在 web.xml 中做如下配
置:
如果你使用的是 Servlet 2.4 及以上的 web 容器,那么你仅需要在 web
应用的 XML 声明文件 web.xml 中增加下述 ContextListener 即可:
...
org.springframework.web.context.request.RequestContex
tListener
...
,如果是 Servlet2.4 以前的 web 容器,那么你要使用一个 javax.servlet.Filter
的实现:
...
requestContextFilter
org.springframework.web.filter.RequestContextFil
ter
requestContextFilter
/*
...
接着既可以配置 bean 的作用域了:
4、session
id="role"
class="spring.chapter2.maryGame.Role"
session 作用域表示该针对每一次 HTTP 请求都会产生一个新的 bean,同
时该 bean 仅在当前 HTTP session 内有效,配置实例:
配置实例:
和 request 配置实例的前提一样,配置好 web 启动文件就可以如下配置:
5、global session
id="role"
class="spring.chapter2.maryGame.Role"
global session 作用域类似于标准的 HTTP Session 作用域,不过它仅
仅在基于 portlet 的 web 应用中才有意义。Portlet 规范定义了全局 Session 的
概念,它被所有构成某个 portlet web 应用的各种不同的 portlet 所共享。在
global session 作用域中定义的 bean 被限定于全局 portlet Session 的生命周
期范围内。如果你在 web 中使用 global session 作用域来标识 bean,那么 web
会自动当成 session 类型来使用。
配置实例:
和 request 配置实例的前提一样,配置好 web 启动文件就可以如下配置:
6、自定义 bean 装配作用域
在 spring2.0 中作用域是可以任意扩展的,你可以自定义作用域,
甚 至 你 也 可 以 重 新 定 义 已 有 的 作 用 域 ( 但 是 你 不 能 覆 盖 singleton 和
prototype ) , spring
的 作 用 域 由 接 口
org.springframework.beans.factory.config.Scope 来定义,自定义自己的作
用域只要实现该接口即可,下面给个实例:
我们建立一个线程的 scope,该 scope 在表示一个线程中有效,代码如下:
publicclass MyScope implements Scope ...{
privatefinal ThreadLocal threadScope = new ThreadLocal() ...{
protected Object initialValue() ...{
returnnew HashMap();
}
};
objectFactory) ...{
public
Object
get(String
name,
ObjectFactory
Map scope = (Map) threadScope.get();
Object object = scope.get(name);
if(object==null) ...{
object = objectFactory.getObject();
scope.put(name, object);
}
return object;
}
public Object remove(String name) ...{
Map scope = (Map) threadScope.get();
return scope.remove(name);
}
publicvoid registerDestructionCallback(String name, Runnable
callback) ...{
}
public String getConversationId() ...{
// TODO Auto-generated method stub
returnnull;
}
}
4.简述 Struts 的工作原理?
参考答案:
在 web 应用启动时就会加载初始化 ActionServlet,ActionServlet 从
struts-config.xml 文件中读取配置信息,把它们存放到各种配置对象
当 ActionServlet 接收到一个客户请求时,将执行如下流程.
-(1)检索和用户请求匹配的 ActionMapping 实例,如果不存在,就返回请
求路径无效信息;
-(2)如果 ActionForm 实例不存在,就创建一个 ActionForm 对象,把客户
提交的表单数据保存到 ActionForm 对象中;
-(3)根据配置信息决定是否需要表单验证 .如果需要验证 ,就调用
ActionForm 的 validate()方法;
-(4)如果 ActionForm 的 validate()方法返回 null 或返回一个不包含
ActionMessage 的 ActuibErrors 对象, 就表示表单验证成功;
-(5)ActionServlet 根据 ActionMapping 所包含的映射信息决定将请求
发
应
Action 实例不存在,就先创建这
转
的
个实例,然后调用 Action 的 execute()方法;
Action,
哪
个
给
如
果
相
-(6)Action 的 execute() 方 法 返 回 一 个 ActionForward 对
象,ActionServlet 在把客户请求转发给 ActionForward 对象指向的 JSP 组件;
-(7)ActionForward 对象指向 JSP 组件生成动态网页,返回给客户;
5.简述 Hibernate 的工作原理?
参考答案:
1.读取并解析配置文件
2.读取并解析映射信息,创建 SessionFactory
3.打开 Sesssion
4.创建事务 Transation
5.持久化操作
6.提交事务
7.关闭 Session
8.关闭 SesstionFactory
6.简述 Spring 的工作原理?
参考答案:
1.spring mvc 请所有的请求都提交给 DispatcherServlet,它会委托应用系统的
其他模块负责负责对请求进行真正的处理工作。
2.DispatcherServlet 查 询 一 个 或 多 个 HandlerMapping, 找 到 处 理 请 求 的
Controller.
3.DispatcherServlet 请请求提交到目标 Controller
4.Controller 进行业务逻辑处理后,会返回一个 ModelAndView
5.Dispathcher 查询一个或多个 ViewResolver 视图解析器,找到 ModelAndView
对象指定的视图对象
6.视图对象负责渲染返回给客户端。
hibenate.hbm2ddl.auto 属性详解
2010-09-19 17:25
hibernate 配置属性中,hibernate.hbm2ddl.auto 可以帮助你实现正向工程,即由 java 代码生
成数据库脚本,进而生成具体的表结构.
在 hibernate.cfg.xml 中:
Java 代码
1.
2.
它包含 4 个属性:
create : 会根据你的 model 类来生成表,但是每次运行都会删除上一次的表,重新生成
表,哪怕 2 次没有任何改变
create-drop : 根据 model 类生成表,但是 sessionFactory 一关闭,表就自动删除
update : 最常用的属性,也根据 model 类生成表,即使表结构改变了,表中的行仍然存
在,不会删除以前的行
validate : 只会和数据库中的表进行比较,不会创建新表,但是会插入新值