依赖注入:给对象中的属性赋值
构造赋值,set赋值
注解赋值
1.创建对象用的:
Component (controller service Repository)
2.注入数据 @Value基本类型和字符串类型
@Autowired 根据类型注入
@Qualifier 找bean名字
@Resource
3.@Scope
4.生命周期相关的
springMVC:
核心:前端控制器
参数接收:
1.普通参数,对象接收参数,@ResquestBody(复杂类型)
@ResquestMapping() @RequestParam
模拟controller, dao,service层,使用bean.xml配置。
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。
javaWeb : servlet,filter ,listener
1、清晰的角色划分:
前端控制器(DispatcherServlet)—> Dispatcher(调度) + Servlet
对不同的Servlet进行调度 分发,MVC核心
请求到处理器映射(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风格的支持、简单的文件上传、约定大于配置的契约式编程支持、基于注解的零配置支持等等
共同点:它们都是表现层框架,都是基于 MVC 模型编写的。它们的底层都离不开原始 ServletAPI。它们处理请求的机制都是一个核心控制器。
javaWeb三大组件:servlet , filter , listener
区别:
Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter
Spring MVC 是基于方法设计的,而 Struts2 是基于类,Struts2 每次执行都会创建一个动作类。所
以 Spring MVC 会稍微比 Struts2 快些。
Spring MVC 使用更加简洁,同时还支持 JSR303, 处理 ajax 的请求更方便
(JSR303 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们 JavaBean 的属性上面,就可以在需要校验的时候进行校验了。)
Struts2 的 OGNL 表达式使页面的开发效率相比 Spring MVC 更高些,但执行效率并没有比 JSTL 提
升,尤其是 struts2 的表单标签,远没有 html 执行效率高。
<!--加依赖-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.8</version>
</dependency>
</dependencies><web-app>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app><?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">
<!--开启注解包扫描-->
<context:component-scan base-package="com.bai" ></context:component-scan>
<!--配置视图解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--springmvc注解驱动,@RequestMapping -->
<mvc:annotation-driven />
</beans>package com.bai.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @ClassName HelloSpringMvc
* @Description ToDo
* @Auther teacher Bai
* @Date 2020/12/22 0:16
*/
@Controller
public class HelloSpringMvc {
//配置访问的路径
@RequestMapping("/hello")
public String hello(){
System.out.println("你好哈哈h");
//对应jsp页面
return "success";
}
}前端jsp页面/html页面《—》发出请求----》controller《----》dao《----》数据库
面试题:springmvc的运行原理 背住!
1、 用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView。
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。使 用 mvc:annotation-driven 自动加载 RequestMappingHandlerMapping (处理映射器) 和RequestMappingHandlerAdapter ( 处 理 适 配 器),可 用 在 SpringMVC.xml 配 置 文 件 中 使 用mvc:annotation-driven替代注解处理器和适配器的配置。
作用:用于建立请求 URL 和处理请求方法之间的对应关系。
出现位置:可以是类上,也可以是方法上。
如果是作用于类上的叫窄化处理(精准定位)
属性:
value: 用于指定请求的url ,跟path属性完全相同。
method: 用于指定请求的方法。
@RequestMapping(value="findItem",method=RequestMethod.GET);
@RequestMapping(value="findItem",method=RequestMethod.POST);
@RequestMapping(value="findItem",method={RequestMethod.GET,RequestMethod.POST});params:属性基本没用了,不用记忆
使用RequestMapping()访问多级目录
请求的注解:
@GetMapping //该方法只接收get请求
@PostMapping
@PutMapping
@DeleteMapping请求的Controller方法中直接接收参数。
使用set方法接收参数。name名字和类的属性名一致。
参数到达控制器后,会按照实体类中的set方法自动封装成javaBean对象。
<!-- 字符串配置-->
<filter>
<filter-name>charfilter</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>charfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping><dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.12.4</version>
</dependency>2.前台发送请求:
3.后台controller接收请求
什么是 rest:**REST(英文:Representational State Transfer,简称 REST)描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。在目前主流的三种 Web 服务交互方案中,REST 相比于 SOAP(Simple Object Access protocol,简单对象访问协议)以及 XML-RPC 更加简单明了,无论是对 URL 的处理还是对 Payload 的编码,REST 都倾向于用更加简单轻量的方法设计和实现。值得注意的是 REST 并没有一个明确的标准,而更像是一种设计的风格。它本身并没有什么实用性,其核心价值在于如何设计出符合 REST 风格的网络接口。restful 的优点它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
restful 的特性:资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个 URI(统一资源定位符)指向它,每种资源对应一个特定的 URI 。要获取这个资源,访问它的 URI 就可以,因此 URI 即为每一个资源的独一无二的识别符。 表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层 (Representation)。比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进制格式。状态转化(State Transfer):每 发出一个请求,就代表了客户端和服务器的一次交互过程。HTTP 协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生“状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是 “表现层状态转化”。具体说,就是 HTTP 协议里面,四个表示操作方式的动词:GET 、POST 、PUT、DELETE。
它们分别对应四种基本操作:
GET 用来获取资源
POST 用来新建资源 添加
PUT 用来更新资源 修改
DELETE 用来删除资源 删除
restful 的示例:
/account/1 HTTP GET : 得到 id = 1 的 account
/account/1 HTTP DELETE: 删除 id = 1 的 account
/account/1 HTTP PUT: 更新 id = 1 的 account
<form action="emp/1" method="post">
<input name="_method" value="delete">
<input type="submit" value="删除一号图书" >
</form>
<form action="/book/1" method="post">
<input name="_method" value="put">
<input type="submit" value="更新一号图书" >
</form>controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
通过spring内置的Model对象可以传输数据。
方式类似于servlet的方式,直接调用servlet相应的请求和响应对象
请求转发
重定向
直接写出数据writer
也可以不经过视图解析器,直接完成请求转发和重定向。
return “forward:xxx.jsp”;//转发
return “redirect:testReturnModelAndView”; //重定向 页面不能在WEB-INF目录下
return “forward:xxx.jsp”;//转发
return “redirect:testReturnModelAndView”; //重定向 页面不能在WEB-INF目录下
跟方式1响应字符串传参数类似。
ModelAndView mv = new ModelAndView();
mv.addObject(String,Object);设置数据:
mv.setViewName(“success”);设置视图的名字
我们配置的前端控制器会拦截所有的请求,所以我们在项目中引入的静态资源,js文件,css文件,图片文件,都会被拦截,导致不能使用,所以需要配置。
在springmvc.xml中配置放行静态资源
<!--设置静态资源的放行-->
<mvc:resources mapping="/js/**" location="/js/"></mvc:resources>在web.xml中配置静态资源放行
<!--配置静态资源放行-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
<url-pattern>*.jpg</url-pattern>
<url-pattern>*.css</url-pattern>
</servlet-mapping><!--默认放行一切静态资源-->
<mvc:default-servlet-handler/>为什么要学它?页面和后台之间有一些数据的交互,就是json数据。
通过@ResponseBody 设定当前函数的返回值要进行json转换(jackson)并且响应ajax。
加过该注解之后,不再走SpringMVC的视图解析器,直接返回数据给页面等需要获取json的url。
@ResponseBody的作用其实是将java对象转为json格式的字符串数据。
@ResponseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。注意:在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。 resp.getWriter.write()
@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】。
我们现在的开发模式是 前后台分离。也就是说前端网页发送ajax请求获取后台数据。后台java只需要写接口,响应ajax请求返回json数据。此时如果一个类中所有的函数都是返回json数据,我们可以每个函数都添加@ResponseBody,也可以每个函数都不添加,将当前类设置成**@RestController**。===>@Controller + @ResponseBody。
环境:Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要加入jackson 的包。
关于springmvc中日期数据在前后台传递时的问题:
解决方法一:
需要在实体类的date字段上添加注解。
//数据从前台传到后台时,日期是字符串无法封装成Date类型,使用以下注解解决问题。
@DateTimeFormat(pattern = "yyyy-MM-dd")
//数据从后台发到前台显示时间戳格式,使用以下注解解决问题。
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")解决方法二:
<mvc:annotation-driven>
<!-- 配置时间转换器 -->
<mvc:message-converters>
<!-- jackson 2.5.x -->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss"></constructor-arg>
</bean>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>使用spring+springmvc+ajax+layui+jdbc打通整个项目。一套增删改查(把日期加进去。)。
做到:
清楚每一个注解的含义。
当做某一步操作时,回想一下,使用servlet是怎么搞的?现在使用spring/springmvc是怎么做的
自己总结对比一波。只有你自己真正对比过了,你才能知道,spring/springmvc好在哪!
```
使用spring+springmvc+ajax+layui+jdbc打通整个项目。一套增删改查(把日期加进去。)。
做到:
清楚每一个注解的含义。
当做某一步操作时,回想一下,使用servlet是怎么搞的?现在使用spring/springmvc是怎么做的
自己总结对比一波。只有你自己真正对比过了,你才能知道,spring/springmvc好在哪!