SpringMVC
0. 前置知识概述
Servlet、JSP、JavaScript和Tomcat都是与Java Web开发相关的技术或工具,它们之间存在一定的关系。下面是对它们的简要说明:
-
Servlet:Servlet是Java编写的服务器端程序,它运行在Web服务器中,用于处理客户端发起的HTTP请求并生成响应。Servlet通常用于实现动态的Web应用程序,可以处理表单提交、用户认证、数据库操作等任务。
-
JSP:JSP(JavaServer Pages)是一种在Java Web应用程序中生成动态网页的技术。它是一个基于Java的模板引擎,允许在HTML文件中嵌入Java代码来动态生成内容。JSP文件最终会被转换成Servlet并在服务器端执行。
-
JavaScript:JavaScript是一种客户端脚本语言,用于为网页增加交互性和动态性。与服务器端的Servlet和JSP不同,JavaScript运行在用户的浏览器中,可以对网页进行各种操作,如表单验证、DOM操作、事件处理等。
-
Tomcat:Tomcat是一个开源的Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)的规范,并提供了一个运行环境。Tomcat可以作为Web服务器,用于部署和运行Servlet和JSP应用程序。它接收并处理客户端发来的HTTP请求,将请求传递给相应的Servlet或JSP进行处理,并将生成的响应返回给客户端。
关系说明:
- Servlet和JSP通常一起使用,用于构建Java Web应用程序。Servlet负责处理客户端的请求和生成响应,而JSP负责将动态内容嵌入到静态HTML页面中。
- JavaScript通常在浏览器端执行,用于增强网页的交互性和动态性。它可以与Servlet和JSP通过Ajax技术进行通信,实现动态数据的加载和更新。
- Tomcat是一个Web服务器,也是一个Servlet容器,用于部署和运行Servlet和JSP应用程序。它可以将Servlet和JSP编译成可执行的代码,并管理Servlet的生命周期,接收和处理客户端的请求。
综上所述,Servlet、JSP、JavaScript和Tomcat是Java Web开发中的关键技术和工具,它们共同参与实现Web应用程序的开发、部署和执行。Servlet和JSP负责服务器端的处理和页面生成,JavaScript负责客户端的交互和动态效果,而Tomcat提供了Servlet容器和Web服务器的功能。
关于tomcat:
jQuery是一个广泛使用的JavaScript库,它简化了JavaScript在网页开发中的使用。jQuery提供了一系列的功能和方法,使得处理HTML文档、处理事件、执行动画和进行Ajax通信等任务更加简单和高效。
以下是jQuery的一些特性和用途:
-
DOM操作:jQuery提供了简单而强大的DOM操作方法,可以轻松选择和修改HTML元素,改变样式、属性和内容等。
-
事件处理:使用jQuery可以轻松地绑定和处理事件,例如点击、鼠标移入移出等事件。它提供了简洁的语法来注册事件处理程序,减少了在不同浏览器上处理事件的兼容性问题。
-
动画效果:jQuery提供了多种内置的动画效果,如淡入淡出、滑动、缓动等,可以方便地实现页面元素的动态效果,提升用户体验。
-
Ajax通信:通过jQuery的Ajax方法,可以发送异步请求并处理服务器端的响应。它提供了简单的接口来执行GET或POST请求,以及处理JSON、XML等不同数据格式。
-
插件扩展:jQuery拥有庞大的插件生态系统,许多开发者编写了各种强大的插件来扩展jQuery的功能。这些插件可以实现各种任务,如图像轮播、日期选择、表单验证等。
总体而言,jQuery简化了JavaScript编程,并提供了跨浏览器兼容性的解决方案。它在网页开发中非常流行,使得开发者可以更高效地操作DOM、处理事件、创建动画效果和进行异步通信。然而,随着现代Web开发的发展,前端技术和框架的选择变得更加多样化,因此,根据具体的项目需求和技术要求,你可能还需要考虑其他的前端技术和框架。
Spring、Spring MVC和Spring Boot是Java开发中的三个关键框架,它们之间存在一定的关系。下面是它们之间的简要说明:
-
Spring:Spring是一个全面的、模块化的Java应用程序开发框架。它提供了大量的功能和组件,用于开发各种类型的应用程序,包括Web应用程序。Spring框架的核心特点是依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriented Programming),它们使应用程序的开发更加模块化、可测试和扩展。
-
Spring MVC:Spring MVC是Spring框架中的一个模块,用于开发基于MVC(Model-View-Controller)模式的Web应用程序。它提供了一套基于注解的方式来定义Web请求的处理器、视图解析器和模型对象等,极大地简化了Web应用程序的开发过程。Spring MVC包含一个前端控制器(Front Controller),负责调度请求,并将其分发给适当的处理器进行处理。
-
Spring Boot:Spring Boot是一个用于快速构建Java应用程序的框架。它基于Spring框架,提供了自动配置和约定优于配置的方式,从而简化了Spring应用程序的搭建和部署。Spring Boot通过减少样板代码和默认配置,使开发者能够快速启动和运行一个独立的、可执行的Spring应用程序,并集成了许多常用的第三方库和组件,如数据库连接池、Web服务器等。
综上所述,Spring是一个全面的Java应用程序开发框架,Spring MVC是Spring框架中的Web开发模块,而Spring Boot是基于Spring框架的快速构建Java应用程序的框架。你可以使用Spring框架来构建各种类型的应用程序,包括Web应用程序,而Spring MVC和Spring Boot可以帮助你更高效地进行Web应用程序的开发。
1. SpringMVC简介
关于springmvc尚硅谷的笔记可参考 这里
2. Servlet
Servlet主要用于在服务器端处理请求,SpringMVC本质上就是对servlet的创建和配置进行了封装与隐藏
2.1 servlet在javaweb中的使用
2.2 springmvc中如何使用封装后的servlet
3. SpringMVC获取前端请求参数
3.1 如何获取请求头(header)和cookie的部分参数值
分别通过@RequestHeader
和@CookieValue
先创建session
再从请求报文中抽取值
此处“JSESSIONID”为@CookieValue注解的value属性
补充:session与cookie
每当创建一个session,就会生成一个键为JSESSIONID的cookie
session生命周期:浏览器开启到浏览器关闭
用户第一次访问服务器时,第一次创建session,存储了JSESSIONID的cookie存在于响应报文中,之后就存在于请求报文中
3.2 POJO
3.3 ModelAndView(重点)
spring MVC推荐以这种方式进行请求参数接收与返回
4. 域对象共享数据
4.1 三种域对象
(1)request域,生存范围是一次请求【查询实时变化的数据】
(2)session域,一次会话,浏览器开启到关闭的过程。基于session的钝化和活化功能
(3)servlet context(application域),整个应用的范围,服务器开启到服务器关闭(少)
创建的都是同一个,从而实现共享
4.2 session与application
可以通过session获取application域(web应用程序的上下文),进而实现 4.3
4.3 向application域共享数据
@RequestMapping("/testApplication")
public String testApplication(HttpSession session){
ServletContext application = session.getServletContext();//!!获取上下文
application.setAttribute("testApplicationScope", "hello,application");
return "success";
}
4.4 三种域对比
(1)request域:列表/修改/回写/错误信息提示
(2)session域:保存用户登录状态/
(3)servlet context(application域):很少用,范围太大了
5. springmvc视图view
搞前端的,处理请求地址与视图之间的跳转
5.1 三种方法
ModelAndView view名称没有前后缀表示被Thymeleaf解析
-
forward:/ 前缀,表示转发视图,创建的是InternalResourceView
-
redirect:/ 前缀,表示重定向视图,创建的是RedirectView
在上面俩controller基础上加上:
5.2 转发与重定向
(1)转发:第一次是浏览器发送,第二次发送发生在服务器内部(url不会变,一直都是第一次请求的地址)。可以获取请求域数据,因为是同义词请求,所以request是同一个。只能访问服务器内部资源
(2)重定向:浏览器发动两次请求,第一次访问servlet,第二次访问重定向地址(url变)。不可获取请求域数据,因为两次请求对应两个request。不能访问WEB-INF(各种HTML页面)下的内容(因为是服务器内部资源)。因此要重定向到另一个请求,而不是具体页面
5.3 spring MVC解析过程(函数调用)
以原始视图为例(不考虑转发及重定向)
(1)DispatcherServlet 的 doDispatch函数
1061行,handle函数获取ModelAndView (mv)
(2)往下翻,有一个处理mv的方法 processDispatchResult(执行转发结果)
(3)进入processDispatchResult,发现有一render方法
在render中,通过resolve View Name(解析视图名称)获取视图对象
6. RESTFul
浏览器只能发出get/post方法,如何调用put/delete?
使用过滤器
6.1 过滤器
过滤器生命周期中的三个过程:初始化,执行过滤,销毁
filterChain用于放行
restful通过过滤器实现调用put/delete
源码分析:
把put/delete/patch三种浏览器不能发送的请求类型塞进list
注:前端中,超链接发送数据是get,form表单提交数据get/post
6.2 实际RESTFul开发中配置文件处理
post方法才有请求体,get方法直接拼在链接后面
6.3 springMVC处理ajax
页面不发生跳转且与服务器进行交互
Ajax 的核心思想是通过在后台与服务器进行数据交换,实现页面更新而无需重新加载整个页面。传统的网页请求是同步的,即当用户与页面交互时,浏览器需要重新加载整个页面才能更新内容。而使用 Ajax,可以通过发送异步请求(使用 XMLHttpRequest 或者更现代的 Fetch API)来与服务器通信,获取数据或发送数据,并使用 JavaScript 来动态更新页面的部分内容,而不需要重新加载整个页面。
@ResponseBody 当controller想返回给前端某个Java对象的时候,通过次注解回返回该对象的json格式数据(将方法的返回值直接返回回去)
微服务与微服务之间的交互靠的就是HTTP+json
@RestController=@ResponseBody+@Controller
文件上传功能前端提交方式一定是post
7. 拦截器
拦截器是对控制器方法(Controller,也叫handler)进行拦截, 有三个作用位置:
(1) preHandle 控制器方法执行之前
(2) postHandle 控制器方法执行之后
(3) afterCompletion 渲染视图(控制器返回ModelAndView中的View)完毕之后
8. 总结
8.1 DispatcherServlet初始化过程
DispatcherServlet:前端控制器,不需要工程师开发,由框架提供
作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求(解析前端请求的)
DispatcherServlet 本质上是一个 Servlet,所以天然的遵循 Servlet 的生命周期。所以宏观上是 Servlet 生命周期来进行调度。
(1)在org.springframework.web.servlet.FrameworkServlet中进行WebApplicationContext初始化,调用initWebApplicationContext()
(2)initWebApplicationContext()这个函数里面又createWebApplicationContext
(3)initWebApplicationContext()中:
8.2 DispatcherServlet调用组件处理请求
(1)FrameworkServlet重写HttpServlet中的service()和doXxx(),这些方法中调用了processRequest(request, response)
(2)processRequest调用doService(request, response);这里调用的doService()是一个抽象方法,在DispatcherServlet中进行了重写
(3)org.springframework.web.servlet.DispatcherServlet对doService()重写,调用doDispatch(request, response);处理请求和响应
(4)doDispatch(request, response);创建handler拦截器等,使用HandlerAdapter调用所对应的控制器方法等
9. 还是总结
原来接收前端请求的:servlet&filter
springmvc就是对servlet的封装
参数接收和返回数据都有框架帮你做了,专注业务就行。原生servlet啥都自己做
DispatcherServlet
HandlerMapping 找路径
HandlerAdapter 又调用Handler调用controller层具体方法
ViewResolver 返回指定视图
按红线执行顺序: