Struts2的工作原理是什么?Struts2中的MVC模式包含哪些核心组件?在Struts2中如何实现转发和重定向?

Struts2的工作原理是什么?
Struts2的工作原理主要基于MVC设计模式,它充当Web应用框架的控制器层(Controller),负责建立模型与视图之间的数据交互。

具体来说,Struts2的工作流程如下:

启动与加载:当Web应用启动时,服务器会加载web.xml配置文件。在这个过程中,StrutsPrepareAndExecuteFilter(核心过滤器)的init()方法会被调用,该方法会读取类路径下默认的配置文件struts.xml,并完成初始化操作。初始化后,Struts2会将struts.xml的内容以JavaBean的形式存放在内存中,以便后续使用。
请求处理:当用户发起一个请求时,这个请求首先会被Struts2的核心控制器FilterDispatcher(过滤器分发器)接收。FilterDispatcher会解析请求的URL,并查找与URL匹配的Action映射。这个过程涉及到ActionMapper组件,它会根据struts.xml中的配置来确定哪个Action应该处理这个请求。
Action调用与拦截:一旦找到匹配的Action,FilterDispatcher会创建一个ActionInvocation实例来调用这个Action。在调用Action的过程中,Struts2会按照配置的顺序调用相关的拦截器(Interceptor)。这些拦截器可以在Action执行前后执行一些操作,比如安全检查、日志记录等。
结果处理:当Action执行完毕后,ActionInvocation会根据struts.xml中的配置找到对应的返回结果。这个返回结果通常是一个需要被表示的JSP页面或者FreeMarker模板。在这个过程中,可以使用Struts2框架中提供的标签来简化视图的编写。
响应返回:最后,FilterDispatcher会通过web.xml中配置的过滤器将处理结果返回给客户端。
在整个工作过程中,Struts2通过配置文件(struts.xml)和注解的方式来定义Action、拦截器、结果等组件的行为,从而实现了灵活且可配置的Web应用开发。同时,Struts2也提供了丰富的标签库和工具类,帮助开发者更高效地构建Web应用。

Struts2中的MVC模式包含哪些核心组件?
Struts2中的MVC模式包含以下核心组件:

模型(Model):
模型组件是实现业务逻辑的模块,通常包括业务逻辑组件和数据库访问组件。在Struts2中,模型层可以是由JavaBean或EJB构成的,用于处理业务逻辑和存储业务数据。模型组件是MVC模式中的核心部分,它封装了应用程序的状态和行为,并通过业务逻辑对数据进行操作和处理。
视图(View):
视图组件负责呈现应用程序的用户界面,包括HTML、JSP页面以及Struts2标签等。视图组件还可以使用FreeMarker、Velocity等模板技术来创建动态页面。视图层的主要任务是根据模型组件提供的数据来生成用户界面,并将用户的请求转发给控制器组件。
控制器(Controller):
控制器组件在Struts2中主要由核心控制器FilterDispatcher和业务控制器Action组成。FilterDispatcher是Struts2的核心过滤器,负责接收用户请求、解析请求参数,并根据配置文件(struts.xml)找到相应的Action进行处理。Action是业务控制器,负责调用模型组件处理业务逻辑,并将处理结果返回给视图组件。
在Struts2的MVC模式中,控制器组件接收用户的请求,并根据请求信息调用相应的模型组件处理业务逻辑。模型组件执行完毕后,将结果返回给控制器,控制器再根据返回的结果选择合适的视图组件进行渲染,并将最终的界面呈现给用户。这样,模型、视图和控制器三者相互分离,各自负责不同的职责,从而提高了应用程序的灵活性和可维护性。

此外,Struts2还提供了其他核心组件,如OGNL/ValueStack、拦截器(Interceptor)和标签库(Tags)等,这些组件在MVC模式中起着辅助和扩展的作用,进一步增强了Struts2框架的功能和灵活性。

在Struts2中如何实现转发和重定向?
在Struts2中,实现转发和重定向主要依赖于Action处理结果类型的配置。Struts2提供了多种结果类型,包括转发(dispatcher)和重定向(redirect)。

转发(dispatcher)
转发是Struts2默认的结果类型。当Action执行完毕后,Struts2框架会使用RequestDispatcher的forward()方法将请求转发到指定的JSP页面。在struts.xml配置文件中,你不需要显式指定结果类型为dispatcher,因为它是默认的。

示例:

<action name="exampleAction" class="com.example.ExampleAction">  <result name="success">/success.jsp</result>  
</action>

在上面的例子中,当exampleAction执行成功(返回"success"字符串)时,Struts2会默认使用转发方式将请求转发到/success.jsp页面。

重定向(redirect)
要实现重定向,你需要在struts.xml配置文件中显式指定结果类型为redirect。重定向是通过HttpServletResponse的sendRedirect()方法实现的,它会发送一个新的请求到服务器。

示例:

<action name="exampleAction" class="com.example.ExampleAction">  <result name="success" type="redirect">/success.jsp</result>  
</action>

在这个例子中,当exampleAction执行成功时,Struts2会使用重定向方式将用户重定向到/success.jsp页面。注意,重定向会导致浏览器地址栏的URL发生变化。

重定向到Action
除了重定向到具体的JSP页面,你还可以重定向到另一个Action。这通常用于实现页面之间的导航或处理某些业务逻辑。

示例:

<action name="exampleAction" class="com.example.ExampleAction">  <result name="success" type="redirectAction">anotherAction</result>  
</action>  <action name="anotherAction" class="com.example.AnotherAction">  <result name="success">/anotherSuccess.jsp</result>  
</action>

在这个例子中,当exampleAction执行成功时,它会重定向到名为anotherAction的另一个Action。然后,anotherAction执行完毕后,会根据其配置的结果类型(在这个例子中是转发到/anotherSuccess.jsp)来呈现最终页面。

通过合理配置Struts2的Action处理结果类型,你可以灵活地实现转发和重定向,以满足不同业务需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/764736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自媒体用ChatGPT批量洗稿软件V5.9环境配置/软件设置教程【汇总】

大家好&#xff0c;我是淘小白~ 首先&#xff0c;感谢大家的支持~~ ChatGPT采集洗稿软件V5.9版本更新&#xff0c;此次版本更新修改增加了一些内容&#xff1a; 1、自定义多条指令&#xff0c;软件自动判断指令条数&#xff0c;进行输入 2、增加谷歌浏览多账号轮询&#xf…

ubuntu20.04 安装ros1

详细介绍如何在ubuntu20.04中安装ROS系统&#xff0c;超快完成安装&#xff08;最新版教程&#xff09;_ubuntu安装ros-CSDN博客Ros noetic : XTDrone安装-CSDN博客 gazebo11卸载&#xff0c;安装gazebo9 我的ROS学习日记-环境搭建 - 知乎 需要选择分支 GitHub - ros-simulat…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记18_竞争市场

1. 竞争市场 1.1. 算法、大数据、超级平台的风起云涌似乎预示了市场竞争机制的加速终结&#xff0c;而我们似乎也对这种市场机制的衰退见怪不怪 1.1.1. 它有效节省了消费者的搜寻成本&#xff0c;降低了市场准入壁垒&#xff0c;开辟了市场扩张与准入之间的崭新通道&#xff…

指针空值nullptr(C++11)

c98中的指针空值 在良好的C/C编程习惯中&#xff0c;声明一个变量时最好给该变量一个合适的初始值&#xff0c;否则可能会出现不可预料的错误&#xff0c;比如未初始化的指针。如果一个指针没有合法的指向&#xff0c;我们基本都是按照如下方式对其进行初始化&#xff1a; void…

Spark-Scala语言实战(5)

在之前的文章中&#xff0c;我们学习了如何在scala中定义与使用集合和元组。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言实战&#xff08;…

伪分布式部署Hive

文章目录 1 Hadoop 伪分布式安装1 Hive下载2 Hive配置3 安装MySQL JDBC连接器4 连接Hive CLI4.1 初始化数据库4.2 连接Hive 1 Hadoop 伪分布式安装 假设我们已经安装好hadoop伪分布式 1 Hive下载 Hive下载地址 2 Hive配置 Hive伪分布式需要在conf文件夹下修改两个文件&…

c++核心学习5

4.6继承 有些类与类之间存在特殊的关系&#xff0c;例如下图中&#xff1a; 我们发现&#xff0c;定义这些类时&#xff0c;下级别的成员除了拥有上一级的共性&#xff0c;还有自己的特性。这个时候我们就可以考虑利用继承的技术&#xff0c;减少重复代码 4.6.1继承的基本语法…

VTK9.2.0+Qt5.14.0 绘制点云

背景 为了显示结构光重建后的点云&#xff0c;开发QT5.14.0VTK9.2.0的上位机软件&#xff0c;用于对结构光3D相机进行控制&#xff0c;并接收传输回来的3D数据&#xff0c;显示在窗口中。 配置QT和VTK VTK9.2.0下载源码&#xff0c;用Cmake编译&#xff0c;编译好的VTK9.2.0…

去中心化的 AI 数据供应:认识Grass,参与Grass

去中心化的 AI 数据供应&#xff1a;认识Grass&#xff0c;参与Grass &#x1f44b;&#xff1a;邀请链接☘️&#xff1a;Intro❓&#xff1a;看好Grass和即将推出的L2的原因有哪些&#xff1f;&#x1f4a1;&#xff1a;展望&#x1f50d;&#xff1a;总结 &#x1f44b;&…

说说webpack的构建流程?

文章目录 一、运行流程初始化流程编译构建流程compile 编译make 编译模块build module 完成模块编译 输出流程seal 输出资源emit 输出完成 二、小结参考文献 一、运行流程 webpack 的运行流程是一个串行的过程&#xff0c;它的工作流程就是将各个插件串联起来 在运行过程中会…

python学生作业管理系统flask-django-nodejs-php

课题主要分为三大模块&#xff1a;即管理员模块和学生、教师模块&#xff0c;主要功能包括&#xff1a;学生、教师、作业信息、学习模块、教学评价、学习情况等&#xff1b; 关键词&#xff1a;学生作业管理系统&#xff1b;作业信息 目录 摘 要 I Abstrac II 目录 III 1绪论 1…

5.84 BCC工具之tcpretrans.py解读

一,工具简介 tcpretrans工具追踪内核TCP重传函数,以显示这些重传的详细信息。 它专门用于追踪TCP重传事件。在网络通信中,重传是由于数据包丢失、损坏或延迟到达而需要重新发送的情况。tcpretrans通过利用Linux内核中的BPF(Berkeley Packet Filter)机制,能够实时捕获和…

matlab实现机器学习svm

一、目的和要求 1.编程实现SVM训练函数和预测函数&#xff1b; 2.绘制线性和非线性边界&#xff1b; 3.编写线性核函数 二、算法 1.线性svm&#xff1a; 分离超平面&#xff1a;wxb0&#xff0c;对于线性可分的数据集来说&#xff0c;这样的超平面有无穷多个&#xff08;…

ARM32day4

VID_20240319_210515 1.思维导图 2.实现三个LED灯亮灭 .text .global _start _start: 使能GPIO外设时钟 LDR R0,0x50000A28 LDR R1,[R0]使能GPIOE ORR R1,R1,#(0X1<<4)使能GPIOF ORR R1,R1,#(0X1<<5) STR R1,[R0]设置引脚状态 LDR R0,0X50006000 LDR R1,[R0…

SQL:窗口函数之OVER()

窗口函数 通用格式 “函数 OVER (PARTITION BY 分组 ORDER BY 排序依据 升降序)”。 这里记录下OVER() 以及搭配LEAD/LAG函数的使用方法&#xff08;执行平台Impala&#xff09; 目录 OVER函数1、不加条件的OVER函数——得到所有的汇总结果2、仅有排序的OVER函数——得到按顺序…

基于NetCoreServer的WebSocket客户端实现群播(学习笔记)

一、NetCoreServer介绍 超快速、低延迟的异步套接字服务器和客户端 C# .NET Core 库&#xff0c;支持 TCP、SSL、UDP、HTTP、HTTPS、WebSocket 协议和 10K 连接问题解决方案。 开源地址&#xff1a;https://github.com/chronoxor/NetCoreServer 支持&#xff1a; Example: TC…

34 vue 项目默认暴露出去的 public 文件夹 和 CopyWebpackPlugin

前言 这里说一下 vue.config.js 中的一些 public 文件夹是怎么暴露出去的? 我们常见的 CopyWebpackPlugin 是怎么工作的 ? 这个 也是需要 一点一点积累的, 因为 各种插件 有很多, 不过 我们仅仅需要 明白常见的这些事干什么的即可 当然 以下内容会涉及到一部分vue-cli,…

Android基础面试题目汇总

一. Android面试相关 1.Activity 说下Activity生命周期​​​​​​onStart 和 onResume、onPause 和 onStop 的区别onSaveInstanceState(bundle),onRestoreInstanceState(bundle)什么时候调用?Activity的onNewIntent(intent)方法什么时候会调用?Activity A跳转Activity B…

Python 10个面试题实例

当然&#xff01;以下是10个Python面试题及其示例解决方案的中题目&#xff1a; 1.反转字符串: string "Hello, World!" reversed_string string[::-1] print(reversed_string)2.检查字符串是否为回文: def is_palindrome(string):return string string[::-1]r…

Xcode15报错: SDK does not contain ‘libarclite‘

pod lib lint *** 报错 clang: error: SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum deployment target 或者xcode…