Struts2框架
---------------------------------------------------------------------------------------------------------------------
a) 说明Struts2框架的工作原理:
要点:掌握一个框架,首先必须了解这个框架的工作原理,企业关注应聘者对常用框架的工作原理的理解程度。
参考答案:
1、 客户端向服务器端提交请求,容器初始化HttpServletRequest请求对象。
2、 请求对象被一系列Servlet的过滤器进行过滤,Struts2中的过滤器有三种:
3、 FilterDispatcher过滤器调用ActionMapper,决定该请求是否需要调用某个 Action。
4、 如果请求需要调用某个Action,ActionMapper将通知FilterDispatcher过滤器把请求的处理交给ActionProxy(Action代理)来处理。
5、 ActionProxy通过Configuration Mapper解析框架的配置文件struts.xml,找到需要调用的Action类。
6、 ActionProxy创建一个ActionInvocation实例。
7、 ActionInvocation实例使用命令模式回调Action中的execute方法,Action调用业务逻辑类完成业务处理。在调用Action的前后,将调用该Action涉及的相关拦截器(Interceptor)。
8、 Action执行完毕,ActionInvocation根据struts.xml中配置找到对应的返回结果(Result)。
b) Struts2与Struts1的区别:
要点:Struts2和struts1在名称上看是版本的区别,实际上并不是这样。Struts2是从webwork的基础上发展起来的,与Struts1本质上没有太多联系。
参考答案:
Strust1最初是Apache Jakarta项目的一部分,后来作为一个开源MVC框架存在。Struts1曾经被很多web应用所采用,作为构建MVC的基础框架使用。Struts1的最大特点是提供了JSP标签库以及页面导航。Struts2是从webwork框架发展起来的,与Struts1没有直接的关系。Struts2新增了很多特性:
1、Struts2的Action与Servlet API解耦,能够进行单元测试。
2、Struts2的视图可以有多种形式:freemark、 jsp、Velocity等。
c) Struts2中有哪三层控制?分别有什么作用?
要点:对于MVC框架来说,控制器往往是核心部分。
参考答案:
1、过滤器:过滤器是Struts2控制器的最前端控制器,请求对象首先被过滤器过滤。
2、拦截器:拦截器是Struts2的第二个层次的控制器,能够在Action执行前后运行一些Action类需要的一些通用的业务功能(例如:数据验证等)。
3、Action:Action是Struts2的第三个层次的控制器,需要程序员自习开发。Action是Struts2应用中使用最多的控制器,负责调用业务逻辑、执行业务操作、根据执行结果返回结果视图,实现页面导航,被称为业务控制器。
d) 如何设置一个包的默认拦截器引用?
要点:拦截器在Struts2中是非常重要的部分,如果一个包中的所有Action总是需要使用某些拦截器或者拦截器栈,那么就可以为这个包定义一个默认的拦截器引用。
参考答案:
Struts2中使用拦截器需要三个步骤:
1、创建拦截器
2、定义拦截器
<package name=”com.tc” extends=”struts-default”>
<default-interceptor-ref name=”myInterceptor”>
</package>
其中myInterceptor是拦截器的名称,也可以是拦截器栈的名称。
3、调用拦截器
e) 如何编写并配置自定义拦截器?
要点:struts2 API中定义了一系列的拦截器,可以直接配置使用,同时struts2也允许用户自定义拦截器,实现自定义的功能。
参考答案
1、创建类实现Interceptor接口。
2、覆盖Interceptor接口中的方法,重点是intercept方法,定义拦截功能。
3、在<package>中使用<interceptor>元素定义拦截器,为拦截器指定一个名称。
4、在需要使用该拦截的Action中通过<interceptor-ref>标签引用拦截器的名称即可使用。
f) 拦截器栈和拦截器有什么区别和联系?
要点:拦截器和拦截器在使用上完全一样,是整体与部分的关系。
参考答案:
拦截器栈是若干个拦截器的集合,如果某些拦截器总是按照一定的顺序一起工作,那么就可以把这些拦截器组织成一个拦截器栈,通过引用拦截器栈,就可以使用到栈中所有的拦截器。
g) Action接口有什么作用?
要点:Struts2 API有一个Action接口,表面上应该是Action类实现该接口,实际并不是这样,Action类可以实现也可以不实现该接口。
参考答案:
Action接口中定义了五个常量:LOGIN、 ERROR、 SUCCESS、 NONE、 INPUT和一个方法:public String execute()。自定义的Action可以实现该接口,使用其中的execute方法作为返回值从而实现业务逻辑控制器。
h) Action类中进行业务控制的方法有什么编码规范?
要点:自定义的业务逻辑控制器可以实现Action接口也可以不实现Action接口,但是其方法的返回值类型必须为String类型。
参考答案:
Action的方法返回值必须为String,没有参数,方法名称默认为execute,可以被自动调用,如果不是execute则需要进行配置或指定才能使用。
i) 什么是动态方法调用(DMI)?
要点:当Action类的方法不是execute时,有很多种方法可以调用,DMI就是其中的一种方法。
参考答案:DMI:动态方法调用,在JSP调用Action时通过指定的方法名调用。语法:action=”Action的name!方法名称”。
j) 如果Struts2应用中的一个表单,需要同时有两个提交按钮进行不同的处理,如何解决?
要点:Strusts2中的提交按钮提供了method属性,能非常方便的解决。
参考答案:
<s:form action=”user_Action.action”>
.....
<s:submit value=”login” method=”login”/>
<s:submit value=”regist” method=”regist”/>
</s:form>
k) 如果一个Action类中需要处理请求范围属性,使用什么方法实现与Servlet API的解耦?
要点:Struts2利用ActionContext可以操作请求属性,同时Action与Server API解耦。
l) ActionContext类中的哪个方法可以用来处理会话范围内的属性?
参考答案:
ActionContext中的getSession方法可以返回一个与会话相关的Map对象,通过该Map对象的put方法,可以往会话中存入属性,通过使用Map对象的get方法可以从会话中返回属性。
m) ActionContext类中的哪个方法可以处理上下文范围的属性?
参考答案:ActionContext中的getApplication方法可以返回一个与上下文对象相关的Map对象,从而操作上下文属性。
n) 如果一个Action类中需要获得ServletAPI中的对象进行处理,如何解决?
参考答案:这是一种与Servlet API耦合方式的操作,可以使用ServletApplicationContext类实现,该类中定义了以下四个方法:
1、 public static PageContextContext();获得PageContext对象。
2、 public static HttpServletRequest getRequest();获得HttpServletRequest对象
3、 Public static HttpServletResponse getResponse();获取HttpServletResponse对象
4、 Page static ServletContext getServletContext 获取ServletConextContext对象。
o) Struts2框架有哪两种封装请求参数的方式?
参考答案:Struts2中封装请求参数的方式有以下两种:
1、Field-Driven:域驱动,在Action中定义与请求参数对应的属性,并为之提供对应的getters和setters,Struts2框架将自动把请求参数封装到这些属性中。
2、Model-Driven:模型驱动,Action类需要实现ModelDriven接口,声明一个与表单对应的JavaBean属性,覆盖其中的getModel方法,返回JavaBean实例,Struts2框架将自动把请求参数封装到JavaBean实例中。
p) 什么是OGNL,有什么作用?
参考答案:OGNL是Object Graphic Navigation Language的缩写,即:对象图导航语言,是一种强大的EL。OGNL往往结合Struts2的标记使用。
q) OGNL中的#的作用?
参考答案:
1、访问非跟对象:OGNL上下文的跟对象时值栈,可以直接访问:当访问其他跟对象时,需要使用#,如#session.cust,可以获得会话范围的cust属性。
2、用于过滤集合:如:list.{?#this.age>20}
3、用于构造Map:如:#{“cust0”:cust0,”cust1”:cust1},
4、
r) OGNL的%的作用?
参考答案:当标记中某一个属性不是具体的值,而是需要通过另外一个OGNL表达式进行计算获得,那么就可以使用%号。
s) OGNL的$可以在哪些场合使用?
参考答案:
1、国际化资源文件
2、Struts2的配置文件
t) Struts.properties文件的作用?
参考答案:struts.prooperties文件可以用来定义struts2框架的属性,能够修改default.properties文件中的默认值属性。
u) 如果一个Struts2应用中可以有多个模块,每个模块都有一个配置文件,如何处理?
参考答案:实际开发中,往往是多模块同时开发,可以对每个模块定义一个配置文件,最终在struts.xml的根元素<struts>下使用<include>包含即可,如下所示:
<struts>
<include file=”/bbs/bbs.xml”></include>
<include file=”/news/news.xml”></include>
</struts>
v) ActionSupport类有什么作用?
参考答案:ActionSupport类定义了一系列与输入校验有关的方法,如果Action需要对输入的数据进行校验,那么Action必须继承ActionSupport类。
w) Struts2有哪些校验?分别有什么含义?
参考答案:struts2提供了三种校验机制:
1、Action错误:指的是Action级别的错误,不和某个域的输入直接相关。
2、Field错误:指的是域级别的错误,和某个输入域有关的校验错误。
3、Action消息:不是错误信息,而是一些友好的提示信息。
x) 如果校验失败,Struts2将导航到什么视图上?
参考答案:如果校验失败,struts2框架将导航到当前Action中名称为input的结果视图上。
y) 如何使用校验器Struts2应用的输入信息?
参考答案:
1、Action类继承ActionSupport类,但是不需要覆盖validate方法。
2、在Action类所在的包中定义***-validation.xml文件,其中***是Action的类名。
3、在xml文件中配置校验器信息,一般需要指定需要校验的域名字、校验器的名字、校验器中的属性值等。如下:
<field name=”custname”>
<field-validator type=”requiredstring”>
<param name=”trim”>true</param>
<message key=”custname.null”></message>
</field-validator>
</field>
其中custname是要进行校验的域名称,type=”requiredstring” 指定的是校验器的名字,使用<param>指定校验器的参数名和对应的值,<message>指定校验错误时的显示信息。
z) Struts2中的<property>标签的作用?请用代码说明?
参考答案:<property> 用来输出值栈中的值,代码如下:
<property value=”#session.customer.customername”/>
aa) 如何在struts.xml中配置异常处理页面?
参考答案:在struts.xml中可以使用<exception-mapping>中配置,如下所示:
<action name=”Register” class=”com.etc.action.RegisterAction”>
<exception-mapping result=”regfail” exception=”com.ect.exception.RegisterException”>
</exception-mapping>
<result name=”regsuccess”>/index.jsp</result>
</action>
ab) 全局异常映射与局部异常映射有什么区别?
参考答案:全局异常映射在<package>中指定,而局部异常映射在<action>中指定。