一、Spring MVC工作原理
Spring MVC框架主要有DispatcherServlet、处理器映射、控制器、视图解析器、视图组成。其工作的流程:
(1)客户端发起的http请求提交到DispatcherServlet;
(2)由DispatcherServlet控制器寻找一个或多个HandlerMapping,找到处理请求的Controller;
(3)DispatcherServlet将请求提交给Controller处理;
(4)Controller调用业务逻辑处理后返回ModelAndView;
(5)DispatcherServlet 寻找一个或多个ViewResolver视图解析器,找到ModelAndView指定的视图;
(6)视图负责将结果显示到客户端。
二、Spring MVC接口
Spring MVC主要的4个接口,即DispatcherServlet
、HandlerMapping
、Controller
以及ViewResolver
。
(1)Spring MVC的所有请求都经过DispatcherServlet
来统一分发到Controller中处理。在DispatcherServlet分发请求之前,需要通过SpringMVC提供的HandlerMapping找到指定的Controller。
(2)HandlerMapping
接口负责客户端请求到Controller的映射。
(3)Controller
接口负责处理客户端请求。相当于java Servlet的作用。处理完请求后,将返回ModelAndView
(包含模型Model和视图View)对象给DispatcherServlet前端控制器。
(4)ViewResolver
接口(视图解析器)负责在web应用中查找View对象,将处理结果渲染给客户端。
三、第一个Spring MVC应用
创建Web项目 :除了添加Spring容器的基础JAR包和Spring依赖的commons-logging的JAR包以外,还需要添加两个与SpringMVC相关的JAR包:Spring-web.jar 和Spring-webmvc.jar 。
在web.xml文件中部署DispatcherServlet
<servlet>
<!--部署DispatchServlet-->
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--表示容器在启动时立即加载Servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<!--处理所有url-->
<url-pattern>/</url-pattern>
</servlet-mapping>
DispatcherServlet中的servlet对象在SpringMVC初始化时将到WEB-INF目录下寻找一个与该servlet相关的配置文件,该配置文件的命名规则:servletName-servlet.xml 。例如本例子中,由<servlet-name>dispatcher</servlet-name>
可以看出的servletName为dispatcher,最后会寻找一个dispatcher-servlet.xml配置文件。
创建web应用首页 index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
未注册的用户,请<a href="${pageContext.request.contextPath}/register">注册</a>!<br>
已注册的用户,请<a href="${pageContext.request.contextPath}/login">登录</a>!
</body>
</html>
创建Controller类 :
创建RegisterController和LoginController两个传统(非注解方式)的控制器(需要实现Controller接口),分别处理首页的“注册”和“登录”的超链接请求。
package controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
return new ModelAndView("login.jsp");
}
}
package controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RegisterController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
return new ModelAndView("register.jsp");
}
}
创建SpringMVC配置文件并配置Controller映射信息:
在WEB-INF目录下创建名为dispatcher-servlet.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--LoginController控制器类,映射到"/login"-->
<bean name="/login" class="controller.LoginController"/>
<!--RegisterController控制器类,映射到"/register"-->
<bean name="/register" class="controller.RegisterController"/>
</beans>
应用的其他页面,如login.jsp 和 register.jsp
register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Register</title>
</head>
<body>
注册操作...
</body>
</html>
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Login</title>
</head>
<body>
登录操作...
</body>
</html>
运行测试:
点击注册,根据dispatcher-servlet.xml文件中的映射将请求转发给了RegisterController处理,并跳转到register.jsp。同理,点击登录也一样的。
通过观察地址栏可以发现,SpringMVC的Controller的return new ModelAndView("login.jsp");
默认是通过转发实现的,所以也就不会看到地址栏发生改变。如果要采用重定向的方式,则需要修改为:
//采用重定向方式跳转
return new ModelAndView("redirect:register.jsp");
修改后运行,可以发现地址栏发生了改变。