img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取


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()	用于获取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项目)




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

登录	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、跳过缓存:只要让每次的访问路径不完全相同。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

必须放在响应体操作之前。

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

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

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

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

[外链图片转存中…(img-TA3hs0CZ-1714981522240)]
[外链图片转存中…(img-ApifQb4B-1714981522240)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐