第一次操作
需求:我发请求,后台有一个类处理这个请求,并跳转成功页面
1.首先用maven构建项目,使用webapp模版,构建好了之后在main文件夹内新建java、resources、webapp(自带)三个文件夹,其中java文件夹要标记为source root(用于存放源代码),resources文件夹标记为resources root(用于存放配置文件),此时项目目录构建完毕。
2.index.jsp代码如下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>入门程序</h3>
<a href="hello">入门程序</a>
</body>
</html>
其中有一个超链接,href为相对路径格式的hello(从http://localhost:8080/springmvc1/跳转到http://localhost:8080/springmvc1/hello)(注意:如果这个地方写/hello,意思就是在从(http://localhost:8080/springmvc1/)跳转到http://localhost:8080/hello,显然无法成功)
3.控制器的类
package com.dwz.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
//控制器类
@Controller
public class HelloController {
@RequestMapping(path = "/hello")
public String sayHello(){
System.out.println("hello spring mvc");
return "success";
}
}
@Controller 注解,该HelloController类被spring进行管理
@RequestMapping(path = “/hello”) 请求映射,表明什么request才会map到该方法,需要提供一个request的路径path,本例中的/hello就是该方法的请求路径
return “success” 跳转到success.jsp文件
4.springmvc的配置文件springmvc.xml(位于resources文件夹下)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 注解扫描 -->
<context:component-scan base-package="com.dwz"></context:component-scan>
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 开启spring mvc 框架注解的支持-->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
(1)<context:component-scan base-package=“com.dwz”></context:component-scan>可以让HelloController这个类被spring扫描到,此时@Controller生效
但是此时springmvc.xml这个配置文件并没有被识别到,也就是无法生效,因此需要在其他地方加载它,才能让springmvc.xml生效,因此我们需要在web.xml中进行配置
5.web.xml(位于WEB-INF下)
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- SpringMVC的核心控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 配置servlet启动时加载对象 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
其中
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
表示我们想要给DispatcherServlet传初始化参数,参数名称为contextConfigLocation,参数值为classpath:springmvc.xml,此时DispatcherServlet就可以帮我们加载springmvc.xml这个配置文件
1是因为,对于正常的servlet,其只会在第一次发请求的时候才会被创建,而我们配置load-on-startup,可以让该servlet在服务器启动的时候就创建,该servlet一旦创建,就可以帮我们创建srpingmvc.xml这个配置文件
配置文件springmvc.xml一旦加载,其中的注解扫描就可以正常进行。HelloController就可以被扫到,其中的requestmapping注解就可以将特定的request映射到相应的方法
6.跳转页面
HelloController这个Controller创建,其中的requestmapping映射的方法sayHello就可以被正常调用,之后return “success” 可以让页面跳转到success.jsp(在WEB-INF下新建pages文件夹存放页面)
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>入门成功</h3>
</body>
</html>
但是这个过程需要使用视图解析器帮助页面跳转
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
配置视图解析器bean的id属性和class属性,其中class为InternalResourceViewResolver,
其中需要配置两个参数prefix(目录)和suffix(后缀)
最后, 开启spring mvc 框架注解的支持(现在这个入门的项目还不需要,之后会用到)
<!-- 开启spring mvc 框架注解的支持-->
<mvc:annotation-driven></mvc:annotation-driven>
作用:springmvc的各个组件中,处理器映射器HandlerMapping、处理器适配器HandlerAdapter、视图解析器ViewResolver被称为springmvc的三大组件。配上spring mvc框架注解支持,相当于把流程中的处理器映射器HandlerMapping、处理器适配器HandlerAdapter
之后配置tomcat的访问路径application context(可以不写,也可以写/项目名)
如果不写
点击后跳转http://localhost:8080/hello
如果写/项目名
主页为http://localhost:8080/springmvc1/
点击后跳转http://localhost:8080/springmvc1/hello
详细流程
- 启动服务器,加载配置文件
- DispatcherServlet对象创建
- springmvc.xml被加载
- HelloController创建成对象(默认为单例??啥意思??)
- 发送请求,后台处理请求
精简版
复杂版
spring mvc基于组件的方式执行流程
1.用户请求request先到达前端控制器DispatcherServlet
2.请求查找Handler:HandlerMapping这个地方,体现在我们程序中的Controller类中的方法前加RequestMapping,其中path为/hello,同时我们在1.Request的时候带的也有路径/hello,这二者一致,说明我们的hello请求就会通过RequestMapping找到Controller中的相应的方法。
3.返回执行链
4.处理器适配器HandlerAdapter,采用了适配器模式,不管是任何类型的Controller,都可以得到适配,都可以执行(Controller就是Handler)
5.执行
6.7.返回ModelAndView,也就是本例中的success.jsp
8.9.视图解析器通过返回的ModelAndView帮你找到相应的视图(success.jsp)返回给前端控制器DispatcherServlet
10.渲染视图
11.返回响应response