SpringMVC学习笔记第2节入门案列

84 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

2、入门案例

2.1、开发环境

IDE:idea 2019.2 构建工具:maven3.5.4 服务器:tomcat8.5 Spring版本:5.3.1

2.2、创建maven工程

①添加web模块 ②打包方式:war ③引入依赖

  <!--将当前工程的打包方式设置成war包,项目结构就会自动生成web工程-->
    <packaging>war</packaging>
    <dependencies>
        <!-- SpringMVC -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.1</version>
        </dependency>
        <!-- 日志 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- ServletAPI -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- Spring5和Thymeleaf整合包 -->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring5</artifactId>
            <version>3.0.12.RELEASE</version>
        </dependency>
    </dependencies>

注:由于 Maven 的传递性,我们不必将所有需要的包全部配置依赖,而是配置最顶端的依赖,其他靠 传递性导入。 在这里插入图片描述

2.3、配置web.xml

注册SpringMVC的前端控制器DispatcherServlet ①默认配置方式 此配置作用下,SpringMVC的配置文件默认位于WEB-INF下,默认名称为- servlet.xml,例如,以下配置所对应SpringMVC的配置文件位于WEB-INF下,文件名为springMVCservlet.xml

 <!--SpringMVC本质是Servlet,即封装了DispatcherServlet的功能,若想要处理请求和响应,必须要在web.xml中注册,配置url-pattern-->

    <!--
    配置SpringMVC的前端控制器DispatcherServlet
    SpringMVC的配置文件默认的位置和名称:
    位置:WEB-INF下
    名称:<servlet-name>-servlet.xml,当前配置下的配置文件为SpringMVC-servlet.xml
    <!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理 --> 
	<servlet> 
		<servlet-name>springMVC</servlet-name> 
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet- 
		class> 
	</servlet> 
	<servlet-mapping> 
		<servlet-name>springMVC</servlet-name> 
		<!--
		设置springMVC的核心控制器所能处理的请求的请求路径 
		/所匹配的请求可以是/login或.html或.js或.css方式的请求路径 
		但是/不能匹配.jsp请求路径的请求 
		--> 
		<url-pattern>/</url-pattern> 
	</servlet-mapping>

②扩展配置方式 可通过init-param标签设置SpringMVC配置文件的位置和名称,通过load-on-startup标签设置 SpringMVC前端控制器DispatcherServlet的初始化时间

<!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理 --> 
<servlet> 
	<servlet-name>springMVC</servlet-name> 
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet- class>
	<!-- 通过初始化参数指定SpringMVC配置文件的位置和名称 --> 
	<init-param> 
		<!-- contextConfigLocation为固定值 --> 
		<param-name>contextConfigLocation</param-name> 
		<!-- 使用classpath:表示从类路径查找配置文件,例如maven工程中的 
		src/main/resources --> 
		<param-value>classpath:springMVC.xml</param-value> 
	</init-param> 
	<!--
	作为框架的核心组件,在启动过程中有大量的初始化操作要做 
	而这些操作放在第一次请求时才执行会严重影响访问速度 
	因此需要通过此标签将启动控制DispatcherServlet的初始化时间提前到服务器启动时 
	--> 
	<load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
	<servlet-name>springMVC</servlet-name> 
	<!--
	设置springMVC的核心控制器所能处理的请求的请求路径 
	/所匹配的请求可以是/login或.html或.js或.css方式的请求路径 
	但是/不能匹配.jsp请求路径的请求 
	--> 
	<!--
	  url-pattern中/ 和 /*的区别:
	  / : 匹配浏览器向服务器发送的所有请求(不包括.jsp)
	  /* : 匹配浏览器向服务器发送的所有请求(包括.jsp)
	  因为tomcat 的 web.xml中配置过JspServlet来专门处理.jsp后缀的请求,若使用/*,交给DispatcherrServlet处理,则处理不了.jsp的请求
	  *.do :
	-->
	<url-pattern>/</url-pattern> 
</servlet-mapping> 

标签中使用/和/*的区别: /所匹配的请求可以是/login或.html或.js或.css方式的请求路径,但是/不能匹配.jsp请求路径的请 求 因此就可以避免在访问jsp页面时,该请求被DispatcherServlet处理,从而找不到相应的页面 /*则能够匹配所有请求,例如在使用过滤器时,若需要对所有请求进行过滤,就需要使用/*的写 法

2.4、创建请求控制器

由于前端控制器对浏览器发送的请求进行了统一的处理,但是具体的请求有不同的处理过程,因此需要 创建处理具体请求的类,即请求控制器 请求控制器中每一个处理请求的方法成为控制器方法 因为SpringMVC的控制器由一个POJO(普通的Java类)担任,因此需要通过@Controller注解将其标识 为一个控制层组件,交给Spring的IoC容器管理,此时SpringMVC才能够识别控制器的存在

@Controller
public class HelloController {

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

2.5、创建SpringMVC的配置文件

 <!--扫描控制层组件-->
    <context:component-scan base-package="com.atguigu.mvc.controller"></context:component-scan>

    <!-- 配置Thymeleaf视图解析器 -->
    <bean id="viewResolver"
          class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine">
        <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
            <property name="templateResolver">
                <bean
                        class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                    <!--物理视图:/WEB-INF/templates/index.html-->
                    <!-- 视图前缀 -->
                    <property name="prefix" value="/WEB-INF/templates/"/>
                    <!-- 视图后缀 -->
                    <property name="suffix" value=".html"/>
                    <property name="templateMode" value="HTML5"/>
                    <property name="characterEncoding" value="UTF-8" />
                </bean>
            </property>
        </bean>
    </property>
    </bean>

2.6、测试HelloWorld

①实现对首页的访问 在请求控制器中创建处理请求的方法

// @RequestMapping注解:处理请求和控制器方法之间的映射关系 
	//服务器中 / 代表的是绝对路径,分为浏览器解析和服务器解析
	//请求路径为上下文路径http://localhost:8080/SpringMVC/,此方法就为处理请求的方法
// @RequestMapping注解的value属性可以通过请求地址匹配请求,/表示的当前工程的上下文路径 
// localhost:8080/springMVC/ 
@RequestMapping("/") 
public String index() { 
	//设置视图名称 
	//将逻辑视图返回,然后被配置文件中视图解析器解析,给逻辑视图加上前缀后缀,
    // 匹配完整的物理视图,通过Thymeleaf渲染跳转到页面
	return "index"; 
}

②通过超链接跳转到指定页面 在主页index.html中设置超链接

<!DOCTYPE html>
<!--xmlns这个可以设置在模板中-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>index.heml</h1>
<!--thmeleaf会自动加上上下文路径-->
<a th:href="@{/hello}"> 测试SpringMVC</a>
<!--下面这个路径找不到  找不到 Web 地址对应的网页: http://localhost:8080/hello-->
<a  href="/hello">测试绝对路径</a>
</body>
</html>

在请求控制器中创建处理请求的方法、

@RequestMapping("/hello") 
	public String HelloWorld() { 
return "target";
}

2.7、总结

浏览器发送请求,若请求地址符合前端控制器的url-pattern,该请求就会被前端控制器 DispatcherServlet处理。前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器, 将请求地址和控制器中@RequestMapping注解的value属性值进行匹配,若匹配成功,该注解所标识的 控制器方法就是处理请求的方法。处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会 被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf对视图进行渲染,最终转发到视 图所对应页面