经典MVC(Model View Controller)模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。其中,View的定义比较清晰,就是用户界面。
模型,主要通过JavaBean实现。完成具体的业务操作(例如数据库的增删改查,对象的封装)
视图,主要通过JSP实现。用于展示数据
控制器,主要通过Servlet实现。用于获取用户输入,调用模型,以及将数据交给视图进行展示
SpringMVC是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级web框架,属于SpringFrameWork的后续产品,已经融合在Spring Web Flow中
SpringMVC是目前最主流的MVC框架之一,它通过一套注解,让一个简单的Java类(POJO:Plain Ordinary Java Object,简单的Java对象,实际就是普通JavaBeans)成为处理请求的控制器,而无需实现任何接口。同时它还支持Restful编程风格的请求
在之前所述的客户端发送请求流程中,一般流程都是客户端发送请求到Tomcat服务器,服务器会利用Tomcat引擎对请求进行接收与封装(req和resp),随后进入web应用调用相关的请求资源即相关Servlet
但实际开发中web层的Servlet存在大量重复操作,几乎每个Servlet都需要执行
以上大量重复的操作可以称为共有行为,而每个Servlet特有的具体执行实现可以称为特有行为,SpringMVC可以抽取共有行为,将所有共有行为创建为一个新的Servlet从未降低代码的重复。同时,剩下的特有行为也不再需要封装为Servlet,而是按照POJO来实现逻辑功能即可
不同框架所使用的前端控制器的格式是不相同的,以SpringMVC为例,其使用Servlet作为前端控制器,而以前的Struts2则采用Filter作为控制器
为解决持久层中一直未处理好的数据库事务的编程,又为了迎合NoSQL崛起,SpringMVC给出了方案:将传统的模型层拆分为了业务层(Service)和数据访问层(DAO,Data Access Object)。 在 Service 下可以通过 Spring 的声明式事务操作数据访问层,而在业务层上还允许我们访问 NoSQL ,这样就能够满足NoSQL的使用了,它可以大大提高互联网系统的性能。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.3</version>
</dependency>
注意这里再配置SpringMVC前端控制器时第一个参数是控制器名称,第二个参数是创建Servlet的名,第三个参数是声明spring-mvc配置文件,最后一个参数是设置调用时间
配置映射地址是指定哪些页面调用时执行Servlet,url-pattern设为“/”表示所有页面都执行该控制器
<!--配置SpringMVC前端控制器-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--配置映射地址-->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
视图
<%--
Created by IntelliJ IDEA.
User:
Date: 2021/3/3
Time: 22:55
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Success!</h1>
</body>
</html>
Controller类
@Controller("userController")
public class UserController {
@RequestMapping("/saveFunction")
public String save(){
System.out.println("(Controller) Save running...");
return "success.jsp";
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置Controller的组件扫描-->
<context:component-scan base-package="cn.ywrby.controller"/>
</beans>
用于建立请求URL和处理请求的方法之间的对应关系(即将请求URL与处理请求的方法进行绑定,并对请求进行限定)
@Controller("userController")
//访问路径:localhost:8080/userController
@RequestMapping("/userController")
public class UserController {
//访问路径:localhost:8080/userController/saveFunction
@RequestMapping("/saveFunction")
public String save(){
System.out.println("(Controller) Save running...");
return "/success.jsp";
}
}
该注解支持三个属性(只有一个属性,且是value属性的情况下,属性名可以省略)
@Controller("userController")
public class UserController {
/**
* 第一个参数表示二级访问路径
* 第二个参数表示对传入参数的限制,分别表示必须有username参数,money参数不能为100
* 第三个参数表示必须是POST请求才能访问
* @return
*/
@RequestMapping(value = "/saveFunction",params = {"username","money!100"},method = RequestMethod.POST)
public String save(){
System.out.println("(Controller) Save running...");
return "/success.jsp";
}
}