Struts2的基本原理与实现

2023-05-16

Struts2是什么

百度说的

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。

我说的

    上面这是百度写的,百度写的太啰嗦了,简单的来说,Struts2就是一个框架,它是属于web层的一个框架,是Struts1的一个升级版,但是它和Struts1来相比,提供了太多的增强和改进,怎么运行的呢,就是实现了Servlet的功能,来进行控制页面跳转
    同时这也是基于MVC设计模式的Web应用框架,Struts2的控制功能就相当于MVC中的Controller的功能,用来控制页面的转向。

为什么说Struts2实现了Servlet的功能?

因为Struts2可以理解为下图,这里介绍了前端控制器模型,形象的体现了Struts2实现了Servlet的功能
在这里插入图片描述

Struts2的优缺点

优点

  1. 实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现。
  2. 丰富的标签库,大大提高了开发的效率。
  3. Struts2提供丰富的拦截器实现。
  4. 通过配置文件,就可以掌握整个系统各个部分之间的关系。
  5. 异常处理机制,只需在配置文件中配置异常的映射,即可对异常做相应的处理。
  6. Struts2的可扩展性高。
  7. 面向切面编程的思想在Strut2中也有了很好的体现。

缺点

  1. Struts2中Action中取得从jsp中传过来的参数时还是有点麻烦。
  2. 校验还是感觉比较繁琐,感觉太烦乱,也太细化了,如果校验出错的只能给用户提示一些信息。
  3. 安全性有待提高。

优缺点来自这里

拦截器和过滤器

过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。

拦截器(Interceptor):在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。

这里不做详细介绍,百度一下

Struts执行流程图

在这里插入图片描述
图片来自这里(这篇博客写的非常的好,强烈推荐!!)

Warning!!!

千万不要错过!!!具体详细的Struts2的详细介绍参考网站:tutorialspoint
别说英文网站我看不懂,我四级都没过的渣渣靠着翻译都没问题!!!

这个Demo可以运行的起来

在这里插入图片描述

导入jar包

在这里插入图片描述

配置Struts2核心过滤器:web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 配置struts2的核心过滤器 -->
  <!-- 所有请求都要通过核心过滤器 -->
  <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>
  
</web-app>

编写Action类:HelloAction.java

package com.banana.struts.demo1;
/*
 * Struts2的Action类
 */
public class HelloAction {
	public String execute(){
		System.out.print("HelloAction执行了......");
		return "success";
	}
}

编写struts.xml来控制转向

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
	<!-- Struts2为了管理Action的配置,通过包进行管理 -->
	<!-- 配置Struts2的包 -->
	<package name="hello" extends="struts-default" namespace="/">
		<!-- 配置Action -->
		<action name="hello" class="com.banana.struts.demo1.HelloAction">
		<!-- 页面的跳转 -->
			<result name="success">/demo1/success.jsp</result>
		</action>
	</package>
</struts>

添加页面:demo1.jsp、success.jsp

demo1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'demo1' starting page</title>
  </head>
  
  <body>
    <h1>Struts2的入门</h1>
    <h3><a href="${ pageContext.request.contextPath }/hello.action">Struts2的入门</a></h3>
  </body>
  
</html>
success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>success page</title>
  </head>
  
  <body>
    跳转成功 <br>
  </body>
</html>

页面跳转逻辑

在这里插入图片描述

总结一下

其实我感觉Struts2,就是实现了页面的转向,转到该转的地方,不要转到不该转的地方,取代了Servlet的功能。
另外,继续学习,如果文中有错误请多多指教。

觉得不错点个赞再走吧😄

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Struts2的基本原理与实现 的相关文章

  • Android 获取设备唯一号 unknown

    Android 获取设备唯一号 unknown 问题 xff1a 使用 Build SERIAL 获取设备唯一号时有些机型会返回 39 unknown 39 原因 xff1a 在Android O以后 android os Build SE
  • C++ string类如何format(格式化)字符串

    string类的使用 很遗憾 xff0c string类并没有提供关于format 格式化 字符串的操作 xff0c 但是我们可以借助其他方法来实现 方法一 xff08 推荐 xff09 xff1a ostringstream类实现 ost
  • Codeforces加速访问及其他编程比赛平台推荐

    最近在学习算法 xff0c 刷题 学的差不多准备去比赛试一试 这里分享一些平时比赛平台 文章的开始先给大家推荐一个公众号 小辅导 互联网开发者 多年一线程序开发经验 不定期分享各类资源 https mp weixin qq com s Gq
  • IOS开发UIScrollView控件详解

    首先实现UIScrollViewDelegate协议 xff1a plain view plain copy import lt UIKit UIKit h gt 64 interface Activity01ViewController
  • 【测试开发】几种常见的自动化测试框架

    几种常见的自动化测试框架 在软件测试领域 xff0c 自动化测试框架有很多 xff0c 这里主要介绍几种常用的自动化测试框架 1 pytest pytest 是 Python 的一种单元测试框架 xff0c 与 Python 自带的 uni
  • MPV 快捷键

    按键功能RIGHT前进 5 秒LEFT后退 5 秒UP前进 60 秒DOWN后退 60 秒 0 9091 倍速播放 1 1 倍速播放 0 5 倍速播放 2 0 倍速播放Backspace还原到 1 0 倍速Space 或 p播放 暂停 下一
  • 清除DNS 缓存记录

    original link http www linuxfly org post 543 为了提高DNS 解析的记录 xff0c 很多操作系统都会提供缓存DNS 记录的功能 xff0c 但是 xff0c 这可能会为测试DNS 服务或域名设定
  • Jetson TX2更换软件源

    TX2的软件源为国外服务器 xff0c 网速会很慢 xff0c 需要换国内的ARM源 备份 etc lib路径下的source list文件 xff0c 然后在终端 xff08 按ctrl 43 alt 43 T打开 xff09 执行以下命
  • python和Microsoft Visual C++ Build Tools版本安装

    在windows环境下 xff0c python需要调用Microsoft Visual C 43 43 compiler编译器 xff0c 尤其是在安装第三方包时候 xff0c 会build项目 xff0c 这时如果没有安装或者安装不协调
  • WebSocket 实现数据实时刷新

    WebSocket 是HTML5的一个新协议 xff0c WebSocket 使得客户端和服务器之间的数据交换变得更加简单 xff0c 允许服务端主动向客户端推送数据 在 WebSocket API 中 xff0c 浏览器和服务器只需要完成
  • 计算机毕业设计论文资料查找

    学位论文的材料准备 所谓材料 xff0c 就是为科学研究和论文写作的需要而搜集的一系列事实和事理 撰写学位论文 xff0c 首先要占有丰富的材料 xff0c 这是科研和写作的基础 在这基础上 xff0c 对材料进行加工整理 综合分析 xff
  • 使用VS Code编写、调试和运行C++程序。

    上次提到的是VS Code怎么编写 调试和运行pytho程序 xff0c 这次来说说使用VS Code来对C 43 43 程序操作是怎么个流程和注意哪些问题 环境说明 xff1a Ubuntu18 04 VS Code g 43 43 编译
  • 搭建gitlab

    安装参照 https blog csdn net duyusean article details 80011540 配置的阿里云邮箱 Email Settings gitlab rails 39 gitlab email enabled
  • webrtc系列-kurento相关的一些尝试

    公司最近要做个ICU探视系统 于是在网上找了一个开源的webrtc实现kurentokurento github地址 https github com Kurento kurento media server 下载kurento docke
  • P1080 国王游戏(c++)

    题目 xff1a 题意 xff1a 找出获得最高赏金的大臣 每一个大臣获得的赏金 61 国王的左手 前面所有大臣的左手乘积 自己的右手 于是这里可以自然的想到贪心 xff1a 尽可能让前面所有人的乘积更小 xff0c 而自己的右手又尽可能地
  • 1.1 Qt Creater使用Python开发桌面软件的操作流程

    Qt Creater及Python的下载与安装过程不再赘述 xff0c 读者可自行在网上搜索相应的下载与安装方法 首先我们打开Qt Creater xff0c 单击 Create Project 按钮或单击菜单栏中的 文件 New Proj
  • zootracer使用说明——一款视频物体追踪软件,获取运动物体在屏幕坐标系的运动轨迹

    警告 xff01 软件会使用大量计算机资源 xff0c 请使用配置较高的电脑运行程序 xff01 不然容易把电脑跑坏 xff01 我的配置 xff1a CPU AMD Ryzen 7 5800H with Radeon Graphics G
  • Dockerfile概念简介

    Dockerfile概念简介 前言一 dockerfile概念二 Docker镜像的创建 1 基于现有镜像创建 2 基于本地模板创建 3 基于dockerfile创建 dockerfile结构 xff08 四部分 xff09 构建镜像命令
  • Android:file.mkdirs() false

    如果创建文件目录失败 就要考虑两个原因 1 是否给了读写权限 清单文件有读写权限 但是创建目录之前是否允许了 span class token operator lt span uses span class token operator
  • 【Flutter web】内网网站如何发布?解决外网下canvaskit.js和字体无法加载问题

    背景 由于部署的网站只能在内网下使用 xff0c 部署服务器又不能访问外网 xff0c 导致Flutter web部署遇到很多问题 xff0c 比如 xff1a 白屏 部署的网站为何首次加载缓慢 xff0c 会白屏 xff1f 通过浏览器开

随机推荐

  • 【Flutter web】实现批量生成可下载的二维码,二维码图片点击下载

    这里写自定义目录标题 先看效果 xff1a 方法 xff1a 先看效果 xff1a 方法 xff1a web布局就略过 xff0c 自行练习 xff0c 只讲重点 xff01 此项目需要用到三个依赖库 xff1a zxing2 0 1 0i
  • android 实现类似个人中心的界面设计

    上效果图 xff1a 先理清设计思路 xff1a 1 外层用linearlayout包裹 xff0c linearlayout采用shape 搭上描边 圆角和填充背景色 2 里层采用relativelayout填充进textview ima
  • 上传项目到github并供团队克隆

    github注册就不说了 1 创建仓库 创建后就能在首页中看到创建的仓库名了 2 本地克隆仓库 到github的项目仓库中找到项目的地址 xff0c 如第一图 磁盘中创建项目文件夹作为仓库 xff0c 右键选择torToiseGit gt
  • Fragment和Activity两种沉浸式状态栏的实现

    我们普通的Activity所有的标题栏颜色风格基本是一致的 xff0c 所以我们可以将这种单独的Activity的沉浸式状态栏放在BaseActivity中实现 但是如果遇到一级栏目的fragment中 xff0c 且有些fragment中
  • Android Studio Git实现回退至某一个版本

    流程 xff1a 一 android studio上部VCS gt Git gt Reset Head 二 选择Reset Type 注释 xff1a Reset Type git reset mixed xff1a 此为默认方式 xff0
  • Gitlab给指定人员设置指定权限

    1 选中指定的项目 xff0c 再选择Members 2 选择要指定的人员 xff0c 选择Project Access xff0c 为其添加指定的权限 xff0c 添加
  • 1.5 Qt Creater使用Python开发桌面软件的程序打包

    当我们开发完成软件后 xff0c 如果需要分发到其它电脑上运行 xff0c 我们需要进行程序打包 通过程序打包 xff0c 我们可以方便其他用户在其它设备上进行程序的使用 最简单且打包文件最小的方式为 xff1a 我们将开发用到的Pytho
  • Vue--Module parse failed: Unexpected character '' (1:0) (fonts/element-icons.ttf)

    当Vue引入iview Element ui后 xff0c npm run dev报错如下图 xff1a 本人项目采用webpack打包工具 xff0c 由于webpack打包工具是将浏览器不能直接运行的拓展语言 xff08 Scss xf
  • 安卓获取APP对应的Android id的原理分析

    android id 的生成原理是由系统生成的随机数 xff0c 并与应用 app 签名 xff0c 经过 HmacSHA256 算法生成的 xff1b 从 android 8 以后开始就是随机的了 xff0c 每个应用获取到的简要步骤 x
  • 将 Word 转换为 Markdown格式 【详细教程】

    文章目录 前言 下载安装Writage Word Markdown 下载安装Pandoc 再次Word Markdown总结 提示 xff1a 以下是本篇文章正文内容 xff0c 学习内容将会持续更新 前言 俗话说 好记性不如烂笔头 在我们
  • JAVA校验SQL语句与格式化语句

    想看实现直接滑倒左下边的工具类 xff0c 前边在说得是解决思路 前言 现在需要向数据库中某张表中的某个字段中 xff0c 插入的值为SQL语句 xff0c 但是要保证插入SQL语句的正确性 xff0c 而且还需要进行格式化 xff0c 就
  • 获取墨墨背单词里面的单词书中的单词

    首先 xff0c 其实是直接尝试抓包获取的 xff0c 不过在抓包的信息中没发现类似的内容 xff0c 然后就去百度了以下 xff0c 发现还是有聪明人 把下载的 apk 文件解压缩一下 xff0c 把里面的 assets 文件夹里面的 m
  • 2021年Redis面试题(持续更新)

    目录 1 redis基础redis 中的数据类型有哪些为什么说redis能够快速执行 2 Redis中的五种数据结构string 字符串 list 列表 set 集合 hash 哈希 zset 有序集合 3 Redis的持久化Redis 的
  • 吐槽一下csdn博客选中文字之后的悬浮窗

    悬浮窗出来的莫名其妙 xff0c 还会挡文字 xff0c 展示一下我框一段文字出现的一百种情况 xff0c csdn是否考虑出一个设置可以自定义把这个功能关闭和开启 看文章很自然的会选中文字一行一行的看 xff0c 我相信很多人都是这样的
  • c语言基础

    基本语法 预定义常量及类型 函数结果状态代码 span class token macro property span class token directive hash span span class token directive k
  • c语言实现基础的排序

    1 插入排序 1 1 直接插入排序 span class token keyword void span span class token function insert sort span span class token punctua
  • 流程图怎么画

    前言 最近在看博客的时候发现很多流程图都不是流程图 xff0c 想画成流程图但是总有些时候会变了样子 xff0c 所以我就想说说流程图到底因该怎么画 组成 流程图一般由由圆角矩形 矩形 菱形 平行四边形 箭头组成 作用 流程图一般都是用圆角
  • mybatis-plus使用中遇到的问题

    mybatis plus使用中遇到的问题 mapper配置问题mybatis plus与mybatis冲突mybatis plus与pagehelper冲突 最近新搭一个测试项目 xff0c 使用了 mybatis plus当前的最新版本
  • 解决“将截断字符串或二进制数据。语句已终止。”的问题

    在EF中 xff0c 使用CodeFirst给实体添加约束的时候 xff0c 使用NeGut控制台进行更新到数据库中 xff0c 先使用add migration migrationName命令进行创建 xff08 migrationNam
  • Struts2的基本原理与实现

    Struts2是什么 百度说的 Struts2是一个基于MVC设计模式的Web应用框架 xff0c 它本质上相当于一个servlet xff0c 在MVC设计模式中 xff0c Struts2作为控制器 Controller 来建立模型与视