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