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

Posted ChinaManor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[硬核]卷起来!两万六千字总结的JavaWeb核心技术学习笔记相关的知识,希望对你有一定的参考价值。


在这里插入图片描述

前言

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

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

在这里插入图片描述

http协议笔记

协议 : 约定 
	网络传输协议:	`规范网络传输` 如 速率 . 传输码率 . 代码结构 . 传输控制
	
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




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


浏览器上能看到的一切内容,统称之为 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=方法名
		②location.href     : 
					location.href=”/项目名/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)



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

	概述	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(以上是关于[硬核]卷起来!两万六千字总结的JavaWeb核心技术学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

超硬核知识:两万字总结《C++ Primer》要点!

Redis核心知识点总结(一万五千字,请耐心读完)

两万五千字的ConcurrentHashMap底层原理和源码分析

两万五千字!写给设计师的数据可视化指南

C++ 等硬核资料推荐,国庆节卷起来!

六千字让你明白什么是数字孪生?