SpringMvc入坑系列(一)----maven插件启动tomcat

springboot傻瓜式教程用久了,回过来研究下SSM的工作流程,当然从Spring MVC开始,从傻瓜式入门处理请求和页面交互,再到后面深入源码分析。
本人写了一年多的后端和半年多的前端了。用的都是springbioot和vue,源码一直来不及时间看,就先从SSM开刀吧~

一、SpringMvc入门之用tomcat插件使用MVCweb项目打印Hello World!

1、新建一个空项目

File- New-Project -----选择Maven 然后SDK选择1.8

2、新建一个模块开始写web项目

File- New - Module

下一步 - 创建项目的名称

然后填写自己的maven坐标,即可完成模块的创建。

3、填写maven依赖

1、servlet-api的依赖 这个一定要写 <scope>provided</scope> 不然tomcat启动失败
2、既然mvc就要添加webmvc依赖
3、填写tomcat插件依赖
最后 记得刷新maven

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>SpringMvcSimple</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>SpringMvcSimple Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <!--  这里确实必须设置 不然tomcat启动会失败    -->
      <scope>provided</scope>
    </dependency>


    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.10.RELEASE</version>

    </dependency>
  </dependencies>

  <build>
    <finalName>SpringMvcSimple</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <port>8088</port>
          <path>/</path>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

4、配置tomcat容器
1、记得一定要配置工作目录 选择你要启动的项目目录
2、命令行 写 tomcat7:run 这个是会自己提示的,如果没有提示说明你的tomcat插件依赖有问题,记得刷新maven依赖

3、另外这个tomcat启动其实也可以直接从你项目的依赖下启动
即双击即可启动容器

4、项目启动

1、写一个Controller 用来处理请求

@Controller
public class HelloController {

    @RequestMapping("/hello")
    @ResponseBody
    public String hello(){
        return "hello world123";
    }
}

2、配置web mvc环境

这个主要用来配置mvc环境以及 将我们需要的配置注册进来。SpringMvcConfig被注册进来

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    
    /**
     * 用于创建并配置DispatcherServlet应用程序上下文。
     * @return
     */
    @Override
    protected WebApplicationContext createServletApplicationContext() {
         AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
         ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    /**
     * 是一个抽象方法,返回DispatcherServlet映射路径的字符串数组。
     * 哪些路径被mvc 管理
     * @return
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};//所有路径交给 mvc 管理
    }

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

mvc配置
此时自动去扫描我们的com.item.controller包注入到容器中

@Configuration
@ComponentScan({"com.item.controller"})
public class SpringMvcConfig {
}

接下来启动tomcat 访问 端口 http://localhost:8088/hello
即可将请求打到控制层 返回数据
hello world123
至此,一个简单的mvc web应用就启动了。

5、优化加载配置

我们上面用的继承 AbstractDispatcherServletInitializer这个类然后加载我们的mvc配置进而初始化webmvc容器,接下来用 继承 AbstractAnnotationConfigDispatcherServletInitializer完成同样的工作。

public class ServletContainersInitConfig2 extends AbstractAnnotationConfigDispatcherServletInitializer {


    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

这个也能完成初始化webmvc的配置

6、处理乱码问题

post请求乱码

post请求处理乱码(注意是post请求!!!)
添加一个中文编码的过滤器即可
在 刚才写的 AbstractAnnotationConfigDispatcherServletInitializer继承此类 ,实现其 getServletFilters 即可

@Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter=new CharacterEncodingFilter();
        filter.setEncoding(Charset.defaultCharset().name());
        return new Filter[]{filter};
    }

然后使用 curl命令发送post请求

curl 'http://localhost:8088/chinese' -d 'name=你好' -d 'address=哈哈'

控制台打印未出现乱码.

get请求乱码

这个是发送请求是 参数不在请求体中,直接在url后面。这个可以在tomcat插件配置中增加 <uriEncoding>UTF-8</uriEncoding>解决。
发送get请求
curl 'http://localhost:8088/chinese?name=你好&address=123'
发现控制台就不乱码了

7、页面交互处理静态资源

1、报错过程分析

在webapp目录下创建 views/books.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>欢迎来到书籍页面</h1>
</body>
</html>

接下来浏览器输入 http://localhost:8088/views/books.html
报错 :

HTTP Status 404 -
type Status report
message
description The requested resource is not available.
Apache Tomcat/7.0.37

很显然,404找不到资源了。说明mvc不知道如何处理这个资源。它实际上是把这个views/books.html当成请求去controler层匹配请求了。但是我们这个是静态页面,实际就是去访问静态资源而已。那么接下来就是这么让容器知道这个是静态资源?不把它当成请求处理呢?

2、springMVC放行静态资源交给tomcat容器处理

造成的原因
显然在 ServletContainersInitConfig2 类中 我们springMvc拦截了所有的请求。

 @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

解决办法:(有很多种,此处是 继承 WebMvcConfigurationSupport类 然后实现其 添加资源方法 进行放行静态资源。同时记得 此类需要加载到 mvc环境中,具体看下面步骤)

1、配置类过滤静态资源

在 com.item.config 包下 编写 SpringMvcSupport 去实现过滤静态资源
一、注意加上@Configuration 这个是为了 SpringMvcConfig 去扫描这个包时,把它注入到mvc环境中
二、重写 addResourceHandlers 方法 这个就是处理映射请求的。

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    /**
     * 资源处理
     * @param registry
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry
                //当访问 /views/** 这个路径 我们让它 访问资源路径 /views/
                .addResourceHandler("/views/**")
                .addResourceLocations("/views/")
        ;

        super.addResourceHandlers(registry);
    }
}
2、注入到Mvc环境中

一、我们新加了 com.item.config 这个包 就是让他去扫描这个包 注入Mvc中的

@Configuration
@ComponentScan({"com.item.controller","com.item.config"})
public class SpringMvcConfig {
}
最后

启动tomcat容器,访问 http://localhost:8088/views/books.html
可以看到页面

欢迎来到书籍页面

即成功。

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

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

相关文章

【视频笔记】古人智慧与修行

古人的智慧 相由心生、老子悟道、佛祖成佛 多一些思考&#xff0c;多一些精神修炼。 除非我们今天能够产生与人类科技发展相并行的精神变革&#xff0c;否则永远可能也无法跳脱出历史的轮回。 视频来源

爬虫学习-基础库的使用(urllib库)

目录 一、urllib库介绍 二、request模块使用 &#xff08;1&#xff09;urlopen ①data参数 ②timeout参数 &#xff08;2&#xff09;request &#xff08;3&#xff09;高级用法 ①验证 ②代理 ③Cookie 三、处理异常 ①URLError ②HTTPError 四、解析链接 ①urlparse ②…

【C语言】结构体内存对齐

目录 引入结构体 结构的声明 创建和初始化 内部元素的使用&#xff1b; 特殊声明&#xff1a; 结构体在内存中的对齐 练习&#xff1a; 引入结构体 C语言有各种数据类型&#xff0c;我们已经对一些数据类型很熟悉&#xff1a; 整型&#xff08;int&#xff09;- 存储整…

108. 将有序数组转换为二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输…

06-React组件 Redux React-Redux

React组件化&#xff08;以Ant-Design为例&#xff09; 组件化编程&#xff0c;只需要去安装好对应的组件&#xff0c;然后通过各式各样的组件引入&#xff0c;实现快速开发 我们这里学习的是 Ant-design &#xff08;应该是这样&#xff09;&#xff0c;它有很多的组件供我们…

kali linux使用Proxmark3

其实kali linux下已经集成了Proxmark3命令&#xff0c;但是由于Proxmark3是开源设备&#xff0c;有时候系统默认安装的版本并不能很好的使用&#xff0c;因此需要手动编译最新的版本。 step 1 准备Proxmark3编译环境&#xff0c;因为kali linux比较激进&#xff0c;很多老旧的…

【EI会议征稿中】第三届信号处理与通信安全国际学术会议(ICSPCS 2024)

第三届信号处理与通信安全国际学术会议&#xff08;ICSPCS 2024&#xff09; 2024 3rd International Conference on Signal Processing and Communication Security 信号处理和通信安全是现代信息技术应用的重要领域&#xff0c;近年来这两个领域的研究相互交叉促进&#xf…

基于YOLOv7算法的高精度实时海上船只目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时海上船只目标检测系统可用于日常生活中检测与定位海上船只目标&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算法…

配置BFD多跳检测示例

BFD简介 定义 双向转发检测BFD&#xff08;Bidirectional Forwarding Detection&#xff09;是一种全网统一的检测机制&#xff0c;用于快速检测、监控网络中链路或者IP路由的转发连通状况。 目的 为了减小设备故障对业务的影响&#xff0c;提高网络的可靠性&#xff0c;网…

【亲测有效】支持横竖屏 微信小程序video禁止进度条拖动,微信小程序遮罩进度条,

背景&#xff1a;部分课程禁止客户拖动视频进度条直至播放结束 红色是遮罩区域遮罩区域 实际遮罩效果&#xff08;有一个很浅的阴影区域&#xff09; 实现代码 .wxml文件 <video enable-progress-gesture"false" ><cover-view class"cover">…

JAVA全栈开发 day18MySql03

一、复习 为什么要用数据库数据库好处数据库的发展史​ 层次模型​ 网状模型​ 关系模型&#xff08;二维表专门存储数据&#xff0c; 表与表的关联&#xff09;​ 表与表的关系&#xff1a; 1对1 &#xff0c;1对多&#xff0c;多对多​ 非关系模型关系模…

Linux常见压缩指令小结

为什么需要压缩技术 我们都知道文件是以byte作为单位的&#xff0c;如果我们的文件仅仅在低位占一个1 0000 0001这种情况我们完全可以压缩一下&#xff0c;将高位的0全部抹掉即可。 如上所说是一种压缩技术&#xff0c;还有一种就是将1111(此处省略96个)一共100个1&#xff0…

Unity中Shader黑白阀值后处理效果

文章目录 前言一、我们先来PS看一下黑白阀值的效果二、使用step(a,b)函数实现效果三、实现脚本控制黑白阀值1、在Shader属性面板定义控制阀值变量2、把step的a改为_Value3、在后处理脚本设置公共成员变量,并且设置范围为&#xff08;0&#xff0c;1&#xff09;4、在Graphics.B…

vulnhub靶机Prime-2

下载地址&#xff1a;Prime (2021): 2 ~ VulnHub 主机发现 目标145 端口扫描 端口服务扫描 漏洞扫描 先去看一下80 扫目录 发现点不一样的 Wordpress&#xff08;记住还是要用api&#xff09; 好洞出来了看看利用方法 192.168.21.145/wp/wp-content/plugins/gracemedia-media…

【刷题篇】动态规划(六)

文章目录 1、最大子数组和2、环形子数组的最大和3、乘积最大子数组4、乘积为正数的最长子数组长度5、 等差数列划分6、最长湍流子数组 1、最大子数组和 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&…

Proteus仿真--基于12864的自制硬件汉字库的应用

本文介绍基于12864的自制硬件汉字库的应用设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 其中12864LCD中显示的汉字是存储在2块AT24C1024芯片中 仿真图如下 仿真运行视频 Proteus仿真--基于12864的自制硬件字库的应用 附完整Proteus仿真资料代码资料 链接&am…

陀螺仪LSM6DSV16X与AI集成(4)----Qvar触摸电容配置

陀螺仪LSM6DSV16X与AI集成.4--Qvar触摸电容配置 概述视频教学样品申请源码下载生成STM32CUBEMX串口配置IIC配置CS和SA0设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置Qvar 功能的实现和配置设置量程和速率配置过滤链激活 Qvar 功能获取Qvar数据演示 概述 Qvar&#x…

onnxruntime和tensorrt多batch推理

以lenet网络为例。 onnxruntime多batch推理 当batch size为2时&#xff0c;导出如下结构的onnx文件&#xff1a; python推理&#xff1a; import cv2 import numpy as np import onnxruntimeimg0 cv2.imread("2.png", 0) img1 cv2.imread("10.png", …

【MATLAB】基于EEMD分解的信号去噪算法(基础版)

代码操作 【MATLAB】基于EEMD分解的信号去噪算法&#xff08;基础版&#xff09; 代码的主要内容 基于EEMD&#xff08;集合经验模态分解&#xff09;的信号去噪算法通常可以结合相关系数、信号的熵值或者方差贡献率来完成去噪处理。这些指标可以用于确定阈值&#xff0c;从而…

Android:java.lang.RuntimeException: Unable to start activity ComponentInfo

java.lang.RuntimeException: Unable to start activity ComponentInfo 报错描述&#xff1a; 在导入别人项目运行时出现了这个报错&#xff1a; java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.news/com.example.activity.DetailNews}: ja…
最新文章