1 MVC设计模式

1.1 什么是设计模式

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。

使用设计模式的目的:
为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。

设计模式使代码编写真正工程化;
设计模式是软件工程的基石脉络,如同大厦的结构一样。

设计模式就是一种模子,经过多年实践锤炼形成一套行之有效的完成某个特定任务的步骤和方式。
===================================================================================
例如:
		西凤酒的酿造过程,酿造工序,前后不能变,温差不能变,这样做就是好喝,稍微改动就变味道了。
		
		再如,北京烤鸭,就是那样做,就是那些调料腌制,变量配比,味道口感就是不如人家。

1.2 MVC设计模式

MVC设计模式是一种通用的软件编程思想
在MVC设计模式中认为, 任何软件都可以分为三部分组成:

  • 控制程序流转的控制器(Controller)
  • 封装数据处理数据的模型(Model)
  • 负责展示数据的视图(view)

并且在MVC设计思想中要求一个符合MVC设计思想的软件应该保证上面这三部分相互独立,互不干扰,每一个部分只负责自己擅长的部分。

如果某一个模块发生变化,应该尽量做到不影响其他两个模块。
这样做的好处是,软件的结构会变得更加的清晰,可读性强。
有利于后期的扩展和维护,并且代码可以实现复用。


view jsp
controller 接收请求
pojo 封装模型
service 检查、调用
dao 查数据、传pojo


2 初识SpringMVC

2.1 Servlet的缺点

  1. 通常情况下,一个Servlet类只负责处理一个请求
    <mark>若项目中有成百上千个请求需要处理,就需要有成百上千个Servlet类,这样会使得项目中Servlet类的个数暴增</mark>;( <mstyle mathcolor="&#35;f01"> S p r i n g M V C </mstyle> \color{#f01}{SpringMVC可以处理一个模块} SpringMVC
  2. 在Servlet3.0版本之前,每一个Servlet都需要在web.xml文件中至少做八行配置信息,
    配置内容多且繁琐。
    <mark>当Servlet特别多时,web.xml配置量太多,不利于团队开发;</mark>( <mstyle mathcolor="&#35;f01"> S p r i n g M V C </mstyle> \color{#f01}{SpringMVC无需太多配置} SpringMVC
  3. 当通过客户端提交参数到服务器,通过Servlet进行接收时,无论数据本身是什么格式,
    <mark>在Servlet中一律按照字符串进行接收,后期需要进行类型转换,</mark>
    request.getParameter();
    request.getParameterValues()
    都只能获得字符串(数组)
    复杂类型还需要特殊处理,特别麻烦!
  4. servlet具有<mark>容器依赖性</mark>,
    必须放在服务器中运行,
    <mark>不利于单元测试</mark>;

2.2 SpringMVC简介

  • Springmvcspring框架的一个模块,
  • springspringmvc无需中间整合层整合
  • Springmvc是一个基于mvcweb框架

2.3 spring执行原理

  • 用户发送请求 至 前端控制器(DispatcherServlet);
    提示:
    DispatcherServlet的作用:<mark>相当于转发器、中央处理器,是整个流程控制的中心</mark>
    • 接收请求,
    • 调用其它组件处理请求,
    • 响应结果,
  • 前端控制器(DispatcherServlet)收到请求后调用处理器映射器(HandlerMapping)
  • 处理器映射器(HandlerMapping)找到具体的Controller
    (这里找到的是 <mstyle mathcolor="&#35;f01"> C o n t r o l l e r </mstyle> \color{#f01}{Controller名字字符串} Controller
    (可以根据xml配置、注解进行查找),
    并将Controller返回给DispatcherServlet
  • 前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)。
    处理器适配器经过适配调用具体的Controller
    (ControllerserviceDao ⇒ 数据库)
  • Controller执行完成后返回ModelAndView
    提示:
    • Model(模型数据,即Controller处理的结果,Map)
    • View(逻辑视图名,即负责展示结果的JSP页面的名字)
  • 处理器适配器(HandlerAdapter)将controller执行的结果(ModelAndView)返回给前端控制器(DispatcherServlet);
  • 前端控制器(DispatcherServlet)将执行的结果(ModelAndView)传给视图解析器(ViewReslover)
  • 视图解析器(ViewReslover)根据View(逻辑视图名)解析后返回具体JSP页面
  • 前端控制器(DispatcherServlet)根据Model对View进行渲染
    (即将模型数据填充至视图中);
  • 前端控制器(DispatcherServlet)将填充了数据的网页响应给用户。

<mark>其中整个过程中需要开发人员编写的部分有</mark>

  • Controller
  • Service
  • Dao
  • View

3 springmvc入门案例

需求

  • 通过浏览器访问http://localhost/项目名称/hello 地址,在控制台输出 “hello springmvc”
  • 将请求转向 /WEB-INF/pages/home.jsp 页面

步骤

3.1创建Maven—Javaweb工程

1、通过Maven创建javaweb工程


2、在pom.xml中引入springmvc所需jar包:将下面的配置直接拷贝到pom.xml中的根标签内

<!-- 集中定义依赖版本号 -->
<properties>
	<junit.version>4.10</junit.version>
	<spring.version>4.1.3.RELEASE</spring.version>
</properties>

<dependencies>
	<!-- 单元测试 -->
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>${junit.version}</version>
		<scope>test</scope>
	</dependency>

	<!-- SpringMVC -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>
		<version>${spring.version}</version>
	</dependency>
	
	<!-- Servlet支持Request和Response -->
	<dependency>
		<groupId>javax.servlet</groupId>
		<artifactId>servlet-api</artifactId>
		<version>2.4</version>
		<scope>provided</scope>
	</dependency>
	
	<!-- java对象转换json的工具类 -->
	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-databind</artifactId>
		<version>2.5.1</version>
	</dependency>
</dependencies>

3.2 在web.xml中配置springmvc

<?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" id="WebApp_ID" version="2.5">
	
	<!-- 配置springmvc前端控制器, 将所有请求交给springmvc来处理 -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		
		<!-- 配置springmvc核心配置文件的位置,默认Springmvc的配置文件是在WEB-INF目录下,默认的名字为springmvc-servlet.xml,如果要放在其他目录,则需要指定如下配置: -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc-config.xml</param-value>
		</init-param>		
	</servlet>
	<!-- 其中的斜杠(/)表示拦截所有请求(除JSP以外), 所有请求都要经过springmvc前端控制器 -->
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

</web-app>

若不拦截全路径,而要要拦截指定路径 ****
写成 : / / /****/ //
url 写成: / / / ***/类名(有设置的话)/方法名/ ///

3.3 创建并配置springmvc-config.xml <mstyle mathcolor="&#35;f01"> s t s </mstyle> \color{#f01}{用sts。。。} sts

直接复制下面配置文件的内容即可!

<?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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
	
	<!-- 1.配置前端控制器放行静态资源(html/css/js等,否则静态资源将无法访问) -->
	<mvc:default-servlet-handler/>
	
	<!-- 2.配置注解驱动,用于识别注解(比如@Controller) -->
	<mvc:annotation-driven></mvc:annotation-driven>
	
	<!-- 3.配置需要扫描的包:spring自动去扫描 base-package 下的类, 如果扫描到的类上有 @Controller、@Service、@Component等注解, 将会自动将类注册为bean -->
	<context:component-scan base-package="com.tedu.controller">
	</context:component-scan>
	
	<!-- 4.配置内部资源视图解析器 prefix:配置路径前缀 suffix:配置文件后缀 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/pages/"/>
		<property name="suffix" value=".jsp"/>
	</bean>
	
	
</beans>

3.4 创建并实现HelloController类

1、创建com.tedu.controller.HelloController类

2、实现HelloController类

package com.tedu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller /* 这个注解表示当前类是属于控制层 */
public class HelloController {
	/* http://localhost/项目名称/hello */
	@RequestMapping("/hello") 
	/* 这个注解用于:映射请求的资源路径(/hello)和当前方法(hello)的对应关系 * 当浏览器请求 /hello 路径时, 将会访问(执行)当前这个方法 */
	public String hello() {
		System.out.println("hello springmvc...");
		return "home";
	}
}

3.5 创建并实现home.jsp

在WEB-INF/pages/目录下,创建home.jsp页面。
WEB-INF/pages/home.jsp

<%@ page pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
</head>
<body>
	<h1>hello springmvc~~~</h1>
</body>
</html>

3.6 访问测试

打开浏览器,输入url地址:http://localhost/hello 地址,访问结果如下:

哈哈,一脸懵逼吧