前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[硬核]卷起来!两万六千字总结的JavaWeb核心技术学习笔记

[硬核]卷起来!两万六千字总结的JavaWeb核心技术学习笔记

作者头像
Maynor
发布2021-07-01 10:04:17
1K0
发布2021-07-01 10:04:17
举报

文章目录

在这里插入图片描述
在这里插入图片描述

前言

大家好,我是ChinaManor,直译过来就是中国码农的意思,我希望自己能成为国家复兴道路的铺路人,大数据领域的耕耘者,平凡但不甘于平庸的人。

该JavaWeb学习笔记源自zcc同学,非常善于总结知识的一位同学,可以收藏起来慢慢学习

在这里插入图片描述
在这里插入图片描述

http协议笔记

代码语言:javascript
复制
协议 : 约定 
	网络传输协议:	`规范网络传输` 如 速率 . 传输码率 . 代码结构 . 传输控制
	
TCP	三次握手		四次挥手

简介 : 
	http协议	http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息		以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式
	
HTTP协议(HyperText Transfer Protocol,`超文本传输协议`)是因特网上应用最为广泛的一种网络传输协	议,		所有的WWW文件都必须遵守这个标准。

HTTP是一个基于`TCP/IP`通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)
	
HTTP 工作原理 :	完整的http协议  包含 请求 和 相应
	1.  HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求
	2. Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等。
	3. Web服务器根据接收到的请求后,向客户端发送响应信息。
	4. HTTP默认端口号为`80`,但是你也可以改为8080或者其他端口。

请求	请求行	请求头	空一行	请求体

响应	响应行	响应头	空一行	响应体
 	
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
	`HTTP1.0` 定义了三种请求方法: GET, POST 和 HEAD方法。
	HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

url 统一资源定位符/IP	端口	(服务器上资源路径)

200 - 请求成功
	301 - `资源(网页等)被永久转移到其它URL`
	404 - 请求的资源(网页等)不存在
	500 - `内部服务器错误`

JavaWEB笔记_1

代码语言:javascript
复制
-------------------------------------------------------------------------------------------


浏览器上能看到的一切内容,统称之为 WEB资源。

静态WEB资源:代码不变,`最终展示效果就不变`。(HTML/CSS/JS/图片/声音/视频…)
动态WEB资源:效果的改变,由程序控制


完整格式如下
协议名://域名:端口号/WEB资源位置?参数=值&参数=值
	协议名:http、https、ftp等 (`谷歌浏览器帮助你隐藏了该协议名,但协议名是存在于URL地址上`)
	域名:通过域名可以找到某个网站。域名最终会翻译成IP地址。 192.168.31.1
域名或IP地址,都可以访问WEB资源。 例如:www.czxy.com
               CMD命令行: 输入 ping 网址       可以看到该网址的ip地址
	端口号:程序必须使用端口号,才可以让另一个计算机访问。http协议的默认端:80
	       例如:http://www.czxy.com       http://www.czxy.com:80/

资源位置:用于描述WEB资源再服务器上的位置。
      	 例如:http://www.czxy.com/czxy.jpg
	 参数=值:浏览器向服务器传递的数据(表单的get方式默认会采取这种方式/程序员也可以主动书写)
	 例如:http://www.czxy.com/index.html?username=xxx&pwd=111

--------------------------------------------------------------------------------------

	服务器就是一个软件,任何电脑只需要安装上了服务器软件,然后该电脑的指定目录下的资源就能提供对外访问
	提供计算服务的设备,服务类型有很多,常见的有:游戏服务,购物服务,新闻服务等

	1. `WebLogic`
	Oracle公司的产品,是目前应用最广泛的Web服务器,支持J2EE规范。WebLogic是用于开发、集成、部署和
	管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。
	2. `WebSphere`
	IBM公司的WebSphere,支持JavaEE规范。WebSphere 是随需应变的电子商务时代的最主要的软件平台,
	可用于企业开发、部署和整合新一代的电子商务应用。
	3. `GlassFish`
	最早是Sun公司的产品,后来被Oracle收购,开源,中型服务器。
	4. `JBoss`
	JBoss公司产品,开源,支持JavaEE规范,占用内存、硬盘小,安全性和性能高。
	5. `Tomcat`
	中小型的应用系统,免费开源,支持JSP和Servlet。

--------------------------------------------------------------------------------------

	BaseServlet 相关方法
		  将表单参数,封装到User对象中	User user = toBean(对象名.class);
		  获取表单单值			getRequest().`getParameter`("name名称");
		  获取表单多值(复选框)		getRequest().`getParameterValues`("name名称");
		  获取整个参数列表			Map<String,String[]> map = request对象.getParameterMap();		


--------------------------------------------------------------------------------------
	
	请求转发:服务器内部进行程序/资源跳转的方式(没有浏览器参与,只有服务器内部执行)
		
		  简化格式:	forward:/要跳转的程序或者页面	注意:forward:/   中的/  表示的就是web目录
		  完整格式:	getRequest().`getRequestDispatcher`(“/要跳转的程序或者页面”).forward(request,response);

	请求转发使用环境 :
		1、快速跳转服务器内某个资源或某个其他的servlet
		2、若需要访问受保护目录资源

	(请求转发无 次数限制,经过多次转发,多次转发因为是在服务器内部,速度极快)
	请求转发中,必须获取RequestDispatcher对象(资源封装器)该对象用于封装当前项目下(web目录)所有的资源(包含受保护目录)
	意味着:请求转发只能跳转当前项目内任意资源。		意味着:请求转发不能跳转外网。
	另一种资源跳转方式:`请求重定向  302`

	若不存在请求转发,不能通过request域对象,进行数据传递的。

	1、	请求转发是服务器内部程序跳转,浏览器是不知道的
	2、	请求转发中会传递request和response对象
	3、	在多次请求转发中,使用的是同一个request对象

	请求转发间的数据传递-request作用域
		1. setAttribute(key,value);	向request作用域中存储一个键值对相当于map.put(key,value);
		2. getAttribute(key);		从request作用域中获取值(Object类型)获取不到,返回null相当于map.get(key);
		3. removeAttribute(key);	从request作用域中删除某个键值对相当于map.remove(key);


--------------------------------------------------------------------------------------

	WEB-FIN下web.xml配置
		 <!--a.注册我们的servlet-->
        		<servlet>
            		<!-- 给我们的servlet起名称 -->
            		<servlet-name>ServletDemo1</servlet-name>
            		<!-- 告诉tomcat我们的servlet所在路径  全限定名(包名+类名) -->
           		 <servlet-class>com.itheima.servlet.ServletDemo1</servlet-class>
       		 </servlet>
       		 <!--b.为我们的servlet提供访问路径-->
       		<servlet-mapping>
           		 <servlet-name>ServletDemo1</servlet-name>
            		<!-- 设置浏览器访问的路径 路径自定义 -->
            		<url-pattern>/demo1</url-pattern>
        		</servlet-mapping>




	访问路径配置


	url-pattern配置方式共有三种:
		1.`完全路径`匹配:以 / 开始,要求域名后的访问路径,必须和配置的路径完全一致,才能匹配到		例如:	 /ServletDemo4 , /aaa/ServletDemo5 , /aaa/bbb/ServletDemo6	适用于:针对性访问某个servlet

		2.`目录`匹配:以 / 开始 需要以 * 结束.	 要求域名后的访问路径,目录名必须和配置的路径目录名完全一致,才能匹配到。 例如: /*  (所有) ,/aaa/* (aaa目录下的所有) ,/aaa/bbb/*  适用于:目录名一致,就进行匹配。 (权限校验 /user /vip)

		3.`扩展名`匹配:不能以 / 开始 以 * 结束的. 要求域名后的访问路径,扩展名必须和配置的路径扩展名完全一致,才能匹配到。例如: *.do , *.action 、*.jpg   适用于:只要扩展名一致,即匹配。(对图片/资源进行针对性的权限处理。  *.jpg,*avi)

		以上三种匹配,若未按照格式进行书写,项目启动时,会报LifecycleException		***** 错误的写法	: /*.do
		
		4.`缺省`路径/   通常情况访问 html页面时,首先从当前web项目的web.xml文件寻找匹配路径,如果如果没有找到,再从tomcat默认的web.xml匹配,将使用缺省servlet
		某个servlet加入该设置后,访问该项目的.jpg或.avi或.html等资源时,都会直接访问该servlet。除非你需要在资源加载前,做一些判断操作,然后手动给用户加载资源,否则不要用缺省路径

	Servlet相关配置:
		url-pattern:
			一个servlet可以设置多个url-pattern
			完全路径匹配>目录匹配>扩展名匹配>缺省路径

--------------------------------------------------------------------------------------
浏览器发请求方式:
	get
		①地址栏直接写路径:http://localhost:8080/项目名/servlet路径?method=方法名
		②kk     : 
					kk=”/项目名/servlet路径?method=方法名”;
		
	post:
		<form method=”post” action=”/项目名/servlet路径”>
		<input type=”hidden” name=”method” value=”方法名”/>
	
	访问servlet的某个方法时:写清servlet路径   `传递参数method=方法名`
--------------------------------------------------------------------------------------

	启动时创建servlet

	前置知识:
	Servlet生命周期
	Servlet对象何时产生:第一次访问该对象(一般情况下,某个servlet在服务器中只有一个实例对象)
	Servlet对象何时销毁:服务器正常关闭时

	问题:
	若某个servlet过大,用户第一次访问该servlet时,servlet因为没有创建对象,第一个用户第一次访问时,servlet会先创建对象,再调用方法。
	第一个用户第一次访问,servlet如果很大,创建对象速度就会很慢。

	为了解决第一个用户等待servlet对象创建,空白时间,优化用户体现。把servlet产生的生命周期提前:提前到项目创建时:<load-on-startup>2</load-on-startup>	大于1的正整数。  优先级虽然很高,但已经被tomcat相关组件使用了。


	ServletConfig配置	一个servlet有一个servletConfig对象,该对象封装了servlet标签下的配置信息servletConfig对象就是某个servlet的身份证。是在servlet创建时,一起创建出来的

	getInitParameter(name)	String	获得Servlet的初始化参数的
	getServletContext()	ServletContext	获得ServletContext对象的引用
	getServletName()	String	获得Servlet在web.xml中配置的name的值。及<servlet-name>标签配置内容。

	作用:
	获取项目配置信息; (用法和servletConfig相似)
	项目内进行信息共享;(域对象,用法和request相似。HashMap<String,Object>)

--------------------------------------------------------------------------------------

	请求转发间的数据传递-request作用域
		1. `setAttribute`(key,value);	向request作用域中存储一个键值对相当于map.put(key,value);
		2. `getAttribute`(key);	从request作用域中获取值(Object类型)获取不到,返回null相当于map.get(key);
		3. `removeAttribute`(key);	从request作用域中删除某个键值对相当于map.remove(key);


	
	ServletContext全局应用程序共享对象:	ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。
	getServletContext();				ServletContex中的获取方式
	setAttribute(String name,Object object)		向ServletContext中存数据
	getAttribute(String name)			从ServletContext中取数据
	removeAttribute(name)			从ServletContext中移除数据


--------------------------------------------------

	ServletContext和Request一样都可以作为域对象进行数据传递。
		request:请求转发中进行数据传递。(一次请求,还未产生响应)
		ServletContext:在当前项目任意位置,传递数据(不限于请求)

	request:生命周期短,作用范围小(仅限于某次请求)
			创建:接收到任意某个请求
			作用范围:请求产生----响应未结束(某次请求中,多见于请求转发)
			销毁:该请求产生响应
	ServletContext:生命周期长,作用范围广(限于项目内容任意资源)
			创建:服务器正常启动时
			作用范围:服务器正常启动期间,项目内任意位置都可以进行数据共享和传递(JSP、servlet)
			销毁:服务器正常关闭时


--------------------------------------------------

--------------------------------------------------------------------------------------

	request对象作用
		1、存在于某个请求—响应 之间的作用域对象(可以获取、设置、删除),可以在请求转发中传递数据	作为作用域,传递数据时,里面有HashMap<String,Object>
		2. request对象产生时,把浏览器发来的请求行、请求头、请求体三部分信息进行封装。三部分请求信息禁止在服务器端直接修改(设计时的一个安全考虑)操作request中的请求信息,只有读取数据操作合法的

	请求行	请求方式 请求路径?参数列表 协议名/版本号

	请求头	String getHeader(String name)		如果获取不到某个头信息,返回为null	该方法用于获取一个指定头字段的值,如果请求消息中没有包含指定的头字段,getHeader()方法返回null;如果请求消息中包含有多个指定名称的头字段,getHeader()方法返回其中第一个头字段的值

	请求体	整个表单数据,封装JavaBean:	JavaBean 对象 = toBean(JavaBean.class);		要求:JavaBean类实现序列化接口,成员变量名必须和参数名保持一致	适用于:大量数据需要接受

		单独获取某个参数信息:		String value = request对象.getParameter(“参数名”); 		//若参数不存在,返回null
						String[] value = request对象.getParameterValues(“参数名”); 		//若参数不存在,返回null
						Map<String,String[]> map = request对象.getParameterMap();		获取整个参数列表
	http请求信息,在服务器接收到请求时,就会被封装成HttpServletRequest对象,把请求的行、头、体所有数据,作为二进制字节流保存。	//封装了请求的行、头、体,该字节流不可修改、替换	ServletInputStream sis = getRequest().getInputStream();
	http请求信息是被封装到request对象中,若尝试在服务器端对请求信息进行任何修改,服务器会报异常。

--------------------------------------------------------------------------------------


	response对象	1. Response对象是用来封装http响应信息,程序员可以在servlet上,对已有的response对象进行操作,向 响应行、头、体编入信息。

	ServletResponse接口	HttpServletResponse接口 (tomcat已经为我们写好了实现类,响应信息封装时,创建tomcat实现类对象,操作的响应对象,就是tomcat写好的实现类)	和request同生共死

	操作-响应行		1. setStatus(int status);//写入任意 码给浏览器(2xx,3xx,4xx,5xx)	若未设置状态码,且服务器运行正常,Web服务器会默认产生一个状态码为200的状态行。
				2. sendError(int sc,String errorMsg);		建议该方法仅发送4xx和5xx状态码。

	操作-响应头		1. void addHeader(String name, String value)		 void setHeader(String name, String value)	
				这两个方法都是用来设置HTTP协议的响应头字段,其中,参数name用于指定响应头字段的名称,参数value用于指定响应头字段的值。不同的是,addHeader()方法可以增加同名的响应头字段,而setHeader()方法则会覆盖同名的头字段
				2. void setCharacterEncoding(String charset)		该方法用于设置输出内容使用的字符编码,对HTTP 协议来说,就是设置Content-Type头字段中的字符集编码部分。
				3. void setContentType(String type)			该方法用于设置Servlet输出内容的MIME类型,对于HTTP协议来说,就是设置Content-Type响应头字段的值。例如,如果发送到客户端的内容是jpeg格式的图像数据,就需要将响应头字段的类型设置										为“image/jpeg”。需要注意的是,如果响应的内容为文本,setContentType()方法的还可以设置字符编码,如:text/html;charset=UTF-8

	操作-响应体	1. getOutputStream()	向响应体输出二进制字节流信息。
			2.    getWriter()		向响应体输出字符流信息。【字符串及前端代码输出】	若输出前端代码,则会被浏览器解析执行		
						//一般要设置码表,才不会乱码(两句中其中一句)  因为BaseServlet中有以下代码			//getResponse().setCharacterEncoding("utf-8");		    //getResponse().setContentType("text/html;charset=utf-8");

			注意: 			一个响应体,只能被一种流操作(字符宇节)若同时获职两种流, servlet执行报错

	读取WEB程序下的资源	相对路径出发目录:	当前项目根目录。	Servlet中读取资源文件,读取的是:	该目录资源使用绝对路径:getServletContext().getRealPath(“/”);




--------------------------------------------------------------------------------------

	请求重定向
			1.  手动书写		//1.1、编写302状态码	getResponse().setStatus(302);	//1.2、编写location响应头	getResponse().setHeader("location","/项目名/资源路径?参数列表");
			2. 完整书写格式		getResponse().sendRedirect("/项目名/资源路径?参数列表");
			3. 简化格式		return “redirect:/资源路径?参数列表”

	--------------------------------------------------
	请求转发-地址:/资源路径?参数列表
	当前项目内-完成格式:/项目名/资源路径?参数列表	 	当前项目内-简化写法:/资源路径?参数列表	外网写法:http://网址

		请求转发:只有一次请求一次响应,产出一个request对象,可以使用request作用域传递数据(服务器内部进行转发的过程中,浏览器完全不知情。地址栏也不会改变) 
		请求重定向:让浏览器自动敲回车。请求重定向一次,产生两个请求。两个request,不能使用request作用域传递数据。(依赖浏览器进行跳转。地址栏会发生改变)
 
		请求重定向:请求外网 / 需改变地址栏路径,统一用重定向,
		请求转发:其他所有使用请求转发即可
	1、	请求转发使用request对象,重定向使用response对象 
	2、	请求转发使用服务器端路径(服务器内部跳转,/资源名?参数列表),重定向使用客户端路径(浏览器跳转:/项目名/资源名?参数列表)
	3、	请求转发不能跳转外网,重定向可以
	4、	请求转发是服务器内部的跳转,不依赖网速,跳转速度极快。重定向是依赖浏览器的跳转,严重依赖网速,跳转速度略慢
	5、	请求转发:请求一次,响应一次。  占用资源少重定向:重定向N次,响应n+1次。占用大量资源
	6、	请求转发可以访问受保护目录资源,重定向不能
	7、	请求转发不会改变地址栏路径,重定向会改变路径。
	8、	请求转发可以使用request作用域,重定向不能
	--------------------------------------------------

		延迟请求重定向	1. getResponse().setHeader(“refresh”,”秒数;url=/项目名/资源名?参数列表”);
				2. getResponse().setHeader(“refresh”,”秒数;url=http://网址”);

	
				请求转发可以和重定向的结合	请求重定向不能和延迟重定向组合使用。			




--------------------------------------------------------------------------------------

	会话技术
		1. 为什么要去使用会话技术?		
		①后期很多功能都要由会话技术辅助
		②已学的域对象无法完成类似数据共享传递(两个不同的请求,request无法进行数据共享)
		2. 会话是什么?
		会话:浏览器开启---浏览器和服务器进行多次请求响应---浏览器关闭   浏览器从开启 到 关闭,我们称为一次会话; 生活中,就是两人一次电话。
		3. 会话技术是什么?作用?
		会话技术:用于保存和传递 会话中产生的数据	保存在浏览器/客户端的会话技术:cookie	保存在服务器端的会话技术:session


	Cookie会话技术	Cookie:是保存在浏览器/客户端 的会话技术		Cookie可以理解为:服务器写给浏览器的一张小纸条。(小纸条由浏览器保存)	键值对。	name:zhangsan	pwd:123

	1、	服务器编写cookie,读取cookie 
	2、	浏览器保存cookie,发送cookie
	3、	浏览器和服务器之间cookie传递  依赖请求头、响应头

	
	///创建cookie	响应cookie
	new Cookie(“键”,”值”);			//创建cookie对象	键和值必须都是字符串
	getResponse().addCookie(cookie对象);		//响应cookie对象
				
	
	//读取cookie
	getRequest().getCookies();  返回cookie数组(封装了请求头所有的cookie)若一个cookie都没有,该数组为null,一般要配合非空判断
	Cookie对象.getName(); 获取键 (String)	Cookie对象.getValue(); 获取值 (String)

	//删除  修改 cookie		
	cookie中key值相同会被覆盖,删除cookie可以给cookie的最大存活时间设置为0		setMaxAge(0);

	使用注意		1. cookie的默认保存:是和浏览器的关闭与否有关,和服务器关闭与否无关  服务器关闭与否,不会影响cookie保存。	浏览器关闭与否才会影响cookie保存。(浏览器关闭,会话结束,默认保存在内存中cookie就会消失)
			2. cookie是由http协议制定,只要使用http协议,就可以使用cookie。浏览器、手机端
			3. cookie保存是有上限。Value值数据量有上限,总cookie数量有上限,某网站向浏览器保存的cookie量有上限
			4. cookie不能直接保存中文	原因:cookie依赖http头(响应头、请求头)进行数据传递	头默认编码、解码码表:iso8859-1	
			 常见解决方案:保存数据时URL编码	1. 响应 Cookie k1 = new Cookie("name", URLEncoder.encode("张三","utf-8"));	2. 读取  String value = URLDecoder.decode(c.getValue(),"utf-8");


	------------------------------------------------------

		临时cookie:保存在浏览器内存中的cookie(默认)		 特点是:浏览器关闭,cookie就会销毁

		持久化cookie:保存在浏览器对应的硬盘上(持久化cookie)	 特点:只有过期cookie,才会销毁	浏览器即使关闭,cookie也会保存下来

	设置cookie的存活时间。 秒	setMaxAge(int expiry)			 -1  默认。保存在浏览器的内存中浏览器必须打开着的,浏览器关闭cookie销毁
									 0   让cookie立即销毁(用来通知浏览器销毁某个cookie)
									 >0的正整数 0 只要正整数大于0的,就会存活在浏览器对应的硬盘上,不以浏览器的关闭为销毁。而是时间到期,就会自动销毁
	
	相同的cookie设置,新的会覆盖旧的	浏览器打开/刷新时,才会有判断和销毁过期cookie的操作。	谷歌浏览器看cookie的过期时间需要加上8个小时


	Cookie的有效路径:地址栏访问路径 若等于或包含 某个cookie的有效路径,该cookie就会被发送给服务器。		setPath(java.lang.String uri)
	设置cookie允许被访问的路径。设置的路径,以及子路径都被允许访问。
	例如:setPath("/web/a/b");
	http://localhost:8080/web/a/b/oneServlet,可访问(当前路径)
	http://localhost:8080/web/a/b/c/oneServlet,可访问(子路径)
	http://localhost:8080/web/a/c/oneServlet,不允许访问(无关路径)
	常见设置:setPath(“/”) ,当前tomcat下的所有的web项目都可以访问

	ookie若隶属于某个模块,为了让该模块的cookie方便管理,会设置有效路径。
	用户模块cookie: /项目名/user/ 
	商品模块cookie: /项目名/product/ 

	cookie对象.setPath(request对象.getContextPath()+”/”);



	唯一标识		需要进行cookie的新旧覆盖操作:
	新cookie和旧cookie,唯一标识相同,才能相互覆盖。
	新cookie和旧cookie,唯一标识不同,就是分别保存两个cookie。

	唯一标识:域名+有效路径+cookie名

	通常  Cookie的域名不需要手动设置,都是idea自动设置。(跨域访问、跨域cookie共享,才会设置域名。  setDomain(“”))

	通常  cookie若未分模块保存,有效路径也就无需设置,都是idea自动设置。	只需要保证,域名和有效路径相同的情况下,使用cookie名区分cookie

	------------------------------------------------------	
	
--------------------------------------------------------------------------------------

	session

	简述	保存在服务器端的会话技术。	浏览器和服务器协作才能完成session数据的保存和读取操作。
	
	request:一次请求范围(请求转发)
	session:会话范围 (用户登录、好友列表、信息、权限)
	ServletContext:整个项目范围

	1、浏览器必须保存JSESSIONID(若该cookie丢失、销毁,会导致找不到原来的session对象,会重新获取新session, 新的JSESSIONID)
	2、session依赖于cookie,若禁用了cookie,会导致session机制失效。

	Session:
		创建:会话开启,第一次调用getSession()方法
		销毁:1、服务器的非正常关闭
				服务器正常关闭,数据会被保存在硬盘上,服务器启动会重新加载回来
				 
				2、调用invalidate() ,就会立即主动销毁session对象
				3、30分钟未访问session对象,session对象销毁


	ServletContext:	服务器启动创建,服务器正常关闭销毁。 
	Request:	创建:接收到任意一个请求;		销毁:这次请求产生了响应



	同一个会话中,可以使用session进行数据传递(同个会话中,多次请求,使用的都是同一个session)
	若浏览器删除JSESSIONID,会导致找不到原来的session对象,会获取一个新session,新session中没有原来的数据

	String getId()	用于返回与当前HttpSession对象关联的会话标识号
			JSESSIONID的cookie是临时cookie,浏览器关闭就销毁。
			若需要将JSESSIONID改为持久化cookie,需要获取sessionid
			new Cookie(“JSESSIONID”,session.getId());
			设置生存时间,可以持久化保存
	
	boolean isNew()	判断当前HttpSession对象是否是新创建的
	void invalidate()	用于强制使Session对象无效。	强制销毁对应session对象。
	void setAttribite(String name,Object value)	用于将一个对象与一个名称关联后存储到当前的HttpSession对象中
	String getAttribute()			用于从当前HttpSession对象中返回指定名称的属性对象
	void removeAttribute(String name)		用于从当前HttpSession对象中删除指定名称的属性

-------------------------------------------------------------------------------------------

	MVC设计模式	

	简述	MVC:软件设计模式。方便维护和扩展。	模型M:算法和数据封装。JavaBean	视图V:数据收集和展示。JSP		控制器C:请求处理、程序跳转。Servlet

	三层架构
		1.  表示层:	又称为 web层,与浏览器进行数据交互的。
		2. 业务逻辑层:	又称为service层,专门用于处理业务逻辑的。	
		2. 数据访问层:	又称为dao层,与数据库进行数据交换的。将数据库的一条记录与JavaBean进行对应。


	根据MVC设计模式,依据三层架构
		cn.czxy 							公司域名倒写
		cn.czxy.xxx 						项目名称
		cn.czxy.xxx.yyy 						子模块
		cn.czxy.xxx.yyy.dao 						子模块dao层接口
		cn.czxy.xxx.yyy.dao.impl					子模块dao层实现类
		cn.czxy.xxx.yyy.service					子模块service层接口
		cn.czxy.xxx.yyy.service.impl					子模块service层实现类
		cn.czxy.xxx.yyy.domain					子模块JavaBean (子模块yyy可省略)
		cn.czxy.xxx.yyy.web.servlet					子模块web层,servlet
		cn.czxy.xxx.yyy.web.filter					子模块web层,filter
		cn.czxy.xxx.utils 						工具
		cn.czxy.xxx.exception 					自定义异常
		cn.czxy.xxx.constant 					常量

-------------------------------------------------------------------------------------------

	过滤器
		
	简述		过滤器:是JavaWeb的三大组件之一(servlet、Filter、listener)	过滤器:实现了Filter接口的Java类。	

	过滤器作用:	①过滤、处理请求		②拦截请求(springMVC --- 拦截器)

		/*   目录匹配(目录拦截)	对项目下所有的请求,进行拦截
		小结:过滤器执行时,每执行一次,都是执行一次doFilter

	生命周期&原理&放行

		创建:服务器启动时创建。 (会执行该Filter的`init`方法)
		销毁:服务器正常关闭时销毁。 (会执行该Filter的`destory`方法)

		1、先执行过滤器,再执行servlet(资源)
		2、只有过滤器放行了,才会执行后面的目标资源



	过滤器web.xml配置		
		<filter>
    			<filter-name>PermissionFilter</filter-name>
   			<filter-class>cn.czxy.demo.filter.PermissionFilter</filter-class>
  		</filter>
  		<filter-mapping>
   			 <filter-name>PermissionFilter</filter-name>
   			 <url-pattern>/*</url-pattern>
    			<dispatcher>FORWARD</dispatcher>
  		</filter-mapping>

			url-pattern的配置与servlet中的配置一样:
			* 三种配置:		完全路径拦截》》目录拦截》》扩展名拦截
			    * 完全路径拦截:	以 / 开始   /aaa /aaa/bbb    例如:/hehe/d1
			    * 目录拦截:     		以 / 开始   /*  /aaa/*		 例如:/*    /user/*   /product/*
			    * 扩展名拦截:  		不能以 / 开始  *.do  *.jsp  *.action		例如:*.jsp   *.avi

		针对某个servlet进行拦截	servlet-name的配置,通过url-pattern拦截一个Servlet的资源.也可以通过servlet-name标签进行拦截.

		
			dispatcher的配置(拦截类型)
			* REQUEST	:默认值.(拦截浏览器发给服务器的请求)
			* FORWARD	:拦截服务器内部的请求转发。(内部跳转到某个重要资源)
			* ERROR		:拦截跳转到错误页面.全局错误页面.  
			* INCLUDE	:拦截在一个页面中包含另一个页面.



 
	过滤器链及原理

		过滤器链:多个过滤器进行请求时,依次执行。
		过滤器链执行顺序:Filter-mapping放置顺序有关。 从上到下依次执行。

		1、	若路径匹配,多个过滤器按照Filter-mapping放置顺序依次执行(从上到下)
		2、	过滤器链上,放行代码,执行下一个过滤器/执行目标资源
		3、	目标资源执行完毕后,还会倒着执行 放行之后的代码

	FilterConfig	FilterConfig对象是Filter的身份证。


	过滤器上的资源跳转	

	HttpServletRequest对象:	getRequestDispatcher(“/资源路径”).forward(request,response);

	HttpServletResponse对象:	sendRedirect(“/项目名/资源路径”);
				sendRedirect(“http://外网路径”);

	补充其他方法		request.getRequestURI()获取当前请求路劲





-------------------------------------------------------------------------------------------

JavaWEB笔记_2(JSP)

代码语言:javascript
复制
--------------------------------------------------------------------------------------------------------------------------

	概述	JSP本质是一个Servlet JSP是Java独有,除了可以书写HTML/CSS/JS代码,更支持书写Java代码和EL表达式等强大功能。
		扩展名: .jsp
	
	JSP运行原理	.jsp文件 -> 翻译 -> .java文件 -> .class文件	修改后的第一次执行该JSP时,才会有翻译和编译过程。

	JSP是如何被读取到文件:	1. 浏览器:/项目名/hello.jsp
				2. 服务器接收路径,创建request和response对象
				3. 进行路径匹配。
				完全路径匹配,匹配不到
				目录匹配,匹配不到
				扩展名匹配,匹配到了  tomcat自带的JSPServlet
				4. JSPServlet执行时,会根据访问路径,读取JSP文件。
				读取不到,404
				读取到了,判断该JSP是否已经被访问。
				如果已经被访问,直接调用。
				如果修改后未被访问,进行翻译过程,把JSP文件,翻译成.java文件
				把.java文件编译成.class文件,以servlet方式执行.class文件

	JSP基本语法	<% java 代码(变量、方法、语句等)%>
			声明表达式:<%! 定义变量 %> 会把代码放置在翻译后JSP文件 成员位置。
	JSP注释		
			<%-- jsp注释--%>		
			<%	//java注释	%>		
			<!-- html注释-->
			
			Jsp文件源码	html源码		翻译后的		Java文件
			jsp注释		有		无		无
			java注释		有		无		有
			html注释		有		有		有
			
			JSP上尽量使用JSP注释



--------------------------------------------------------------------------------------------------------------------------
	JSP不仅可以编写前端代码,而且可以直接编写Java代码
	
	JSP嵌入Java代码		书写Java代码格式:  <%   java代码   %>
	<% String str = "O(∩_∩)O~"; //建议使用 out.write() 替代System.out.println();   //out.write()可以直接输出到页面上 out.write(str);%>


	1. <%--  EL表达式:不能用于HTML,只能用于JSP   --%>   ${username}	方式一:${键名}


	2. <% String username = (String) request.getAttribute("username");  out.write(username); %>

	JSP页面导包	JSP可以进行导包操作。使用import属性。  一个页面可以书写N多个import属性。
	<%@ page import="com.czxy.demo2.domain.Person" %>
	<%@ page import="java.util.ArrayList" %>
	<%@ page contentType="text/html;charset=UTF-8" language="java" %>

	JSP和HTML区别

	JSP:可以编写前端代码,可以编写Java代码。EL表达式。自定义标签 是一个动态资源,本质是一个特殊的servlet
            (request.getRequestDispatcher("/路径").forward(request,response);

	HTML:仅是一个前端静态资源,仅可以书写前端代码。
--------------------------------------------------------------------------------------------------------------------------

	JSP指令	为了设置 JSP 页面中的一些信息, Sun 公司提供了 JSP 指令。 JSP 2.0 中共定义了 page、 include 和 taglib 三种指令,每种指令都定义了各自的属性。

	page指令		<%@ page 属性名1= "属性值1" 属性名2= "属性值2" ...%>

	1. pageEncoding 	当前页面 指定页面编码格式
	2. contentType	有效的文档类型	客户端浏览器根据该属性判断文档类型,例如:HTML 格式为 text/html		纯文本格式为 text/plain	JPG 图像为 image/jpeg	GIF 图像为 image/gif	Word 文档为 application/msword
	3. import		任何包名、类名	指定在 JSP 页面翻译成的 Servlet 源文件中导入的包或类。 import 是唯一可以声明多次的 page 指令属性。	一个 import 属性可以引用多个类,中间用英文逗号隔开。

	include 指令	实际开发中,经常涉及到一个 JSP 引入另一个 JSP 的代码。这时我们就需要使用 include 指令	<%@ include file="被包含的文件地址"%>

	taglib 指令	该指令 用于引入标签库


--------------------------------------------------------------------------------------------------------------------------

	JSP `九大内置对象`	在 JSP 页面中,有一些对象需要频繁使用,如果每次都重新创建这些对象则会非常麻烦。为了简化Web 应用程序的开发, JSP2.0 规范中提供了 9 个隐式(内置)对象,它们是 JSP 默认创建的,可以直接在JSP 页面中使用。

	`四个域对象`:application、session、request、pageContext
	两个特殊:response、page
	三个其他:out,config,exception

	out		javax.servlet.jsp.JspWriter			用于页面输出
	request		javax.servlet.http.HttpServletRequest		得到用户请求信息,
	response		javax.servlet.http.HttpServletResponse		服务器向客户端的回应信息
	config		javax.servlet.ServletConfig			服务器配置,可以取得初始化参数
	session		javax.servlet.http.HttpSession			用来保存用户的信息
	application	javax.servlet.ServletContext			所有用户的共享信息
	page		java.lang.Object				指当前页面转换后的Servlet类的实例
	pageContext	javax.servlet.jsp.PageContext			JSP的页面容器
	exception		java.lang.Throwable			表示JSP页面所发生的异常,在错误页中才起作用

	若需要使用第九个内置对象,需要设置当前JSP为专业错误展示页面。	isEerrorPage="true";


	----------------------------------------------------

	pageContext对象	
		
	1. 获取其他八大内置对象	JspWriter getOut()			用于获取out隐式对象
						Object getPage()			用于获取page隐式对象
						ServletRequest getRequest()		用于获取request隐式对象
						ServletResponse getResponse()	用于获取response隐式对象
						HttpSession getSession()		用于获取session隐式对象
						Exception getException()		用于获取exception隐式对象
						ServletConfig getServletConfig()	用于获取config隐式对象
						ServletContext getServletContext()	用于获取application隐式对象

	操作其他域数据				void setAttribute(String name,Object value,int scope)	用于设置pageContext对象的属性
						Object getAttribute(String name,int scope)		用于获取pageContext对象的属性
						void removeAttribute(String name,int scope)		删除指定范围内名称为name的属性
						void removeAttribute(String name)			删除所有范围内名称为name的属性
						Object findAttribute(String name)			从4个域对象中查找名称为name的属性		
						//从小到大找:先寻找pageContext 再寻找request,再寻找session,最后寻找application	//只要能找到该键值对,立刻返回值,寻找停止    //如果找不到,就会返回null 
						${参数名}  替代了    pageContext.findAttribute(“参数名”);

							PageContext.PAGE_SCOPE:		表示页面范围(pageContext)
							PageContext.REQUEST_SCOPE:	表示请求范围(request)
							PageContext.SESSION_SCOPE:	表示会话范围(session)
							PageContext.APPLICATION_SCOPE:	表示Web应用程序范围(servletContext)



	

	2. 作为一个最小域对象使用(了解)


	out对象	JspWriter类的对象。 字符流对象。用于向响应体输出字符。他和response.getWriter.write("");   的区别是  后置后优先刷新到前者的缓冲区上方  之后jsp 会发前者的缓存区刷新进页面 所以会出现 后者的数据展示在前段 前者的数据展示的指定位置

	----------------------------------------------------

	JSP四大作用域		
	Servlet三大作用域:	ServletContext,HttpSession,HttpServletRequest
				JSP四大作用域:		application    session    request    pageContext
	
	PageScope	当前页面中有效		pageContext	PageContext
	RequestScope	一次请求范围		request		HttpServletRequest
	SessionScope	一次会话范围		session		HttpSession
	ApplicationScope	应用范围			application	ServletContext

	page:	表示当前页,通常没用。jsp标签底层使用。
	request:表示一次请求。通常一次请求就一个页面,但如果使用请求转发,可以涉及多个页面。
	session:	表示一次会话。可以在多次请求之间共享数据。
	application:表示 一个web应用(项目)。可以整个web项目共享,多次会话共享数据。

	先尝试使用request域,若request域过小,再加大域范围,使用session;若session域过小,再加大域范围,使用application域
	----------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------

	EL表达式		
	
	简述:   EL( Expression Language) 目的:为了使 JSP 写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让 Jsp 的代码更加简化	

	格式:由于 EL 可以简化 JSP 页面的书写,因此,在 JSP 的学习中,掌握 EL 是相当重要的。要使用 EL 表达式,首先要学习它的语法。 EL 表达式的语法非常简单,都是以“${”符号开始,以“}”符号结束的,具体格式如下:${表达式}	${1+1}

	环境:必须写于 JSP 文件中, HTML 中无法使用 EL 表达式

	--------------------------------

	域对象数据读		

		基本数据类型/String				${域容器中的 key名称}
		
		数组/List 集合(JavaWEB建议使用完整格式的泛型)		若索引越界,EL表达式内部有try catch处理,不会把异常抛出来,变为空字符串
								获取整个集合:		${域容器中的 key名称}		
								获取索引为1的元素:	${域容器中的 key名称[1]}
		
		Map		格式1:	${map集合.键名}	
				格式2(仅适用于特殊键名):${map集合[“键名”] }	
				格式3:${map集合.get(“键名”) }

		JavaBean		获取属性格式1:	${javaBean对象.属性名}
				获取属性格式2:	${javaBean对象.getXxx()}
				调用自定义方法:	${javaBean对象.方法名(参数)}方法的返回值,会被EL表达式使用 或 会被直接打印在页面上


		复合形式:	和java 一样	



	调用对象API		任意工具类,快速使用EL表达式:(若某个工具不能new,无法使用该方法)	pageContext.setAttribute(“键名”,new 工具类());	${键名.方法(参数)}

	数据运算			和java 一样	无论哪种运算符,运算结果都会直接展示页面 / 可以被其他表达式使用
				empty运算符:如果判断为空,返回true   若非空,返回false		为空:	1.对象为null 	2.字符串为"" 	3.集合长度为0 

	常见EL表达式对象		请求参数	param	获得一个参数 相当于request.getParameter()
				JSP上下文对象	pageContext	pageContext的域对象  ${pageContext.request.contextPath} 用于获取项目名 例如:/day03
				cookie	cookie	用于获取cookie 格式:${cookie.cookie名.value} 例如:获取cookie名为username的值:${cookie.username.value}

	--------------------------------

	JSTL标签		

	使用				1、导入两个jar包
					2、若某个JSP需要使用核心标签,通过帮助导入进来(导报)

	

	If判断:<c:if>			test	if语句的布尔表达式。为true,进入if    为false,不进if    和EL表达式连用。
	
	If…elseif…else判断:<c:choose>	相当于if…else if…else

		结构:
		<c:choose>
			<c:when test=””></c:when>
			<c:otherwise></c:otherwise >
		</c:choose>

		<c:choose> 声明当前位置,使用一个if…elseif…else结构
		<c:when> 必须位于c:choose中,相当于 if语句 / else if语句,可以写1个~多个
		<c:otherwise>必须位于c:choose中,相当于else语句,可以写0个~1个

		test	if语句的布尔表达式。为true,进入if	为false,不进if	和EL表达式连用。	和c:if的test是一样的




	增强for:<c:forEach>

		items	必有属性	需要遍历的数组/集合	和EL表达式连用
		var	必有属性每次遍历出来的元素,保存一个临时变量

		varStatus	遍历的状态变量
			.index 当前遍历的索引
			.count 当前遍历的次数
			.first   是否为第一次遍历
			.last   是否为最后一次遍历

		begin	循环从哪个索引开始
		end	循环到哪个索引结束
		step	每次循环完毕,索引加几。
		step默认为1


		遍历Map集合:keySet和entrySet   c:forEach 标签遍历Map集合时,底层使用的是entrySet,每遍历一个键值对,获取到该键值对对象Entry
		内部遍历时:${entry.key} 获取键				 ${entry.value}获取值

		集合为空:<c:forEach>标签内会进行非空判断,若集合不存在,就不会进行任何遍历。(Java的增强for遍历null,会报异常)【建议:自己用c:if再前面做好非空判断】

	--------------------------------

--------------------------------------------------------------------------------------------------------------------------

JavaWEB笔记_3(web项目)

代码语言:javascript
复制
--------------------------------------------------------------------------

	------------------------------------------------

	登录	1. 登录
		2. 退出	
		3. 验证码
		4. 记住用户名 密码
		5. 记录用户上次登录时间
		6. 自动登录

	------------------------------------------------

	增	1.  单挑增加
		2. 批量增加

	删	1.  单挑删除
		2. 批量删除

	改	1. 基础修改(回显修改)

	查	1.  查询所有
		2. 模糊查询

	
	------------------------------------------------

	文件下载		下载:服务器---响应体---》浏览器

	英文文件名:	默认都是可以被请求到的(服务器都会通过响应体发给浏览器)

	中文文件名:	默认 tomcat无法直接访问到。返回404	解决方案:自己写一个专门处理中文文件名 下载的 servlet

	无论以下哪种情况,文件都是通过响应体 发送给 浏览器	若文件 浏览器可以直接打开,浏览器打开展示	若文件 浏览器无法直接打开,浏览器提供下载窗口

	toomcat服务器内部使用的是 iso-8859-1		解码

	上传文件名乱码解决:	new String("乱码".getBytes("iso8859-1"),"utf-8");

	让浏览器强制弹出下载窗口	响应头:	Content-Disposition:attachement;filename=文件名(该文件名 就是下载框体中默认显示的文件名)	注意:必须放在响应体操作之前。

	浏览器解码时:utf-8解码	响应头进行编码时,默认进行iso8859-1		解决方案: 1、响应头编码改为utf-8	2、根据浏览器的不同,使用工具代码将数据进行UTF-8编码后写出到响应头URL编码

	------------------------------------------------

	验证码	生成验证码图片,展示在登录表单中

	为了加快浏览器访问速度	 相同的访问路径,一般会在浏览器上留下缓存。	 浏览器检测到访问路径没有发生改变,会要求浏览器使用缓存展示,而不会去请求服务器
	1、浏览器设置,不用缓存(不可能给所有用户都设置)	2、跳过缓存:只要让每次的访问路径不完全相同。

	------------------------------------------------
	权限校验	
	------------------------------------------------
	购物车
	------------------------------------------------

--------------------------------------------------------------------------

Servlet

代码语言:javascript
复制
	Servlet就是运行在web服务器上的java小程序 本质就是一个java类,一个类要想通过浏览器被访问到,那么这个类
	必须直接或间接实现Servletr接口
	
	作用		1.接收浏览器请求
			2.处理请求
			3.相应请求

	Servlet
			1.实现servlet接口,重写servlet方法
			2.编写配置文件	注册serlvet	绑定路径
			3.测试	协议 ip :端口 项目名称/绑定路径
========================================================================
	Servlet3.0:
	注解方式实现

		1.编写一个类

			实现servlet接口

			重写Service(request,response)方法

		2.在servlet类上添加  @WebServlet(name = "Demo" ,urlPatterns = "/demo")

			name: 起名称

			urlPatterns: 访问路径
========================================================================
	Servlet2.5:

		1.编写一个类

			实现servlet接口

			重写Service(request,response)方法

		2.编写配置文件(web.xml)

			注册servlet

			绑定路径

       <!--a.注册我们的servlet-->
        <servlet>
            <!-- 给我们的servlet起名称 -->
            <servlet-name>ServletDemo1</servlet-name>
            <!-- 告诉tomcat我们的servlet所在路径  全限定名(包名+类名) -->
            <servlet-class>com.itheima.servlet.ServletDemo1</servlet-class>
        </servlet>
        <!--b.为我们的servlet提供访问路径-->
        <servlet-mapping>
            <servlet-name>ServletDemo1</servlet-name>
            <!-- 设置浏览器访问的路径 路径自定义 -->
            <url-pattern>/demo1</url-pattern>
        </servlet-mapping>



		3.测试

			http://localhost:8080/项目名称/绑定路径
========================================================================

Servlet:接口
			 (掌握★)`init`:初始化 
			 (掌握★) service :提供服务
			 (掌握★)`destroy`:销毁
			 (理解)`getServletConfig`():获取当前Servlet的配置对象
			 (了解)`getServletInfo`():获取Servlet信息


========================================================================

			Servlet 接口:

			GenericServlet 抽象类:

			HttpServlet 抽象类:

			最终实现方式: 继承HttpServlet,重写doGet 和 doPost 方法

Tomcat笔记

代码语言:javascript
复制
---------------------------------------
	web 服务器 	用于发布资源
		
			接受请求	在处理请求之前 将请求 对象化 Request		   
	
			响应请求 在处理响应之前 将响应 对象话 Response
	
	Windows下部署不能有中文目录
	Tomcat需要java环境   需要配置环境变量

---------------------------------------

	网络协议三要素  ip  协议(tcp 三次握手安全  utp 速度快 不安全  ssh安全外壳协议)  端口
	
	Tomcat(Web服务器软件)	浏览器访问 通过 ip  端口协议  -----   访问 服务器中的 tomcat  . tomcat 在访问 项目资源
		
	tomcat整合IDEA		1. 下载tomcat  在IDEA中 配置Tomcat路径	以及其他环境参数  jre 默认访问路径 浏览器等
				2. 配置javaWEB项目  配置访问路径
				3. 浏览器测试访问
			(启动后 Idea 回将tomcat的核心配置文件 复制一份 到IDEA指定目录中(相当于一共新的简化tomcat  这个目录是IDEA自动生			成的很难改)  (目的是Idea运行web项目不影响本地tomcat) )	
			(tomcat会自动将 加载 web文件中的所有    web文件名被项目名替代 , src下的calss文件会放到web下 WEB-INF下)

	tomcat项目部署	3种方式		1.直接部署在tomcat本地webapps下
					2.修改server.xml配置文件 指定访问目录
					3.配置独立的xml文件(无需重启服务 自动加载和卸载项目)(第三种方式最多 IDEA也是采用此方式)

	Tomcat基础
	Tomcat架构
	Tomcat服务器配置
	Tomcat  jsp引擎  Jasper

	Web应用配置
	Tomcat管理配置
	JVM配置
	Tomcat集群
	Tomcat安全
	Tomcat性能调优
	Tomcat附件功能

总结

以上便是JavaWeb核心技术学习笔记 ,喜欢的小伙伴欢迎一键三连!!! 我是manor,一枚相信技术改变世界的码农,我们下期再见~

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-06-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 前言
  • http协议笔记
  • JavaWEB笔记_1
  • JavaWEB笔记_2(JSP)
  • JavaWEB笔记_3(web项目)
  • Servlet
  • Tomcat笔记
  • 总结
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档