Spring MVC 基本概念
1.1 MVC模式
MVC是Model、View和Controller的缩写,分别代表Web应用程序中的3种职责。
- 模型:用于存储数据以及处理用户请求的业务逻辑。
- 视图:向控制器提交数据,显示模型中的数据。
- 控制器:根据视图提出的请求判断将请求和数据交给哪个模型处理,将处理后的有关结果交给哪个视图更新显示。
1.2 Spring MVC
SpringMVC框架主要由DispatcherServlet、处理器映射、控制器、视图解析器、视图组成,SpringMVC的工作流程如下:
- 客户端请求提交到DispatcherServlet;
- 由DispatcherServlet控制器寻找一个或多个HandlerMapping,找到处理请求的Controller;
- DispatcherServlet将请求提交到Controller;
- Controller调用业务逻辑处理后返回ModelAndView;
- DispatcherServlet寻找一个或多个ViewResolver视图解析器,找到ModelAndView指定的视图;
- 视图负责将结果显示到客户端。
1.3 Spring MVC接口
MVC接口:DispatcherServlet、HandlerMapping、Controller和ViewResolver。
DispatcherServlet
借助于Spring MVC提供的HandlerMapping将请求转发到具体的Controller。DispatcherServlet来统一分发Spring MVC所有的请求,是整个Web应用的控制器。
HandlerMapping
接口负责完成客户请求到Controller映射。
Controller
接口将处理用户请求,返回ModelAndView对象给DispatcherServlet前端控制器,是单个Http请求处理过程中的控制器。
ModelAndView
是Http请求过程中返回的模型(Model)和视图(View)。
ViewResolver
接口(视图解析器)在Web应用中负责查找View对象,将结果渲染给客户。
Spring MVC示例
1. 建立需要的JSP页面
在\WEB-INF下建立\jsp,在\jsp下建立login.jsp和register.jsp
2. 为超链接请求建立控制器类
在包controller创建“RegisterController”和“LoginController”两个控制器类(实现了Controller接口),分别处理首页中“注册”和“登录”超链接请求。
控制器类实现org.springframework.web.servlet.mvc.Controller
接口
public class LoginController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
return new ModelAndView("/WEB-INF/jsp/login.jsp");
//return new ModelAndView("login");
}
}
复制代码
public class RegisterController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
return new ModelAndView("/WEB-INF/jsp/register.jsp");
//return new ModelAndView("register");
}
}
复制代码
3. 在web.xml部署DispatcherServlet
<?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" version="2.5">
<display-name>mymaven</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!--部署DispatcherServlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 表示容器在启动时立即加载servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 处理所有URL -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
复制代码
DispatcherServlet的servlet对象springmvc初始化时,将在应用程序的WEB-INF目录下查找一个配置文件,该配置文件的命名规则是“servletName-servlet.xml”,如:springmvc-servlet.xml。也可以自定义位置,此时使用init-param配置文件路径,如:
<!--部署DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>ContextConfigLocation</param-name>
<param-value>
/WEB-INF/spring-config/springmvc-servlet.xml
</param-value>
</init-param>
<!-- 表示容器在启动时立即加载servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 处理所有URL-->
<url-pattern>/</url-pattern>
</servlet-mapping>
复制代码
4. 配置springmvc-servlet.xml
- 提供JSP和控制器之间的相互关系;
- 定义SpringMVC的一个视图解析器(ViewResolver),配置前缀和后缀两个属性,这样控制器类的视图路径仅需提供register和login,视图解析器将会自动添加前缀和后缀。
<?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="com.controller.LoginController" />
<!--RegisterController控制器类,映射到“/register” -->
<bean name="/register" class="com.controller.RegisterController" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
</beans>
复制代码
控制器类改为
//return new ModelAndView("/WEB-INF/jsp/register.jsp");
return new ModelAndView("register");
//return new ModelAndView("/WEB-INF/jsp/login.jsp");//不配置前后缀的写法
return new ModelAndView("login");
复制代码
5. 创建index.jsp
${pageContext.request.contextPath}
是JSP取得绝对路径的方法,等价于<%=request.getContextPath()%>
。也就是取出部署的应用程序名或者是当前的项目名称
<%@ 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>
没注册的用户,请
<a href="${pageContext.request.contextPath }/register">注册</a>!
<br> 已注册的用户,去
<a href="${pageContext.request.contextPath }/login">登录</a>!
</body>
</html>
复制代码