SpringMVC框架简介

前言

现在由于功能以及业务的复杂性,大部分系统从技术上就拆分开为前后端分离,单体应用我都很少没接触了,导致现在对springMVC那套都忘记了很多东西,因此这篇文章在来回忆一下SpringMVC这个框架;很多时候因为业务的需求,本地功能不是很大,以后扩展性也不多,主要访问就几个业务员或者技术维护系统,就考虑单体应用,并不需要复杂,怎么简单怎么来就行,快速开发一套系统。

MVC模式

MVC(Model-View-Controller)模式是一种常用的软件架构模式,用于分离应用程序的业务逻辑、用户界面和数据模型。

在MVC模式中,应用程序被分为三个核心部分:

  1. 模型(Model):负责处理应用程序的数据逻辑,包括数据的读取、写入、更新和删除。模型通常是应用程序中的数据对象或数据库的接口。

  2. 视图(View):负责显示应用程序的用户界面,包括各种UI元素和用户交互。视图是应用程序中用户可以看到和操作的部分。

  3. 控制器(Controller):负责处理用户输入和整个应用程序的控制流程。控制器接收用户输入并调用模型或视图来响应用户操作。它将用户输入转化为对模型的操作,然后更新视图以反映新的状态。

MVC模式的优点包括:

  1. 分离关注点:MVC模式允许开发人员将应用程序的不同部分分开开发,使得代码更易于理解和维护。

  2. 可重用性:由于模型、视图和控制器之间的分离,可以更容易地重用这些组件,以构建不同的应用程序或模块。

  3. 可测试性:由于模型、视图和控制器的独立性,可以更容易地编写和运行单元测试,以确保每个组件的正确性。

MVC模式可以应用于各种各样的应用程序,包括Web应用程序、桌面应用程序和移动应用程序等。

对于MVC模式,业务开发人员主要精力,或者说业务操作,主要放在控制器上操作,或者说专注于控制器就行。

SpringMVC框架

mybatis ---解决java代码和sql语句之间的耦合---代替DAO层

Spring ---解决了业务层和其他各层之间的耦合---优化Service层

SpringMVC---解决了java代码和servlet之间的耦合---代替servlet(SpringMVC本质还是Servlet,实现了对Servlet解耦)

我们在使用servlet初期的时候发现,每一个请求都对应一个servlet ,如果有100个请求,这个时候就需要写100个servlet,这样一来就 会造成servlet的数量太多,尽管后期进行了Servlet合并,但是任然是手动进行的,耦合度太高了。

使用servlet进行数据接受的时候,比较的麻烦

并且springMVC是基于spring 开发的,这个完整的生态链,以及扩展性,促使我们不得不用springMVC.强大的拦截器,aop 对象的生命周期,我们确实用这个框架用的很爽的感觉

1.Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。

SpringMVC和Spring关系

1.SpringMVC是Spring framework的子框架.

2.SpringMVC运行后形成自己的容器.Spring也有自己的容器. ​ 2.1 称Spring的容器和SpringMVC的容器是父子容器

3.SpringMVC就是比直接使用Spring多了spring-webmvc-xxx.jar

4.在环境搭建时,区分开父子容器. ​ 4.1 直观表现:Spring和SpringMVC的内容可以配置在一个配置文件中.区分不开父子容器.可能导致出现问题:例如声明式事务绑定无 效(不报错,还没有效果.) ​ 4.2 处理办法:Spring的东西配置一个配置文件中,SpringMVC的东西配在一个文件中.

2.Spring MVC是一个基于MVC的web框架,Spring MVC分离了控制器,模型对象,过滤器以及处理程序对象的角色,这种分离让他们更 容易进行定制。

3.Spring MVC 3.0 后全面超越Struts2,成为最优秀的MVC框架

2.Spring MVC通过一套MVC注解,让POJO成为处理请求的控制器,而无须实现任何接口

4.采用了松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵活性

5.进行更简洁的Web层的开发

6.天生与Spring框架集成(如:IOC容器,AOP等)

7.能简单的进行web层的单元测试

8.支持灵活的URL到页面控制器的映射

9.非常容易与其他试图技术集成,

执行流程

流程描述

当用户发起请求后,执行DiapacherServlet,如果是JSP直接调用jsp页面.如果不是JSP,DiapacherServlet调用HandlerMapping判断请求URL是否合法,如果URL不存在报错,如果URL存在使用HandlerAdapter调用具体的HandlerMethod,当Handler执行完成后会返回ModelAndView,会被ViewResovler解析,调用具体的物理视图. 最终响应给客户端浏览器.

SpringMVC环境搭建

创建maven web项目

1.New Project  点击Maven 先勾选Create from archetype 选择org.apache.maven.archetypes:maven-archetype-webapp
2.设置项目名称
3.创建完成后,手动添加resources和java目录

添加依赖

<dependencies><!--进行junit单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!--Spring的5大核心jar包 --><!--依赖于commons-logging日志管理 --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><!--提供了框架的基本组成部分,包括IOC 和 DI--><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.1.6.RELEASE</version></dependency><!-- 提供了BeanFactory--><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.1.6.RELEASE</version></dependency><!--上下文配置对象,提供一个框架式的对象访问方式--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.1.6.RELEASE</version></dependency><!--提供了强大的表达式语言--><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.1.6.RELEASE</version></dependency><!--springMVC的jar包--><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.1.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.1.6.RELEASE</version></dependency><!--java web依赖 --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.3</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version></dependency><!-- jstl表达式 --><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency></dependencies>

web.xml

<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/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><display-name>Archetype Created Web Application</display-name><!--设置欢迎页 --><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><!--配置前端控制器,拦截的是以do结尾的url --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 自启动-在启动tomcat时立即加载对应的Servlet --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping></web-app>

创建Spring核心配置文件

1.在WEB-INF下

2.新建名字叫:<servlet-name>-servlet.xml配置文件,并配置内容

==说明:<servlet-name>-servlet.xml 的意思是:如果web.xml中,<servlet-name>springmvc</servlet-name>那么创建的Spring框架的核心配置文件名就叫做springmvc-servlet.xml。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 设置注解扫描路径 --><context:component-scan base-package="com.controller"></context:component-scan><!-- 默认加载注解处理器映射器和处理器适配器及很多的参数绑定 --><mvc:annotation-driven/>
</beans>

编写控制器

@Controller
public class UserController {@RequestMapping("/show")public ModelAndView show(HttpServletRequest request){ModelAndView mv=new ModelAndView();String name=request.getParameter("username");request.setAttribute("uname",name);mv.setViewName("show.jsp");return mv;}
}

创建index.jsp页面

<body><form action="reg.do" method="post">用户名:<input type="text" name="username"><br/>密码:<input type="password" name="password"/><br/><input type="submit" value="提交"></form>
</body>

九大内置对象和四大作用域

九大内置对象

类型对象名描述获取对象
HttpServletRequestrequest请求对象方法参数
HttpServletResponseresponse响应对象方法参数
HttpSessionsession会话对象req.getSession();
ServletContextapplication应用程序对象getServletContext()
PrintWriterout输出对象res.getWriter();
Exceptionout异常对象
PageContextpageContext页面上下文对象
ServletConfigconfig配置对象
Objectpage当前页面对象

输出对象(2):

out , response

作用域对象(4):

pageContext ,request , session , application

打酱油对象(3):

exception , config , page

四大作用域对象

1.九大内置对象中可以在特定情况下传递内容 ​

2.四大作用域对象: ​

      1 application: 整个应用程序任何时间内容 ​

      2 session:一次会话 ​ 浏览器关闭无效 ​ 超过默认tomcat中设置的Session时间 ​ 代码手动设置的有效时间 session.setMaxInactiveInterval(123); ​

      3 request:一次请求,只要跳转必须使用转发才能继续传递 ​

      4 pageContext : 当前页面内 ​

3.常用方法 ​

        1 setAttribute();设置值 ​

        2 getAttribute();获取值 ​

        3 removeAttribute();删除某个值 ​

        4.其他可能使用方法: ​

                1 application.getRealPath(“/”);获取到参数的真实全路径(发布到tomcat后的路径) ​

                2 request.getRequestURL();获取请求路径. ​

                 3 request.getPrameter();获取请求参数 ​

                4 request.setCharacterEncoding(“utf-8”);设置请求编码

                ​5 response.setContentType(“text/html;charset=utf-8”);设置响应头中响应内容.        

映射请求

SpringMVC 使用 @RequestMapping 注解为控制器指定可以处理哪些URL请求

@RequestMapping修饰类

注解@RequestMapping修饰类,提供初步的请求映射信息,相对于WEB应用的跟目录。

如果在类名前,使用了注解@RequestMapping,那么在处理器的方法里,在进行页面跳转的时候:

如果不经过视图解析器,那就要在跳转页面名的前面 加上“ / ”,表示页面的跳转位置从项目根目录开始;

如果没加“ /” 的意思是,以上面的例子来说,那么页面的跳转位置是从items这个逻辑文件夹开始!

@RequestMapping修饰方法

  

1.@RequestMapping("/show.do")

===加 / 是当前工程下,不加默认也是当前工程下

2.@RequestMapping(value={"show.do",”reg.do“})

===表示两个url请求都可以进入此控制器的此方法里。

===如果value的值只有一个的话,不需要加{}

===如果@RequestMapping注解里只有value这一个属性的话,并且该value属性还只有一个值的话,value也可以省去。如 上面的1。

3.@RequestMapping(value={"show.do",”reg.do“} ,method={RequestMethod.POST})

===value 和method两个属性之间使用 逗号,隔开

===method={RequestMethod.POST} 表示当前方法只能处理POST请求,若缺省,则get/post都可以处理。

4.对请求的参数加以限制:

@RequestMapping(value={"show.do",”reg.do“} ,params={”参数名1“,”参数名2“})

===表示当前方法请求参数中,必须有参数名叫 参数名1 和 参数名2 这两个参数。

@RequestMapping(value={"show.do",”reg.do“} ,params={”参数名1=value1“,”参数名2“})

===表示当前方法请求参数中,必须有参数名叫 参数名1 和 参数名2 这两个参数,并且参数1的值必须为value1。

5.headers属性:作为了解

指定request中必须包含某些指定的header值,才能让该方法处理请求。

@RequestMapping(value = "/pets", method = RequestMethod.GET, headers="Referer=凤凰网")

===表示仅处理request的header中包含了指定“Refer”请求头和对应值为“http://www.ifeng.com/”的请求;

返回值类型

controller 方法的返回值有三种:

A.ModelAndView

B.String

C.void

拦截器

1.拦截器和 过滤器的区别和联系:

联系:都是在进入目标代码前,提前做一些其他的事情。

区别:过滤器:----依赖于Servlet,在web.xml中进行配置

----函数回调实现的。

拦截器: ----依赖于MVC框架,在ApplicationContext.xml中进行配置

----本质拦截器是反射实现的。

-----过滤器能做的活,拦截器都能完成。----使用拦截器比较多。

执行顺序: 过滤器 拦截器 控制器

public class MYHandler implements HandlerInterceptor {@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {System.out.println("执行完控制器的方法后,执行的拦截器方法。。。。");}@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {System.out.println("请求已经进入到控制器了,但是还没有执行完控制器的时候,回到拦截器里来,执行该方法。");
}@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {System.out.println("进入控制器方法前,要执行的拦截器方法。。。。。");//返回值:返回值为true----说明,符合通过条件,可以进行进入到控制器里。//      返回值为 false----说明:不符合通过条件,拦截此次请求。  不在继续进入控制器。     return false;
}
}

配置拦截器

  <!-- 配置拦截器 --><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/>  <!-- /表示项目根目录;** 项目下任意路径以及任意子路径; 拦截所有请求路径 --><mvc:exclude-mapping path="/index.do"/>   <!-- 放行请求路径 --><mvc:exclude-mapping path="/reg.do"/><mvc:exclude-mapping path="/login.do"/><bean class="com.msb.handler.MYHandler"></bean></mvc:interceptor></mvc:interceptors>

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

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

相关文章

【Android】图解View的工作流程原理

文章目录 入口DecorView如何加载到Window中MeasureSpec MeasureView的测量ViewGroup的测量 LayoutView的layout() Draw1、绘制背景3、绘制View内容4、绘制子View6、绘制装饰 入口 DecorView如何加载到Window中 MeasureSpec 该类是View的内部类&#xff0c;封装View的规格尺寸…

876.链表的中间结点 143.重排链表

给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间结点&#xff0c;值为 3 。示…

文献学习-28-Endora: 用于内镜仿真的视频生成模型

Endora : Video Generation Models as Endoscopy Simulators Authors: Chenxin Li, Hengyu Liu, Yifan Liu, Brandon Y. Feng, Wuyang Li, Xinyu Liu, Zhen Chen, Jing Shao, Yixuan Yuan Keywords: Medical Generative AI Video Generation Endoscopy Abstract 生成模型有…

【C++】红黑树讲解及实现

前言&#xff1a; AVL树与红黑树相似&#xff0c;都是一种平衡二叉搜索树&#xff0c;但是AVL树的平衡要求太严格&#xff0c;如果要对AVL树做一些结构修改的操作性能会非常低下&#xff0c;比如&#xff1a;插入时要维护其绝对平衡&#xff0c;旋转的次数比较多&#xff0c;更…

33. UE5 RPG使用增强输入激活GameplayAbility(三)

在前面的文章&#xff0c;我们实现了使用GameplayTag和InputAction的对应绑定的数据&#xff0c;并且添加到了增强输入映射的上下文中&#xff0c;实现了通过按键打印对应的GameplayTag&#xff0c;这只是我们基础需要制作的。目的主要是为了实现在GameplayAblity上面设置对应的…

深入浅出 -- 系统架构之分布式多形态的存储型集群

一、多形态的存储型集群 在上阶段&#xff0c;我们简单聊了下集群的基本知识&#xff0c;以及快速过了一下逻辑处理型集群的内容&#xff0c;下面重点来看看存储型集群&#xff0c;毕竟这块才是重头戏&#xff0c;集群的形态在其中有着多种多样的变化。 逻辑处理型的应用&…

【.Net】DotNetty

文章目录 概述NIO和BIO、AIODotNetty适用场景DotNetty的整体架构和模块DotNetty的使用示例来源 概述 本系列文章主要讲述由微软Azure团队研发的.net的版本的netty&#xff0c;Dotnetty。所有的开发都将基于.net core 3.1版本进行开发。 Dotnetty是什么&#xff0c;原本Netty是…

蓝桥真题--路径之谜DFS解法

路径之谜 思路 前置知识&#xff1a;深度搜索模板搜索所有可以找的路径&#xff0c;将走过的靶子减去一走到最后一个格子的时候&#xff0c;直接去判断所有的靶子只有除最后一个位置的靶子&#xff0c;其余靶子都归零的时候&#xff0c;判断一个最后一个位置横坐标和纵坐标的靶…

PTA C 1050 螺旋矩阵(思路与优化)

本题要求将给定的 N 个正整数按非递增的顺序&#xff0c;填入“螺旋矩阵”。所谓“螺旋矩阵”&#xff0c;是指从左上角第 1 个格子开始&#xff0c;按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列&#xff0c;满足条件&#xff1a;mn 等于 N&#xff1b;m≥n&#xff1b;且…

Bayes-RF,基于贝叶斯Bayes优化算法优化随机森林RF分类预测(二分类及多分类皆可)-附代码

Bayesian Optimization&#xff08;贝叶斯优化&#xff09;是一种用于超参数调优的技术&#xff0c;对于类似随机森林&#xff08;Random Forest&#xff0c;简称RF&#xff09;的机器学习算法非常重要。随机森林是一种集成学习方法&#xff0c;它在训练过程中构建多个决策树&a…

漂亮国的无人餐厅的机器人骚操作

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;你的老朋友&#xff0c;老K。行业群 新书《智能物流系统构成与技术实践》 知名企业 读者福利&#xff1a; &#x1f449;抄底-仓储机器人-即买即用-免调试 智能制造-话题精读 1、西门子、ABB、汇川&#x…

详解 Redis 在 Centos 系统上的安装

文章目录 详解 Redis 在 Centos 系统上的安装1. 使用 yum 安装 Redis 52. 创建符号链接3. 修改配置文件4. 启动和停止 Redis 详解 Redis 在 Centos 系统上的安装 1. 使用 yum 安装 Redis 5 如果是Centos8&#xff0c;yum 仓库中默认的 redis 版本就是5&#xff0c;直接 yum i…

Premiere Pro 2024:赋予创意翅膀,让你的视频飞翔 mac/win版

Premiere Pro 2024&#xff0c;作为Adobe旗下的旗舰视频编辑软件&#xff0c;自推出以来&#xff0c;一直在视频制作领域占据着重要的地位。随着技术的不断进步和创新&#xff0c;Premiere Pro 2024为用户带来了前所未有的编辑体验&#xff0c;重新定义了视频制作的标准。 Pre…

Unity类银河恶魔城学习记录12-3 p125 Limit Inventory Slots源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Inventory.cs using Newtonsoft.Json.Linq; using System.Collections; us…

深入go泛型特性之comparable「附案例」

写作背景 如果你经常遇到一些操作&#xff0c;比如将 map 转换为 slice&#xff0c;判断一个字符串是否出现在 map 中&#xff0c;slice 中是否有重复元素等等&#xff0c;那你对下面这个库肯定不陌生。 github.com/samber/lo最近抽业余时间在看了源码&#xff0c;底层用了范…

云计算的安全需求

目录 一、概述 二、云安全服务基本能力要求 三、信息安全服务&#xff08;云计算安全类&#xff09;资质要求 3.1 概述 3.2 资质要求内容 3.2.1 组织与管理要求 3.2.2 技术能力要求 四、云安全主要合规要求 4.1 安全管理机构部门的建立 4.2 安全管理规范计划的编制 4…

【Flutter】Getx设计模式及Provider、Repository、Controller、View等

本文基于Getx 4,x 本本 1、引入 再次接触到Flutter项目&#xff0c;社区俨然很完善和活跃。pubs.dev 寻找状态管理的时候看到很熟悉的Getx时间&#xff0c;俨然发现Getx的版本已到是4.x版本&#xff0c;看到Getx的功能已经非常强大了&#xff0c;庞大的API俨然成为一种开发框架…

Windows Server 2008添加Web服务器(IIS)、WebDAV服务、网络负载均衡

一、Windows Server 2008添加Web服务器&#xff08;IIS&#xff09; &#xff08;1&#xff09;添加角色&#xff0c;搭建web服务器&#xff08;IIS&#xff09; &#xff08;2&#xff09;添加网站&#xff0c;关闭默认网页&#xff0c;添加默认文档 在客户端浏览器输入服务器…

蓝桥杯 十一届C++A组 字符排序 21分(运行超时)

思路&#xff1a; 1. 此题考查的冒泡排序中的交换次数&#xff0c;其实就是考察当前数与后面的逆序对个数问题。而为了最大利用位数&#xff0c;应当使每一位都不小于后面的字符&#xff0c;否则会造成一次逆序对的浪费&#xff08;贪心&#xff0c;为了使总位数最少&#xff…

每日OJ题_优先级队列_堆③_力扣692. 前K个高频单词

目录 力扣692. 前K个高频单词 解析代码 力扣692. 前K个高频单词 692. 前K个高频单词 难度 中等 给定一个单词列表 words 和一个整数 k &#xff0c;返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率&#xff0c…