笔记大纲
- SpringMVC简述
- SpringMVC基本作用
- HelloWorld案例(7大步骤)
- HelloWorld案例深度解析
- 运行流程图解
- 运行原理图解
- 运行过程详述(必须掌握)
1.SpringMVC简述
Spring3.0后超越了Struts2,Spring为展现层提供了一种基于MVC设计、轻量级Web层应用框架,是Spring框架的一个后续产品(偏前端非基于业务逻辑层),是目前企业主流的MVC框架之一;
SpringMVC通过注解,让POJO(简单的Java对象即普通的JavaBean)成为处理请求的控制器,无序实现任何接口;
SpringMVC支持Restful风格的URL请求(POST、DELETE、PUT、GET);
SpringMVC采用松散耦合可插拔组件结果,比对其它MVC框架,更具有扩展性和灵活性。
2.SpringMVC基本作用
①与Spring框架无缝集成,如:(IOC,AOP);
② 支持Restful风格;
③ 进行更简洁的Web层开发;
④支持灵活的URL到页面控制器的映射;
⑤非常容易与其他视图技术集成,如:Velocity、FreeMarker等等;
⑥因为模型数据不存放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用);
⑦非常灵活的数据验证、格式化和数据绑定机制、能使用任何对象进行数据绑定,不必实现特定框架的API;
⑧更加简单、强大的异常处理;
⑨对静态资源的支持;
⑩支持灵活的本地化、主题等解析;
3.HelloWorld案例
3.1新建Web工程,导入JAR包
8个JAR包:
3.2.在web.xml中配置DispatchServlet
<?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_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>SpringmvcDemo01</display-name>
<!-- 【1】中央调度器/前端控制器,主要接受客户端的请求,将请求交给不同的处理器处理 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--
【2】初始化参数
用于读取springmvc的配置文件
servlet对象在服务器启动阶段会被创建,其中的init方法中实例化了Spring的容器
指定SpringMVC配置文件的路径
如果不指定路径,则默认在WEB-INF/dispathchweServlet-servlet.xml文件作为SpringMVC的配置文件
-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!-- 在服务器启动时候创建servlet对象,完成容器初始化,映射等操作!级别越小,启动越快!-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- 【匹配规则】
完全匹配 /userLogin
通配符匹配 /*
后缀匹配 *.do
注意:SpringMVC的中央调度器比较特殊,拦截所有的请求,不能使用 /*,而是使用/
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
快捷配置快捷键:Alt+"/"!!!
3.3.创建配置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-4.0.xsd">
<!-- 【1】组件扫描 -->
<context:component-scan base-package="com.codinglin.springmvc.helloworld"></context:component-scan>
<!-- 【2】视图解析器
作用:将prefix +处理器返回的逻辑名称+suffix 拼接成物理视图,就会做转发操作
-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
3.4.在WebContext下新建jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>测试入口页面</title>
</head>
<body>
<!-- 发送请求 -->
<!-- 测试【1】通过绝对路径访问 -->
<a href="https://coding0110lin.blog.csdn.net/">测试1--绝对路径</a><br>
<!-- 测试【2】通过相对路径访问,不以/开始,【相对的是当前请求的资源】 http://localhost:8080/SpringmvcDemo01/blog.html-->
<a href="blog.html">测试2--相对路径</a><br>
<!-- 测试【3】通过相对路径访问,以/开始,相对的是【服务器的根路径】 http://localhost:8080/blog.html-->
<a href="/blog.html">测试3--相对路径</a><br>
<!-- 测试【4】(当前项目)【上下文根 】,EL表达式,可以解决资源找不到-->
<!-- http://localhost:8080/SpringmvcDemo01/blog.html-->
<a href="${pageContext.request.contextPath}/blog.html">测试4--相对路径</a><br>
<!--<a href="${pageContext.request.contextPath}/hello">SpringMVC--helloWorld测试1</a><br>-->
<a href="${pageContext.request.contextPath}/codinglin/hello">SpringMVC--helloWorld测试2</a>
</body>
</html>
SpringmvcDemo01我们称之为为当前项目,官方说法是“上下文根”!如果我们下修改项目名,即重命名,选中项目–>Properties:
3.5.新建处理请求的处理器(普通JavaBean)
package com.codinglin.springmvc.helloworld;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/*这个处理器,不依赖某一个类和某一个接口
*
* 1.交给容器管理
* 2.标识为Controller
* 注意:在SpringMVC上,处理器必须加上Controller注解
* */
@Controller
@RequestMapping("/codinglin")
public class HelloWorldController {
//将客户端的请求交给该方法进行处理
// "/"表示相对的项目 http://localhost:8080/SpringmvcDemo01/hello
//请求的映射路径名称和处理请求的方法名称最好一致!
@RequestMapping("/hello")
public String hello() {
//返回的是要跳转的页面的【逻辑视图名称】
//通过视图解析器
return "success";
}
}
3.6.编写视图,在/WEB-INF/下创建views目录下创建success.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
<h3>Success Page!</h3>
</body>
</html>
3.7.部署测试,页面效果:
总结:
开发HelloWorld案例的步骤如下:
(1)创建创建DynamicWebProject<动态工程>
(2)导包(8个)
aop
,bean
,context
,core
,expression
,common-logging
,web
,web-mvc
(3)配置web.xml文件
① 配置SpringMVC的中央调度器
② 指定SpringMVC配置文件(spring-mvc.xml)的路径
③ 在web服务器启动阶段实例化servlet(4)配置spring-mvc.xml文件
①组件扫描
②视图解析器(prifix
、suffix
)(5)编写处理器HelloWordController处理器客户端请求
①@Controller
②@RequestMapping
③返回跳转的页面的逻辑名称(6) 编写success.jsp页面在WEB-INF/views目录下
4.HelloWorld案例深度解析
4.1.运行流程图解
4.2.运行原理图解
4.3.运行过程详述
(1)启动Tomcat服务器
①读取web.xml
文件;
②在web.xml
文件配置SpringMVC的中央调度器,配置了<load-on-startup>1</load-on-startup>
;
③在启动服务器时,DispatcherServlet就会被创建,init()就会执行;
④在init()中,中央调度器实例化Spring的容器对象,在实例化容器时,需要读取spring的配置文件,通过<init-param>
指定spring的配置文件路径(类路径);实例化容器对象时,会读取spring-mvc.xml
文件。
⑤在spring-mvc.xml
配置文件中,指定了扫描的组件,会将HelloWorldController扫描到,同时会对方法上的@RequestMapping
注解进行解析,就可知道请求与处理器间的一个映射关系;
控制台信息:
(2)在浏览器中地址栏中发送http://localhost:8080/SpringmvcDemo01/index.jsp
请求
①该请求交个中央处理器处理,在web.xml中,中央处理器匹配了所有的请求,<url-pattern>/</url-pattern>
,中央处理器根据请求和处理器的映射关系,会决定选择将请求交给对应的处理器的方法进行处理;
②处理器的方法处理完请求之后,返回一个字符串类型值,这个字符串是跳转视图的逻辑名称;
③在spring-mvc.xml配置文件中视图解析器对返回值进行解析:
格式:前缀+逻辑名称+后缀=具体的物理视图
④解析完毕后,通过请求转发的方法跳转到具体的物理视图success.jsp
。
☝上述分享来源个人总结,如果分享对您有帮忙,希望您积极转载;如果您有不同的见解,希望您积极留言,让我们一起探讨,您的鼓励将是我前进道路上一份助力,非常感谢!我会不定时更新相关技术动态,同时我也会不断完善自己,提升技术,希望与君同成长同进步!
☞本人博客:https://coding0110lin.blog.csdn.net/ 欢迎转载,一起技术交流吧!