SpringMVC 是web层的框架
-
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。
-
SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring3.0 的发布,全面超越 Struts2,成为最优秀的 MVC 框架。
-
它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持 RESTful 编程风格的请求。
web层主要干嘛的:接收请求参数,封装数据,调用service,响应给浏览器
但是在web层各种域之间存取数据、页面之间的跳转、数据写到响应体中等等这些操作还未进行优化。
Spring提供了spring-web实现Spring整合web开发,但是这种做法很难实现MVC思想,也就是不能简化我们的web开发。
这里要注意区分两个不同的概念:
1、软件三层:展示层、业务层、数据持久层。一个应用根据代码职责不同划分为软件三层。
展示层:负责与前台交互
业务层:负责业务逻辑处理
数据持久层:负责业务数据持久化与读取
2、MVC:为了模型和视图实现代码上的分离,将软件三层中的展示层中代码根据职能不同分为三部分:
模型——Model——M :封装数据(企业数据和业务规则)
视图——View——V :封装视图(用户可以看到的界面,通过HTML、jsp等技术实现)
控制——Controller——C :负责同步M和V,一旦M改变,V应该同步更新。
Spring简化版工作流程
如上图所示,Servlet需要的做工作有:
- 接收请求
- 通过request对象获取请求参数
- 将获取的请求参数封装成对象
- 调用Service
- 根据Service返回的结果,作出响应,响应可以是将数据写入各种域中,完成页面跳转,也可以把数据封装成json写到响应体中,然后直接响应
上述步骤中除了调用Service会根据不同的业务需求调用不同的service之外,其他的基本都是相对比较固定的。这些相对比较固定的步骤就是SpringMVC帮我们去实现的,通过前端控制器帮我们实现。
两个概念,JavaBean和POJO。
- JavaBean 是指一个类按照指定的规范去编写
- 这个类必须实现序列化接口
- 这个类必须提供无参构造方法
- 这个类必须私有化成员变量
- 这个类必须提供成员变量的getter和setter
- POJO —— Plain Ordinary Java Object —— 就是简单的java对象
- 就是一个普通的java类
- 没有任何实现和继承(Object除外)
- 可以有自己的成员变量和成员方法
- controller就是一个POJO
代码演示
导入Spring和SpringMVC的坐标、导入Servlet和Jsp的坐标
<!--Spring坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--SpringMVC坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--Servlet坐标-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!--Jsp坐标-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
在web.xml配置SpringMVC的核心控制器
<!-- 配置SpringMVC前端控制器 -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
servlet初始化参数,用于指定SpringMVC配置文件位置
schema约束规定,该标签需要在load-on-startup上面
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--
0表示web容器启动时就加载该控制器DispatcherServlet
当值为0或者大于0时,表示容器在应用启动时就加载这个servlet
正数的值越小,启动该servlet的优先级越高
设置重复也不会出现异常,服务器会自己决定初始化顺序。
当是一个负数时或者没有指定时,则指示容器在该servlet被使用时才加载
-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 拦截规则 -->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
编写Controller代码
public class QuickController {
public String quickMethod(){
System.out.println("quickMethod running.....");
return "index";
}
}
在webapp目录下编写视图页面index.jsp
<html>
<body>
<h2>Hello SpringMVC!</h2>
</body>
</html>
使用注解装配Controller、配置方法的映射请求地址
// 把当前类放入Spring容器
@Controller
public class QuickController {
// 给当前方法加访问路径
@RequestMapping("/quick")
public String quickMethod(){
System.out.println("quickMethod running.....");
// 如果是重定向 “redirect:/quick/index.jsp”
// 如果是转发 “forward:/quick/index.jsp”
// 不写,默认转发
return "index";
}
}
⑤ 编写spring-mvc.xml
<!--配置SpringMVC的注解扫描,建议只扫描controller层-->
<context:component-scan base-package="cs.wy.controller"/>