1 三层架构介绍
咱们开发服务器端程序,一般都基于两种形式,一种C/S架构程序,一种B/S架构程序
使用Java语言基本上都是开发B/S架构的程序,B/S架构又分成了三层架构
三层架构
- Model(模型):封装实体类
- Controller(控制器):层则根据 View 层的用户输入调用Model 层的逻辑读写相关数据,并将数据选择适当的视图模板生成对应的 View 层展示效果
- View(视图):层直接与用户交互,负责向用户展示数据
请求流程
- 用户发送请求至前端控制器DispatcherServlet
- DispatcherServlet收到请求调用HandlerMapping处理器映射器。
- 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
- 执行处理器(Controller,也叫后端控制器)。
- Controller执行完成返回ModelAndView
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器
- ViewReslover解析后返回具体View
- DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
- DispatcherServlet响应用户
以上流程是以DispatcherServlet为核心轴,并且DispatcherServlet就是一个Servlet
使用XML方式配置
1 创建项目并引入依赖
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!--Spring核心基础依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 增加了切面 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<!-- spring jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring mvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!--日志相关-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--测试相关-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
</dependencies>
配置文件
1.web.xml 配置如下
<servlet>
<!-- 设置所有请求拦截到分发器
第一种 如果SpringMVC的配置文件,和web.xml在同一个目录
比如 MVC配置文件名字叫 basic-servlet.xml
只需要把servlet-name的值 设置为basic就可以,
但是 MVC配置文件的名字必须是xxx-servlet.xml的格式 -->
<servlet-name>basic</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定配置文件-->
<!-- <init-param> -->
<!-- <param-name>contextConfigLocation</param-name> -->
<!-- 可以放在任何地方 -->
<!-- <param-value>/a/b/c/d/xxxxxxxxx.xml</param-value> -->
<!-- 放在src下 -->
<!-- <param-value>classpath:xxxxxxxxx.xml</param-value> -->
<!-- </init-param> -->
<!-- 项目启动就会加载这个servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>basic</servlet-name>
<url-pattern>/</url-pattern>
<!--
/* 会拦截jsp文件
/ 不会拦截jsp
-->
</servlet-mapping>
2.basic-servlet.xml 配置
<!-- 使用XML进行映射
MVC框架基本两个点
1 url怎么映射进去进行处理
2 处理完如何找到视图
-->
<!-- 处理映射器配置-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 创建映射,配置映射器,name必须是 / 打头-->
<bean name="/w" class="com.wxx.SpringMVCDay01.Controller.TestControlle"/>
<!-- 视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
注意点 文件名字和Servlet-name必须相同
3.创建 Controlle层 绑定映射关系
继承AbstractController
覆写里面handleRequestInterna
注解配置(重点)
1.引用依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
2.配置mvc的配置文件 basic-servlet.xml
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
<!-- 配置包扫描文件-->
<context:component-scan base-package="com.wxx.SpringMVCNotes.controller"/>
<!-- 开启动MVC的配置-->
<mvc:annotation-driven>
<!-- 解决响应乱码-->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!--视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
配置包扫描文件
配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<display-name>SpringMVC_01_Basic</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<!-- 设置所有请求拦截到分发器
第一种 如果SpringMVC的配置文件,和web.xml在同一个目录
比如 MVC配置文件名字叫 basic-servlet.xml
只需要把servlet-name的值 设置为basic就可以,
但是 MVC配置文件的名字必须是xxx-servlet.xml的格式 -->
<servlet-name>basic</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定配置文件-->
<!-- <init-param> -->
<!-- <param-name>contextConfigLocation</param-name> -->
<!-- 可以放在任何地方 -->
<!-- <param-value>/a/b/c/d/xxxxxxxxx.xml</param-value> -->
<!-- 放在src下 -->
<!-- <param-value>classpath:xxxxxxxxx.xml</param-value> -->
<!-- </init-param> -->
<!-- 项目启动就会加载这个servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>basic</servlet-name>
<url-pattern>/</url-pattern>
<!--
/* 会拦截jsp文件
/ 不会拦截jsp
-->
</servlet-mapping>
<!-- 请求中文乱码解决方法 过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 指定字符集 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
设置所有请求拦截到分发器 第一种 如果SpringMVC的配置文件,和web.xml在同一个目录 比如 MVC配置文件名字叫 basic-servlet.xml 只需要把servlet-name的值 设置为basic就可以, 但是 MVC配置文件的名字必须是xxx-servlet.xml的格式
3.创建 controller
1. 类上加上@Controller(@component的基础含义)
2.类上还需要加@RequestMapping(“”)配置地址和controller的映射关系(一级路径)
3.方法上也要加@RequestMapping(“”)配置地址和方法的映射关系(二级路径)
4方便咱们不用再去写很多个controller(servlet)
5方法返回值可以写成字符串,返回值就是view-name
代码如下
@Controller
@RequestMapping("/Test")
public class TestController {
@RequestMapping("/w")
public String Test1(){
return "One";
}
@RequestMapping("/ws")
public ModelAndView Test12(){
return new ModelAndView("One");
}
常用注解
@Controller
1.具有component的基础含义,被spring管理,当成bean注入到spring容器中
2.可以让该类中的方法返回String,该String默认就是view-name
3.标志该层为表现层或者控制层
@RequestMapping
映射地址和controller或者方法的关系,
写在controller上就是一级路径,写在方法上就是二级路径
同样效果的 GetMapping,PostMapping,PutMapping,DeleteMapping
@ResponseBody
封印 被视图解析器解析的效果( 避过视图解析器的解析 )
返回想要返回的数据类型,String就是String,而不是view-name
@RequestBody
加载参数前
要求前端必须传json格式,就算没有传参,你也得传给我一个空的json {}
如果用form-data传参,其实就是(application/x-www-form-urlencoded)
会报错 415 Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
如果没有传参,也会报错,400 Required request body is missing 请求体缺失
@RestController(适合用于整个类都避开视图解析时使用)
1.具有component的基础含义,被spring管理,当成bean注入到spring容器中
2.可以让该类中的方法避过视图解析器的解析,返回的String不再是view-name
3.标志该层为表现层或者控制层
@RestController和@Controller做了一个对比,是否被视图解析器解析
@RequestParam("")
只能用Post请求方式
加在参数前
1.当前端传值时,key值和后端不一致,可以用该注解解决,
2.当前端没有传该注解起的名字name时,前端调用接口就会报400的错误 Required String parameter 'name' is not present 不存在不在场
@PathVariable
只能用Post请求方式
加载参数前
获取地址栏动态参数,/{as}
如果参数类型转化发生异常,会报错
Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer';nested exception is java.lang.NumberFormatException: For input string: "abc"
数组的添加方式
多个Url映射到同一个方法上
@RequestMapping({"/hello","/h","/hi"})