当前位置: 首页 > news >正文

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")@ResponseBodypublic String hello(){return "hello world123";}
}

2、配置web mvc环境

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

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {/*** 用于创建并配置DispatcherServlet应用程序上下文。* @return*/@Overrideprotected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringMvcConfig.class);return ctx;}/*** 是一个抽象方法,返回DispatcherServlet映射路径的字符串数组。* 哪些路径被mvc 管理* @return*/@Overrideprotected String[] getServletMappings() {return new String[]{"/"};//所有路径交给 mvc 管理}@Overrideprotected 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 {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[0];}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
}

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

6、处理乱码问题

post请求乱码

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

@Overrideprotected 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拦截了所有的请求。

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

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

1、配置类过滤静态资源

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

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {/*** 资源处理* @param registry*/@Overrideprotected 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
可以看到页面

欢迎来到书籍页面

即成功。

相关文章:

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

springboot傻瓜式教程用久了&#xff0c;回过来研究下SSM的工作流程&#xff0c;当然从Spring MVC开始&#xff0c;从傻瓜式入门处理请求和页面交互&#xff0c;再到后面深入源码分析。 本人写了一年多的后端和半年多的前端了。用的都是springbioot和vue&#xff0c;源码一直来…...

Leetcode—337.打家劫舍III【中等】

2023每日刷题&#xff08;五十二&#xff09; Leetcode—337.打家劫舍III 算法思想 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(null…...

列表标签的介绍与使用

列表的作用&#xff1a; 整齐、整洁、有序&#xff0c;它作为布局会更加自由和方便。 根据使用情景不同&#xff0c;列表可以分为三大类&#xff1a;无序列表、有序列表和自定义列表 无序列表 <ul> 标签表示 HTML 页面中项目的无序列表&#xff0c;一般会以项目符号呈…...

浅谈什么是语音芯片的白噪音支持功能:打造舒适家居与优质音频体验

随着科技的不断进步和人们对生活质量要求的提升&#xff0c;语音芯片已经成为了现代电子产品中不可或缺的一部分。而在这些语音芯片中&#xff0c;支持白噪音的功能逐渐受到人们的关注。本文将围绕语音芯片中的白噪音支持功能展开讨论&#xff0c;带您领略其带来的舒适家居与优…...

【QED】高昂的猫 Ⅰ

目录 题目背景题目描述输入格式输出格式 测试样例样例说明数据范围 思路核心代码 题目背景 这是小橘。因为它总是看起来很高傲&#xff0c;所以人送外号“高昂的猫”。 题目描述 "锕狗"的房间里放着 n n n ( 1 ≤ n ≤ 1 0 9 ) (1 \leq n \leq 10^9) (1≤n≤109)个…...

Redis如何做内存优化?

Redis如何做内存优化&#xff1f; 1、缩短键值的长度 缩短值的长度才是关键&#xff0c;如果值是一个大的业务对象&#xff0c;可以将对象序列化成二进制数组&#xff1b; 首先应该在业务上进行精简&#xff0c;去掉不必要的属性&#xff0c;避免存储一些没用的数据&#xff1…...

倪海厦:教你正确煮中药,发挥最大药效

同样的一个汤剂&#xff0c;我开给你&#xff0c;你如果煮的方法不对&#xff0c;吃下去效果就没那么好。 所以&#xff0c;汤&#xff0c;取它的迅捷&#xff0c;速度很快&#xff0c;煮汤的时候还有技巧&#xff0c;你喝汤料的时候&#xff0c;你到底是喝它的气&#xff0c;…...

C++学习笔记:继承

继承 什么是继承?继承的写法基类和派生类的赋值转换继承中的作用域派生类的默认成员函数单继承,多继承,虚拟继承is-a 和 has-a 什么是继承? 继承是C语言面向对象的三大特性之一&#xff0c;是面向对象程序设计使代码可以复用的最重要的手段,基本都是在一个类的基础上为了增加…...

音频/视频、信息和通信技术设备安全标准UL62368-1

UL 62368-1&#xff0c;第 3 版&#xff0c;2019 年 12 月 13 日- UL 音频/视频、信息和通信技术设备安全标准 - 第 1 部分&#xff1a;安全要求 IEC 62368 的这一部分适用于该领域内电气和电子设备的安全音频、视频、信息和通信技术&#xff0c;以及额定电压不超过 600 V 的商…...

macos下安装科研绘图软件Origin

科研人必备软件Origin&#xff0c;主要是考虑到很多期刊都要求绘制origin可编辑的图&#xff0c;所以有些时候必须用这个软件&#xff0c;但是这个软件macos并不支持&#xff0c;所以必须考虑其他的方案&#xff0c;我没有安装虚拟机&#xff0c;而是使用crossover 安装crosso…...

安全快速地删除 MySQL 大表数据并释放空间

一、需求 按业务逻辑删除大量表数据操作不卡库&#xff0c;不能影响正常业务操作操作不能造成 60 秒以上的复制延迟满足以上条件的前提下&#xff0c;尽快删除数据并释放所占空间 表结构如下&#xff1a; create table space_visit_av (userid bigint(20) not null comment 用…...

未使用 “严格模式“(js的问题)

"严格模式"&#xff08;即在JavaScript源文件的开头包括 "use strict"&#xff1b;&#xff09;是一种自愿在运行时对JavaScript代码执行更严格的解析和错误处理的方式&#xff0c;同时也使它更安全。 但是&#xff0c;不使用严格模式本身并不是一个 &quo…...

Verilog基础:$random系统函数的使用

相关阅读 Verilog基础​编辑https://blog.csdn.net/weixin_45791458/category_12263729.html $random系统函数语法的BNF范式如下所示&#xff0c;有关BNF范式相关内容&#xff0c;可以浏览以往文章Verilog基础&#xff1a;巴科斯范式(BNF)。 $random系统函数在每次调用时返回一…...

数据库Delete的多种用法

数据库的Delete操作是用来删除数据库中的数据记录的&#xff0c;它是数据库操作中的一种重要操作&#xff0c;能够帮助用户删除不需要的数据&#xff0c;以便保持数据库的整洁和高效。在使用Delete操作时&#xff0c;需要注意确保操作的准确性和安全性&#xff0c;以免误删重要…...

鸿蒙前端开发-构建第一个ArkTS应用(Stage模型)

创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发&#xff08;本文以应用开发为例&#xff0c;Atomic Serv…...

从零开始搭建链上dex自动化价差套利程序(12)

其他品种 扩展到其他币种的价差套利 1.eth 新建文件get_depth_data_eth.py import asyncio from apexpro.http_public import HttpPublic from dydx3 import Client from dydx3.constants import MARKET_ETH_USD# 定义交易对列表 symbol ETHUSDC market MARKET_ETH_USD# …...

MySQL 数据库如何实现 XA 规范?

本文我们来讨论 MySQL 的 XA 规范有哪些应用相关的内容。 MySQL 为我们提供了分布式事务解决方案&#xff0c;在前面的内容中提到过 binlog 的同步&#xff0c;其实是 MySQL XA 规范的一个应用&#xff0c;那么 XA 规范是如何定义的&#xff0c;具体又是如何应用的呢&#xff…...

SVN修改已提交版本的日志方法

1.在工做中一直是使用svn进行項目的版本控制的&#xff0c;有时候因为提交匆忙&#xff0c;或是忘了添加Log&#xff0c;或是Log内容有错误。遇到此类状况&#xff0c;想要在查看项目的日志时添加log或是修改log内容&#xff0c;遇到以下错误&#xff1a; Repository has not b…...

ArkUI组件--Text组件

1.声明Text组件并设置文本内容 Text(content?:string|Recource) #两种数据类型&#xff0c;字符串和本地资源文件 ①string格式&#xff0c;直接填写文本内容 Text(需要显示的文本) ②Recource格式&#xff0c;读取本地资源文件 Text($r(app.string.width_label)) 读取图…...

mysql的组合查询

mysql的组合查询 1、mysql的内连接查询 在 MySQL 中&#xff0c;内连接&#xff08;INNER JOIN&#xff09;是一种根据两个或多个表之间的匹配条件&#xff0c;将多个表中的数据进行联接的操作。内连接只返回符合联接条件的行&#xff0c;而不会返回未匹配的行。 内连接的语…...

Vue-Tree-List:轻松构建优雅树形结构的Vue组件指南

Vue-Tree-List&#xff1a;轻松构建优雅树形结构的Vue组件指南 【免费下载链接】vue-tree-list &#x1f332;A vue component for tree structure 项目地址: https://gitcode.com/gh_mirrors/vu/vue-tree-list 你是否曾为在Vue项目中实现复杂的树形结构而感到头疼&…...

掌握SRA Tools:3步轻松处理高通量测序数据的高效工具

掌握SRA Tools&#xff1a;3步轻松处理高通量测序数据的高效工具 【免费下载链接】sra-tools SRA Tools 项目地址: https://gitcode.com/gh_mirrors/sr/sra-tools SRA Tools是处理NCBI Sequence Read Archive数据的核心工具集&#xff0c;让你可以轻松地下载、转换和分析…...

基于RT-Thread与TOF传感器的智能电动滑板主动刹车系统设计

1. 项目概述&#xff1a;从情怀出发的硬件升级之旅几年前&#xff0c;我和几个同学在导师的带领下&#xff0c;捣鼓出了一个基于 Arduino Uno 的电动滑板。那会儿真是干劲十足&#xff0c;白天画图、晚上调代码&#xff0c;傍晚就踩着滑板在校园里飞驰。这个滑板后来成了我的“…...

如何用OneMore插件彻底改变你的OneNote笔记体验:终极效率提升指南

如何用OneMore插件彻底改变你的OneNote笔记体验&#xff1a;终极效率提升指南 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore 你是否曾经在OneNote中花费大量时间调整…...

Android Studio中文界面终极指南:告别英文困扰,3分钟打造母语开发环境

Android Studio中文界面终极指南&#xff1a;告别英文困扰&#xff0c;3分钟打造母语开发环境 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLangua…...

在多模型聚合调用中体验到的路由与失败切换流畅度

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在多模型聚合调用中体验到的路由与失败切换流畅度 效果展示类&#xff0c;分享开发者在实际编程中&#xff0c;当配置了多个备用模…...

体验Taotoken的模型广场如何辅助开发者快速选型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 体验Taotoken的模型广场如何辅助开发者快速选型 对于需要接入大模型能力的开发者而言&#xff0c;面对市场上众多的模型提供商和复…...

容器镜像加速实战:3种方案彻底解决国内拉取难题

容器镜像加速实战&#xff1a;3种方案彻底解决国内拉取难题 【免费下载链接】public-image-mirror 很多镜像都在国外。比如 gcr 。国内下载很慢&#xff0c;需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。 项目地址: https://gitcode.com/GitHub_Trending/pu…...

docker、harbor、jenkins概念

一、docker 1、docker是什么&#xff1f; &#xff08;1&#xff09;docker是一个的【工具软件】&#xff08;就像微信、VS Code、浏览器&#xff09;&#xff0c;运行在你的电脑 / 服务器上。 &#xff08;2&#xff09;「Docker 是造镜像、跑容器的工具」 2、docker可以用来做…...

Proteus 8.17安装超详细教程 保姆级教程【附安装包】

电子设计小伙伴们&#xff01;今天我给大家带来一篇超详细的Proteus 8.17专业版安装教程 &#xff01;这可是电子工程师和学生党的福音啊&#xff01;作为PCB设计和单片机仿真的神器&#xff0c;Proteus绝对是你玩转电子设计必备的利器&#xff01;不会安装&#xff1f;别担心&…...