前言
JavaEE的体系结构:
由上到下分为:
应用层、Web层、业务层、持久层
(1)持久层:数据的持久化层(将内存中的数据保存到数据库文件中或其他文件中)
持久层的框架有: MyBatis、Hibernate
(2)业务层:实现业务的整合、解耦。Spring
(3)Web层:实现请求-响应。
Web层的框架有:SpringMVC、Struts2
什么是SpringMVC
- SpringMVC框架是以请求为驱动;围绕Servlet设计,将请求发给控制器,然后通过模型对象,分配器展示请求结果视图。
- SpringMVC的核心类:DespatcherServlet;DespatcherServlet是一个Servlet,顶层实现Servlet接口
- SpringMVC由DispatcherServlet、HandlerMapping、controller、ViewResolver四个接口组成
在IDEA中配置SpringMVC
在pom.xml中导入依赖jar包:
<!-- Spring统一版本号 -->
<springVersion>5.1.1.RELEASE</springVersion>
<!-- Spring表达式 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${springVersion}</version>
</dependency>
<dependency>
<!-- Spring核心 -->
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springVersion}</version>
</dependency>
<dependency>
<!-- Spring实体 -->
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${springVersion}</version>
</dependency>
<dependency>
<!-- Spring容器 -->
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springVersion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${springVersion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springVersion}</version>
</dependency>
<!--spring AOP的包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${springVersion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${springVersion}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<!--Servlet工具-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
(一)DispatcherServlet
DispatcherServlet 是前端控制器;是整个SpringMVC的核心;是一个Servlet,负责统一分发所有请求
DispatcherServlet 的作用:
- 拦截符合特定格式的URL请求
- 初始化DispatcherServlet上下文对应的WebApplicationContext;并与业务层(Spring)、持久层(Mybatis)建立联系
- 初始化SpringMVC各个组件,并装配到DispatcherServlet中
在web.xml文件中配置DispatcherServlet:
如果不指定<param-name>;则默认配置文件为/WEB-INF/<servlet-name>-servlet.xml<load-on-startup>是启动顺序;
通常让Servlet跟随servlet容器一起启动;<url-pattern>定义要拦截的URL请求:
其中的值有:
拦截规则:
*.xxx: 指定要拦截的特定类型;不拦截静态文件
/: 使用REST风格进行拦截,导致静态文件被拦截不能正常显示;如果要静态文件可以使用,可以在DispatcherServlet前使用DefaultServlet先拦截特定类型的请求(*、js、.css等)
/* : 导致不能访问jsp
<servlet>
<servlet-name>springMvc</servlet-name>
<!--核心的前端控制器-->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:springMvc-config.xml</param-value>
</init-param>
</servlet>
<!--映射-->
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
(二)HandlerMapping(处理器映射):
HandlerMapping负责完成请求到控制器的映射。在Servlet的配置文件中,进行url与控制器的映射,同时,还可以对控制器进行拦截
- 默认是BeanNameUrlHandkerMapping;直接将url与实现类进行绑定,书写方便,但是耦合性高
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
- 配置SpringMVC处理器适配器:SimpleUrlHandlerMapping
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
- 配置SpringMVC视图解析器:InternalResourceViewResolver
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
(三)Controller(控制器):
Controller(控制器)负责处理用户请求,完成之后返回ModelAndView对象给前端控制器,通过实现Controller接口或继承父类的方式编写控制器
控制器写法:
- 实现Controller接口
- 继承AbtractController类,重写其中方法
- 继承MultActionController类,实现多个方法,处理多个请求
(四)ViewResolver(视图解析器):
负责对ModelAndView对象的解析,并直接查找对应的view对象,SpringMVC默认通过转发进行页面跳转
如果要解析的是HTML页面;则需要导入jar包:
<!--html视图解析器freemarker-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.22</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springVersion}</version>
</dependency>
创建一个properties文件:对日期等进行格式化
tag_syntax=auto_detect
template_update_delay=60
default_encoding=UTF-8
output_encoding=UTF-8
locale=zh_CN
date_format=yyyy-MM-dd
time_format=HH:mm:ss
datetime_format=yyyy-MM-dd HH:mm:ss
classic_compatible=true
template_exception_handler=ignore
在SpringMVC-conf.xml中配置html解析器
<!--配置html解析器-->
<bean id="freemarkerConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="classpath:freemarker.properties"/>
</bean>
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="freemarkerSettings" ref="freemarkerConfiguration"/>
<property name="templateLoaderPath" value="/WEB-INF/html/"/>
</bean>
<bean id="htmlViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="suffix" value=".html"/>
<property name="contentType" value="text/html;charset=utf-8"/>
<property name="order" value="0"/>
</bean>
<!--配置jsp视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
<property name="order" value="1"/>
</bean>
SpringMVC的核心架构
为什么要使用SpringMVC
很多应用程序的问题在于处理业务数据的对象和显示业务数据的视图之间存在紧密耦合,通常,更新业务对象的命令都是从视图本身发起的,使视图对任何业务对象更改都有高度敏感性。而且,当多个视图依赖于同一个业务对象时是没有灵活性的。
SprinaMVC是一种基于Java,实现了WebMVc设计模式,请求驱动类型的轻量级Web框架,即使用了Mvc架构模式的思想,将 Web层进行职责解耦。
基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringMvc也是要简化我们日常web开发。
一个简单的SpringMVC例子:
创建bean
package com.mvc.beans;
import lombok.Data;
/**
* @author Una
* @date 2022/8/12 14:17
* @description:
*/
@Data
public class User {
//属性必须和表单属性相同
private String userName;
private String passWord;
}
创建一个简单的js文件
<%--
Created by IntelliJ IDEA.
User: ThinkPad
Date: 2022/8/11
Time: 15:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>SpringMVC实例</title>
</head>
<body>
<h1>西安邮电大学</h1>
</body>
</html>
配置js的视图解析器以及开启注解驱动
<!--开启注解驱动-->
<mvc:annotation-driven />
<!--开启包的自动扫描;扫描controller所在的包-->
<context:component-scan base-package="com.mvc.controller"/>
<!--配置jsp视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
<property name="order" value="1"/>
</bean>
构造一个控制器
package com.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author Una
* @date 2022/8/13 12:38
* @description:
*/
//@RequestMapping(value = "hello")//表示这个类所有的响应结果以/hello/为父路径
@Controller//表示被注解的类是一个控制器;可以处理客户端的请求
public class HelloController {
@GetMapping(value = "abc")
public String test() {
return "hello";
}//值与hello.jsp同名
@GetMapping(value = "xjd")
public String test2(){
return "admin";
}
}
在以上代码中,当用户在地址栏输入abc回车后,test()方法返回"hello",控制器将hello拼接到"/WEB-INF/views/“与”.jsp"之间;形成一个完整的路径:"/WEB-INF/views/hello.jsp"即跳转到hello.jsp页面