美文网首页JAVA开发Java 杂谈互联网科技
Java面试系列—框架篇(Struts2)

Java面试系列—框架篇(Struts2)

作者: 奋斗的蛐蛐 | 来源:发表于2018-07-14 15:11 被阅读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,此时不会立即响应,执行拦截器栈剩余内容,最终才会响应给客户端.

相关文章

网友评论

本文标题:Java面试系列—框架篇(Struts2)

本文链接:https://www.haomeiwen.com/subject/ixrypftx.html