SSM框架学习——Eclipse创建Spring MVC maven项目

Spring MVC项目创建

什么是Spring MVC

Spring MVC是Spring内置的,实现了Web MVC设计模式的框架。

它解决了Web开发过程中很多的问题,例如参数接收、表单验证等。另外它采用松散耦合可插拔组件等结构,具有相对较高的灵活性和扩展性。

Spring MVC官方文档可参考 docs.spring.io。

Spring MVC执行流程

按顺序可分为如下流程

  • 用户请求被DispatcherServlet进行拦截处理
  • DispatcherServlet收到请求调用HandlerMapping
  • HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器,再一起返回给DispatcherServlet
  • DispatcherServlet调用HandlerAdapter
  • HandlerAdapter经过适配调用具体的处理器
  • Controller执行完成返回ModelAndView对象
  • HandlerAdapterModelAndView返回给DispatcherServlet
  • DispatcherServletModelAndView传给ViewReslover
  • ViewReslover解析ModelAndView后返回View(给DispatcherServlet
  • DispatcherServlet根据View进行渲染
  • DispatcherServlet响应View给用户

通过上面流程可知,程序员需要配置DispatcherServlet,并开发ViewController/Handler

项目创建

即然如此,我们就来创建一个Spring MVC项目。

打开Eclipse,创建一个Maven项目(想必经过前面学习已经很熟了),项目名称top.cairbin.test7

但是需要注意,创建时请勾选下图的Add project(s) to working set

Select an Archetype这一步需要注意,我们不再用之前的maven-archetype-quickstart,而是maven-archetype-webapp,如下图所示

创建完成后项目目录结构大概如下

我们还需要引入Spring MVC的依赖包以及Servlet,这你很清楚应该在pom.xml里配置

<!-- 添加servlet依赖 -->
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><scope>provided</scope><version>3.1.0</version>
</dependency><!-- 添加spring依赖 -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.23</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.3.23</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.23</version>
</dependency>

最终效果看起来是这样

<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>top.cairbin</groupId><artifactId>test7</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>test7 Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!-- 添加servlet依赖 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><scope>provided</scope><version>3.1.0</version></dependency><!-- 添加spring依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.23</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.3.23</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.23</version></dependency></dependencies><build><finalName>test7</finalName></build>
</project>

相比于以往的项目,你会发现webapp已经为我们创建了一个resources资源文件夹,并且src/main下多了一个webapp目录。webapp它一般存放前端相关的文件。

webapp目录下有一个WEB-INF,里面有一个默认生成的web.xml配置文件。还记得我们刚才提到的Spring MVC执行流程吗,用户请求会被DispatcherServlet拦截,它叫前端控制器,而这个XML文件就是用来对它进行设置的。

我们对web.xml进行修改

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><servlet><!-- 配置前端过滤器 --><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 初始化时加载配置文件 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springCtx.xml</param-value></init-param><!-- 表示容器在启动时立即加载Servlet --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern> </servlet-mapping>
</web-app>

注意<param-value>classpath:springCtx.xml</param-value>这一段引入了一个文件,是用来配置Controller映射信息的。

我们再来看看,webapp下还有一个index.jsp文件,它正是你的前端代码文件,它的内容如下

<html>
<body>
<h2>Hello World!</h2>
</body>
</html>

你可能对此表示疑惑,这不就是一个HTML文件,现实一个标题,标题内容为Hello World!吗。没错,但是对于传统的HTML来讲页面是静态的,而我们的JSP文件则能动态获取后端一些内容。

有了View来实现USL前台还不够,我们还要实现USL后台,接下来我们在src/main/java下创建包top.cairbin.test7.controller,并在这个包下创建控制器类TestController

package top.cairbin.test7.controller;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;public class TestController implements Controller{@Overridepublic ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)  {// 创建ModelAndView对象ModelAndView mav = new ModelAndView();// 向模型对象中添加数据mav.addObject("message", "Hello Spring");// 设置逻辑视图名mav.setViewName("/WEB-INF/views/hello.jsp");// 返回ModelAndView对象return mav;}
}

还记得刚才说的<param-value>classpath:springCtx.xml</param-value>吗,我们创建了控制器,还要告诉Spring MVC控制器与View的映射关系。

springCtx.xml这个文件并不存在我们项目中,需要手动添加。在resources资源文件夹里创建它。

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 配置处理器Handle,映射“/hello”请求 --><bean name="/hello" class="top.cairbin.test7.controller.TestController" /><!-- 处理器映射器,将处理器Handle的name作为url进行查找 --><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /><!-- 处理器适配器,配置对处理器中handleRequest()方法的调用--><bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /><!-- 视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
</beans> 

请务必注意<bean name="/hello" class="top.cairbin.test7.controller.TestController" />这一段的包名与你控制器一致。它告诉Spring MVC,将这个控制器映射到/hello路径上去,一会你就能在浏览器通过http://ip:port/项目名/hello的形式去访问它。

WEB-INF里创建views文件夹,请注意是WEB-INF下创建。

并在这个viewsview文件夹里新建jsp文件hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@page isELIgnored="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello SpringMvc</title>
</head>
<body><h1>${message}</h1>
</body>
</html> 

我们在这里使用${...}的形式来使用后端提供的接口,以此获取后端返回的对象。

那么问题来了,我们这个项目该怎么运行呢?显然对于Web项目我们需要Http服务器。

还记得我们在配置环境的时候安装的Tomcat9吗,现在终于要到了使用它的时候了!

另外,我们注意之前编写的TestController这个控制器,它需要导入的包中可能有两个报错。

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

如果出现这种情况,我们右键这个项目,打开属性

找到Java Build Path选项的Libraries选项卡,点击Add Library...

选择Server Runtime选项,然后下一步

选择之前配置好的服务器(就是在环境配置那篇文章里的)

保存并退出。

接下来我们尝试运行它,与以往不同的是,我们需要Run As里面的Run on server

如果你第一次这样做,会弹出个窗口

选择Apache里对应的服务器,我这里是Tomcat9.0

然后点击完成。很显然,你的浏览器已经打开了,说明你的项目跑成功了。并且在Eclipse的Package Explorer中多了个Servers文件夹。

我们在浏览器访问的是index.jsp所渲染的页面

在地址栏输入http://localhost:8080/test7/hello访问控制器和hello.jsp所渲染的页面

问题

在这一节其实有很多坑,一是Tomcat版本在10.0以上的话,包名变化问题。

另外如果当初配置环境的时候,Eclipse没选Web选项,这里有些配置是没有的。

上面这些问题请参考环境配置和此教程的问题模块。

如果你项目菜单里的Run as没有Run on server选项的话需要如下操作

打开项目属性

搜索project facets,勾选Dynamic Web Module选项

保存并退出。

接下来如果操作不当的话可能导致Servers文件夹下配置文件里有多个context,这时候需要打开server.xml进行就该

找到如下片段<Context>标签,把重复的删除

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

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

相关文章

vue创建项目下载动态路由v-for mounted websocket :style :class store使用说明

在Vue中创建一个项目&#xff0c;并整合动态路由、v-for、mounted生命周期钩子、WebSocket、:style、:class以及Vuex的store&#xff0c;涉及到多个Vue核心特性的使用。下面我将简要说明如何逐步整合这些特性。 1. 创建Vue项目 使用Vue CLI创建项目&#xff1a; 2. 配置动态路…

C++ 类(初篇)

类的引入 C语言中&#xff0c;结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。 而为了区分C和C我们将结构体重新命名成class去定义 类的定义 标准格式&#xff1a; class className {// 类体&#xff1a;由成员函…

【计算机网络】epoll

IO多路转接 - epoll 一、I/O多路转接之 epoll1. epoll 接口&#xff08;1&#xff09;epoll_create()&#xff08;2&#xff09;epoll_wait()&#xff08;3&#xff09;epoll_ctl() 2. epoll 原理3. epoll 的优点4. epoll 的使用5. epoll 的工作模式&#xff08;1&#xff09;水…

实验四 Java图形界面与事件处理(头歌)

实验四 Java图形界面与事件处理(头歌) 制作不易&#xff01;点个关注&#xff01;给大家带来更多的价值&#xff01; 目录 实验四 Java图形界面与事件处理(头歌) 制作不易&#xff01;点个关注&#xff01;给大家带来更多的价值&#xff01;代码如下&#xff1a; 代码如下&…

case语句

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 CASE 语句的执行方式与 IF...THEN...ELSIF 语句的执行方式类似&#xff0c;但是它是通过一个表达式的值来决定执行哪个分支 CASE 选择器表达式 WHEN 条件 1 THEN 语句序列 …

Linux: linux常见操作指令

目录 01.ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令&#xff08;重要&#xff09; 06.rmdir指令 && rm 指令&#xff08;重要&#xff09; 07.man指令&#xff08;重要&#xff09; 07.cp指令&#xff08;重要&#xff09; 08.mv指令&#…

H.264 压缩与编解码原理

H.264 压缩与编解码原理 H.264 压缩与编解码原理H.264 简介视频编码的总体思路H.264 压缩技术帧内预测压缩什么是空间冗余&#xff1f;具体预测方法 帧间预测压缩什么是时间冗余&#xff1f;具体预测方法&#xff1a;运动估计 概念&#xff1a;Group of Pictures&#xff08;GO…

java-网络编程socket-聊天室-先导

这边我会简单介绍一下聊天室的组成部分,和思路的引导 涉及知识点 java 中异常处理机制 和 io流和网络编程socket 简单回顾异常机制 Java中的异常机制是一种用于处理程序运行期间出现的错误或异常情况的机制。这种机制允许程序员定义在特定情况下可能发生的错误&#xff0c;并…

mysql慢sql排查与分析

当MySQL遇到慢查询&#xff08;慢SQL&#xff09;时&#xff0c;我们可以通过以下步骤进行排查和优化&#xff1a; 标题开启慢查询日志&#xff1a; 确保MySQL的慢查询日志已经开启。通过查看slow_query_log和slow_query_log_file变量来确认。 如果没有开启&#xff0c;可以…

闻风丧胆的算法(二)

&#x1f308;个人主页&#xff1a;Rookie Maker &#x1f525; 系列专栏&#xff1a;算法 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于IT的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到我的代码世界~ &#x1f601; 喜欢的小…

小林coding图解计算机网络|基础篇01|TCP/IP网络模型有哪几层?

小林coding网站通道&#xff1a;入口 本篇文章摘抄应付面试的重点内容&#xff0c;详细内容还请移步&#xff1a; 文章目录 应用层(Application Layer)传输层(Transport Layer)TCP段(TCP Segment) 网络层(Internet Layer)IP协议的寻址能力IP协议的路由能力 数据链路层(Link Lay…

一文介绍回归和分类的本质区别 !!

文章目录 前言 1、回归和分类的本质 &#xff08;1&#xff09;回归&#xff08;Regression&#xff09;的本质 &#xff08;2&#xff09;分类&#xff08;Classification&#xff09;的本质 2、回归和分类的原理 &#xff08;1&#xff09;回归&#xff08;Regression&#x…

Vue3(学自尚硅谷)

一、基础准备工作 &#xff08;一&#xff09;过程 环境要求&#xff1a;有node.js环境、npm。执行命令&#xff1a; npm create vuelatest 而后选择&#xff1a; ✔ 请输入项目名称&#xff1a; … me_vue3 ✔ 是否使用 TypeScript 语法&#xff1f; … 否 / 是 ✔ 是否启用…

干货| 这篇电商数据分析案例一定要看!

主流电商商品数据采集API接口 直播带货行业在经历了高端玩家的“春秋争霸”之后&#xff0c;逐渐进入到了一种“网红化”的阶段。人们正在将注意力从原来凤毛麟角的直播巨头逐渐转移到一些小主播身上。但近短时间却出现了网红带货营销额放缓的现象。因此商家必须要调整直播策略…

【数据库】数据库的介绍、分类、作用和特点,AI人工智能数据如何存储

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《数据库》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识…

互联网轻量级框架整合之JavaEE基础II

编写本篇代码并实际执行之前请仔细阅读前一篇互联网轻量级框架整合之JavaEE基础I Servlet 在Servlet容器中&#xff0c;Servlet是最基础的组件&#xff0c;也可以把JSP当做Servlet&#xff0c;JSP的存在意义只在于方便编写动态页面&#xff0c;使Java语言能和HTML相互结合&…

产品推荐 | 中科亿海微推出亿迅®A8000金融FPGA加速卡

01、产品概述 亿迅A8000金融加速卡&#xff0c;是中科亿海微联合金融证券领域的战略合作伙伴北京睿智融科&#xff0c;将可编程逻辑芯片与金融行业深度结合&#xff0c;通过可编程逻辑芯片对交易行情加速解码&#xff0c;实现低至纳秒级的解码引擎&#xff0c;端到端的处理时延…

Linux gcc day3

find命令&#xff08;importance&#xff09;&#xff1a; 语法&#xff1a;find pathname -options find /root -name test.c which命令&#xff1a; which [指令] 只搜索指令&#xff0c;在什么位置下 为什么文件夹带有颜色呢&#xff1f; 科普补充alias命令&#xff1a; ali…

C++:赋值运算符(17)

赋值也就是将后面的值赋值给变量&#xff0c;这里最常用的就是 &#xff0c;a1那么a就是1&#xff0c;此外还包含以下的赋值运算 等于int a 1; a10 a10加等于int a 1; a1;a2-减等于int a 1; a-1;a0*乘等于int a 2; a*5;a10/除等于int a 10; a/2;a5%模等于int a 10; a%…

kafka集群介绍+部署Filebeat+Kafka+ELK

一、消息队列 1、为什么需要消息队列&#xff08;MQ&#xff09; 主要原因是由于在高并发环境下&#xff0c;同步请求来不及处理&#xff0c;请求往往会发生阻塞。比如大量的请求并发访问数据库&#xff0c;导致行锁表锁&#xff0c;最后请求线程会堆积过多&#xff0c;从而触…