Struts 2 框架的总结

1、Action 是不是线程安全的?如果不是,有什么方式可以保证Action的线程安全?如果是,说明原因。

Struts1不是 
声明局部变量,或者扩展RequestProcessor,让每次都创建一个Action,或者在spring中用scope=”prototype”来管理

2. Struts 2.0的mvc模式?与struts 1.0的区别?

   struts2的mvc模式:当用户在页面提交用户请求时,该请求需要提交给struts2的控制器处理。struts2的控制器根据处理结果, 决定将哪个页面呈现给客户端。 
  与struts1最大的不同是:struts2的控制器。struts2的控制器不再像struts1的控制器,需要继承一个Action父类,甚至可以无需实现任何接口,struts2的Action就是一个普通的POJO。实际上,Struts2 的Action就是一个包含execute方法的普通Java类,该类里包含的多个属性用于封装用户的请求参数。

3.Struts2拦截器原理

   Struts2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。事实上,我们之所以能够如此灵活地使用拦截器,完全归功于“动态代理”的使用。
4. 自定义拦截器

  1、实现拦截器类:com.opensymphony.xwork2.interceptor.Interceptor。 
  2、注册自定义拦截器:需要在<interceptors>中注册。 
  3、可以将拦截器放入拦截器栈<interceptor-stack>。 
  4、在action中应用拦截器。 
  5、也可以设置默认的拦截器。<default-interceptor-refname=”myInterceptor”/>
5. Struts2的核心控制器StrutsPrepareAndExecuteFilter的作用

   StrutsPrepareAndExecuteFilter 主要负责拦截 url请求,可以在web.xml中配置拦截的url,<url-pattern>/*</url-pattern>代表拦截所有的请求,执行doFilter方法默认情况下,如果用户请求的路径不带后缀或者后缀以.action结尾,这时请求将被转入struts2框架处理,否则struts2框架将略过该请求的处理。

6.Struts2的工作流程:

  (1)客户端提交一个HttpServletRequest请求(.action或JSP页面) 
  (2) 请求被提交到一系列Filter过滤器,如ActionCleanUp和FilterDispatcher等 
  (3) FilterDispatcher是Struts2控制器的核心,它通常是过滤器链中的最后一个过滤器 
  (4) 请求发到FilterDispatcher后,FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个Request(一般根据URL后缀是否为.action来判断) 
  (5) 如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求交到ActioProxy,由其进行处理. 
  (6) ActionProxy通过Configuration Manager(它会访问struts.xml)询问框架的配置文件,找到需要调用的Action类. 
  (7) ActionProxy创建一个ActionInvocation实例,而ActionInvocation通过代理模式调用Action,(在调用之前会根据配置文件加载相关的所有Interceptor拦截器) 
  (8) Action执行完毕后,返回一个result字符串,此时再按相反的顺序通过Interceptor拦截器. 
  (9) 最后ActionInvocation负责根据struts.xml中配置的result元素,找到与返回值对应的result,决定进行下一步输出.

7.struts2是如何管理action的?这种管理方式有什么好处?

  struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的。 主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。

8.Action和ActionForm是单例的吗?Action是线程安全的吗?

    Struts1的Action是单例的,不是线程安全的 
  Struts2的Action是多例的,是线程安全的 
  每当有一次用户的请求,ActionFrom就会被创建一次。
9.配置Struts 2 的开发模式
<constant name="struts.devMode" value="true"/>
10.为什么要使用 Struts2 & Struts2 的优点
  1. 基于 MVC 架构,框架结构清晰。
  2. 使用 OGNL: OGNL 可以快捷的访问值栈中的数据、调用值栈中对象的方法
  3. 拦截器: Struts2 的拦截器是一个 Action 级别的 AOP, Struts2 中的许多特性都是通过拦截器来实现的, 例如异常处理,文件上传,验证等。拦截器是可配置与重用的
  4. 多种表现层技术. 如:JSP、FreeMarker、Velocity 等

11.拦截器的生命周期与工作过程 ?

  每个拦截器都是需要实现 Interceptor 接口
  init():在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源进行必要的初始化;
  intercept(ActionInvocation invocation):每拦截一个动作请求,该方法就会被调用一次;
  destroy:该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次;

12. 如何在 Struts2 中使用 Ajax 功能 ?

1. JSON plugin
  2. DOJO plugin
  3. DWR plugin
  4. 使用 Stream 结果类型.

13. Struts如何支持I18N

1、需要在struts配置文件中指定资源属性文件的位置和名称,如
  2、在相应的位置放置相应的文件
  3、在JSP页面中使用来输出文本,以避免硬编码
  以登录页面的国际化作为例子讲解
  创建相应的资源属性文件
  用标签替换登录页面的硬编码文本
  测试(更改网页显示语言,以便测试不同的版本)

14. 介绍一下Struts的异常自动处理机制

  编程式异常处理
  即我们在Action中调用业务逻辑层对象的方法时,用try{ }catch的方式来截获异常之后,手工对异常进行处理
  我们以前的开发过程中,都是使用编程式的异常处理
  在编程式异常处理的时候,我们可以使用struts的消息处理机制(前面所讲的内容)来对这些异常信息进行处理
  自动异常处理机制
  即在Action中不捕捉异常,而是将异常抛出给struts框架处理
  我们需要在配置文件中指示struts如何处理这些被抛出的异常
  使用元素来定义自动异常处理
  元素的配置,指示了struts如何处理异常的方式
  在通常的情况下,我们得到异常以后,需要将页面导航到一个错误提示的页面,提示错误信息
  元素配置的关键属性是:
  key – 即这个异常所对应的错误提示消息文本的key,这个key的值,需要在资源属性文件中进行定义
  type – 即定义需要处理哪种类型的Exception
  path – 定义一旦出现异常,需要转向哪个页面来进行提示,如果不定义path属性,默认情况下,将使用  Action配置中的input属性的值来作为转向的页面

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

path属性:指定请求访问Action的路径
  type属性:指定Action的完整类名
  name属性:指定需要传递给Action的ActionForm Bean
  scope属性:指定ActionForm Bean的存放范围
  validate属性:指定是否执行表单验证
  input属性:指定当表单验证失败时的转发路径。
  元素还包含一个子元素,它定义了一个请求转发路径。

16. Action和拦截器线程安全吗?

Struts2的Action类是线程安全的,因为每个请求一个实例。
Struts2的拦截器是单例,所以它不是线程安全的,我们需要仔细地实现它们,以避免与共享数据的任何问题。

17.Struts2的拦截器执行什么模式?

过滤器decorator模式和职责链模式

18.Struts1和Struts2的区别是什么?

组件Struts1Struts2
Action 类需要强迫继承一个类,不灵活只要实现Action接口, 完成execute()
线程安全Action类是单例的,非线程安全,编程时要注意多线程副作用action类每次请求一个(性能降低) 。
Servlet API 耦合Struts1 API 与Servlet API 紧紧耦合,Request和Response 对象直接传入execute() 方法(虽然很方便)Struts2 API 和Servlet API松耦合,自动将表单bean数据映射到action类的javabean属性(struts1也可以通过ActionForm实现)。
测试Struts1 action类因为和Servlet API 耦合难于测试Struts2 Action 类是一个正常Java类,易于测试。

Request

参数映射

Struts1 需要我们创建 ActionForm 类来 hold request 参数,还需要配置Struts2 request参数映射是自动的,我们只要有相应的java bean属性在action类中,或实现 ModelDriven接口提供java bean 类名用于映射。
标签支持Struts1 使用 JSTL 和自己的表情。Struts2 使用 OGNL
校验Struts1 支持validate() 方法手动Struts2 支持手动和验证框架整合。
视图输出Struts1 使用标准JSP 输出Struts2 使用 ValueStack 存储请求参数和属性,使用OGNL 和 Struts2 标签访问

19. Struts2的前端控制器是什么?

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 每次请求处理从这里开始。

20.什么是ValueStack和OGNL?

ValueStack是一个用来处理客户端请求的数据存储区,数据存储在ActionContext中,这是用ThreadLocal为每个请求线程创建的,生命周期是请求级别。
  对象图导航语言Object-Graph Navigation Language (OGNL) 是用户将储存在valuestack中的数据导出,使用OGNL拦截器和结果页面都能访问到ValueStack的数据。

21.Struts2有用的标签有哪些?

@Action创建action
  @Actions 配置一个类为多个Action
  @Namespace 和 @Namespaces 用于创建不同的模块
  @Result 用于结果页面
  @ResultPath用于配置结果页面的定位。

22. Struts2重要的常量?

struts.devMode 是运行在开发调试模式,提供日志和调试功能,提交生产环境需要关闭。
  struts.convention.result.path 配置结果页面的位置,缺省Struts2在 {WEBAPP-ROOT}/{Namespace}/下寻找结果页面, 用这个常量能够改变这个位置。
  struts.custom.i18n.resources 用来定义 i18n 支持.
  struts.action.extension 用来配置应用程序的URL后缀. 缺省是后缀 .action。

?
1
2
3
4
<code class = "hljs livecodeserver" ><constant name= "struts.devMode" value= "true" ></constant>
<constant name= "struts.action.extension" value= "action,do" ></constant>
<constant name= "struts.custom.i18n.resources" value= "global" ></constant>
<constant name= "struts.convention.result.path" value= "/" ></constant></code>

23.Struts2的名称空间namespace 有什么用?

我们能使用名称空间基于功能分离我们的Action类,如admin user和客户等模块。

24. 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。详细信息请参考
  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表单的验证。

25. Struts2的核心组件?

Action 类
       Interceptors拦截器
      结果页面, FreeMarker 模板的JSP
      ValueStack, OGNL 和 Tag库

漂亮回答面试官struts2的原理

众所周知,Struts2是个非常优秀的开源框架,我们能用Struts2框架进行开发,同时能快速搭建好一个Struts2框架,但我们是否能把Struts2框架的工作原理用语言表达清楚,你表达的原理不需要说出底层是怎么实现的,我估计大多数的人也听不懂。当面试官问到我们Struts2的工作原理时,我们该怎么回答这个问题呢?回答什么才能让自己说的与众不同,先看看其他朋友总结的

一 工作原理

在Struts2框架中的处理大概分为以下几个步骤 :
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 
2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 
3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类 
6 ActionProxy创建一个ActionInvocation的实例。 
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper 

二 工作流程
1、客户端浏览器发出HTTP请求.
2、根据web.xml配置,该请求被FilterDispatcher接收
3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton
4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面
6、返回HTTP响应到客户端浏览器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值