MVC: model 模型(JavaBean对象)、view 视图(Jsp、html等技术)、Controller控制器(Servlet等)
浏览器发请求,请求先到Controller控制器,控制器接收请求,去new一个JavaBean对象,
将拿到的数据封装起来,此时JavaBean在业务层就可以调用业务逻辑,业务层返回数据,再封装到JavaBean中,
再将数据转发给JSP(html),在jsp中响应结果,生成html
SpringMVC是什么
优势
1.Maven骨架创建wep
2.导入依赖
抽取spring依赖的公共版本号、spring-context、spring-web、spring-webmvc、servlet-api、jsp=api
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<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.0</version>
<scope>provided</scope>
</dependency>
3. 配置前端控制器
4.创建spring配置文件
开启spring注解,指定要扫描的包
5.创建控制器类
6. 前端控制器中,加载springmvc配置文件
Servle对象t默认是在接收请求时,才会被创建,使用<load-on-startup>1将servlet对象的创建变为服务器启动时,就创建
所以,springmvc配置文件的加载初始化,要放到前端控制器servlet中,当服务器启动时,就会被加载
7. 给控制器指定返回页面的页面名字符串,MVC会将该字符串默认为页面名
8. 配置视图解释器对象,解析控制器类返回的字符串为jsp页面
9. 请求页面的请求路径填写为,请求的控制器控制方法的请求映射路径
总结:
Maven骨架创建wep
导入依赖spring-context、spring-web、spring-webmvc、servlet-api、jsp=api
spring配置文件 开启注解,指定扫描包
控制器类 将类对象存入容器、
将方法带上请求路径,存入容器
控制器指定返回页面名字符串 ------- 方法返回为字符串
如果方法返回值为modelandView对象,需要设置对象的VIewName为返回页面名
返回值为void,则使用原生request,跳转页面
前端控制器 的servlet
前端控制器中加载springmvc配置文件
全局初始化指定配置文件路径
指定前端控制器的servlet,在服务器启动时就创建
视图解释器对象,解析控制器类返回的字符串为jsp页面
请求页面的请求路径
处理器映射器、处理器适配器、视图解析器------SpringMVC三大组件
<mvc:annotation-driven>:自动加载处理器映射器、处理器适配器
可以作用于方法、类上
用于类上,表示一级目录---模块url
属性value = path 指定请求路径的url
属性 method 指定 请求方式(GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE)
属性 param 指定请求参数 ------------ 请求必须包含指定的属性键值对key=value,有一个不同就请求失败
属性headers 指定请求必须包含的请求头
1. 基本类型/字符串类型 请求参数,作为控制器方法的参数绑定,进而获取参数值-------------要求请求参数名 == 方法参数名
2. 实体类型 请求参数,作为控制器方法的参数绑定---------------要求请求参数名 == 实体类属性名
过滤器解决post响应 乱码的情况
写一个类继承Converter<s,t>-------方法中设置类型转换格式
注册自定义类型转换器
在mvc:annotation-driven中开启自定义类型转换器
对日期类型处理
获取请求参数给控制器方法
请求参数的绑定,要求请求参数名和Controller方法形参名必须一致,RequestParam可以修饰形参,来给形参起别名
请求参数为name,导致@RequestParam(name="name")中的值一定为name,相反,当@RequestParam(name="name")中设为name,请求参数也必须有name
获取请求体内容给控制器方法
只支持post请求(post请求才有请求体)---- 所有不能用超链接请求(get)
得到的就是表单内容
提供url占位符给控制器方法
(在url中传入一个占位符)类似于重载思想,url的主路径一致,通过填充不同的占位符和请求方式,来区分不同的请求资源
配置一个过滤器,用意将post、get请求转变为delete put
必须要有此消息头
传Cooki值
修饰的方法时,会在请求方法之前执行,可以保证未提交数据的字段,使用原来设定好的数据
提前设定一个对象参数的值,当另一个传递的请求参数没有此值时,使用该值
方法一:修饰方法,使用返回值,提前设定值,给未传递的属性使用 -------------------使用对象来存放提前设定的值
在表单中提交了两个属性,属性不全,在@ModelAttribute的方法中,传入一个表单项,将表单中未传递的属性,提前设置好,封装到一个对象,再将对象返回给@RequestMapping中做参数,表单访问@RequestMapping方法路径,就得到完整的对象属性
方法二:修饰参数:使用Map存提前设定的值,给未传递的属性使用------------------------使用Map集合来存放提前设定的值
不忽略EL表达式:开启EL表达式
参数共享1.request域中
方法参数用Model,调用方法addAttribute("key","value"); 存入request域中
参数共享2. session域中
@SessionAttribute 修饰类,当request域通过model设置了键值对,才能读取出来
当request域中有msg=美美,再用@SessionAttributes(value={"msg"})将该键值对又存入session域中
开启EL表达式支持
去共享的Session域的值
参数传递Model的实现类ModelMap 通过 get("key"),可以从session中取出对应键值对的值
删除共享的Session值
参数传递SessionStatus 调用方法setComplete(),清除session域中的值
直接请求转发请求重定向
setViewName提供视图名称,传递给modelandview作为返回页面名称
return的就是视图名称,作为返回页面名称
注意事项:重定向请求不到WEB-INT下的页面
使用 redirect: 关键字来重定向,不需要写项目名称路径
重定向后共享数据
使用参数 RedirectAttributes 的方法 addFlashAttribute() 设定键值对,在重定向的另一个方法中 能使用
静态资源不拦截
在springmvc.xml中
需要用到的jar包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.10</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.10</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.10</version>
</dependency>
springmvc上传文件
注意:表单中的文件名必须和上传方法中、参数名一样
一键全部的控制方法都拦截,不需要指定拦截路径也可以
拦截指定路径
将拦截路径设为请求路径下的所有路径,就可以拦截所有控制器方法的请求
spring-mybatis整合