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框架,继承其长处。同一时候做了相当的改进。

1、Struts2基于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。

freemarker、velocity、chain、httpheader、xslt、plainText、stream

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

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

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

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

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

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

16  Struts2文件的上传

1、JSP页面:

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组件的名称+ContentType,jsp页面file组件的名称+FileName.

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

时间: 2024-08-28 16:13:56

Java面试-Struts2的相关文章

Java面试宝典2017

JAVA面试.笔试题(2017版)                 欲想成功,必须用功!   目录 一.                  HTML&CSS部分.......................................................................................... 9 1.HTML中定义表格的宽度用80px和80%的区别是什么?...................................... 9 2.CSS样

Java面试宝典-2017

Java面试宝典2017版 一. Java基础部分...................................................................................................... 7 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?..... 7 2.Java有没有goto?.......................................................

java面试宝典(蓝桥学院)

Java面试宝典(蓝桥学院) 回答技巧 这套面试题主要目的是帮助那些还没有java软件开发实际工作经验,而正在努力寻找java软件开发工作的学生在笔试/面试时更好地赢得好的结果.由于这套试题涉及的范围很泛,很广,很杂,大家不可能一天两天就看完和学完这套面试宝典,即使你已经学过了有关的技术,那么至少也需要半个月的时间才能消化和掌握这套面试宝典,所以,大家应该早作准备,从拿到这套面试宝典之日起,就要坚持在每天闲暇之余学习其中几道题目,日积月累,等到出去面试时,一切都水到渠成,面试时就自然会游刃有余了

普华永道高级JAVA面试记录

最近在考虑换个工作 原因?咱能不逗吗? 一面感觉发挥不错  二面之后累觉不爱  基本上浪费了半天的工资(好多钱啊~~~) PWD上海地址在浦东软件园  工作环境说实话没我现在工作的环境好,不过里面的人给人感觉不错.前台不NICE但给人很舒服的感觉. 说重点,面试过程. 面试分笔试和面试  笔试面试都是英文(回答问题要是实在英文撑不住了就用中文) 笔试题偏基础  说两个注意点  手写冒泡排序  和 用英文描述一个设计模式 面试有两次 第一个考官是个微胖界的胖子(很和蔼)  第二个有点娘(很刁钻)

Java面试总结(2017.10)

Java面试总结(2017.10) 把最近一个月的面试经历总结一下吧.期间有面试大数据和java,以下主要针对java大概总结一下. 一.某滴(套路:项目.数据结构.算法.数据库.多线程) 1.手写链表反转.二分查找(有序循环数组 4 5 1 2 3) 2.mysql索引,哪些地方影响性能? 3.jdk1.8 hashmap 的变化? 数组+树,数组加表  空间复杂度 4.hashmap的结构优化? 5.concurrenthashmap机制? 6.hbase,为什么要有列族? 7.rabbit

JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)

hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加得心应手. 第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些.Mybatis框架相对简单很容易上手,但也相对简陋些.个人觉得要用好Mybatis还是首先要先理解好Hibernate. 比起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项目需求

转:最近5年133个Java面试问题列表

最近5年133个Java面试问题列表 Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来越高级,面试官问的问题也更深入. 在我初入职场的时候,类似于 Vector 与 Array 的区别.HashMap 与 Hashtable 的区别是最流行的问题,只需要记住它们,就能在面试中获得更好的机会,但这种情形已经不复存在.如今,你将会被问到许多 Java 程序员都没有看过的领域,如 NIO,

java 面试 -- 4

Java面试知识点总结 本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺(阅读本文需要有一定的Java基础:若您初涉Java,可以通过这些问题建立起对Java初步的印象,待有了一定基础后再后过头来看收获会更大).本文的问题列表来自于http://www.nowcoder.com/discuss/3043,在此感谢原作者的无私分享:) 1. Java中的原始数据类型都有哪些,它们的大小及对应

Java 面试-- 1

JAVA面试精选[Java基础第一部分] 这个系列面试题主要目的是帮助你拿轻松到offer,同时还能开个好价钱.只要能够搞明白这个系列的绝大多数题目,在面试过程中,你就能轻轻松松的把面试官给忽悠了.对于那些正打算找工作JAVA软件开发工作的童鞋们来说,当你看到这份题目的时候,你应该感动很幸运,因为,只要你把题目中的内容都搞懂了,在笔试的时候就可以游刃有余,通过面试只有半步之遥了,笔试只能反映你的JAVA技能.不管你是面试各个级别的JAVA工程师.架构师.还是项目经理,这个系列文章都是你最宝贵的资