Hibernate, Spring, Struts
相关
1.
Hibernate
工作原理及为什么要用?
原理:
1.
读取并解析配置文件
2.
读取并解析映射信息,创建SessionFactory
3.
打开Sesssion
4.
创建事务Transation
5.
持久化操作
6.
提交事务
7.
关闭Session
8.
关闭SesstionFactory
为什么要用:
1.
对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2. Hibernate
是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
3. hibernate
使用Java反射机制,而不是字节码增强程序来实现透明性。
4. hibernate
的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
2.
Hibernate
是如何延迟加载?
1. Hibernate2
延迟加载实现:a)实体对象 b)集合(Collection)
2. Hibernate3
提供了属性的延迟加载功能;当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
3.
Hibernate
中怎样实现类之间的关系?(如:一对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、
4.
说下Hibernate的缓存机制
1.
内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存
2.
二级缓存:
a)
应用及缓存
b)
分布式缓存
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非
关键数据
c)
第三方缓存的实现
5.
Hibernate
的查询方式
Sql
、Criteria,object comptosition
Hql
:
1
、
属性查询
2
、
参数查询、命名参数查询
3
、
关联查询
4
、
分页查询
5
、
统计函数
6.
如何优化Hibernate?
1.
使用双向一对多关联,不使用单向一对多
2.
灵活使用单向一对多关联
3.
不用一对一,用多对一取代
4.
配置对象缓存,不使用集合缓存
5.
一对多集合使用Bag,多对多集合使用Set
6.
继承类使用显式多态
7.
表字段要少,表关联不要怕多,有二级缓存撑腰
7.
Struts
工作机制?为什么要使用Struts?
工作机制:
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实例不存在,就先创建这个实例,然后调用Action的execute()方法;
(6)Action
的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件;
(7)ActionForward
对象指向JSP组件生成动态网页,返回给客户;
为什么要用:
JSP
、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。
基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件
8.
Struts
的validate框架是如何验证的?
在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。
9.
说下Struts的设计模式
MVC
模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的 Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用 Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。
单例模式Factory(工厂模式):
定义一个基类===》实现基类方法(子类通过不同的方法)===》定义一个工厂类(生成子类实例) ===》开发人员调用基类方法.
10. spring
工作机制及为什么要用?
1.spring mvc
请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。
2.DispatcherServlet
查询一个或多个HandlerMapping,找到处理请求的Controller.
3.DispatcherServlet
请请求提交到目标Controller
4.Controller
进行业务逻辑处理后,会返回一个ModelAndView
5.Dispathcher
查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
6.
视图对象负责渲染返回给客户端。
为什么用:
AOP
让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用 AOP 后,公共服务
(比
如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。
IOC
允许创建一个可以构造对象的应用环境,然后向这些对象传递它们的协作对象。正如单词
倒置
所表明的,IOC 就像反
过来的 JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction),每一个对象都是用其协作对象构造的。因此是由容器管理协作对象(collaborator)。
Spring
即使一个AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换具有类似接口的协作对象。
11.
说说Struts的优点、缺点
Struts
是开源软件,使开发者能更深入的了解其内部实现机制。
Struts
优点:
业界”标准”(很多成功案例),学习资源丰富。
Struts
的优点主要集中体现在两个方面:Taglib和页面导航。
a
、利用Struts提供的taglib可以大大节约开发时间。
b
、维护扩展比较方便。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。
c
、表现与逻辑分离
d
、表单验证解决了请求数据的验证问题,增强了系统健壮性。
e
、便于团队开发
Struts
缺点:
a
、大量的使用标签,对于初学者难度较大。
b
、ActionForms使用不便、无法进行单元测试(StrutsTestCase只能用于集成)
12. Struts
提供了几个标签库?都是什么标签库?
Struts
提供了五个标签库,即:HTML、Bean、Logic、Template和Nested。
HTML
标签
用来创建能够和Struts 框架和其他相应的HTML 标签交互的HTML 输入表单
Bean
标签 在访问JavaBeans 及其属性,以及定义一个新的bean 时使用
Logic
标签 管理条件产生的输出和对象集产生的循环
Template
标签 随着Tiles框架包的出现,此标记已开始减少使用
Nested
标签 增强对其他的Struts 标签的嵌套使用的能力
13.
分析一下struts是如何实现MVC的。
Struts
采用jsp作为MVC的视图,由ActionServlet具体指定的action动作类作为控制器即MVC中的C,负责视图与模型之间的交互。控制器的每个入口点都由名为struts-config.xml的配置文件设置。该文件把来自视图的请求映射为特定的JAVA类以进行相应的处理,控制器还指定下一个视图的位置。Struts中的模型主要指的就是javabean,它是模型的代表,主要封装数据和业务逻辑。
14.
说说Struts的处理流程:
控制器进行初始化工作,读取配置文件,为不同的Struts模块初始化相应的ModuleConfig对象。控制器接收Http请求,并从ActionConfig中找出对应于该请求的Action子类,如果没有对应的Action,控制器直接将请求转发给JSP或者静态页面,否则控制器将请求分发至具体的Action类进行处理。
在控制器调用具体的Action的Execute方法之前,ActionForm对象将利用Http请求中的参数来填充自已。还可以在 ActionForm类中调用Validate方法来检查请求参数的合法性,并且可以返回一个包含所有错误信息的ActionErrors对象。
执行具体的的Execute的方法,它负责执行相应的业务逻辑。执行完后,返回一个ActionForward对象,控制器通过该 ActionForward对象来进行转发工作。也可以把Action要处理的业务逻辑封装在JavaBean中,如果系统中还有EJB,那么通过 JavaBean调用EJB以完成业务处理;如果没有EJB,那么就直接在JavaBean中连接数据库,进行数据库相关的操作。
15.
说说Struts几个关键对象的作用:
Action
、ActionServlet、ActionForm
16. Action
是不是线程安全的?如果不是有什么方式可以保证Action的线程安全?如果是,说明原因
不是线程安全的。只要不申明类变量就可以保证线程安全。因为只存在一个Action类实例,所有线程会共享类变量。
17. Tiles
框架是什么?
Tiles
框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离。
18.
你对MVC的理解,MVC有什么优缺点?结合Struts,说明在一个Web应用如何去使用?
MVC
设计模式(应用观察者模式的框架模式)
M: Model(Business process layer)
,模型,操作数据的业务处理层,并独立于表现层 (Independent of presentation)。
V: View(Presentation layer)
,视图,通过客户端数据类型显示数据,并回显模型层的执行结果。
C: Controller(Control layer)
,控制器,也就是视图层和模型层桥梁,控制数据的流向,接受视图层发出的事件,并重绘视图
MVC
框架的一种实现模型
模型二(Servlet-centric): JSP+Servlet+JavaBean,以控制为核心,JSP只负责显示和收集数据,Sevlet,连接视图和模型,将视图层数据,发送给模型层,JavaBean,分为业务类和数据实体,业务类处理业务数据,数据实体,承载数据,基本上大多数的项目都是使用这种MVC的实现模式。
Struts MVC
框架(Web application frameworks) Struts是使用MVC的实现模式二来实现的,也就是以控制器为核心。
Struts
提供了一些组件使用MVC开发应用程序:
Model
:Struts 没有提供model 类。这个商业逻辑必须由Web 应用程序的开发者以JavaBean或EJB的形式提供
View
:Struts提供了action form创建form bean,用于在controller和view间传输数据。此外,Struts提供了自定义JSP标签库,辅助开发者用JSP创建交互式的以表单为基础的应用程序,应用程序资源文件保留了一些文本常量和错误消息,可转变为其它语言,
可用于JSP中。
Controller
:Struts提供了一个核心的控制器ActionServlet,通过这个核心的控制器来调用其他用户注册了的自定义的控制器Action,自定义Action需要符合Struts的自定义Action规范,还需要在struts-config。xml的特定配置文件中进行配置,接收JSP输入字段形成Action form,然后调用一个Action控制器。Action控制器中提供了model的逻辑接口。
19. Struts
中DispatchAction和Action类有什么不同?
DispatchAction
是Struts包含的另一个能大量节省开发时间的Action类。与其它Action类仅提供单个execute()方法实现单个业务不同,DispatchAction允许你在单个Action类中编写多个与业务相关的方法。这样可以减少Action类的数量,并且把相关的业务方法集合在一起使得维护起来更容易。
要使用DispatchAction的功能,需要自己创建一个类,通过继承抽象的DispatchAction得到。对每个要提供的业务方法必须有特定的方法signature。例如,我们想要提供一个方法来实现对购物车添加商品清单,创建了一个类ShoppingCartDispatchAction提供以下的方法:
public ActionForward addItem(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){
throws Exception;
}
那么,这个类很可能还需要一个deleteItem()方法从客户的购物车中删除商品清单,还有clearCart()方法清除购物车等等。这时我们就可以把这些方法集合在单个Action类,不用为每个方法都提供一个Action类。
在调用ShoppingCartDispatchAction里的某个方法时,只需在URL中提供方法名作为参数值。就是说,调用addItem()方法的 URL看起来可能类似于:
http://myhost/storefront/action/cart?method=addItem
其中method参数指定ShoppingCartDispatchAction中要调用的方法。参数的名称可以任意配置,这里使用的”method”只是一个例子。参数的名称可以在Struts配置文件中自行设定。
20. Struts
中如何基于validation.xml来启用客户端验证?
可以使用<html:javascript>标签来进行基于validation.xml的客户端验证。
例如代码<html:javascript formName=logonForm dynamicJavascript=true staticJavascript=true/>会按照validation.xml中的定义为logonForm生成客户端javascript代码。
21. Struts
框架如何取得消息资源文件中的信息?
消息资源文件是一些简单的.properties文件,这些文件包含有可以被struts项目使用的消息信息,消息资源文件可以以<message-resource/>标签的形式添加到struts-config.xml文件,例如<message-resource parameter=MessageResource/>
22. Struts1
和Struts2都有什么区别?
特性
|
Struts1.x
|
Struts2
|
Action
类
|
Struts1.x
要求Action类要扩展自一个抽象基类。Struts1.x的一个共有的问题是面向抽象类编程而不是面向接口编程。
|
Struts2
的Action类实现了一个Action接口,连同其他接口一起来实现可选择 和自定义的服务。Struts2提供一个名叫ActionSupport的基类来实现一般使用的接口。当然,Action接口不是必须的。任何使用 execute方法的POJO对象可以被当作Struts 2的Action对象来使用。
|
线程模型
|
Struts1.x Action
类是单例类,因为只有一个实例来控制所有的请求。单例类策略造成了一定的限制,并且给开发带来了额外的烦恼。Action资源必须是线程安全或者同步的。
|
Struts2 Action
对象为每一个请求都实例化对象,所以没有线程安全的问题。(实践中,servlet容器给每一个请求产生许多�G弃的对象,并且不会导致性能和垃圾回收问题)。
|
Servlet
依赖
|
Struts1.x
的Action类依赖于servlet API,当Action被调用时,以HttpServletRequest和HttpServletResponse作为参数传给execute方法。
|
Struts2
的Action和容器无关。Servlet上下文被表现为简单的Maps,允 许Action被独立的测试。Struts2的Action可以访问最初的请求(如果需要的话)。但是,尽可能避免或排除其他元素直接访问 HttpServletRequest或HttpServletResponse。
|
易测性
|
测试Struts1.x的主要问题是execute方法暴露了Servlet API这使得测试要依赖于容器)。第三方的扩展,如Struts TestCase,提供了一套Struts1的模拟对象(来进行测试)。
|
Struts2
的Action可以通过初始化、设置属性、调用方法来测试。依赖注入的支持也是测试变得更简单。
|
捕获输入
|
Struts1.x
使用ActionForm对象来捕获输入。象Action一样,所有的 ActionForm必须扩展基类。因为其他的JavaBean不能作为ActionForm使用,开发者经常创建多余的类来捕获输入。 DynaBeans可以被用来作为替代ActionForm的类来创建。但是,开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有 冗余的javabean)。
|
Struts2
直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入 属性可能是有自己(子)属性的rich对象类型。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm 模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种ModelDriven 特性简化了taglib对POJO输入对象的引用。
|
表达式语言
|
Struts1.x
整合JSTL,所以它使用JSTL的表达式语言。表达式语言有基本的图形对象移动,但是对集合和索引属性的支持很弱。
|
Struts2
使用JSTL,但是也支持一个更强大和灵活的表达式语言--”Object Graph Notation Language” (OGNL)。
|
将值绑定到页面
|
Struts1.x
使用标准JSP机制来绑定对象到页面上下文。
|
Struts2
使用“ValueStack”技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
|
类型转换
|
Struts1.x
的ActionForm属性经常都是String。Struts 1.x使用Commons-Beanutils来进行类型转换。转换每一个类,而不是为每一个实例配置。
|
Struts2
使用OGNL进行类型转换。提供基本和常用对象的转换器。
|
验证
|
Struts1.x
支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
|
Struts2
支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性
|
Action
执行控制
|
Struts1.x
支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。
|
Struts2
支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。
|
23.
如何在struts中配置数据源在,什么文件?用什么标签?如何取出DataSource?
Struts-config.xml
<data-sources>
<data-source key=”data” type=”org.apache.commons.dbcp.BasicDataSource”>
<set-property property=”driverClassName” value=”com.microsoft.jdbc.sqlserver.SQLServerDriver” />
<set-property property=”url” value=”jdbc:microsoft:sqlserver://localhost:1433;databaseName=t23” />
<set-property property=”username” value=”sa” />
<set-property property=”password” value=”" />
</data-source>
</data-sources>
DataSource ds=(DataSource)this.getServlet().getServletContext().getAttribute(“data”);
Connection con=ds.getConnection();
24.
如何用Struts实现国际化?
国际化:不用修改代码,就适用于不同的语言国家
本地化:如果要适应一个国家,要修改源代码
实现过程:
在struts-config.xml中用如下标签说明资源文件名,注意其只是文件名,没有语言_国家
<message-resources parameter=”struts.ApplicationResources” />
在资源文件对应的目录struts中加入适应不同语言、国家的properties文件
ApplicationResources_zh_CN.properties
中国
ApplicationResources_en_US.properties us
如果不是英语要转码
native2ascii -encoding gb2312
源 ApplicationResources_zh_CN.properties
在jsp页面中用
<bean:message key=
”"/>取出信息
25. Spring
和Struts的区别?
strusts
:是一种基于MVC模式的一个web层的处理。
Spring:
提供了通用的服务,ioc/di aop,关心的不仅仅web层,应当j2ee整体的一个服务,可以很容易融合不同的技术struts hibernate ibatis ejb remote springJDBC springMVC
26.
如何配置spring+struts?
在struts-config.xml加入一个插件,通过它加载applicationContext.xml
在struts-config.xml修改action-mapping标记,具体action交给了DelegateActionProxy
通过DelegateActionProxy进入一spring的环境。
在spring的applicationContext.xml加入<bean name=”/login” class=”" singleton=”false”/>
27. Struts
中最核心的类和包有哪些?
1. org.apache.struts.action
基本上,控制整个struts framework的运行的核心类、组件都在这个包中,比如我们上面提到的控制器ActionServlet。已经Action,ActionForm,ActionMapping等等。struts1.1比1.0多了 DynaActionForm 类。增加了动态扩展生成FormBean功能
2. org.apache.struts.actions
这个包是主要作用是提供客户的http请求和业务逻辑处理之间的特定适配器转换功能,而1.0版本中的部分动态增删FromBean的类,也在struts1.1中被Action包的DynaActionForm组件所取代
3. org.apache.struts.config
提供对配置文件struts-config.xml元素的映射。这也是sturts1.1中新增的功能
4. org.apache.struts.util
Strtuts
为了更好支持web application的应用,体统了一个些常用服务的支持,比如Connection Pool和Message Source。详细信息请参考
http://jakarta.apache.org/struts/api/org/apache/struts/util/package-summary.html
5. org.apache.struts.taglib
这不是一个包,而是是一个客户标签类的集合。下面包括Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags这几个用于构建用户界面的标签类。
6 . org.apache.struts.validator
Struts1.1 framework
中增加了validator framework,用于动态的配置from表单的验证。
28.
介绍一下Struts的ActionServlet类
ActionServlet
继承自javax.servlet.http.HttpServlet类,其在Struts framework中扮演的角色是中心控制器。它提供一个中心位置来处理全部的终端请求。控制器ActionServlet主要负责将HTTP的客户请求信息组装后,根据配置文件的指定描述,转发到适当的处理器。
按照Servelt的标准,所有得Servlet必须在web配置文件(web.xml)声明。同样,ActoinServlet必须在Web Application配置文件(web.xml)中描述,有关配置信息如下。
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
</servlet>
全部的请求URI以*.do的模式存在并映射到这个servlet,其配置如下:
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
一个该模式的请求URI符合如下格式:
http://www.my_site_name.com/mycontext/actionName.do
中心控制器为所有的表示层请求提供了一个集中的访问点。这个控制器提供的抽象概念减轻了开发者建立公共应用系统服务的困难,如管理视图、会话及表单数据。它也提供一个通用机制如错误及异常处理,导航,国际化,数据验证,数据转换等。
当用户向服务器端提交请求的时候,实际上信息是首先发送到控制器ActionServlet,一旦控制器获得了请求,其就会将请求信息传交给一些辅助类(help classes)处理。这些辅助类知道如何去处理与请求信息所对应的业务操作。在Struts中,这个辅助类就是org.apache.struts.action.Action。通常开发者需要自己继承Aciton类,从而实现自己的Action实例。
29.
介绍一下Struts的Action类
ActionServlet
把全部提交的请求都被控制器委托到RequestProcessor对象。RequestProcessor使用struts-config.xml文件检查请求URI找到动作Action标示符。
一个Action 类的角色,就像客户请求动作和业务逻辑处理之间的一个适配器(Adaptor),其功能就是将请求与业务逻辑分开。这样的分离,使得客户请求和Action类之间可以有多个点对点的映射。而且Action类通常还提供了其它的辅助功能,比如:认证(authorization)、日志(logging)和数据验证(validation)。
Action
最为常用的是execute()方法当Controller收到客户的请求的时候,在将请求转移到一个Action实例时,如果这个实例不存在,控制器会首先创建,然后会调用这个Action实例的execute()方法。Struts Framework为应用系统中的每一个Action类只创建一个实例。因为所有的用户都使用这一个实例,所以你必须确定你的Action 类运行在一个多线程的环境中。
30. Struts
的控制器如何知道什么样的信息转发到什么样的Action类呢?
在struts 中,控制器信息转发的配置映射信息是存储在特定的XML文件(比如struts-config.xml)中的。这些配置信息在系统启动的时候被读入内存,供struts framework在运行期间使用。在内存中,每一个<action>元素都与org.apache.struts.action.ActionMapping类的一个实例对应。当可以通过/logonAction.do(此处假设配置的控制器映射为*.do)提交请求信息的时候,控制器将信息委托com.test.LogonAction处理。调用LogonAction实例的execute()方法。同时将Mapping实例和所对应的LogonForm Bean信息传入。其中name=LogonForm,使用的form-bean元素所声明的ActionForm Bean。
31.
如何提高Struts2的性能?
1.
关闭logging和开发模式(devMode), devMode是在struts.properties中设置的,
关闭logging需要修改web.xml文件,加入以下参数
<servlet>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>0</param-value>
</init-param>
</servlet>
2.
除非需要,否则不要使用拦截器(interceptor).
3.
正确设置页面的Cache-Control 和 Expires
4. struts2
提供的Ajax theme(Dojo)或者Calendar标签默认情况下保存在struts.jar包里面,
把这些js文件或者css文件拷出来放到另外一个服务器上可以提高性能。
5.
如果使用freemarker的话,在WEB-INF下的classes文件夹下创建一个freemarker.properties并且加入
template_update_delay=60000
,
这个值是freemarker多久从硬盘重新载入模板,默认情况下是500ms, 因为没有必要检查是不是需要重新载入模板文件,所以最好把它设置为一个很大的数字。
6.
启用Freemarker 模板缓存, 这是struts.freemarker.templatesCache为true, 默认情况下这个是false的。
7.
节省使用session, 不必要的话不要使用session.
32.
请你谈谈SSH整合
SSH
:
Struts
(表示层)+Spring(业务层)+Hibernate(持久层)
Struts
:
Struts
是一个表示层框架,主要作用是界面展示,接收请求,分发请求。
在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。(View:沿用JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet,struts-config.xml,Action)
Hibernate
:
Hibernate
是一个持久层框架,它只负责与关系数据库的操作。
Spring
:
Spring
是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。
33. Struts
中如何访问session
有两种方法可以访问session, 通过ActionContext或者实现SessionAware接口,第二种是推荐的。
1.
通过ActionContext
Map attributes = ActionContext.getContext().getSession();
2.
实现SessionAware接口
首先使Action implements SessionAware
然后 Map parameters = this.getSession();
任何对parameters的改动都会直接影响session.
34.
如何强制重新加载ActionMapping(struts.xml)
通常情况下,如果WAR包重新部署的话Action Mapping是会自动重新加载的,如果没有的话可以试试以下两种方法:设置reload属性为true或者销毁配置
设置reload为true: struts.properties
struts.configuration.xml.reload = true
销毁配置
String execute(){
com.opensymphony.xwork.config.ConfigurationManager.destroyConfiguration();
return SUCCESS;
}
35.
如何测试Action
测试 Struts Action 相对比较困难 , 因为 Struts 是运行在 Web 服务器中 , 因此要测试 Struts Action 就必须发布应用程序然后才能测试,换言之,我们必须要有 Web 容器的支持 . 我们想象一下 , 对于一个拥有上千个 JSP page 和数百甚至数千 Java Classes 的大规模应用程序 , 要把他们发布到诸如 Weblogic 之类的应用服务器再测试 , 需要多少的时间和硬件资源 ? 所以这种模式的测试是非常费时费力的 .
所以 , 如果有一种办法能够不用发布应用程序 , 不需要 Web 服务器就能象测试普通 Java Class 一样测试 Struts Action, 那就能极大地加强 Struts 的可测试性能 , 使应用程序测试更为容易 , 简单快速 . 现在这个工具来了 , 这就是 StrutsTestCase.
StrutsTestCase
是一个开源工具 , 可以到 http://strutstestcase.sourceforge.net 下载 . 这里是 2.1.3, 如果你使用 Servlet2.3 就下载 StrutsTestCase213-2.3.jar, 使用 Servlet2.4 的就下载 StrutsTestCase213-2.4.jar. 另外 StrutsTestCase 本身就是从 JUnit 继承的 , 所以你还需要下载 JUnit3.8.1.
下面就以一个简单的 LogonAction 为例测试一下:
public class LogonAction extends Action {
public ActionForward execute( ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) {
DynaValidatorForm dynaForm = (DynaValidatorForm)form;
String name = (String)dynaForm.get(“username");
String password = (String)dynaForm.get(“password");
if (name.equals(“wangxq") && password.equals(“wangxq")){
request.setAttribute(“valid_user",form);
return mapping.findForward(“admin");
}
return mapping.findForward(“success");
}
}
LogonAction
的简单说明:从 Logon 的页面中输入用户名和密码,在 LogonAction 中作判断,并且作相应的跳转。
对其的测试代码如下:
public class LogonActionTest extends MockStrutsTestCase {
protected void setUp() throws Exception {
super.setUp();
setContextDirectory(new File(
“WebRoot")); // 设置 WEB-INF 的上级目录,让程序可以找到 struts-config.xml 文件
}
protected void tearDown() throws Exception {
super.tearDown();
}
public void testNoParameters(){
setRequestPathInfo(“/logon");
actionPerform();
verifyInputForward();
String[] actionErrors = {“errors.required","errors.required"};
verifyActionErrors(actionErrors);
verifyInputForward();
}
public void testOneParameters(){
setRequestPathInfo(“/logon");
addRequestParameter(“username","wangxq");
actionPerform();
//
校验 Action 是否转发到 Action Mapping 里的 input 属性
verifyInputForward();
String[] actionErrors ={“errors.required"};
verifyActionErrors(actionErrors);
verifyInputForward();
}
public void testSuccessAdmin(){
//
设置 Request 的请求,说明该 Request 请求的是哪一个 Action ,或者说,请求的是哪一个 .do 文件。
setRequestPathInfo(“/logon");
//
将参数和其对应的值加入到 request 中,相当于是 action 对应的 formbean 传过来的值,即用户在登陆界面输入的值。
addRequestParameter(“username","wangxq");
addRequestParameter(“password","wangxq");
//
执行这个请求,即执行 action 中对应的 execute 方法。
actionPerform();
//
验证 forward 的名字是否正确,即有没有跳转到预期的页面。
verifyForward(“admin");
//
验证没有任何的 ActionErrors 。
verifyNoActionErrors();
}
public void testSuccessLogon(){
setRequestPathInfo(“/logon");
addRequestParameter(“username","aaaaaa");
addRequestParameter(“password","bbbbbb");
actionPerform();
verifyForward(“success");
verifyNoActionErrors();
}
}
补充说明其中的一些方法:
verifyActionErrors/Messages
—
校验 ActionActionServlet controller 是否发送了 ActionError 或 ActionMessage. 参数为 ActionError/Message Key
verifyNoActionErrors/Messages
—
校验 ActionActionServlet controller 没有发送 ActionError 或 ActionMessage
VerifyForward
—
校验 Action 是否正确转发到指定的 ActionForward.
VerifyForwardPath
—
校验 Action 是否正确转发到指定的 URL
verifyInputForward
—
校验 Action 是否转发到 Action Mapping 里的 input 属性
其他的方法可以参考具体的文档说明。
还有一点需要说明:
关于Web.xml和Struts-Config.xml
缺省情况下 ,StrutsTestCase 认为你的 Web.xml 和 struts-config.xml 的路径分别是 :
/WEB-INF/web.xml
和 /WEB-INF/struts-config.xml
1.
假如你的 web.xml/struts-config.xml 的路径是
d:/application/web/WEB-INF/web.xml(struts-config.xml)
的话 , 就需要把 d:/ application /web 加到 classpath.
或者更简单的方法是 setContextDirectory(new File(“web")) 这样就可以找到了。
2.
假如你的 struts config 是 strust-config-module.xml,
那么必须调用 setConfigFile() 设置你的 struts config 文件
深入使用:
<action path="/handle"input="/handle.do?method=setUp"name=" handleForm"type=" handleAction" scope="session" parameter="method" validate="true">
<forward name="CurPage" path=" handle “/>
</action>
这段配置文件中,使用了 parameter="method" 的配置,这样在测试的时候就需要设置以下:
测试代码中应该加入:
addRequestParameter(“method “,"setUp");
这样,在执行 actionPerform() 时,程序就自动进入 setUp 的方法,执行该方法的测试。
另外,也可以用EasyMock来进行Action测试
36.
如何返回一个为字符串的response
在Action里面加一个InputStream类型的变量
package actions;
import java.io.InputStream;
import java.io.StringBufferInputStream;
import com.opensymphony.xwork2.ActionSupport;
public class TextResult extends ActionSupport {
private InputStream inputStream;
public InputStream getInputStream() {
return inputStream;
}
public String execute() throws Exception {
inputStream = new StringBufferInputStream(
"Hello World! This is a text string response from a Struts 2 Action.");
return SUCCESS;
}
}
设置ResultType为stream
<action name="text-result" class="actions.TextResult">
<result type="stream">
<param name="contentType">text/html</param>
<param name="inputName">inputStream</param>
</result>
</action>
37.
概述struts,以及struts如何实现MVC架构的?
struts framework是一种基于java的技术,Web应用程序开发人员通过struts framework即可充分利用面向对象设计、代码重用以及”编写一次、到处运行”的优点。Struts提供了一种创建Web应用程序的框架,其中对应用程序的显示、表示和数据的后端代码进行了抽象。Struts采用jsp作为MVC的视图,由ActionServlet具体指定的action动作类作为控制器即MVC中的C,负责视图与模型之间的交互。控制器的每个入口点都由名为struts-config.xml的配置文件设置。该文件把来自视图的请求映射为特定的JAVA类以进行相应的处理,控制器还指定下一个视图的位置。Struts中的模型主要指的就是javabean,它是模型的代表,主要封装数据和业务逻辑