Java EE SSM框架整合开发(八)Spring MVC 基础

2021-05-04 08:06:25 Author: juejin.cn
觉得文章还不错?,点我收藏



Spring MVC 基本概念

1.1 MVC模式

MVC是Model、View和Controller的缩写,分别代表Web应用程序中的3种职责。 image.png

  • 模型:用于存储数据以及处理用户请求的业务逻辑。
  • 视图:向控制器提交数据,显示模型中的数据。
  • 控制器:根据视图提出的请求判断将请求和数据交给哪个模型处理,将处理后的有关结果交给哪个视图更新显示。

1.2 Spring MVC

SpringMVC框架主要由DispatcherServlet、处理器映射、控制器、视图解析器、视图组成,SpringMVC的工作流程如下: image.png

  1. 客户端请求提交到DispatcherServlet;
  2. 由DispatcherServlet控制器寻找一个或多个HandlerMapping,找到处理请求的Controller;
  3. DispatcherServlet将请求提交到Controller;
  4. Controller调用业务逻辑处理后返回ModelAndView;
  5. DispatcherServlet寻找一个或多个ViewResolver视图解析器,找到ModelAndView指定的视图;
  6. 视图负责将结果显示到客户端。

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; " 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>
复制代码



觉得文章还不错?,点我收藏



如果文章侵犯到您的版权,请联系我:buaq.net[#]pm.me