首页 > 代码库 > Java面试-Struts2

Java面试-Struts2

1  Struts2工作原理

技术分享

  一个请求在Struts2框架中的处理大概分为下面几个步骤:

1、client初始化一个指向Servlet容器(比如Tomcat)的请求;

2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器。这个过滤器对于Struts2和其它框架的集成非常有帮助,比如:SiteMeshPlugin);

3、接着FilterDispatcher被调用。FilterDispatcher询问ActionMapper来决定这个请是否须要调用某个Action。

4、假设ActionMapper决定须要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。

5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到须要调用的Action类。

6、ActionProxy创建一个ActionInvocation的实例。

7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8、一旦Action运行完成,ActionInvocation负责依据struts.xml中的配置找到相应的返回结果。返回结果一般是(但不总是。也可能是另外的一个Action链)一个须要被表示的JSP或者FreeMarker的模版。在表示的过程中能够使用Struts2框架中继承的标签。

在这个过程中须要涉及到ActionMapper。

2  Struts的设计模式

MVC模式:web应用程序启动时就会载入并初始化ActionServlet。

用户提交表单时。一个配置好的ActionForm对象被创建,并被填入表单对应的数据,ActionServlet依据Struts-config.xml文件配置好的设置决定是否须要表单验证。假设须要就调用ActionForm的Validate()验证后选择将请求发送到哪个Action,假设Action不存在,ActionServlet会先创建这个对象,然后调用Action的execute()方法。Execute()从ActionForm对象中获取数据,完毕业务逻辑,返回一个ActionForward对象。ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。

3  Struts2 的特点

Struts2 是一个相当强大的Java Web开源框架,是一个基于POJO的Action的MVC Web框架。它基于当年的Webwork和XWork框架,继承其长处。同一时候做了相当的改进。 

1Struts2基于MVC架构。框架结构清晰,开发流程一目了然。开发者能够非常好的掌控开发的过程。 

2、使用OGNL进行參数传递。

OGNL提供了在Struts2里訪问各种作用域中的数据的简单方式,你能够方便的获取Request,Attribute。Application。Session,Parameters中的数据。大大简化了开发者在获取这些数据时的代码量。

3、强大的拦截器 

Struts2 的拦截器是一个Action级别的AOP。Struts2中的很多特性都是通过拦截器来实现的,比如异常处理,文件上传。验证等。

拦截器是可配置与重用的。能够将一些通用的功能如:登录验证。权限验证等置于拦截器中以完毕一些Java Web项目中比較通用的功能。

在我实现的的一Web项目中,就是使用Struts2的拦截器来完毕了系统中的权限验证功能。

4、易于測试 

Struts2的Action都是简单的POJO,这样能够方便的对Struts2的Action编写測试用例。大慷慨便了Java Web项目的測试。

5、易于扩展的插件机制

在Struts2加入扩展是一件愉快而轻松的事情。仅仅须要将所须要的Jar包放到WEB-INF/lib目录中。在struts.xml中作一些简单的设置就能够实现扩展。

6、模块化管理。Struts2已经把模块化作为了体系架构中的基本思想,能够通过三种方法来将应用程序模块化:将配置信息拆分成多个文件把自包括的应用模块创建为插件创建新的框架特性。即将与特定应用无关的新功能组织成插件。以加入到多个应用中去。

7、全局结果与声明式异常 为应用程序加入全局的Result。和在配置文件里对异常进行处理,这样当处理过程中出现指定异常时,能够跳转到特定页面。 

3  Struts2拦截器原理

Struts2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时。Struts2会查找配置文件。并依据其配置实例化相对的拦截器对象,然后串成一个列表(list)。最后一个一个地调用列表中的拦截器。

其实,我们之所以可以如此灵活地使用拦截器,全然归功于“动态代理”的使用。

http://blog.csdn.net/csh624366188/article/details/7543342

4  Struts2拦截器类型

  内置拦截器:struts2的数据校验、国际化等功能都是在内置拦截器中实现的。

例如以下所看到的:

技术分享

  自己定义拦截器:

1、实现拦截器类:com.opensymphony.xwork2.interceptor.Interceptor。

2、注冊自己定义拦截器:须要在<interceptors>中注冊。

3、能够将拦截器放入拦截器栈<interceptor-stack>。

4、在action中应用拦截器。

5、也能够设置默认的拦截器。<default-interceptor-refname="myInterceptor"/>

http://blog.csdn.net/csh624366188/article/details/7545677

5  拦截器和过滤器的差异

拦截器和过滤器之间有非常多同样之处。可是两者之间存在根本的区别。其主要区别为下面几点:

1)拦截器是基于JAVA反射机制的。而过滤器是基于函数回调的。

2)过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器。

3)拦截器仅仅能对Action请求起作用,而过滤器能够对差点儿全部的请求起作用。

4)拦截器能够訪问Action上下文、值栈里的对象。而过滤器不能

5)在Action的生命周期中,拦截器能够多次被调用,而过滤器仅仅能在容器初始化时被调用一次(init方法)。

6  Struts2核心控制器的作用

  StrutsPrepareAndExecuteFilter的作用:

       负责拦截由<url-pattern>/*</url-pattern>指定的全部用户请求,当用户请求到达时。该Filter会过滤用户的请求。

默认情况下。假设用户请求的路径不带后缀或者后缀以.action结尾,这时请求将被转入struts2框架处理,否则struts2框架将略过该请求的处理。

   

能够通过常量"struts.action.extension"改动action的后缀,如:   

<constant name="struts.action.extension" value="http://www.mamicode.com/do"/>   

7  Struts2获取HttpServletRequest、HttpSession、ServletContext对象

  通过ServletActionContext的对应的静态方法就可以获取。

8  Struts2管理action的方式及长处

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

9  Struts2的默认包struts-default的作用 

1)struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型,而Struts2非常多核心的功能都是通过这些内置的拦截器实现,如:从请求中把请求參数封装到action、文件上传和数据验证等等都是通过拦截器实现的。

当包继承了struts-default包才干使用struts2为我们提供的这些功能。

2)struts-default包是在struts-default.xml中定义。struts-default.xml也是Struts2默认配置文件。 Struts2每次都会自己主动载入 struts-default.xml文件。

   

3)通常每一个包都应该继承struts-default包。

10  Struts2对指定的方法进行验证

1)validate()方法会校验action中全部与execute方法签名同样的方法;

2)要校验指定的方法通过重写validateXxx()方法实现,validateXxx()仅仅会校验action中方法名为Xxx的方法。当中Xxx的第一个字母要大写;

3)当某个数据校验失败时,调用addFieldError()方法往系统的fieldErrors加入校验失败信息(为了使用addFieldError()方法,action能够继承ActionSupport)。 假设系统 的fieldErrors包括失败信息。struts2会将请求转发到名为input的result;   

4)在input视图中能够通过<s:fielderror/>显示失败信息。

5)先运行validateXxxx()->validate()->假设出错了。会转发<result name="input"/>所指定的页面,假设不出错,会直接进行Action::execute()方法。

http://wenku.baidu.com/link?

url=i9cPHN8n7qGp0WpK78nqFiEzcbo5hYF1sBscY19jGKBDwcUyrmOgyIbZeGPj1SfeVr3rGHGUk_2aviSfVjsZTLUTzykkhDNcIMZV1MPu0oq

11  struts2默认拦截器

  fileUpload:提供文件上传功能

  i18n:记录用户选择的locale

  cookies:使用配置的name,value来是指cookiescheckbox加入了checkbox自己主动处理代码,将没有选中的checkbox的内容设定为false。而html默认情况下不提交没有选中的checkbox。

  chain:让前一个Action的属性能够被后一个Action訪问,如今和chain类型的result()结合使用。

  alias:在不同请求之间将请求參数在不同名字件转换,请求内容不变  

12  ValueStack的原理与生命周期

1)ValueStack贯穿整个Action的生命周期,保存在request域中。所以ValueStack和request的生命周期一样。

当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action。

然后把action存放进ValueStack,所以action的实例变量能够被OGNL訪问。请求来的时候,action、ValueStack的生命開始,请求结束,action、ValueStack的生命结束;

2)action是多例的,和Servlet不一样,Servelt是单例的;

3)每一个action的都有一个相应的值栈,值栈存放的数据类型是该action的实例。以及该action中的实例变量,Action对象默认保存在栈顶;

4)ValueStack本质上就是一个ArrayList。

5)关于ContextMap,Struts会把以下这些映射压入ContextMap中。parameters:该Map中包括当前请求的请求參数。request:该Map中包括当前request对象中的全部属性;session:该Map中包括当前session对象中的全部属性;application:该Map中包括当前application对象中的全部属性。attr:该Map按例如以下顺序来检索某个属性:request,session, application。

6)使用OGNL訪问值栈的内容时。不须要#号。而訪问request、session、application、attr时,须要加#号;

7)OGNL表达式须要配合Struts标签才干够使用。如:<s:propertyvalue="http://www.mamicode.com/name"/>

8)Struts2配置文件里引用OGNL表达式,引用值栈的值,此时使用的"$",而不是#或者%。

http://blog.csdn.net/wyply115/article/details/8257140

13  ActionContext、ServletContext、pageContext的差别

1)ActionContext是当前的Action的上下文环境,通过ActionContext能够获取到request、session、ServletContext等与Action有关的对象的引用;

2)ServletContext是域对象。一个web应用中仅仅有一个ServletContext。生命周期伴随整个web应用;

3)pageContext是JSP中的最重要的一个内置对象。能够通过pageContext获取其它域对象的应用,同一时候它是一个域对象,作用范围仅仅针对当前页面,当前页面结束时,pageContext销毁。生命周期是JSP四个域对象中最小的。

14  result的type有几种类型

10

  dispatcher:struts默认的结果类型。把控制权转发给应用程序里的某个资源。

不能把控制权转发给一个外部资源。若须要把控制权重定向到一个外部资源,应该使用redirect。

  redirect:把响应重定向到还有一个资源(包含一个外部资源)。

  redirectAction:把响应重定向到还有一个Action。

  freemarkervelocitychainhttpheaderxsltplainTextstream

15  拦截器的生命周期与工作过程

1)每一个拦截器都是实现了Interceptor接口的 Java 类;

2)init():该方法将在拦截器被创建后马上被调用,它在拦截器的生命周期内仅仅被调用一次。能够在该方法中对相关资源进行必要的初始化;

3)intercept(ActionInvocation invocation):每拦截一个动作请求,该方法就会被调用一次。

4)destroy:该方法将在拦截器被销毁之前被调用。它在拦截器的生命周期内也仅仅被调用一次;

5)Struts2中有内置了18个拦截器。

16  Struts2文件的上传

1JSP页面:

1)JSP页面的上传文件的组件:<s: file name=”upload” />。假设须要一次上传多个文件。就必须使用多个 file 标签,但它们的名字必须是同样的。即:name=xxx的值必须一样;

2)必须把表单的enctype属性设置为:multipart/form-data;

3)表单的方法必须为post,由于post提交的数据在消息体中。而无限制大小。

2、相应的action

1)在 Action 中新加入 3 个和文件上传相关的属性;

2)假设是上传单个文件,uploadImage属性的类型就是 java.io.File。它代表被上传的文件,第二个和第三个属性的类型是 String。它们分别代表上传文件的文件名称和文件类型,定义方式是各自是:jsp页面file组件的名称+ContentTypejsp页面file组件的名称+FileName.

3)假设上传多个文件,能够使用数组或 List。

Java面试-Struts2