Struts面试题

来源:互联网 发布:跟踪路由 linux 编辑:程序博客网 时间:2024/05/21 06:54

1)Struts2如何启动

    Struts2是通过web.xml中的过滤器StrutsPrepareAndExecuteFilter启动的,Tomcat服务器启动的时候,会执行一次StrutsPrepareAndExecuteFilter里面的init方法,加载struts.xml配置文件,将配置文件的内容封装为javabean存放在内存中,以后用户请求将会读取内存,读取数据,而不用每次都在struts.xml中读取。

2)Struts2的核心控制StrutsPrepareAndExecuteFilter的作用

  StrutsPrepareAndExecuteFilter 主要负责拦截 url请求,可以在web.xml中配置拦截的url,<url-pattern>/*</url-pattern>代表拦截所有的请求,执行doFilter方法默认情况下,如果用户请求的路径   不带后缀或者后缀以.action结尾,这时请求将被转入struts2框架处理,否则struts2框架将略过该请求的处理。

3)struts2配置文件的加载顺序?

  struts.xml ——> struts.properties常量可以在struts.xml或struts.properties中配置,如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值.      struts.xml文件的作用:通知Struts2框架加载对应的Action资源
4)struts2是如何管理action的?这种管理方式有什么好处?
struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的。 主要用于管理一组业务功能相关的action。在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。

5)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

6)
struts2的action的URL访问路径由什么构成?  

   由两部分组成:包的命名空间+action的名称 [ + action的后缀 ],/crud1/userAdd.action,crud1是命名空间,userAdd是struts.xml中配置的action的名称。

 7)在struts.xml中可以不为action指定class属性吗?struts2中有哪些默认的属性? 
  可以,如果没有为action指定class,默认是com.opensymphony.xwork2.ActionSupport 
默认属性:

    如果没有为action指定class          ActionSupport

如果没有为action指定method     execute()       注意:ActionSupport的execute方法里面就一句话return "success"
 如果没有指定result的name           success 
如果没有指定result的type           dispatcher

action中默认都有一个拦截器的引用,即:<interceptor-ref name="defaultStack">;

        注意: 
       1.一旦我们为该包中的某个action显式指定了某个拦截器,则默认拦截器不会起作用,所以此时要显式的引进默认的拦截器;

       2.每个包只能指定一个默认拦截器,每个默认拦截器只针对当前包下有效。 

8)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()方法.

9)拦截器的作用?拦截器与过滤器的区别?

 1)拦截器是对调用的Action起作用,它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码。拦截器只能拦截Action,说明白点拦截器其实是Action的功能块,只在Action前后执行。拦截器可以抽象出一部分代码可以用来完善原来的action。同时可以减轻代码冗余,提高重用率。

 2) 过滤器是拦截用户请求的,范围明显比拦截器大的多。

10)struts2如何完成从html表单到action的类型转换? 
    1.在 struts2 中, 把请求参数映射到 action 属性的工作由 Params拦截器负责, 它是默认的 defaultStack 拦截器中的一员. Params拦截器可以自动完成字符串和基本数据类型之间转换.

   2.在web应用中,提交的数据基本都是字符串。

   3. 对于引用类型的数据(除String、Collection)转换,需要自定义类型转换器;

   4.自定义类型转化器必须实现TypeConverter 接口或对这个接口的某种具体实现做扩展,如:StrutsTypeConverter,重写convertToString和convertFromString方法;

  5.两种自定义类型的转换器:  

         >> 局部:
           创建一个属性文件: ActionClassName-conversion.properties, 该文件需和相对应的动作类(Action)放在同一个目录下, ActionClassName是Action的类名,后面的-conversion.properties 是固定写法。在properties文件中的内容为: 属性名称=类型转换器的全类名

        >> 全局:

         在 WEB-INF/classes/ 目录下创建 xwork-conversion.properties 文件. 在properties文件中的内容为: 待转换的类型=类型转换器的全类名 
          注意:对于转换的是属性,只需要写属性名,如果是对应的是类型,则需要写全类名 
11).struts2如何防止用户表单重复提交?

第一步:在表单中加入<s:token /> 
第二步,使用token栏截器,定义invalid.token结果集

要使用<s:token /> 必须要在struts.xml的action中引用token的预定义拦截器。
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>

当然还可以使用tokenSession

 <interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>

12).struts2如何完成文件的上传?

  1、JSP页面:
    JSP页面的上传文件的组件:<s: file name=”upload” />,如果需要一次上传多个文件, 就必须使用多个 file 标签, 但它们的名字必须是相同的,即:name=“xxx”的值必须一样; 

   2. 必须把表单的enctype属性设置为:multipart/form-data;

   3.表单的方法必须为post,因为post提交的数据在消息体中,而无大小限制。

  对应的action: 
   4.在 Action 中新添加 3 个和文件上传相关的属性

   5.如果是上传单个文件, uploadImage属性的类型就是 java.io.File, 它代表被上传的文件, 第二个和第三个属性的类型是 String, 它们分别代表上传文件的文件名和文件类型,定义方式是分别是:jsp页面file组件的名称+ContentType,  jsp页面file组件的名称+FileName
    6如果上上传多个文件, 可以使用数组或 List