Java面试系列—框架篇(Struts2)
2018-07-14 本文已影响3人
奋斗的蛐蛐
先整理出一批面试笔试面试题。后续将继续更新,如果本文中出现问题,请及时与蛐蛐联系,蛐蛐马上继续修改,后续也会同步更新。
如何在web.xml中添加核心过滤器
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
配置struts核心过滤器两种方式
- 在web.xml中通过标签配置
- 通过注解配置,要求必须在java ee 6及以上
- 新建类继承StrutsPrepareAndExecuteFilter
- 在类上添加注解@WebFilter(“/*”)
@WebFilter("/*")
public class MyFilter extends StrutsPrepareAndExecuteFilter{
}
Action类的三种配置方式
- 继承ActionSupport(推荐写法,里面有默认常量,很多时不继承struts功能不能调用)
- 实现Action接口
- 不继承也不实现
继承ActionSupport类或实现了Action接口的默认5个常量的含义
- SUCCESS:执行成功
- ERROR:出现错误
- INPUT:需要重新输入(如果系统返回INPUT,无法把客户端数据转换为指定类型的变量)
- LOGIN:登录
- NONE:请求成功,但不在做任何事情.
拦截器
拦截是struts2框架中推出专门针对于action的一种机制.可以在action执行前后完成一些事情.以ActionInvocation.invoke()为分界
什么是拦截器栈
- 由多个有序拦截器组成的拦截器栈
- 执行顺序:先进后出
默认情况下,所有<action>的拦截器栈是defaultStack,当自定义拦截器后默认拦截器栈不生效,如何解决?
- 方法一:把defaultStack和自定义拦截器放到一个新栈中
<interceptors>
<interceptor name="myinter" class="com.fddqq.smallming.util.MyInterceptor"></interceptor>
<interceptor name="myinter1" class="com.fddqq.smallming.util.MyInterceptor1"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="myinter"></interceptor-ref>
<interceptor-ref name="myinter1"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="show" method="show" class="com.fddqq.smallming.action.Demo1Action">
<interceptor-ref name="myStack"></interceptor-ref>
<result>index.jsp</result>
</action>
- 方法二:都配置到<action>中自动组成拦截器栈
<interceptors>
<interceptor name="myinter" class="com.fddqq.smallming.util.MyInterceptor"></interceptor>
<interceptor name="myinter1" class="com.fddqq.smallming.util.MyInterceptor1"></interceptor>
</interceptors>
<action name="show" method="show" class="com.fddqq.smallming.action.Demo1Action">
<interceptor-ref name="myinter"></interceptor-ref>
<interceptor-ref name="myinter1"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result>index.jsp</result>
</action>
什么是OGNL,有什么用途?如何使用
- OGNL是Object-Graph Navigation Language的缩写,也叫对象导航语言。它是Struts的一种功能强大的表达式语言
- 获取stack context中内容语法:#key.value
什么是JSON?
一种轻量级数据传输格式.可以让js脚本快速解析
Struts几种获取获取到作用域对象方式
提供了原生和特有两种
-
原生方式(紧耦合方式)
- 获取到的是Servlet中原有类型.不仅仅可以传值,还可以调用其他方法
-
特有方式(解耦合方式)
- 把作用域对象重新封装,编程Map集合,只能传值
Struts2中token执行流程
token执行流程.png必须在jsp页面中提供<s:token>标签让session存放token,并产生两个隐藏域.当第一次提交表单时.token拦截器会认为是正常提交,执行完成后,把session中内容清除.此时session中没有内容.其他任何时候在去提交时,由于session中没有内容了,都认为是重复提交,最终返回invalid.token逻辑视图
注解的好处
- 不用配置配置文件.
- 便于维护和团队开发的实现方式.
struts2运行原理
struts2流程图.png当发送request请求后,由ActionMapper判断请求格式是否合法,如果不合法报错,如果合法进入到核心过滤器StrutsPrepareAndExecuteFilter,之后产生ActionProxy的代理对象,代理对象会调用Configuration Manager 加载struts.xml,在配置文件查找请求的action对应的类及方法.如果不存在报404,如果存在通过 Action Invocation 调度类在执行action之前执行拦截器,默认执行defaultStack拦截器栈,struts2大部分默认功能都是通过拦截器实现的.拦截器执行完成后才开始执行action,根据返回逻辑视图名调用Result,此时不会立即响应,执行拦截器栈剩余内容,最终才会响应给客户端.