狂神说SpringMVC02:第一个MVC程序

2023-11-04

狂神说SpringMVC系列连载课程,通俗易懂,基于Spring5版本(视频同步),欢迎各位狂粉转发关注学习。未经作者授权,禁止转载

Hello,SpringMVC

在上一节中,我们讲解了 什么是SpringMVC以及它的执行原理!

狂神说SpringMVC01:什么是SpringMVC

现在我们来看看如何快速使用SpringMVC编写我们的程序吧!

配置版

1、新建一个Moudle , springmvc-02-hello , 添加web的支持!

2、确定导入了SpringMVC 的依赖!

3、配置web.xml  , 注册DispatcherServlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
        version="4.0">


   <!--1.注册DispatcherServlet-->
   <servlet>
       <servlet-name>springmvc</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
       <init-param>
           <param-name>contextConfigLocation</param-name>
           <param-value>classpath:springmvc-servlet.xml</param-value>
       </init-param>
       <!--启动级别-1-->
       <load-on-startup>1</load-on-startup>
   </servlet>


   <!--/ 匹配所有的请求;(不包括.jsp)-->
   <!--/* 匹配所有的请求;(包括.jsp)-->
   <servlet-mapping>
       <servlet-name>springmvc</servlet-name>
       <url-pattern>/</url-pattern>
   </servlet-mapping>


</web-app>

4、编写SpringMVC 的 配置文件!名称:springmvc-servlet.xml  : [servletname]-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"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">


</beans>

5、添加 处理映射器

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

6、添加 处理器适配器

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

7、添加 视图解析器

<!--视图解析器:DispatcherServlet给他的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
   <!--前缀-->
   <property name="prefix" value="/WEB-INF/jsp/"/>
   <!--后缀-->
   <property name="suffix" value=".jsp"/>
</bean>

8、编写我们要操作业务Controller ,要么实现Controller接口,要么增加注解;需要返回一个ModelAndView,装数据,封视图;

package com.kuang.controller;


import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


//注意:这里我们先导入Controller接口
public class HelloController implements Controller {


   public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
       //ModelAndView 模型和视图
       ModelAndView mv = new ModelAndView();


       //封装对象,放在ModelAndView中。Model
       mv.addObject("msg","HelloSpringMVC!");
       //封装要跳转的视图,放在ModelAndView中
       mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp
       return mv;
  }
   
}

9、将自己的类交给SpringIOC容器,注册bean

<!--Handler-->
<bean id="/hello" class="com.kuang.controller.HelloController"/>

10、写要跳转的jsp页面,显示ModelandView存放的数据,以及我们的正常页面;

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>Kuangshen</title>
</head>
<body>
${msg}
</body>
</html>

11、配置Tomcat 启动测试!

可能遇到的问题:访问出现404,排查步骤:

  1. 查看控制台输出,看一下是不是缺少了什么jar包。

  2. 如果jar包存在,显示无法输出,就在IDEA的项目发布中,添加lib依赖!

  3. 重启Tomcat 即可解决!

小结:看这个估计大部分同学都能理解其中的原理了,但是我们实际开发才不会这么写,不然就疯了,还学这个玩意干嘛!我们来看个注解版实现,这才是SpringMVC的精髓,到底有多么简单,看这个图就知道了。

注解版

1、新建一个Moudle,springmvc-03-hello-annotation 。添加web支持!

2、由于Maven可能存在资源过滤的问题,我们将配置完善

<build>
   <resources>
       <resource>
           <directory>src/main/java</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>false</filtering>
       </resource>
       <resource>
           <directory>src/main/resources</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>false</filtering>
       </resource>
   </resources>
</build>

3、在pom.xml文件引入相关的依赖:主要有Spring框架核心库、Spring MVC、servlet , JSTL等。我们在父依赖中已经引入了!

4、配置web.xml

注意点:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
        version="4.0">


   <!--1.注册servlet-->
   <servlet>
       <servlet-name>SpringMVC</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <!--通过初始化参数指定SpringMVC配置文件的位置,进行关联-->
       <init-param>
           <param-name>contextConfigLocation</param-name>
           <param-value>classpath:springmvc-servlet.xml</param-value>
       </init-param>
       <!-- 启动顺序,数字越小,启动越早 -->
       <load-on-startup>1</load-on-startup>
   </servlet>


   <!--所有请求都会被springmvc拦截 -->
   <servlet-mapping>
       <servlet-name>SpringMVC</servlet-name>
       <url-pattern>/</url-pattern>
   </servlet-mapping>


</web-app>

/ 和 /* 的区别:< url-pattern > / </ url-pattern > 不会匹配到.jsp, 只针对我们编写的请求;即:.jsp 不会进入spring的 DispatcherServlet类 。< url-pattern > /* </ url-pattern > 会匹配 *.jsp,会出现返回 jsp视图 时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。

  • 注意web.xml版本问题,要最新版!

  • 注册DispatcherServlet

  • 关联SpringMVC的配置文件

  • 启动级别为1

  • 映射路径为 / 【不要用/*,会404】

5、添加Spring MVC配置文件

在resource目录下添加springmvc-servlet.xml配置文件,配置的形式与Spring容器配置基本类似,为了支持基于注解的IOC,设置了自动扫描包的功能,具体配置信息如下:

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


   <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
   <context:component-scan base-package="com.kuang.controller"/>
   <!-- 让Spring MVC不处理静态资源 -->
   <mvc:default-servlet-handler />
   <!--
   支持mvc注解驱动
       在spring中一般采用@RequestMapping注解来完成映射关系
       要想使@RequestMapping注解生效
       必须向上下文中注册DefaultAnnotationHandlerMapping
       和一个AnnotationMethodHandlerAdapter实例
       这两个实例分别在类级别和方法级别处理。
       而annotation-driven配置帮助我们自动完成上述两个实例的注入。
    -->
   <mvc:annotation-driven />


   <!-- 视图解析器 -->
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
         id="internalResourceViewResolver">
       <!-- 前缀 -->
       <property name="prefix" value="/WEB-INF/jsp/" />
       <!-- 后缀 -->
       <property name="suffix" value=".jsp" />
   </bean>


</beans>

在视图解析器中我们把所有的视图都存放在/WEB-INF/目录下,这样可以保证视图安全,因为这个目录下的文件,客户端不能直接访问。

  • 让IOC的注解生效

  • 静态资源过滤 :HTML . JS . CSS . 图片 , 视频 .....

  • MVC的注解驱动

  • 配置视图解析器

6、创建Controller

编写一个Java控制类:com.kuang.controller.HelloController , 注意编码规范

package com.kuang.controller;


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;


@Controller
@RequestMapping("/HelloController")
public class HelloController {


   //真实访问地址 : 项目名/HelloController/hello
   @RequestMapping("/hello")
   public String sayHello(Model model){
       //向模型中添加属性msg与值,可以在JSP页面中取出并渲染
       model.addAttribute("msg","hello,SpringMVC");
       //web-inf/jsp/hello.jsp
       return "hello";
  }
}
  • @Controller是为了让Spring IOC容器初始化时自动扫描到;

  • @RequestMapping是为了映射请求路径,这里因为类与方法上都有映射所以访问时应该是/HelloController/hello;

  • 方法中声明Model类型的参数是为了把Action中的数据带到视图中;

  • 方法返回的结果是视图的名称hello,加上配置文件中的前后缀变成WEB-INF/jsp/hello.jsp。

7、创建视图层

在WEB-INF/ jsp目录中创建hello.jsp , 视图可以直接取出并展示从Controller带回的信息;

可以通过EL表示取出Model中存放的值,或者对象;

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>SpringMVC</title>
</head>
<body>
${msg}
</body>
</html>

8、配置Tomcat运行

配置Tomcat ,  开启服务器 , 访问 对应的请求路径!

OK,运行成功!

小结

实现步骤其实非常的简单:

  1. 新建一个web项目

  2. 导入相关jar包

  3. 编写web.xml , 注册DispatcherServlet

  4. 编写springmvc配置文件

  5. 接下来就是去创建对应的控制类 , controller

  6. 最后完善前端视图和controller之间的对应

  7. 测试运行调试.

使用springMVC必须配置的三大件:

处理器映射器、处理器适配器、视图解析器

通常,我们只需要手动配置视图解析器,而处理器映射器处理器适配器只需要开启注解驱动即可,而省去了大段的xml配置

再来回顾下原理吧~

下面我们准备研究下Controller及RestFul风格!

end

视频同步更新,这次一定!

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

狂神说SpringMVC02:第一个MVC程序 的相关文章

  • VJ 4 F - ABC087C AtCoder - 3881(dp)

    Problem Statement We have a 2 N grid We will denote the square at the i th row and j th column 1 i 2 1 j N as i j You ar
  • Idea快捷键(Windows系统)

    Idea快捷键 1 生成get set toString 构造方法 重写父类方法等 快捷键 Alt Insert 在进行set方法时 可以选择链式编程 2 复制一份当前代码 快捷键 Ctrl D 3 自动补全变量名 快捷键 Alt Ente
  • RData的保存与加载

    最好的存储R中数据的格式是保存为 RData RData 也称为 rda文件 是R专属的文件 可以保存海量文件 rds Rds files store a single R object 和 Rdata 也称为 rda 文件 可以用于以R原
  • 经典排序算法总结

    简介 java系列技术分享 持续更新中 初衷 一起学习 一起进步 坚持不懈 如果文章内容有误与您的想法不一致 欢迎大家在评论区指正 希望这篇文章对你有所帮助 欢迎点赞 收藏 留言 更多文章请点击 文章目录 一 冒泡排序 1 1 排序原理 1
  • C语言数组介绍(详解)

    数组目录 数组概念 一维数组 维数组的创建和初始化 一维数组的基本创建 一维数组的初始化 数组的类型 一维数组的使用 数组下标 数组元素的打印 数组的输入 一维数组内存中的储存 如何用sizefo计算数组元素个数 二维数组 二维数字的概念
  • 如何用安装启动盘启动计算机,用u盘启动电脑进入系统安装 如何进入启动u盘安装系统...

    U盘是现在安装系统最常用到的工具 而且大部分的电脑都支持U盘启动 通过启动热键或BIOS设置都可以进入U盘启动 下面介绍一下如何进入启动u盘安装系统 用u盘启动电脑进入系统安装步骤阅读 1 将U盘插在电脑的USB接口 开机并不断按下启动U盘
  • 神经网络参数优化总结

    神经网络参数优化总结1 一般而言 对神经 网络的调节包括 学习速率 Momentum 动量梯度下降法 的参数beta Adam优化算法的参数 beta1 beta2 神经网络层数 不同层中隐藏单元数量 学习率衰减等 1 对于学习率 1 gi
  • 【Cocos Creator 3D快捷方式】Cocos Creator 3D场景基本操作与快捷方式

    3D场景记住以下操作就可以了 a 双击节点 让节点来到我们视野中央 要看哪个物体 我们只要双击这个节点 b 拉远拉近 鼠标滚轮滚动 拉远 拉近操作 c 按住alt 鼠标左键按下 拖动 360度来查看我们的节点模型 d 鼠标右键 wsad 这
  • unity Editor下批量设置材质球中的贴图部分:

    批量设置材质球中Main Maps部分贴图包含 Albedo Metallic Nomap Occlusion 脚本存放位置 放在在Editor目录之下 点击 window 之下的AddMaterialBall 资源存放位置 所有的材质球和
  • 【牛客SQL】SQL23 对所有员工的薪水按照salary降序进行1-N的排名

    题目描述 描述 有一个薪水表salaries简况如下 对所有员工的薪水按照salary降序进行1 N的排名 要求相同salary并列且按照emp no升序排列 示例1 输入 drop table if exists salaries CRE
  • 一线城市重金扶持区块链项目 2020年产业规模将超百亿元

    导读 从2017年开始 区块链不仅掀起了行业热浪 也引来了地方政府的极大关注 一线城市开始重金扶持区块链项目 据统计 北京对单个区块链项目最高扶持额上限500万元 广州为上限300万元 深圳上限200万元 一 群雄逐鹿 黄埔领先 作为广州第
  • [ICCV2019]Deep Single-Image Portrait Relighting

    标题 Deep Single Image Portrait Relighting 链接 http openaccess thecvf com content ICCV 2019 papers Zhou Deep Single Image P
  • stm32串口IAP例程解析

    例程获取 可以通过访问官方网站www st com获取示例代码和应用笔记 示例代码 x cube iap usart 应用笔记 an4657 同时本文涉及的所有资料可以从此下载 链接 https pan baidu com s 19nKPc
  • VS2022编译OBS29.1之后的版本

    OBS仓库 https github com obsproject obs studio 在OBS 29 1之前 windows系统编译时需要手动下载deps依赖库文件 具体可参考我的另一篇博客 vs2019编译obs 编译视频 vs201
  • openGL API 之glDrawBuffer(GL_NONE);

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一 glDrawBuffer官网 二 翻译 前言 openGL API 之glDrawBuffer GL NONE 详解 一 glDrawBuffer官网 glDrawBu
  • 删除 KubeSphere 中一直卡在 Terminating 的 Namespace

    问题 最近一直在玩 KubeSphere 使用kubesphere delete sh删除KubeSphere 执行一段时间后发面ns删除不了 使用强制命令还是无法删除 kubectl delete ns kubesphere monito
  • 一文读懂SQL的增删改查(基础教程)

    前言 一 一些最重要的 SQL 命令 二 查询 SELECT 1 查询所有列 2 查询指定列 3 查询并去重 DISTINCT 4 按条件查询where 5 SQL AND OR 运算符 6 SQL ORDER BY 关键字 7 SQL L
  • 代码pytorch-adda-master跑通记录

    前言 最近在学习迁移学习 ADDA算法 由于嫌自己写麻烦 准备先跑通别人的代码 代码名称 pytorch adda master 博客 https www cnblogs com BlairGrowing p 17020378 html g
  • .NET MVC + vue 前后端不分离--基本配置

    啊我是第一次接触前后不分离的vue项目 记录一下遇到的困难 一 vue要怎么放进 NET 项目里面 1 安装webpack 如果文件后缀用 vue的话 npm install webpack g 全局的安装 webpack v 查看是否安装
  • Python机器学习基础教程

    文章目录 监督学习与预处理 无监督学习的类型 数据集变换 聚类 无监督学习的挑战 预处理与缩放 应用数据变换 对训练数据和测试数据进行相同的缩放 预处理对监督学习的作用 降维 特征提取与流形学习 主成分分析 将PCA应用于cancer数据集

随机推荐

  • C#FTP操作类含下载上传删除获取目录文件及子目录列表等等

    ftp登陆格式 ftp 帐号 密码 IP 端口 ftp 用户名 密码 FTP服务器IP或域名 FTP命令端口 路径 文件名 直接上代码吧 根据需要选择函数 可根据业务自己修改 如日志记录 提示等等 using System using Sy
  • 职工工资程序c语言doc,c语言职工工资管理程序代码.doc

    c语言职工工资管理程序代码 include include include include define N 3 void enter int menu void input void search void search number v
  • r语言如何将图变成矩阵?_SPSS矩阵散点图:多变量关系探查利器

    多变量关系探查 矩阵散点图是非常不错的选择 是可视化利器 假设你有5个指标数据要考察两两之间关系 不需要依次制作10个散点图 矩阵散点图可以 一次搞定 在一个大坐标下完成所有散点图的绘制 按照矩阵的形式呈现出来 更高效 SPSS提供独特的散
  • C++ 学习大纲

    一 C 基本语法知识点 二 数据结构和基本算法 刷题 三 数据库 四 并行 五 网络编程 socket编程 服务器开发 并行量吞吐量稳定性 六 库的使用 引入第三方库 boost库 七 操作系统的知识
  • 四元数-坐标系转换-旋转-转欧拉角

    1 四元数世界坐标系转换到父节点坐标系下 公式 Q Q父 1 Q子 把四元数转到父坐标系下 ChildLocalQuat VDFULL GetChildLocalQuat quaternion father quaternion child
  • Qt子线程的“信号队列”(转载)

    对Qt的多线程编程没有深究 只了解了基本的用法 够我用就行了 之所以写这篇文章是因为前几天遇到一个疑问 如果其他几个线程同时向一个线程发signal 而这个线程没有自己的事件循环 那是不是会丢失signal呢 下面是我总结的两种子线程的工作
  • Android开发把项目打包成apk

    做完一个Android项目之后 如何才能把项目发布到Internet上供别人使用呢 我们需要将自己的程序打包成Android安装包文件 APK Android Package 其后缀名为 apk 将APK文件直接上传到Android模拟器或
  • (2021,FastGAN)用于高保真 few-shot 图像合成的更快、更稳定的 GAN 训练

    Towards faster and stabilized gan training for high fidelity few shot image synthesis 公众号 EDPJ 目录 0 摘要 1 简介 2 相关工作 3 方法
  • 在windows中ohmyzsh 的powerlevel10k主题及插件推荐

    1 安装powerlevel10k git clone https github com romkatv powerlevel10k git ZSH CUSTOM themes powerlevel10k 配置ohmyzsh 主题 vim
  • Java初识泛型

    目录 一 包装类 1 基本数据类型和对应的包装类 2 装箱和拆箱 3 自动装箱和自动拆箱 二 什么是泛型 三 引出泛型 1 泛型的语法 四 泛型类的使用 1 语法 2 示例 3 类型推导 Type Inference 六 泛型如何编译的 1
  • 计算机组成原理题库(2)

    计算机网络题库 目录 计算机网络题库 1 选择题 2 填空题 3 分析判断题 可能会有重复 大家跳着看 4 计算题 5 简述题 1 选择题 1 总线通信中 若发送方和接收方设备的速度有差异 但不是特别大 则最适合选择 时序控制方式 A 同步
  • unity打开VS2017异常解决 unity打开VS2017很慢 unity只打开mono

    早几天开始安装了VS2017 关联好unity 但后续使用编译脚本时 发现经常打开很慢 最后总是打开mono 检查过自己的关联没有错误 也试着修复了几次VS 上网搜了几遍 连老外的网站都看了 最后找到的解决方案是更换成VS2015 原因在于
  • PyTorch深度学习实战(8)——批归一化

    PyTorch深度学习实战 8 批归一化 0 前言 1 批归一化原理 2 批归一化优势 3 批归一化对模型训练的影响 3 1 未使用批归一化 且输入值较小 3 2 使用批归一化 且输入值较小 3 3 使用批归一化 且输入值较大 小结 系列链
  • element ui自定义主题

    一 在element ui 里找到自定义主题 1 1 在自定义主题 设置对应的颜色 并下载 1 2 在项目目录下安装element theme element theme chalk npm i element theme chalk 2
  • virtio sr-iov

    虚拟机规格 12核 32G内存 负载模拟 利用bc将CPU所有核占用提高的98 echo scale 500000 4 a 1 bc l q VirtIO 9 37 Gbps 4 5 12 SR IOV 9 40 Gbps 4 5 7 低负
  • 蓝桥杯单片机组经验分享之(一)引言

    一 开篇激励 蓝桥杯单片机组真的是非常容易拿奖的 尤其是省赛 水军特别多 结合我以及我的师兄师姐的参赛经验 基本上编程题全部完成就能保证省一了 至少广东是这情况 至于想拿国一的话得靠平时专业知识的积累了 只靠程序高分是拿不到国一的 第八届我
  • 小程序使用 企业微信客户服务插件(联系我) contactPlugin

    小程序插件接入步骤 1 开发者在小程序管理后台申请使用插件 添加路径 设置 gt 第三方服务 gt 插件管理 gt 添加插件 搜索并添加插件ID wx104a1a20c3f81ec2 无需审核确认 设置 第三方服务 插件管理 添加插件 2
  • 【Linux初阶】信号入门

    hello 各位读者大大们你们好呀 系列专栏 Linux初阶 本篇内容 Linux信号的基本概念 生活信号 技术信号 信号生命周期 信号的保存位置和发送本质 信号的产生 四种方式 一个系统调用接口 作者简介 计算机海洋的新进船长一枚 请多多
  • vue自定义指令-加载指令v-loading和占位图指令v-showimg

    了解自定义指令的钩子函数 bind 每当指令绑定到元素上的时候 就会立刻执行bind这个函数 只调用一次 和css相关的操作 可以放在这个钩子函数中 inserted 元素插入到DOM中的时候 会执行inserted函数 只调用一次 upd
  • 狂神说SpringMVC02:第一个MVC程序

    狂神说SpringMVC系列连载课程 通俗易懂 基于Spring5版本 视频同步 欢迎各位狂粉转发关注学习 未经作者授权 禁止转载 Hello SpringMVC 在上一节中 我们讲解了 什么是SpringMVC以及它的执行原理 狂神说Sp