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/javaee
    http://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/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL语言

一、DDL数据库定义语言 1、登录mySQL mysql -u"用户名" -p"密码" -h"登录地址 -h&#xff1a;默认为本机 示例&#xff1a; 2、查看当前存在的数据库 show databases; 示例&#xff1a; 3、创建数据库database create…

Jenkins (五) - Docker SonarQube

Jenkins (五) - Docker SonarQube Jenkins 集成 SonarQube&#xff0c;编译项目并通过SonarQube分析项目 前提 基于已有的环境 Jenkins (四) - Docker SonarQube 基于 Jenkins (三) - 拉取编译 上的mockito-demo工程 配置工程 Administration -> Projects -> Manage…

Java数据结构队列

队列(Queue) 概念 队列的使用 注意&#xff1a;Queue是个接口&#xff0c;在实例化时必须实例化LinkedList的对象&#xff0c;因为LinkedList实现了Queue接口。 import java.util.LinkedList; import java.util.Queue;public class Test {public static void main(String[]…

使用GPT需要注意的事项

GPT出来之后&#xff0c;基本就告别浏览器搜索问题答案了。将问题原封不动的copy给GPT基本可以得到解答。 但是这个也有弊端&#xff0c;那就是太依赖GPT了。 1&#xff0c;使用GPT需要更强的专业知识&#xff1a;除了能问对问题&#xff0c;还要具备识别GPT&q…

VPDN(L2TP、PPTP)

1、虚拟专用拨号网络 远程接入VPN&#xff0c;客户端可以是PC机 技术&#xff1a;L2TP、PPTP 术语&#xff1a;LAC&#xff1a;L2TP的访问集中器 --- 提供用户的接入 LNS&#xff1a;L2TP的网络服务器 --- 提供L2TP服务的服务器 2、技术 1&#xff09;PPTP 点对点隧道…

深入理解Java匿名内部类(day21)

在Java编程中&#xff0c;匿名内部类是一种非常有用的特性&#xff0c;它允许我们定义和实例化一个类的子类或实现一个接口&#xff0c;而无需给出子类的名称。这种特性使得代码更加简洁、紧凑&#xff0c;尤其适用于一些只使用一次的临时对象。本文将深入探讨Java匿名内部类的…

租用阿里云的服务器多少钱?30元、61元、99元、165元、199元

租个阿里云的服务器多少钱&#xff1f;很便宜&#xff0c;云服务器2核2G3M固定带宽99元一年、2核4G服务器30元3个月、199元一年&#xff0c;轻量应用服务器2核2G3M配置61元一年、2核4G4M带宽165元一年&#xff0c;可以在阿里云CLUB中心查看 aliyun.club 当前最新的优惠券和活动…

基于Socket简单的TCP网络程序

⭐小白苦学IT的博客主页 ⭐初学者必看&#xff1a;Linux操作系统入门 ⭐代码仓库&#xff1a;Linux代码仓库 ❤关注我一起讨论和学习Linux系统 TCP单例模式的多线程版本的英汉互译服务器 我们先来认识一下与udp服务器实现的不同的接口&#xff1a; TCP服务器端 socket()&…

基于单片机电子密码锁系统设计

**单片机设计介绍&#xff0c;基于单片机电子密码锁系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机电子密码锁系统设计概要主要包括以下几个方面&#xff1a; 一、系统概述 基于单片机电子密码锁系统是一个…

打造你的专属云开发环境:支持任意 IDE,任意云服务 | 开源日报 No.215

loft-sh/devpod Stars: 6.9k License: MPL-2.0 devpod 是一个开源的、仅限客户端的、不受限制的工具&#xff0c;可以与任何集成开发环境&#xff08;IDE&#xff09;一起使用&#xff0c;并允许您在任何云端、Kubernetes 或本地 Docker 上进行开发。 使用 devcontainer.json…

贪心算法|45.跳跃游戏II

力扣题目链接 class Solution { public:int jump(vector<int>& nums) {if (nums.size() 1) return 0;int curDistance 0; // 当前覆盖最远距离下标int ans 0; // 记录走的最大步数int nextDistance 0; // 下一步覆盖最远距离下标for (int i 0;…

qt-C++笔记之QLabel加载图片

qt-C笔记之QLabel加载图片 —— 2024-04-06 夜 code review! 文章目录 qt-C笔记之QLabel加载图片0.文件结构1.方法一&#xff1a;把图片放在项目路径下&#xff0c;在 .pro 文件中使用 DISTFILES添加图片文件1.1.运行1.2.qt_test.pro1.3.main.cpp 2.方法二&#xff1a;不在 .pr…

深入浅出 -- 系统架构之分布式集群的分类

一、单点故障问题 集群&#xff0c;相信诸位对这个概念并不陌生&#xff0c;集群已成为现时代中&#xff0c;保证服务高可用不可或缺的一种手段。 回想起初集中式部署的单体应用&#xff0c;因为只有一个节点&#xff0c;因此当该节点出现任意类型的故障&#xff08;网络、硬件…

go | 上传文件分析 | http协议分析 | 使用openssl 实现 https 协议 server.key、server.pem

是这样的&#xff0c;现在分析抓包数据 test.go package mainimport ("fmt""log""github.com/gin-gonic/gin" )func main() {r : gin.Default()// Upload single filer.MaxMultipartMemory 8 << 20r.POST("/upload", func(c *g…

【单片机】心率传感器,串口发送,MAX30102心率传感器模块

数值还是稳定的&#xff0c;但太贵了&#xff0c;stm32单片机的话&#xff0c;直接用这篇博客&#xff08;https://qq742971636.blog.csdn.net/article/details/137359381&#xff09;的代码&#xff0c;一样稳定。 解析这个模块的数据 char rev_max30102_bufferdata[30]; cha…

Flutter学习12 - SharedPreferences

1、shared_preferences 插件 类似于 Android 中的 SharedPreferences&#xff0c;键值对的形式进行本地存储 1.1、引入插件 在 pubspec.yaml 中引入 dependencies:shared_preferences: ^2.1.0在需要用到的文件中引入 import package:shared_preferences/shared_preference…

安全的通信协议HTTPS被攻击改采用什么防护方案

随着互联网的发展&#xff0c;保护用户在网上交换的敏感信息的安全性变得至关重要。HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;作为一种安全的通信协议&#xff0c;通过加密数据传输&#xff0c;保护用户的隐私和数据安全。然而&#xff0c;尽管HTTPS提…

Ubuntu部署LangChain-Chatchat

个人博客&#xff1a;https://blog.lukeewin.top 更多内容欢迎访问我的博客。 一、环境 OS: Ubuntu 20.04 PyTorch: 2.0.0 Python: 3.8 CUDA: 11.8 GPU: RTX 4090 24GB CPU: 12 vCPU Intel(R) Xeon(R) Platinum 8352V CPU 2.10GHz RAM: 90GB 硬盘: 180GB LLM: Chatglm3-6b E…

ubuntu20.04.6安装sshd服务,并连接到远程服务器

文章目录 sshd 是 OpenSSH 服务器的守护进程OpenSSH下载在 Ubuntu 上&#xff0c;可以按照以下步骤来管理 sshd 服务 防火墙开启22端口使用Mobaxterm链接服务器 sshd 是 OpenSSH 服务器的守护进程 它负责提供远程登录和安全的 shell 服务。通过启动 sshd 服务&#xff0c;可以…

小米汽车su7全色系展示源码

源码简介 小米汽车全色系展示源码&#xff0c;小米汽车su7全色系展示源码 安装教程 纯HTML&#xff0c;直接将压缩包上传网站目录解压即可 首页截图 源码下载 小米汽车su7全色系展示源码-小8源码屋源码简介 小米汽车全色系展示源码&#xff0c;小米汽车su7全色系展示源码 …