Spring MVC 的初识
简介
1. 设么是 MVC
MVC 是一种设计模式,是模型(model)-- 视图(view)-- 控制器(controller)的缩写,他强制性的使应用的输入,处理和输出分开。
MVC 的设计模式:
- 视图(view):视图是用户看到并与之交互的界面
- 模型(Model):企业数据和业务规则
- 控制器(controller):接受用户输入,并调用模型和视图去完成用户的需求。
2. Spring MVC 的工作流程
Spring MVC 的工作流程:
- 浏览器将请求信息发送给 DIspatcherServlet。
- DispatcherServlet 查询一个或多个处理器映射,并将请求发送给相应的控制器
- 控制器处理用户请求信息,将生成的数据和视图打包成 ModelAndView 对象返回给 DispatcherServlet 对象。
- DispatcherServlet 通过视图解析器将逻辑视图匹配为一个特定的视图实现
- 视图使用模型数据渲染输出。
SpringMVC 开发初步(三个重要步骤)
1. 配置 DispatcherServlet
DispatcherServlet 主要是拦截前端页面的请求,并将请求转发给相应的控制器进行处理。 DispatcherServlet 需要通过 Spring 配置文件获取 Spring 的上下文,从而将请求转发给相应的控制器类。 DispatcherServlet 需要通过 Spring 来进行初始化。一般使用 init-param 来配置 Spring 配置文件的位置。
加载 Spring 的 xml 配置文件
如果不进行 init-param 标签的设置 ,那么 Spring 的 xml 配置文件需要放在 Servlet 配置文件的同一文件夹下,名称为 servlet 名称 加上 -servlet。 如果通过 init-param 指定位置则首先在 param-name 中填写 contextConfigLocation 以指定 Spring 的配置文件为 xml 类型。 param-value 标签用于指定 Spring 配置文件的位置。如果使用 classpath 表示配置文件放在 src 文件夹下。若果不填写则表示 Spring 配置文件放在 WebContent 文件夹下
代码语言:javascript复制 <servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
加载 Spring 的 java 配置文件
首先在 param-name 标签中填写 contextClass 以指定 Spring 的配置文件为 java 配置文件。 param-value 中则填写 Spring 的配置类的全类名。
2. 配置视图解析器
视图解析器能够将控制返回的视图和模型数据解析为视图并且返回给前台。 在此我们以 InternalResourceViewResolver 为例,InternalResourceViewResolver 能够将控制器返回的字符串解析为 jsp 页面 InternalResourceViewResolver 实例化时需要设置前缀与后缀两个属性。前缀指定 JSP 文件的位置(都默认放在 WebContent 文件夹下)。后缀指定文件的格式为 jsp 页面。例如控制器传来
在 Spring 的 xml 配置文件中配置视图解析器
代码语言:javascript复制 <!-- 配置视图解析器:如何把 handler 返回方法值解析为视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
在 Spring 的 java 配置文件中配置视图解析器
代码语言:javascript复制@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
3. 编写控制器类
@Controller 用来声明控制器,他是基于 @Component 注解,能有辅助实现组件扫描。 @RequestMapping 注解声明了他们所要处理的请求,该注解既可以用于标注方法也可以用于标注类。
代码语言:javascript复制@Controller
public class Controller1 {
public String SUCESS = "sucess";
@RequestMapping("/sucess")
public String toSucess() {
System.out.println("got to the sucess page");
return SUCESS;
}
}
Spring MVC 的简单示例
欢迎页面 (index.jsp)
创建一个欢迎页面,压面中有一个链接,指向接下来会跳转的 url。
代码语言:javascript复制<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h3>
<a href="sucess">Click here to the sucess page</a>
</h3>
</body>
</html>
配置欢迎页面 web.xml
欢迎页面是 Servlet 配置文件中的配置
代码语言:javascript复制 <welcome-file-list>
<welcome-file>views/index.jsp</welcome-file>
</welcome-file-list>
代码语言:javascript复制创建跳转页面 sucess.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h2>The SUCESS Page</h2>
<br/>
</body>
</html>
配置 DispatcherServlet
配置转发的 Servlet 是使用 Spring 进行 url 的转发。init-param 标签是变量初始化标签,param-value 是指向 Spring 配置文件的路径。classpaht:是指在 src 文件夹下。如果不对 init-param 进行配置。那么 就会默认加载 WEB-INF 文件夹下 名称为 servelet-name 标签中的 servlet 名称加上 -servlet
为名的 Spring 配置文件。例如示例中可以在不设置 init-param 情况下加载的 Spring 配置文件的名称为 springDispatcherServlet-servlet.xml
<!-- 配置 DispatcherServlet -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
编写控制器类
使用 @Controller 注解可以将这个类标注为一个控制器的类,在启用组件扫描时 IOC 容器会自动加载该类。 其中的方法是 Spring 中
代码语言:javascript复制package cn.edu.stu.Demo1.handlers;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class Controller1 {
public String SUCESS = "sucess";
@RequestMapping("/sucess")
public String toSucess() {
System.out.println("got to the sucess page");
return SUCESS;
}
}
编写 Spring 配置文件
首先设置组件的自动扫描,然后设置视图解析器。prefix 是前缀设计,用于指定页面文件所在的文件夹的位置,一般是指在 WebContent 文件夹下的文件位置。。suffix 用于指定文件的后缀。
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="cn.edu.stu.Demo1.handlers"></context:component-scan>
<!-- 配置视图解析器:如何把 handler 返回方法值解析为视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>