Struts2面试题及答案
1.Struts2的核心组件有哪些?它们之间如何协作?
答案:核心组件包括Action、Interceptor(拦截器)、Result(结果)、ValueStack(值栈)、OGNL表达式、StrutsPrepareAndExecuteFilter(核心过滤器)。
协作流程:
客户端请求先经过StrutsPrepareAndExecuteFilter,过滤器解析请求路径;
找到对应的Action后,先执行该Action关联的拦截器链(如参数封装、验证拦截器);
拦截器执行完后,调用Action的业务方法(默认execute());
Action返回结果码(如success),Struts2根据struts.xml配置找到对应的Result;
Result通过ValueStack和OGNL获取数据,渲染页面并响应客户端。
2.Struts2的配置文件有哪些?加载顺序是怎样的?
答案:常用配置文件有4类:
struts-default.xml(框架自带,定义默认拦截器、Result类型等);
struts-plugin.xml(插件配置,如struts-spring-plugin.jar里的配置);
struts.xml(项目自定义,配置Action、Result、拦截器等,核心配置文件);
perties(可选,用于覆盖框架默认属性,如编码、OGNL开关);
web.xml(配置Struts2核心过滤器StrutsPrepareAndExecuteFilter)。
加载顺序:struts-default.xml→所有struts-plugin.xml→struts.xml→perties(后加载的配置会覆盖前加载的同名配置)。
3.Struts2的Action有几种实现方式?实际项目中常用哪种?为什么?
答案:3种实现方式:
普通POJO类(无任何接口/父类,只需定义execute()方法);
实现com.opensymphony.xwork2.Action接口(重写execute(),获取预定义结果码如SUCCESS);
继承com.opensymphony.xwork2.ActionSupport类(最常用)。
实际项目优先选第3种,因为ActionSupport内置了:
表单验证方法(validate()、validateXxx());
国际化消息处理(getText());
错误信息存储(addFieldError()、addActionError());
预定义结果码(SUCCESS、ERROR等),无需手动定义。
4.拦截器(Interceptor)和过滤器(Filter)的区别是什么?如何自定义Struts2拦截器?
答案:核心区别:
维度
拦截器(Interceptor)
过滤器(Filter)
作用范围
Struts2Action级别的拦截
Servlet容器级别的拦截(所有请求)
生命周期
随Struts2容器创建/销毁
随Servlet容器创建/销毁
访问对象
可访问ActionContext、ValueStack
仅能访问ServletRequest/Response
配置位置
struts.xml
web.xml
自定义拦截器步骤:
写拦截器类:继承AbstractInterceptor,重写intercept(ActionInvocationinvocation)方法;
示例(登录验证拦截器):
publicStringintercept(ActionInvocationinvocation)throwsException{
HttpSessionsession=ServletActionContext.getRequest().getSession();
if(session.getAttribute(user)==null){
returnlogin;//未登录则跳登录页
}
returninvocation.invoke();//已登录则执行后续拦截器/Action
}
在struts.xml配置拦截器和拦截器栈:
package...
!--定义拦截器--
interceptors
interceptorname=loginInterceptorclass=erceptor.LoginInterceptor/
!--自定义拦截器栈(需包含默认拦截器栈,否