SSH企业关注的技能

Struts2框架

---------------------------------------------------------------------------------------------------------------------

a) 说明Struts2框架的工作原理:

    要点:掌握一个框架,首先必须了解这个框架的工作原理,企业关注应聘者对常用框架的工作原理的理解程度。

参考答案:

1、 客户端向服务器端提交请求,容器初始化HttpServletRequest请求对象。

2、 请求对象被一系列Servlet的过滤器进行过滤,Struts2中的过滤器有三种:

3、 FilterDispatcher过滤器调用ActionMapper,决定该请求是否需要调用某个   Action

4、 如果请求需要调用某个ActionActionMapper将通知FilterDispatcher过滤器把请求的处理交给ActionProxyAction代理)来处理。

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) Struts2Struts1的区别:

要点:Struts2struts1在名称上看是版本的区别,实际上并不是这样。Struts2是从webwork的基础上发展起来的,与Struts1本质上没有太多联系。

参考答案:

Strust1最初是Apache Jakarta项目的一部分,后来作为一个开源MVC框架存在。Struts1曾经被很多web应用所采用,作为构建MVC的基础框架使用。Struts1的最大特点是提供了JSP标签库以及页面导航。Struts2是从webwork框架发展起来的,与Struts1没有直接的关系。Struts2新增了很多特性:

1、Struts2ActionServlet API解耦,能够进行单元测试。

2、Struts2的视图可以有多种形式:freemark、 jspVelocity等。

c) Struts2中有哪三层控制?分别有什么作用?

要点:对于MVC框架来说,控制器往往是核心部分。

参考答案:

1、过滤器:过滤器是Struts2控制器的最前端控制器,请求对象首先被过滤器过滤。

2、拦截器:拦截器是Struts2的第二个层次的控制器,能够在Action执行前后运行一些Action类需要的一些通用的业务功能(例如:数据验证等)。

3、ActionActionStruts2的第三个层次的控制器,需要程序员自习开发。ActionStruts2应用中使用最多的控制器,负责调用业务逻辑、执行业务操作、根据执行结果返回结果视图,实现页面导航,被称为业务控制器。

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=”Actionname!方法名称”。

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可以操作请求属性,同时ActionServer 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中定义与请求参数对应的属性,并为之提供对应的getterssettersStruts2框架将自动把请求参数封装到这些属性中。

2、Model-Driven:模型驱动,Action类需要实现ModelDriven接口,声明一个与表单对应的JavaBean属性,覆盖其中的getModel方法,返回JavaBean实例,Struts2框架将自动把请求参数封装到JavaBean实例中。

p) 什么是OGNL,有什么作用?

参考答案:OGNLObject Graphic Navigation Language的缩写,即:对象图导航语言,是一种强大的ELOGNL往往结合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>中指定。

猜你喜欢

转载自blog.csdn.net/tonysong111073/article/details/10987243