1.Struts 2是什么?
Struts2 是基于MVC设计模式的Web应用程序框架,是Struts的下一代产品,但更算是WebWork的更新产品。
2.Struts 2的体系结构?
Struts 2 体系结构大致可以分成三个部分:
核心控制器、业务控制器、业务逻辑组件。
①.核心控制器【StrutsPrepareAndExecuteFilter】:是Struts2框架的基础,包含了框架自身内部的流程控制和处理机制。
②.业务控制器【Action】和业务逻辑组件:则是由用户自己编写实现,它在实现过程中要编写相关的配置文件,提供给核心控制器来使用。
3.Struts 2的工作处理流程?
基本流程如下:
①.客户端【用户浏览器】向Servlet容器【Tomcat】发送一个请求;
②.服务器通过Web.xml映射请求,经过一些列的过滤器【Filter】,并找到Struts2控制器;
③.控制器【FilterDispatcher或者StrutsPrepareAndExecuteFilter{看Struts2版本}】被调用;
④.通过ActionMapper决定这个请求是否需要通过Struts2处理并调用某个Action;
⑤.如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
⑥.ActionProxy读取struts.xml文件获取Action和Interceptor Stack的信息;
⑦.然后ActionProxy创建一个ActionInvocation的实例;
⑧.ActionInvocation依次调用Action和Interceptor;
⑨.Action执行完毕,ActionInvocation负责根据Struts.xml中的配置找到对应的返回结果。
⑩.匹配返回结果产生一个服务端的响应,并将响应行为发送给客户端。
4.Struts 2的优点?
①.实现MVC模式,设计结构清晰。
②.拦截器实现参数拦截,以及参数注入等功能;
③.类型转换器,可以把特殊的请求参数转换成需要的类型。
④.提供了全局范围、包范围和Action范围的国际化资源文件管理实现;
⑤.AJAX的支持、插件的支持、多视图支持以及标签的支持;
⑥.易于框架的整合,配置量少,提供了内置的测试;
5.Struts 2的缺点?
①.学习该框架所依赖的技术教多,代码透明度低,需要更长的学习曲线;
②.不够先进,逐渐开始难以满足现今的开发任务。
6.Struts 2配置文件的加载顺序?
①.核心包中的默认配置struts-default.xml;
②.各个插件包中的配置struts-plugin.xml;
③.用户编写的控制配置struts.xml;
④.用户编写的常量配置struts.properites;
7.Struts 2常量的修改方式?
①.在struts.xml中通过标签配置;
<constant name=” struts.devMode” value=”true”/>
②.在struts.properites文件中键值对配置:
struts.devMode=true
③.解压Struts核心包中org.apache.struts2.default.properties直修接改;
8.Struts2中Result中的type类型?
①.dispatcher:它是默认的,用来转向页面,通常处理JSP;
②.redirect:将用户重定向到一个已配置好的URL;
③.redirectAction:将用户重定向到一个已定义好的action;
④.chain:将action和另外一个action链接起来;
⑤.freemarker:呈现Freemarker模板;
⑥.httpheader:返回一个已配置好的HTTP头信息响应;
⑦.stream:向浏览器发送InputSream对象对下载的内容和图片非常有用;
⑧.velocity:呈现Velocity模板;
⑨.xslt:该XML可以通过XSL模板进行转换;
⑩.plaintext:显示原始文件内容,例如文件源代码;
9.Struts2中如何访问HttpServletRquest,HttpSession,ServletContext三个域对象?
通过静态对象ServletActionContext获取;
10.Struts2是如何管理Action的,这种管理有什么好处?
Struts2框架中使用Packager包来管理Action,作用与Java中的类包相似,主要用于管理同一业务组功能相关的Action,在实际运用中,我们应该把一组业务功能相关的Action放在同一个包下。
11.Struts2中的默认包.struts2-default有什么作用,在使用中我们为什么要继承它?
struts-default包是Struts内置的,他定义了Struts2中内部众多的拦截器和返回值类型,众多核心功能都是通过这些内置的拦截器实现的,如:参数的封装、文件上传下载、数据验证等等都是通过拦截器实现的。
当我们的包继承了Struts-default包才能使用Struts2为我们提供的这些功能,所以通常我们每个包都是要继承Struts-default包的;
12.Struts2默认拦截器?
alias【别名拦截器】:允许参数在跨越多个请求时使用不同别名,这个拦截器可将多个action使用不同名字链接起来,然后用于处理同一信息;
autowiring【自动装配拦截器】:信息自动装配的拦截器,主要用于当struts2和Spring整合时,Struts可以使用自动装配的方式来访问Spring容器中的Bean;
chain【链拦截器】:允许当前action能够使用上一个被执行action的属性,这个拦截器通常要和“chain”结果类型一起使用(<result type=”chain”…/>);
checkbox【多选框拦截器】:为没有被选定的多选框增加一个值为false的参数,协助管理多选框(在HTTP请求里,那些没有被选定的多选框通常是没有任何信息的);
conversionError【转换错误拦截器】:将转换错误的信息(包括转换的字符串和参数类型等)存放到action的字段错误集里去;
cookie【Cookie拦截器】:使用配置的name,value来指定cookies;
clearSession【清除Session拦截器】:负责销毁HttpSeesion;
createSession【会话创建拦截器】:自动创建一个HttpSession会话(如果会话不存在),用来为需要使用到HttpSession的拦截器服务;
debugging【调试拦截器】:当使用Struts2的开发模式时,此拦截器会提供更多的调试信息,为开发者提供几种不同调试界面;
externalRef【扩展引用拦截器】:负责扩展引用;
execAndWait【执行和等待拦截器】:当action在后台执行时,给用户显示一个过渡性的等待页面;
exception【异常拦截器】:将action抛出的异常映射到结果,这样就通过重定向来自动处理异常,一般情况下,应该为最后一个拦截器;
fileUpload【文件上传拦截器】:此拦截器主要用于文件上传,它负责解析表单中文件域的内容;
i18n【国际化拦截器】:这是支持国际化的拦截器,它负责把所选的语言、区域放入用户Session中;
logger【日志拦截器】:通过输出被执行action的名字,提供简单的日志功能,记录用于追踪的信息(可位于拦截器序列的不同位置);
store【消息存储拦截器】:在会话中为action存储和检索消息、字段错误以及action错误,该拦截器要求action实现ValidationAware接口;
modelDriven【模型驱动拦截器】:这是一个用于模型驱动的拦截器,当某个Action类实现了ModelDriven接口时,它负责把getModel()方法的结果放入ValueStack中;
scopedModelDriven【作用域模型驱动拦截器】:如果一个Action实现了一个ScopedModelDriven接口,该拦截器负责从指定生存范围中找出指定的Modol,并将通过setModel方法将该Model传给Action实例;
params【参数拦截器】:这是最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值
prepare【预备拦截器】:如果action实现Preparable接口,将会调用该拦截器的prepare()方法;
profiling【概要拦截器】:允许action记录简单的概要信息日志;
scope【作用域拦截器】:这是范围转换拦截器,它可以将Action状态信息保存到HttpSession范围,或者保存到ServletContext范围内;
servletConfig【Servlet配置拦截器】:如果某个Action需要直接访问ServletAPI,就是通过这个拦截器实现,它提供访问HttpServletRequest和HttpServletResponse的方法,以map的方式访问;
staticParams【静态参数拦截器】:设置action里的静态定义值(通过action配置里的param标签来实现);这个拦截器负责将struts.xml文件中<action>标签下<param>标签中的参数传入action;
roles【角色拦截器】:这是一个JAAS(Java Authentication and Authorization Service, Java授权和认证服务)拦截器,只有当浏览者取得合适的授权后,才可以调用被该拦截器拦截的Action;
timer【计时拦截器】:以执行action所花时间的形式,简单记录action概要信息,此拦截器负责输出Action的执行时间,可以利用此拦截器分析该Action的性能瓶颈;
token【令牌拦截器】:检查action的合法令牌,以防止重复提交表单,当表单被多次提交时,跳转到一个错误页面;
tokenSession【令牌会话拦截器】:功能与令牌拦截器相同,但是对于非法令牌,提交的数据将保存在会话中,不跳转到错误页面,再次生成与第一次相同的页面;
validation【验证拦截器】:通过执行在xxxAction-validation.xml中定义的校验器,从而完成数据校验;
workflow【工作流拦截器】:为action定义默认的工作流,一般跟在validation等其他拦截器后,当验证失败时,不执行action然后重定向到INPUT视图;
jsonValidation【Json拦截器】:验证失败,此拦截器可以将fieldErrors和actionErrors两个属性给序列化成json返回给客户端;
13.Struts2拦截器的生命周期与工作过程?
①.每个拦截器都是实现了Interceptor接口的JAVA类;
②.拦截器中Init()方法:初始化方法,他在拦截器被创建后立即被调用,拦截器生命周期内只被调用一次,可以在该方法中对相关资源进行必要的初始化。
③.拦截器中Intercept(ActionInvocation invocation)方法:默认执行方法,每拦截一个动作请求,该方法就会被调用一次;
④.拦截器中destory方法:遗言方法,该方法将在拦截器被销毁之前被调用,拦截器生命周期内只被调用一次;
14.Struts2值栈的原理与生命周期?
①.值栈贯穿整个Action的生命周期,保存在request域中;
当Struts2接受到请求时,会迅速创建ActionContext,Value Stack,Action;
然后将Action存入ValueStack中;
请求结束后Action 和 ValueStack生命周期结束;
②.Action是多例的,每访问一次,会生成一个Action实例;
③.值栈的本质是一个List集合;