3.11.请简述Struts2中各组件的作用及调用顺序
参考答案:
Struts2有6大核心自检,分别为前端控制器filter,业务控制器Action,值对象ValueStack,拦截器Interceptor,输出组件Result,Struts2标签.
它们的调用顺序是,请求提交给前端控制器filter,它会根据struts.xml中的配置找到对应的业务控制器Action,然后实例化值对象ValueStack并实例化Action放于ValueStack的栈顶,在调用Action 的业务方法,在调用过程中会被拦截器组件所拦截.最终根据Action方法的返回值,filter从struts.xml中可以找到对应的Result,于是使用这个Result向页面输出内容.
当然,最常见的输出实际上是将请求转发给一个JSP.name在容器解析JSP生成HTML的过程中,Struts2标签将被解析.此时标签中的OGNL表达式会发送给ValueStack取值,返回的结果被写入最终生成的HTML.
3.12.简述拦截器的作用
参考答案:
拦截器适合封装一些共通处理,便于重复利用.例如请求参数给Action属性,日志的记录,权限检查,事务处理等.拦截器是通过配置方式调用,因此使用方法比较灵活,便于维护和扩展.
3.13.Struts2有哪些UI标签,请简述其作用
参考答案:
Struts2中有如下UI标签:
1.表单标签,可以生成form元素.
2.文本框,密码框,文本域标签,这些标签很相似,都是生成一个框体,然后在框体中显示出默认的内容,差异仅仅是长相不同.
3.布尔框,可以生成一个checkbox,要求用户进行确认选择.这个标签可以做默认的勾选,但是要求OGNL表达式访问的值是布尔类型的.
4.单选框标签,可以生成一组单选框,并根据OGNL取值自动勾上一个单选框.
5.复选框标签,可以生成一组复选框,并根据OGNL取值自动勾选上几个复选框.
6.下拉列表标签,可以生成一个下拉列表,包含一组option,并根据OGNL取值自动勾选上一个option.
注意,上述单选框,复选框,下拉列表标签,在使用上都有2中初始化选项的方式,一种是静态的方式,可以直接在标签上写出固定的范围,并根据此范围初始化选项.也可以在标签上通过OGNL表达式访问Action中的一个集合,并根据此集合来初始化选项.
3.14.Struts2中的拦截器有什么用,与Spring中的AOP有什么区别和联系
参考答案:
Struts2中的拦截器可以批量扩展Action,处理一组Action的通用业务逻辑.
Struts2中的拦截器实际上就是采用AOP思想实现的,只是它只能处理Action的通用逻辑,无法处理其他组件的通用逻辑.而Spring的AOP实现更为灵活,可以实现任意一批组件的通用业务逻辑.
3.15.Action默认引用哪个拦截器,如果没有默认引用,会导致什么问题?
参考答案:
Action默认引用一个拦截器栈,叫做defaultStack.这个默认引用不能丢掉,因为里面包含了Struts2框架所必须依赖的一些拦截器,如果丢掉会导致项目报错.因此我们在开发时,如果自己引用了自定义拦截器,要注意不丢掉默认的拦截器栈.
3.16.Struts2写Action的时候,需不需要继承什么类?
参考答案:
可以继承自ActionSupport类,也可以不继承.
3.17.Struts Action是不是线程安全?如果不是,有什么方式可以保证Action的线程安全?如果是,请说明原因(Struts1和Struts2)?
参考答案:
Struts1的Action不是线程安全的.Struts1在第一次请求某个Action是,会创建这个Action实例.之后再请求该Action实例时,就用之前创建好的这个Action处理,即他是单例模式.在Struts1的方法调用模式用到的参数一般都是局部变量(包括Request,Response等),局部变量是线程安全的,因此不用考虑线程安全问题.如果在Action类中使用了实例变量,就会存在线程安全问题.所以我们用Struts1开发是尽量不要使用实例变量.
Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题.不过在Spring + Struts2的应用中,由Spring来管理Struts2的Action,而IOC容器管理的bean默认是单实例(scope=”singleton”),加上Struts2的Action就像一个POJO一样,定义了很多的类变量,这就有线程安全问题了.解决此问题最简单的办法则是不是用单例模式(设置scope=”prototype”>,配置如下:
<bean id="testAction" class="com.webapp.action.TestAction" scope="prototype">
3.18.Struts2中的拦截器和Servlet中的过滤器有什么区别?
参考答案:
Struts2中的拦截器和Servlet中的过滤器的区别如下:
1.拦截器是基于Java反射机制的,而过滤器是基于函数回调的;
2.过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器;
3.拦截器只能对Action请求其作用,而过滤器则可以对几乎所有请求起作用;
4.烂机器可以访问Action上下文,值栈里的对象,而过滤器不能;
5.在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次.