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框架,继承其长处。同一时候做了相当的改进。
、Struts2基于MVC架构。框架结构清晰,开发流程一目了然。开发者能够非常好的掌控开发的过程。
、使用OGNL进行參数传递。
OGNL提供了在Struts2里訪问各种作用域中的数据的简单方式,你能够方便的获取Request,Attribute。Application。Session,Parameters中的数据。大大简化了开发者在获取这些数据时的代码量。
、强大的拦截器 。
Struts2 的拦截器是一个Action级别的AOP。Struts2中的很多特性都是通过拦截器来实现的,比如异常处理,文件上传。验证等。
拦截器是可配置与重用的。能够将一些通用的功能如:登录验证。权限验证等置于拦截器中以完毕一些Java Web项目中比較通用的功能。
在我实现的的一Web项目中,就是使用Struts2的拦截器来完毕了系统中的权限验证功能。
、易于測试 。
Struts2的Action都是简单的POJO,这样能够方便的对Struts2的Action编写測试用例。大慷慨便了Java Web项目的測试。
、易于扩展的插件机制。
在Struts2加入扩展是一件愉快而轻松的事情。仅仅须要将所须要的Jar包放到WEB-INF/lib目录中。在struts.xml中作一些简单的设置就能够实现扩展。
、模块化管理。Struts2已经把模块化作为了体系架构中的基本思想,能够通过三种方法来将应用程序模块化:将配置信息拆分成多个文件把自包括的应用模块创建为插件创建新的框架特性。即将与特定应用无关的新功能组织成插件。以加入到多个应用中去。
、全局结果与声明式异常 。为应用程序加入全局的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()方法。
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有几种类型
种
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文件的上传
、JSP页面:
1)JSP页面的上传文件的组件:<s: file name=”upload” />。假设须要一次上传多个文件。就必须使用多个 file 标签,但它们的名字必须是同样的。即:name=“xxx”的值必须一样;
2)必须把表单的enctype属性设置为:multipart/form-data;
3)表单的方法必须为post,由于post提交的数据在消息体中。而无限制大小。
、相应的action:
1)在 Action 中新加入 3 个和文件上传相关的属性;
2)假设是上传单个文件,uploadImage属性的类型就是 java.io.File。它代表被上传的文件,第二个和第三个属性的类型是 String。它们分别代表上传文件的文件名称和文件类型,定义方式是各自是:jsp页面file组件的名称+ContentType,jsp页面file组件的名称+FileName.
3)假设上传多个文件,能够使用数组或 List。
Java面试-Struts2的更多相关文章
- java面试宝典(蓝桥学院)
Java面试宝典(蓝桥学院) 回答技巧 这套面试题主要目的是帮助那些还没有java软件开发实际工作经验,而正在努力寻找java软件开发工作的学生在笔试/面试时更好地赢得好的结果.由于这套试题涉及的范围 ...
- Java 面试宝典-2017
http://www.cnblogs.com/nelson-hu/p/7190163.html Java面试宝典-2017 Java面试宝典2017版 一. Java基础部分........... ...
- Java面试宝典-2017
Java面试宝典2017版 一. Java基础部分........................................................................... ...
- Java面试宝典2018
转 Java面试宝典2018 一. Java基础部分…………………………………………………………………………………….. 7 1.一个“.java”源文件中是否可以包括多个类(不是内部类)?有什么限制 ...
- Java面试宝典(2018版)
置顶 2018年11月10日 23:49:18 我要取一个响亮的昵称 阅读数:8893 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chen ...
- java面试教程视频
java.从入门到精通.第28讲-面试题评讲:http://www.iqiyi.com/w_19rsdc9mu9.html java面试题 1.面试的整体流程:http://www.iqiyi.com ...
- Java面试总结(面试流程及核心面试题)
Java面试流程及核心面试题 面试整体流程 1.1 简单的自我介绍 我是xxxx,工作xxx年.我先后在xxxx公司.yyyy公司工作.先后做个xxxx项目.yyyy项目. 1.2 你简单介 ...
- java面试宝典2019(好东西先留着)
java面试宝典2019 1.meta标签的作用是什么 2.ReenTrantLock可重入锁(和synchronized的区别)总结 3.Spring中的自动装配有哪些限制? 4.什么是可变参数? ...
- java面试必问问题总结
1. 自我介绍 2. get跟load的区别 3. 什么是重载,什么是重写 4. HashTable跟HashMap的区别 5. Jsp九大隐式对象 6. Forword和redirect 的区别 7 ...
随机推荐
- django模型层(二)
多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对 ...
- 1.java安全框架SHIRO
1. shiro介绍 Apache Shiro是一个强大且易用的java安全框架,执行身份验证.授权.密码和会话管理. 使用Shiro的易于理解的API,您可以快速.轻松地获得任何应用程序,从最小的移 ...
- Java算法——求出两个字符串的最长公共字符串
问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. 例如:“acbbsdef”和"abbsced"的最长公共字符串是“bbs” 算法思路: 1.把两个字符串分别 ...
- MySQL Connector for .NET 和 EF版本匹配问题
以下讨论的都是EF5.0, 版本号:4.4.0.0 如果装了MySQL 5.0.1 , 那么最好用MySQL Connector 6.3.6,但是创建数据库后,生成迁移历史表的时候,会报错,你不管,直 ...
- CruiseControl.NET 的安装与配置
CC.NET 是 CruiseControl.NET 的简称,官方网站在这里. 官方的定义是自动连续集成服务, 使用Microsoft .NET Framework实现. 另外它还有Java的版本叫做 ...
- Luogu P1365 WJMZBMR打osu! / Easy
概率期望专题首杀-- 毒瘤dp 首先根据数据范围推断出复杂度在O(n)左右 但不管怎么想都是n^2-- 晚上躺在床上吃东西的时候(误)想到之前有几道dp题是通过前缀和优化的 而期望的可加性又似乎为此创 ...
- antd #upload
import React from 'react' import {Upload, Icon, message,Button } from 'antd' import './index.scss'; ...
- javascript匿名函数及闭包深入理解及应用
1.匿名函数 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种: ...
- 【转载】Jmeter分布式部署测试-----远程连接多台电脑做压力性能测试
在使用Jmeter进行接口的性能测试时,由于Jmeter 是JAVA应用,对于CPU和内存的消耗比较大,所以,当需要模拟数以万计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至会引起J ...
- 【剑指Offer】11、二进制中1的个数
题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题思路: 本题有以下两个解决方案: (1)依次判断每一位.判断的方法是先与1相与,为1则说明该位为1 ...