05 SpringMVC
01.SpringMVC概述及入门案例
01.SpringMVC概述及入门案例
我们的开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就是浏览器服务器。在 JavaEE 开发中,几乎全都是基于 B/S 架构的开发。那么在 B/S 架构中,系统标准的三层架构
包括:表现层、业务层、持久层。三层架构在我们的实际开发中使用,所以我们课程中的案例也都是基于三层架构设的。
表现层的设计一般都使用 MVC 模型。(MVC 是表现层的设计模型,和其他层没有关系)
1.1.2 MVC 模型
MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,
是一种用于设计创建 Web 应用程序表现层的模式。 MVC 中每个部分各司其职:Model(模型) :
通常指的就是我们的数据模型。作用一般情况下用于封装数据。View(视图) :
通常指的就是我们的 jsp 或者 html。作用一般就是展示数据的。
通常视图是依据模型数据创建的。Controller(控制器) :
是应用程序中处理用户交互的部分。 作用一般就是处理程序逻辑的。
02.SpringMVC框架的介绍
SpringMVC 的优势
1、清晰的角色划分:
前端控制器(DispatcherServlet)
请求到处理器映射(HandlerMapping)
处理器适配器(HandlerAdapter)
视图解析器(ViewResolver)
处理器或页面控制器(Controller)
验证器( Validator)
命令对象(Command 请求参数绑定到的对象就叫命令对象)
表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)。
2、分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要。
3、由于命令对象就是一个 POJO,无需继承框架特定 API,可以使用命令对象直接作为业务对象。
4、和 Spring 其他框架无缝集成,是其它 Web 框架所不具备的。
5、可适配,通过 HandlerAdapter 可以支持任意的类作为处理器。
6、可定制性, HandlerMapping、 ViewResolver 等能够非常简单的定制。
7、功能强大的数据验证、格式化、绑定机制。
8、利用 Spring 提供的 Mock 对象能够非常简单的进行 Web 层单元测试。
9、本地化、主题的解析的支持,使我们更容易进行国际化和主题的切换。
10、强大的 JSP 标签库,使 JSP 编写更容易。
………………还有比如RESTful风格的支持
Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter
03.入门程序之需求分析
第2章 SpringMVC 的入门
04.入门程序之搭建开发环境 (IntelliJ IDEA 2018.3.6 x64)
代码:
springmvc_day01_01_start
手动补全Maven项目的文件夹目录
java
resources
Mark Directory as
springMVC要添加的依赖坐标如下
<properties>
<!-- 版本锁定 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.15.RELEASE</spring.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
在web.xml配置前端控制器
在web.xml配置文件中核心控制器DispatcherServlet
<!-- SpringMVC的核心控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 配置servlet启动时加载对象 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
创建springmvc.xml的配置文件
05.入门程序之入门代码编写
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>入门程序</h3>
<a href="/hello">入门程序</a>
</body>
</html>
需要启用注解IOC的支持,所以copy依赖头到springmvc.xml
springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
配置spring创建容器时要扫描的包
<!-- 配置spring创建容器时要扫描的包 -->
<context:component-scan base-package="cn.bjut"></context:component-scan>
创建并编写控制器的类在java目录
cn.bjut.controller.HelloController
// 控制器类
@Controller
public class HelloController {
@RequestMapping(path="/hello")
public String sayHello(){
System.out.println("Hello StringMVC");
return "success";
}
}
在WEB-INF目录下创建pages目录,在里头创建success.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>入门成功</h3>
</body>
</html>
返回springmvc.xml配置视图解析器
<!-- 视图解析器对象 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 开启SpringMVC框架注解的支持 -->
<mvc:annotation-driven/>
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。
使 用 <mvc:annotation-driven> 自 动 加 载 RequestMappingHandlerMapping ( 处 理 映 射 器 ) 和
RequestMappingHandlerAdapter ( 处 理 适 配 器 )。
启动Tomcat服务器后,测试结果正常显示,可以完成跳转页面的项目需求。
06.入门案例的流程总结
<a href="${ pageContext.request.contextPath }/hello">入门案例</a>
入门案例的执行流程 1. 当启动Tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatcherServlet对象, 就会加载springmvc.xml配置文件 2. 开启了spring注解扫描,那么HelloController对象就会被创建 3. 从index.jsp发送请求,请求会先到达DispatcherServlet核心控制器,根据配置@RequestMapping注解 找到执行的具体方法 4. 根据执行方法的返回值,再根据配置的视图解析器,去指定的目录下查找指定名称的JSP文件 5. Tomcat服务器渲染页面,做出响应
07.入门案例中使用的组件介绍
入门案例中的组件分析 1. 前端控制器(DispatcherServlet) 2. 处理器映射器(HandlerMapping) 3. 处理器(Handler) 4. 处理器适配器(HandlAdapter) 5. 视图解析器(View Resolver) 6. 视图(View)
08.RequestMapping注解的作用/09.RequestMapping注解的属性
RequestMapping注解 1. RequestMapping注解的作用是:建立请求URL和处理方法之间的对应关系。 2. RequestMapping注解可以作用在方法和类上 1. 作用在类上:第一级的访问目录 2. 作用在方法上:第二级的访问目录 3. 细节:${ pageContext.request.contextPath }也可以省略不写,但是路径上不能写 / 3. RequestMapping的属性 1. path 指定请求路径的url 2. value value属性和path属性是一样的 3. method 指定该方法的请求方式 4. params 指定限制请求参数的条件 5. headers 发送的请求中必须包含的请求头
// 控制器类 @Controller @RequestMapping(path="/user") public class HelloController { /** * 入门案例 * @return */ @RequestMapping(path="/hello") public String sayHello(){ System.out.println("Hello StringMVC"); return "success"; } /** * RequestMapping注解 * @return */ @RequestMapping(value="/testRequestMapping",params = {"username=heihei"},headers = {"Accept"}) public String testRequestMapping(){ System.out.println("测试RequestMapping注解..."); return "success"; } }
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h3>入门程序</h3> <%-- <a href="hello">入门程序</a> --%> <a href="user/testRequestMapping?username=heihei">RequestMapping注解</a> </body> </html>
枚举类型的.POST
@RequestMapping(value="/testRequestMapping",method = {RequestMethod.POST})
================
end