Struts Interview

Struts框架面试题
http://simpleframework.net/bbs/835/88264.html

1. 简述Struts框架的初始化流程。

答案:

对于采用Struts框架的Web应用,在Web应用启动时就会加载并初始化控制器ActionServlet

ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到ActionMappings对象中。

在Struts framework中, Controller主要是ActionServlet,但是对于业务逻辑的操作则主要由Action、ActionMapping、ActionForward这几个组件协调完成(也许这几个组件,应该划分到模型中的业务逻辑一块)。

其中,Action扮演了真正的控制逻辑的实现者,而ActionMapping和ActionForward则指定了不同业务逻辑或流程的运行方向。

2. 简述Struts框架响应客户请求的工作流程

答案:

1. 检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的信息。

2. 如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。

3. 根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()方法。

4. 如果ActionForm的validate()方法返回null或返回一个不包含ActionMessge的ActionErrors对象,就表示表单验证成功。

5. ActionServlet根据AtionMapping实例包含的映射信息决定将请求转发给哪个Action。如果应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。

6. Action的execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。

7. ActionForward对象指向的JSP组件生成动态页面,返回给客户。

对于以上流程的步骤(4),如果ActionForm的validate()方法返回一个包含一个或多个ActionError的ActionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含客户提交表单的JSP组件。在这种情况下,不会再创建Action对象并调用Action的execute方法。

3 Struts框架的数据验证可分为几种类型?

答案:

表单验证(由ActionForm Bean处理):如果用户没有在表单中输入姓名,就提交表单,将生成表单验证错误

业务逻辑验证(由Action处理):如果用户在表单中输入的姓名为“Monster”,按照本应用的业务规则,不允许向“Monster”打招呼,因此将生成业务逻辑错误。

4 简述Form Bean的表单验证流程。

答案:

1、当用户提交了HTML表单,Struts框架自动把表单数据组装到ActionForm Bean中。

2、接下来Struts框架会调用ActionForm Bean的validate()方法进行表单验证。

3、如果validate()方法返回的ActionErrors 对象为null,或者不包含任何ActionMessage对象,就表示没有错误,数据验证通过。

4、如果ActionErrors中包含ActionMessage对象,就表示发生了验证错误,Struts框架会把ActionErrors对象保存到request范围内,然后把请求转发到恰当的视图组件,视图组件通过<html:errors>标签把request范围内的ActionErrors对象中包含的错误消息显示出来,提示用户修改错误。

5在struts配置文件中action元素包含哪些属性和子元素?

答案:

path属性:指定请求访问Action的路径

type属性:指定Action的完整类名

name属性:指定需要传递给Action的ActionForm Bean

scope属性:指定ActionForm Bean的存放范围

validate属性:指定是否执行表单验证

input属性:指定当表单验证失败时的转发路径。

<action>元素还包含一个<forward>子元素,它定义了一个请求转发路径。

6. 简单叙述ActionForm Bean的作用

答案:

1、ActionForm Bean也是一种JavaBean,除了具有一些JavaBean的常规方法,还包含一些特殊的方法,用于验证HTML表单数据以及将其属性重新设置为默认值。

2、Struts框架利用ActionForm Bean来进行View组件和Controller组件之间表单数据的传递。

3、Struts框架把View组件接受到的用户输入的表单数据保存在ActionForm Bean中,把它传递给Controller组件,Controller组件可以对ActionForm Bean中的数据进行修改JSP文件使用Struts标签读取修改后的ActionForm Bean的信息,重新设置HTML表单。

7 .叙述ActionForm执行步骤

答案:

(1)检查Action的映射,确定Action中已经配置了对ActionForm的映射

(2)根据name属性,查找form bean的配置信息

(3)检查Action的formbean的使用范围,确定在此范围下,是否已经有此form bean的实例。

(4)假如当前范围下,已经存在了此form bean的实例,而是对当前请求来说,是同一种类型的话,那么就重用。

(5)否则,就重新构建一个form bean的实例

(6)form bean的reset()方法备调用

(7)调用对应的setter方法,对状态属性赋值

(8)如果validatede的属性被设置为true,那么就调用form bean的validate()方法。

(9)如果validate()方法没有返回任何错误,控制器将ActionForm作为参数,传给Action实例的execute()方法并执行。

8.在下面的标签中哪些是struts标签

A、<html:form>

B、<html:text>

C、<html:errors>

D、<html:message>

答案:A B C

9、FormBean的作用

答:FormBean是一种JAVABean,除了具有JAVABean的常规方法,还包含一些特殊方法,用于验证表单数据,以及将其属性重新设置为默认值。 FormBean用来进行View组件和Controller组件之间表单数据的传递。View组件接收到用户输入的表单数据,保存在FormBean中,把它传递给Controller组件,Controller组件可以对FormBean中的数据进行修改。

10、Forward与Global-Forward的区别

答:Forward是根据Action return的值找到对应的JSP页。当多个Action共同return同一个值时,可将这个Forward元素写在Global-Forward中。

11.问题:在Struts应用的视图中包含哪些组件?

选项:

(A) JSP

(B) Servlet

(C) ActionServlet

(D) Action

(E) 代表业务逻辑或业务数据的JavaBean

(F) EJB

(G) 客户化标签

答案:A,G

12问题:在Struts应用的控制器中包含哪些组件?

选项:

(A) JSP

(B) Servlet

(C) ActionServlet

(D) Action

(E)代表业务逻辑或业务数据的JavaBean

(F) EJB

(G) 客户化标签

答案:B,C,D

13.在struts配置文件中action元素包含哪些属性和子元素?

答案:

path属性:指定请求访问Action的路径

type属性:指定Action的完整类名

name属性:指定需要传递给Action的ActionForm Bean

scope属性:指定ActionForm Bean的存放范围

validate属性:指定是否执行表单验证

input属性:指定当表单验证失败时的转发路径。

<action>元素还包含一个<forward>子元素,它定义了一个请求转发路径。

14. 问题:在Struts应用的模型中包含哪些组件?

选项:

(A) JSP

(B) Servlet

(C) ActionServlet

(D) Action

(E) 代表业务逻辑或业务数据的JavaBean

(F) EJB

(G) 客户化标签

答案:F

15. 问题: struts框架中,关于FormBean,下列说法正确的是:
A FormBean是一种数据bean,主要用来封装表单提交上来的数据,并把这些数据传递给Action
B 在FormBean中可以对页面上传递来的参数进行一下格式上的验证,这种验证是一种客户端的验证
C 用户每次提交表单,都会产生一个新的FormBean实例
D 动态FormBean不能进行验证操作

答案:A

16. 问题:struts框架中,在一个Action的配置信息中,name属性指的是:
A 当前action实例的名字
B 当前action所在的类的名字
C 该Action中调用的FormBean的实例的名字
D 该Action中调用的FormBean的类的所在包名

答案:C

17. 问题:关于struts项目中的类与MVC模式的对应关系,说法错误的是?
A Jsp文件实现视图View的功能
B ActionServlet这一个类是整个struts项目的控制器
C ActionForm、Action都属于Model部分
D 一个struts项目只能有一个Servlet

答案:D

18、问题:以下哪些说法是正确的?

选项:(A)每个HTTP请求对应一个单独的ActionServlet实例

(B)对于每个请求访问HelloAction的HTTP请求,Struts框架会创建一个单独的HelloAction实例。

(C)每个子应用对应一个单独的RequestProcessor实例

(D)每个子应用对应一个单独的web.xml文件

答案:C

19 ActionForm Bean对象是由谁创建的?

选项:

(A) <html:form>标签处理类

(B) ActionServlet

(C) RequestProcessor

(D) Action

答案:C

20、struts框架,错误的是?
A Struts中无法完成上传功能
B Struts框架基于MVC模式
C Struts框架容易引起流程复杂、结构不清晰等问题
D Struts可以有效地降低项目的类文件数目

答案:C

21、问题:以下代码定义了一个变量,如何输出这个变量的值?

<bean:define id=”stringBean” value=“helloWorld“/>

选项:(A)<bean:write name=“stringBean”/>

(B) <bean:write name=“helloWorld”/>

(C)<%= stringBean%>

(D)<% String myBean=(String)pageContext.getAttribute(“stringBean”,PageContext.PAGE_SCOPE);%> <%=myBean%>

答案: A,D

22、问题:把静态文本放在Resource Bundle中,而不是直接在JSP文件中包含这些静态文本,有什么优点?答案: 提高可维护性 提高可重用性 支持国际化

23在struts配置文件中action元素包含哪些属性和子元素?

答案:

path属性:指定请求访问Action的路径

type属性:指定Action的完整类名

name属性:指定需要传递给Action的ActionForm Bean

scope属性:指定ActionForm Bean的存放范围

validate属性:指定是否执行表单验证

input属性:指定当表单验证失败时的转发路径。

<action>元素还包含一个<forward>子元素,它定义了一个请求转发路径。

24. 问题:关于struts项目中的类与MVC模式的对应关系,说法错误的是?
A Jsp文件实现视图View的功能
B ActionServlet这一个类是整个struts项目的控制器
C ActionForm、Action都属于Model部分
D 一个struts项目只能有一个Servlet

答案:D

Struts面试题大全
http://qiutian110119.blog.163.com/blog/static/54617311201071611239973/

1.Struts的工作原理?

在Struts中,用户的请求一般以*.do作为请求服务名,所有的请求均被指向ActionServlet,ActionServlet根据Struts-config.xml中的配置信息,将用户请求封装成一个指定名称的ActionForm,并将此ActionForm传至指定的Action中,由Action完成相应的业务操作。

2.Struts的优缺点?

优点:开源;表现与逻辑分离;MVC框架

缺点:大量的标签;ActionForms使用不便,无法进行单元测试

3.结合Struts,谈谈对MVC框架的理解?

M:模型—业务处理层

V:视图—表示层

C:控制器

Struts的M:javaBean或EJB的形式提供

Struts的V:Jsp + ActionForm

Struts的C:核心控制器ActionServlet

4.Struts的Action是不是线程安全的?如果不是有什么方式可以保证Action的线程安全?

不是线程安全的。只要不声明实例变量就可以保证线程安全;或者对操纵实例变量的方法进行同步。

5.Struts提供了几个标签库?

HTML标签:重新包装了html的表单控件。提供了事务跟踪(url重写功能);防止重复提交(如:form标签,link标签);封装Bean的功能。

Bean标签

Logic标签

Template标签

Nested标签

6.常用的Struts类有哪些?

ActionServlet:控制核心。

Action:处理用户请求。通常的做法是在Action的execute方法中调用业务层对象,进行业务处理,并将业务处理的结果,返回给不同的ActionForward对象。

ActionForm:封装用户通过表单提交的数据;validate方法验证用户提交的数据。

ActionMapping:代表了struts-config.xml文档中action标签的配置信息。findForward或getInputForward。

ActionForward

ActionErrors

ActionError:错误信息。

ActionMessage:提示信息。

7.Struts中都有哪些Action?

主要有Action,DispatchAction,ForwardAction…

8.Struts中都有哪些ActionForm?

主要有ActionForm,DynaActionForm(属性配置在struts-config.xml中),LazyValidatorForm(无需ActionForm,无需在struts-config.xml中配置)

9.Struts中解决重复提交问题的方法有哪些?

令牌机制

saveToken

resetToken

isTokenValid

10.Struts的控制器组件有以下哪几个?

a.ActionForm b.ActionServlet c.Action d.ActionForward

答案:b,c

11.Struts有哪些主要配置文件?

a.web.xml b.struts-config.xml c.validation.xml d.validator-rule.xml

答案:a,b

12.Struts有哪些常用的标签库?

a.html标签库 b.bean标签库 c.logic标签库 d.c标签库

答案:abc

13.ActonForm中的validate()方法起作用,要配置Action中的哪个属性?

a.path b.input c.type d.validate

答案:d

14.ActionForm中的name属性要与Action中的哪个属性对应?

a.path b.input c.type d.name

答案:d

15.ActionForm的生命周期是在什么范围

a.page b.request c.session d.application

答案:b,c

16.用于多模块转发的内部类是?

a.ForwardAction b.IncludeAction c.DispatchAction d.SwitchAction

答案:a

17.Struts中的中文转换通常是扩展RequestProcessor类中的哪个方法?

a.processPreprocess() b.processPopulate() c.processMapping() d.processLocale()

答案:a

18.MVC中的C指的是?

a.视图层 b.控制层 c.模型层 d.持久化层

答案:b

19.Struts对国际化支持主要用到的元素是?

a.message-resources b.data-source c.ActionMessage d.ActionMessages

答案:a

20.标签中的bundle属性对应哪个元素的key值?

a.message-resources b.data-source c.action d.from-beans

答案:a

21.动态ActionForm中的type属性必须是?

a.ActionForm b.DynaActionForm c.ActionMapping d.ActionForward

答案:b

22.扩展RequestProcessor时必须要配置哪个元素?

a.data-source b.message-resources c.global-forwards d.controller

答案;d

23.form表单中的action属性值必须与action元素中的哪个属性对应?

a.input b.name c.type d.path

答案:d

24.action元素的哪几个属性是互相排斥的?

a.type b.forward c.include d.input

答案:a,b,c

25.业务对象分哪几种?

a.实体业务对象 b.过程业务对象 c.会话业务对象 d.事件业务对象

答案:a, b, d

26.与表单紧密结合的是哪一类标签?

a.html基本标签 b.html表单标签 c.html文件上传标签 d.html显示消息标签

答案:b

27.用于输出javaBean的标签?

a.<bean:define/> b.<bean:write/> c.<bean:message/> d.<bean:page/>

答案:b

28.用于输出Resource Bundle的正常消息的标签?

a.<bean:write/> b.<bean:message/> c.<html:errors/> d.<bean.header/>

答案:b

29.用于上传文件的标签

<html:file/>

30.用于循环遍历的标签

<logic:iterate/>

31.用于生成普通<a>元素的标签

<html:link/>

32.用于生成隐藏字段的标签

<html:hiddern>

33.<html:link/>的forward属性对应struts的哪个元素

global-forward

struts面试题汇总
http://hi.baidu.com/winlei/item/f23397a7f0127fdf5bf19100

1. Struts优点与缺点
Struts是开源软件,使开发者能更深入的了解其内部实现机制。
Struts 优点:业界"标准"(很多成功案例),学习资源丰富。
Struts的优点主要集中体现在两个方面:Taglib和页面导航。
a、利用Struts提供的taglib可以大大节约开发时间。
b、维护扩展比较方便。通过一个配置文件,即可把握整个系统各部分之间的联 系,这对于后期的维护有着莫大的好处。
c、表现与逻辑分离
d、表单验证解决了请求数据的验证问题,增强了系统健壮性。
e、便于团队开发
Struts缺点:a、大量的使用标签,对于初学者难度较大。
b、ActionForms使用不便、无法进行单元测(StrutsTestCase只能用于集成)
2. Struts提供了几个标签库?都是什么标签库?
Struts提供了五个标签库,即:HTML、Bean、Logic、Template和Nested。
HTML 标签 用来创建能够和Struts 框架和其他相应的HTML 标签交互的HTML 输入表单
Bean 标签 在访问JavaBeans 及其属性,以及定义一个新的bean 时使用
Logic 标签 管理条件产生的输出和对象集产生的循环
Template 标签 随着Tiles框架包的出现,此标记已开始减少使用
Nested 标签 增强对其他的Struts 标签的嵌套使用的能力
3 Tiles框架是什么?
Tiles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离。
4.你对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的实现模式。
StrutsMVC框架(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的逻
辑接口。
6、叙述Struts ActionForm执行步骤
(1)检查Action的映射,确定Action中已经配置了对ActionForm的映射
(2)根据name属性,查找form bean的配置信息
(3)检查Action的formbean的使用范围,确定在此范围下,是否已经有此form bean的实例。
(4)假如当前范围下,已经存在了此form bean的实例,而是对当前请求来说,是同一种类型的话,那么就重用。
(5)否则,就重新构建一个form bean的实例
(6)form bean的reset()方法备调用
(7)调用对应的setter方法,对状态属性赋值
(8)如果validatede的属性被设置为true,那么就调用form bean的validate()方法。
(9)如果validate()方法没有返回任何错误,控制器将ActionForm作为参数,传给Action实例的execute()方法并执行
7.简单叙述Struts 里 ActionForm Bean的作
(1)ActionForm Bean也是一种JavaBean,除了具有一些JavaBean的常规方法,还包含一些特殊的方法,用于验证HTML表单数据以及将其属性重新设置为默认值。
(2)Struts框架利用ActionForm Bean来进行View组件和Controller组件之间表单数据的传递。
(3)Struts框架把View组件接受到的用户输入的表单数据保存在ActionForm Bean中,把它传递给Controller组件,Controller组件可以对ActionForm Bean中的数据进行修改,JSP文件使用Struts标签读取修改后的ActionForm Bean的信息,重新设置HTML表单。
8.简述Struts Form Bean的表单验证流程
(1)当用户提交了HTML表单,Struts框架自动把表单数据组装到ActionForm Bean中。
(2)接下来Struts框架会调用ActionForm Bean的validate()方法进行表单验证。
(3)如果validate()方法返回的ActionErrors 对象为null,或者不包含任何ActionMessage对象,就表示没有错误,数据验证通过。
(4)如果ActionErrors中包含ActionMessage对象,就表示发生了验证错误,Struts框架会把ActionErrors对象保存到request范围内,然后把请求转发到恰当的视图组件,视图组件通过<html:errors>标签把request范围内的ActionErrors对象中包含的错误消息显示出来,提示用户修改错误
9.简述Struts框架响应客户请求的工作流程
(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的信息。
(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。
(3)根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()方法。
(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessge的ActionErrors对象,就表示表单验证成功。
(5)ActionServlet根据AtionMapping实例包含的映射信息决定将请求转发给哪个Action。如果应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。
(6)Action的execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。
(7)ActionForward对象指向的JSP组件生成动态页面,返回给客户。
对于以上流程的步骤(4),如果ActionForm的validate()方法返回一个包含一个或多个ActionError的ActionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含客户提交表单的JSP组件。在这种情况下,不会再创建Action对象并调用Action的execute方法。
10、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类组件构成:控制器组件、模型组件、视图组件
11、说下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(工厂模式):
定义一个基类===》实现基类方法(子类通过不同的方法)===》定义一个工厂类(生成子类实例) ===》开发人员调用基类方法
12、struts中的几个关键对象的作用(说说几个关键对象的作用)
ActionServlet,requestProcess,ActionForm,Action等等
13、Action是不是线程安全的?如果不是有什么方式可以保证Action的线程安全?如果是,说明原因
不是线程安全的。只要不申明类变量就可以保证线程安全。因为只存在一个Action类实例,所有线程会共享类变量。