谈谈你对Struts的理解(包含struts的所有相关面试题,不看后悔)

版权声明:本文为博主原创文章,未经博主允许可以转载。 https://blog.csdn.net/qq_36071795/article/details/83791960

struts2是一个按照MVC模式设计的一个web层的框架,其实它就相当于一个大的servlet.但是它和servlet是有区别的.servlet默认在第一次访问的时候创建,只创建一次,是单实例对象.struts2的action是多实例对象,每次访问的时候都会创建action对象

struts.xml配置文件中的package标签的namespace属性值和action标签里面的name属性值构成访问路径,action标签里的class值表示所对应的Action类的全路径.如果不配置method属性的时候,Action类里面默认执行的方法是execute方法.action标签里的method属性值对应类中Action的方法名.在result标签里面配置方法的返回值到页面.但是,如果一个类的方法很多,就需要写多个action标签,这时可以使用通配符来简化配置

在继承ActionSupport类后,可以使用ActionContext和ServletActionContext类来获取表单提交的数据

struts2封装表单数据的方式,就是将表单数据封装到实体类对象中..可以使用表达式封装(主要是通过生成get,set方法来完成页面和action的双向交互),模型驱动封装(通过实现ModelDriven接口类)

在Action类里面可以把数据存到值栈里面,在页面中获取到值栈的数据;在页面中可以通过struts2标签和ognl表达式来获取值栈中的数据

struts2中的默认包struts-default有什么作用? 
struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型,而Struts2很多核心的功能都是通过这些内置的拦截器实现,如:从请求中 
把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。当包继承了struts-default包才能使用struts2为我们提供的这些功能。

struts2的执行流程

  1. 客户端浏览器发出HTTP请求。
  2. 根据web.xml配置,该请求被StrutsPrepareAndExecuteFilter接收。如果判断是struts2请求,就把它交给ActioProxy处理
  3. ActionProxy创建一个ActionInvocation的实例(采用动态代理的方式),并进行初始化
  4. ActionInvocation实例在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用
  5. 根据struts.xml配置,找到需要调用的Action类和方法,并通过IoC方式,将值注入给Aciton。
  6. Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。
  7. 返回HTTP响应到客户端浏览器。

 

  1. 客户端浏览器发出HTTP请求。
  2. 根据web.xml配置,该请求被StrutsPrepareAndExecuteFilter接收。如果判断是struts2请求,就把它交给ActioProxy处理

 

  1. ActionProxy创建一个ActionInvocation的实例(采用动态代理的方式),并进行初始化
  2. ActionInvocation实例在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用
  3. 根据struts.xml配置,找到需要调用的Action类和方法,并通过IoC方式,将值注入给Aciton。

6、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。

7、返回HTTP响应到客户端浏览器。

struts2的核心控制器(过滤器)

  1. Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。 

StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。struts2读取到struts.xml的内容后,是将内容封装进javabean对象然后存放在内存中,以后用户的每次请求处理将使用内存中的数据,而不是每次请求都读取struts.xml文件。
2、作用: 
负责拦截由<url-pattern>/*</url-pattern>指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。默认情况下,如果用户请求的路径 
不带后缀或者后缀以.action结尾,这时请求将被转入struts2框架处理,否则struts2框架将略过该请求的处理。 
可以通过常量"struts.action.extension"修改action的后缀,如: 
<constant name="struts.action.extension" value="do"/> 
如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。
<constant name="struts.action.extension" value="do,go"/>  

拦截器和过滤器的区别

struts2中拦截器的底层原理

拦截器在action对象创建之后,action的方法执行之前执行在action没有直接调用拦截器的方法,使用配置文件方式进行操作

aop思想

Aop是面向切面(方面)编程,有基本功能,扩展功能,不通过修改源代码方式扩展功能

责任链模式

要执行多个操作,有添加、修改、删除三个操作。

首先执行添加操作,添加操作执行之后 做类似于放行操作,执行修改操作,修改操作执行之后做类似于放行操作,执行删除操作

struts2自定义拦截器

在struts2里面有很多的拦截器,这些拦截器是struts2封装的功能,但是在实际开发中,struts2里面的拦截器中没有自己要用的,这个时候需要自己写拦截器实现功能

第一步 创建类,继承MethodFilterInterceptor类

第二步 重写MethodFilterInterceptor类里面的方法写拦截器逻辑

第三步 配置action和拦截器关系(注册拦截器)

(1)在要拦截的action标签所在的package标签里面声明拦截器

(2)在具体的action标签里面使用声明的拦截器

(3)struts2里面执行很多的默认拦截器,但是如果在action里面配置自定义拦截器,

问题:默认的拦截器不会执行了

解决:把默认拦截器手动使用一次

struts2的Action是不是线程安全的

struts2中的Action是多实例的,在每次被访问的时候都会创建Action对象。而被static修饰的变量可以在多个对象中共享资源。所以被static修饰的类变量在Action中不是线程安全的

猜你喜欢

转载自blog.csdn.net/qq_36071795/article/details/83791960