Java面试-Struts2

来源:互联网 发布:phpcms linux 权限 编辑:程序博客网 时间:2024/05/16 06:17

1  Struts2工作原理


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

1、客户端初始化一个指向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="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="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。

2 0
原创粉丝点击