文章目录
Hello SpringMVC
一、SpringMVC概述
- Spring 为展现层提供的基于 MVC 设计理念的优秀的 Web 框架,是目前最主流的 MVC 框架之一
- Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架。
- Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任 何接口。
- 支持 REST 风格的 URL 请求。
- 采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。
二、SpringMVC是什么
- 一种轻量级的、基于 MVC 的 Web 层应用框架。偏前端而不是基于业务逻辑层。Spring 框架的一个后续产品
- Spring 框架结构图(新版本):
三、SpringMVC可以干什么
- 天生与 Spring 框架集成,如:(IOC,AOP)
- 支持 Restful 风格
- 进行更简洁的 Web 层开发
- 支持灵活的 URL 到页面控制器的映射
- 非常容易与其他视图技术集成,如:Velocity、FreeMarker 等等
- 因为模型数据不存放在特定的 API 里,而是放在一个 Model 里(Map 数据结构实现, 因此很容易被其他框架使用)
- 非常灵活的数据验证、格式化和数据绑定机制、能使用任何对象进行数据绑定, 不必实现特定框架的 API
- 更加简单、强大的异常处理
- 对静态资源的支持
- 支持灵活的本地化、主题等解析
四、SpringMVC怎么耍
- 将 Web 层进行了职责解耦,基于请求-响应模型
- 常用主要组件 :
- DispatcherServlet:前端控制器
- Controller:处理器/页面控制器,做的是 MVC 中的 C 的事情,但控制逻辑转移 到前端控制器了,用于对请求进行处理
- HandlerMapping :请求映射到处理器,找谁来处理,如果映射成功返回一个 HandlerExecutionChain 对象(包含一个 Handler 处理器(页面控制器)对象、多 个 HandlerInterceptor 拦截器对象)
- View Resolver : 视图解析器,找谁来处理返回的页面。把逻辑视图解析为具体 的 View,进行这种策略模式,很容易更换其他视图技术;
- 如 InternalResourceViewResolver 将逻辑视图名映射为 JSP 视图
- LocalResolver:本地化、国际化
- MultipartResolver:文件上传解析器
- HandlerExceptionResolver:异常处理
五、HelloWord yyds
1.导包
idea新建Maven工程,在pom.xml中导入一下jar包
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.13</version>
</dependency>
</dependencies>
2.写配置
5.2.1在web.xml中配置DispatcherServlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--contextConfigLocation:指定SpringMVC配置文件位置-->
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc.xml</param-value>
</init-param>
<!-- servlet启动加载,servlet原本是第一次访问创建对象
load-on-startup:服务器启动的时候创建对象,值越小优先级越高,越先创建对象
-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 处理所有请求-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- /*和/都是拦截所有请求
/*的范围更大,还会拦截*.jsp这些请求
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
注意SpringMVC的配置文件位置,我们将其放在了WEB-INF目录下所以我们要在这个目录下创建SpringMVC.xml
5.2.2:创建SpringMVC.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 视图解析器DispatchServlet给他的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀-->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!-- 后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
<context:component-scan base-package="com.shang"></context:component-scan>
</beans>
3.测试
5.3.1 创建入口页面,index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello</title>
</head>
<body>
<a href="hello">hello</a>
</body>
</html>
5.3.2 编写处理hello请求的处理器
@Controller
public class MyFirstController {
/**
* 映射请求的名称:用于客户端请求;类似 Struts2 中 action 映射配置的 action 名称
* 1. 使用 @RequestMapping 注解来映射请求的 URL
* 2. 返回值会通过视图解析器解析为实际的物理视图, 对于 InternalResourceViewResolver 视图解析器, * 会做如下的解析:
* 通过 prefix + returnVal + suffix 这 样的方式得到实际的物理视图, 然后做转发操作.
* /WEB-INF/views/success.jsp
*/
@RequestMapping("/hello")//声明 Bean 对象,为一个控制器组
public String myFirstRequest() {
System.out.println("请求转发进行中");
return "success"; //此处是对视图解析器处进行了字符串拼接,全路径为 :/WEB-INF/pages/success.jsp
}
}
5.3.3 编写视图succe.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>成功</h1>
</body>
</html>
5.3.4 测试结果
现给出工程完整结构:
六、hello world解析
1.hello请求图解
2.@RequestMapping
这个注解就是告诉SpringMVC,这个方法用来处理什么请求。方法上的/是可以省略的,即使省略,也是默认从当前项目下开始的。在使用这个注解之前一定要在方法所在类上加上**@Controller**注解。
3.指定SpringMVC配置文件位置
如果没有指定指定配置文件位置,那么tomcat会报这个错误
nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/dispatcherServlet-servlet.xml]
说明如果不指定,就会默认去找 :/WEB-INF/前端控制器名-servlet.xml。
如果我们懒得写这个配置 语句,就可以走他默认的文件位置。
4.后缀匹配
/:拦截所有请求,不拦截jsp页面,**.jsp请求*
/* : 拦截所有请求,拦截jsp页面,*.jsp请求
处理.jsp是tomcat做的事,所有的项目的小web.xml都是继承于大web.xml。
6.4.1 不能访问静态资源,如:.html, .png, .css等的原因。
- 在服务器的大web.xml中,有一个DefaultServlet的url-pattern = /
<--The default servlet for all web applications, that serves static-->
<!-- resources.
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
我们通过注释可以看到,这个默认的Servlet是tomcat中处理静态资源的。(除过jsp和servlet)。
但是我们写了这个配置之后,前端控制器dispatcherServlet就覆盖了默认的转发路径,而将其转发到DispatcherServlet中进行处理,我们又没有配关于静态资源的路径,那肯定是找不到,就直接报错了。
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- /*和/都是拦截所有请求
/*的范围更大,还会拦截*.jsp这些请求
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
6.4.2 为什么可以访问jsp呢?
因为我们没有覆盖服务器中的JspServlet
<--The JSP page compiler and execution servlet, which is the mechanism used by Tomcat to support JSP pages. Traditionally, this servlet -->
<!-- is mapped to the URL pattern "*.jsp".
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>