Struts2 知识点总结及其详解

1、简单介绍一下 Struts2

        Struts2 框架是一个按照 MVC 设计模式设计的 WEB 层框架,是在 struts 1 和 WebWork 的技术基础上进行了合并的全新的框架。其全新的 Struts 2 的体系结构与 Struts 1 的体 系结构差别巨大。Struts 2 以 WebWork 为核心,采用拦截器的机制来处理用户的请求, 这样的设计也使得业务逻辑控制器能够与 ServletAPI 完全脱离开。 我们可以把 struts2 理解为一个大大的 servlet,而这个 servlet 就是 ActionServlet。struts2 在处理客户端请求时,会先读取 web.xml 配置文件,根据前端控制器将符合条件的请求 分给各个不同的 Action 处理。 在此之前,会把ActionServlet 会把数据封装成一个 javaBean。

        Struts2 框架提供了许多的拦截器,在封装数据的过程中,我们可以对数据进行一些操 作,例如:数据校验等等。当 Action 执行完后要返回一个结果视图,这个结果视图可以跟据 struts2 的配置文件中 配置,选择转发或者重定向。

2、Struts2 的执行流程

流程图:

在这里插入图片描述

  1. 当用户发出一个HTTP请求,请求会被Tomcat接收到,Tomcat服务器来选择处理这个请求的Web应用,那就是由这个web工程来处理这个请求。
  2. Web容器会去读取helloworld这个工程的web.xml,在web.xml中进行匹配,但发现,由struts2这个过滤器来进行处理(也就是
    StrutsPrepareAndExecuteFilter),根据Filter的配置,找到FilterDispatcher(Struts2的调度中心)
  3. 然后会获取FilterDispatcher实例,然后回调doFilter方法,进行真正的处理
  4. 这时FilterDispatcher会将请求转发给ActionMapper。ActionMapper负责识别当前的请求是否需要Struts2做出处理。
  5. 如果需要Struts2处理,ActionMapper会通知FilterDispatcher,需要处理这个请求,FilterDispatcher会停止过滤器链以后的部分。然后建立一个ActionProxy实例,这个对象作为Action与xwork之间的中间层,会代理Action的运行过程。
3、Struts2 中 Action 配置的注意事项有哪些?
  • name 包名称,在 struts2 的配置文件中,包名不能重复,name 并不是真正包名,只是为了管理 Action
  • namespace 和 的 name 属性,决定 Action 的访问路径 (以/开始 )
  • extends 继承哪个包,通常开发中继承 struts-default 包 (struts-default 包 在 struts-default.xml 中定义 )【可以使用包中默认的拦截器和结果集】
4、Struts2 的封装方式有哪些?

一、属性封装

  1. 在 action 中设置成员变量,变量名与表单中的 name 属性值相同
  2. 生成变量的 set 方法

     实例:获取用户输入的用户名和密码

        jsp 页面如下:

在这里插入图片描述

        java 代码如下:

在这里插入图片描述

二、模型驱动(常用)

  1. action 实现 ModeDriven 接口
  2. 在 action 里创建实体类对象
  3. 实现接口的 getModel 方法并返回所创建的对象

     示例:获取用户输入的用户名和密码

        jsp 页面如下:

在这里插入图片描述

        java 代码如下:

在这里插入图片描述

     需注意的是表单 name 的值应与类的属性名相同。

三、表达式封装

  1. 在 action 中声明实体类
  2. 生成实体类的 set 和 get 方法
  3. 在表单输入项的 name 属性值里面写表达式

        jsp 页面如下:

在这里插入图片描述

        java 代码如下:

在这里插入图片描述

5、拦截器和过滤器有哪些区别?
  • 拦截器是基于 java 的反射机制的,而过滤器是基于函数回调
  • 拦截器不依赖与 servlet 容器,而过滤器依赖与 servlet 容器
  • 拦截器只能对 action 请求起作用,而过滤器则可以对几乎所有的请求起作用
  • 拦截器可以访问 action 上下文、值栈里的对象,而过滤器不能
  • 在 action 的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一 次
6、简单介绍一下 Struts2 的值栈

      值栈是对应每一个请求对象的数据存储中心。Struts2 的一个很重要的特点就是引入了值栈。之前我们通过缓存或者模型驱动在 action 和页面之间传递数据,数据混乱,并且难以管理,缓存还有时间和数量限制,使用起来非常的困难。值栈的引入解决了这个问题,它可以统一管理页面和action 之间的数据,供 action、result、interceptor 等使用。我们大多数情况下不需要考虑值栈在哪里,里面有什么,只需要去获取自己需要的数据就可以了,大大的降低了开发人员的工作量和逻辑复杂性。

参考资料:https://www.cnblogs.com/hlhdidi/p/6185836.html

7、SpringMVC 和 Struts2 的区别?

      1、Struts2 是类级别的拦截, 一个类对应一个 request 上下文,SpringMVC 是方法级别的拦截,一个方法对应
一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为 Struts2 中 Action 的一个方法可以对应一个 url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。

      2、由上边原因,SpringMVC 的方法之间基本上独立的,独享 request response 数据,请求数据通过参数获取,处理结果通过 ModelMap 交回给框架,方法之间不共享变量,而 Struts2 搞的就比较乱,虽然方法之间也是独立的,但其所有 Action 变量是共享的,这不会影响程序运行,却给我们编码 读程序时带来麻烦,每次来了请求就创建一个Action,一个 Action 对象对应一个 request 上下文。

      3、由于 Struts2 需要针对每个request 进行封装,把 request,session 等 servlet 生命周期的变量封装成一个一个 Map,供给每个 Action 使用,并保证线程安全,所以在原则上,是比较耗费内存的。

      4、 拦截器实现机制上,Struts2 有以自己的 interceptor 机制,SpringMVC 用的是独立的 AOP 方式,这样导致
Struts2 的配置文件量还是比 SpringMVC 大。

      5、SpringMVC 的入口是 servlet,而 Struts2 是 filter(这里要指出,filter 和 servlet 是不同的。),这就导致
了二者的机制不同,这里就牵涉到 servlet 和 filter 的区别了。

      6、SpringMVC 集成了 Ajax,使用非常方便,只需一个注解@ResponseBody 就可以实现,然后直接返回响应文本即可,而 Struts2 拦截器集成了 Ajax,在 Action 中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。

      7、SpringMVC 验证支持 JSR303,处理起来相对更加灵活方便,而 Struts2 验证比较繁琐,感觉太烦乱。

      8、Spring MVC 和 Spring 是无缝的。从这个项目的管理和安全上也比 Struts2 高(当然 Struts2 也可以通过不同的目录结构和相关配置做到 SpringMVC 一样的效果,但是需要 xml 配置的地方不少)

      9、 设计思想上,Struts2 更加符合 OOP 的编程思想, SpringMVC 就比较谨慎,在 servlet 上扩展。

      10、SpringMVC 开发效率和性能高于 Struts2。

      11、SpringMVC 可以认为已经 100%零配置。

8、Struts2 中的 # 和 % 分别是做什么的?

(1)使用#获取 context 里面数据

<s:iterator value = “list” var=”user”>
<s:property value = “#user.username”>
</s:iterator>

(2)向 request 域放值(获取 context 里面数据,写 ognl 时候,首先添加符号#context 的 key 名称.域对象名称)

(3)在页面中使用 ognl 获取

<s:property value = “#request.req”>

(4)%在 struts2 标签中表单标签在 struts2 标签里面使用 ognl 表达式,如果直接在 struts2 表单标签里面使用 ognl 表达式不识别,只有%之后才
会识别。

<s:textfield name=”username” value=”%{#request.req}”>

9、Struts2 中有哪些常用结果类型?
  1. dispatcher :默认的请求转发的结果类型,Action 转发给 JSP

  2. chain :Action 转发到另一个 Action (同一次请求)

  3. redirect : 重定向,重定向到一个路径信息,路径信息没有限制(不在一个请求中),Action 重定向到 JSP

  4. redirectAction :Action 重定向到另一个 Action

  5. stream :将原始数据作为流传递回浏览器端,该结果类型对下载的内容和图片非常有用。

  6. freemarker :呈现 freemarker 模板。

  7. plaintext :返回普通文本内容。

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Monika、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值