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

`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:

访问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()	用于获取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的属性		

img
img
img

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

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

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

alue,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的属性

[外链图片转存中…(img-Bcizc2jX-1714426923869)]
[外链图片转存中…(img-M1LlUAJH-1714426923869)]
[外链图片转存中…(img-5YEsUjgN-1714426923869)]

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

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

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

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值