需求:我发请求,后台有一个类处理这个请求,并跳转成功页面
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/
点击后跳转http://localhost:8080/hello
如果写/项目名
主页为http://localhost:8080/springmvc1/
点击后跳转http://localhost:8080/springmvc1/hello
精简版
复杂版
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