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{
	@Override
	public 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/beans
	http://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>标签,把重复的删除

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

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

相关文章

Coursera上托福专项课程02:TOEFL Speaking and Writing Sections Skills Mastery 学习笔记

TOEFL Speaking and Writing Sections Skills Mastery Course Certificate 本文是学习 https://www.coursera.org/learn/toefl-speaking-writing-sections-skills-mastery 这门课的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 TOEFL Speaking and Writing…

《崩溃》社会如何选择成败兴亡 - 三余书屋 3ysw.net

崩溃&#xff1a;社会如何选择成败兴亡 《崩溃&#xff1a;社会如何选择成败兴亡》深入对人类大历史的思考&#xff0c;解答人类社会成败兴亡的秘密。这本书主要聚焦在人类社会兴盛与环境之间的纠葛。我们将一同探讨历史上哪些伟大文明因为环境破坏而崩溃&#xff0c;还有哪些…

v-for之对象和对象信息

如下图所示&#xff1a; 看打印&#xff1a;尤其是这个对象信息的打印 也可以在打印对象信息的时候取出索引信息&#xff1a;

kafka 高吞吐设计分析

说明 本文基于 kafka 2.7 编写。author blog.jellyfishmix.com / JellyfishMIX - githubLICENSE GPL-2.0 概括 支撑 kafka 高吞吐的设计主要有以下几个方面: 网络 nio 主从 reactor 设计模式 顺序写。 零拷贝。 producer producer 开启压缩后是批量压缩&#xff0c;bro…

一分钟快速用上号称“音乐版ChatGPT”的suno AI,适合普通人的超简单教程!

随着AI的应用变广&#xff0c;各类AI程序已逐渐普及。AI已逐渐深入到人们的工作生活方方面面。而AI涉及的行业也越来越多&#xff0c;从最初的写作&#xff0c;到医疗教育&#xff0c;再到现在的音乐。 Suno是一个专业高质量的AI歌曲和音乐创作平台&#xff0c;用户只需输入简…

JAVA IO流学习

File类&#xff1a; File类是java.io包中很重要的一个类 File类的对象可以代表一个文件或者目录&#xff0c;可以修改文件大小、文件最后修改日期、文件名等 File对象不能操作文件的具体数据&#xff0c;即不能对文件进行读和写的操作 File的构造方法&#xff1a; File&…

Redis中的Sentinel(一)

Sentinel 概述 Sentinel(哨岗、哨兵)是Redis的高可用性(high availability)解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器&#xff0c;以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时&#xff0…

H.264 压缩与编解码原理

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

容器的底层技术:CGroup和NameSpace

无论是容器&#xff0c;还是虚拟机&#xff0c;都依赖于内核中的技术&#xff0c;虚拟机依赖的是 KVM&#xff0c;容器依赖的是 namespace 和 cgroup 对进程进行隔离和资源限制。 容器实现封闭的环境主要要靠两种技术&#xff0c;一种是看起来是隔离的技术&#xff0c;称为nam…

闻风丧胆的算法(二)

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

在linux下conda 创建虚拟环境失败的解决方法

报错内容一&#xff1a; Solving environment: failed CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://conda.anaconda.org/conda-forge/noarch/repodata.json> Elapsed: - An HTTP error occurred when trying to retrieve this URL. HTTP errors are…

Redis面试题28道

1、什么是类加载器&#xff0c;类加载器有哪些&#xff1f; 1、什么是类加载器&#xff1f; 类加载器负责加载所有的类&#xff0c;其为所有被载入内存的类生成一个 java.lang.Class 实例对象。 2、类加载器有哪些&#xff1f; JVM 有三种类加载器&#xff1a; &#xff08…

二分答案 蓝桥杯 2022 省A 青蛙过河

有些地方需要解释&#xff1a; 1.从学校到家和从家到学校&#xff0c;跳跃都是一样的&#xff0c;直接看作2*x次过河就可以。 2.对于一个跳跃能力 y&#xff0c;青蛙能跳过河 2x 次&#xff0c;当且仅当对于每个长度为 y 的区间&#xff0c;这个区间内 h 的和都大于等于…

一文彻底搞懂synchronized实现原理

文章目录 1. synchronized 是什么2. synchronized 可以实现的锁3. synchronized 使用4. synchronized 底层原理4.1 作用于同步代码块4.2 作用于方法 1. synchronized 是什么 synchronized 是 Java 中实现线程同步的关键字&#xff0c;用于保护共享资源的访问&#xff0c;确保在…

TCP/IP协议、HTTP协议和FTP协议等网络协议包简介

文章目录 一、常见的网络协议二、TCP/IP协议1、TCP/IP协议模型被划分为四个层次2、TCP/IP五层模型3、TCP/IP七层模型 三、FTP网络协议四、Http网络协议1、Http网络协议简介2、Http网络协议的内容3、HTTP请求协议包组成4、HTTP响应协议包组成 一、常见的网络协议 常见的网络协议…

如何打包一个手机软件

目录 前言&#xff1a; 准备工具&#xff1a; 创建项目&#xff1a; 打包程序&#xff1a; 前言&#xff1a; 我们平时手机上使用的程序&#xff0c;或者电脑上使用的程序都可以由Web程序打包而来的&#xff0c;而打包不是一个.html文件也不是一个.js文件而是一个大型的文…

【AAOS车载系统+AOSP14系统攻城狮入门实战课】:正式上线了(二百零三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Blender怎么样启动默认移动和Cavity效果

在使用Blender的过程中&#xff0c;有一些特殊的技巧很重要。 比如默认地设置blender打开时&#xff0c;就是移动物体&#xff0c;这样怎么样设置的呢&#xff1f; 需要在界面里打开下面的菜单: 这样就找到默认设置的地方&#xff0c;把下面的移动勾选起来&#xff0c;这样点…

使用注意力机制的 LSTM 彻底改变时间序列预测

目录 一、说明二、LSTM 和注意力机制简介三、为什么要将 LSTM 与时间序列注意力相结合&#xff1f;四、模型架构训练与评估 五、验证六、计算指标七、结论 一、说明 在时间序列预测领域&#xff0c;对更准确、更高效的模型的追求始终存在。深度学习的应用为该领域的重大进步铺…

深度学习pytorch实战第P2周:CIFAR10彩色图片识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 零、引言&#xff08;温故而知新&#xff…