Java Web的了解和使用
·
文章目录
1. JavaEE 和 JavaSe区别
1) javaEE
Java Enterprise Edition , Java 企业版,多用于企业级开发,包括web开发等。
企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务端java应用。
JavaEE是在JavaSE的基础上构建的,可以用来实现企业级的面向服务体系结构和web2.0应用程序。
2) javaSE
Java Standard Edition,java标准版,就是一般java程序的开发。
可以看作是javaEE 的子集。
它允许开发和部署在桌面、服务器、嵌入式环境和实施环境中使用的java应用程序。
javaSE 包括 支持java web 服务开发的类,并为 javaSE提供基础。
2. 软件架构
1) C/S
client /server ,指的是客户端和服务器的交互。
特点:需要在自己的电脑上安装一个客户端,比如:qq,美团
优点:效果比较好看。
缺点:占用硬盘空间,服务器只要升级,就要求客户端跟着升级。
2) B/S
browser /server 浏览器 和 服务器 的交互。
特点:不需要安装客户端,一个浏览器就可以,比如:网页版淘宝,网页版12306等。
优点:不会占用硬盘空间,服务器升级不要求跟着升级。
缺点:页面效果一般,所有压力都在服务器。
3. web资源分类
web资源 指的是可以通过浏览器访问的资源。
分类为:静态资源 和 动态资源。
静态资源:在页面写死的数据,时时刻刻都不会改变,比如:html、css、js、图片等。
动态资源:web 页面供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容不同。数据不是写死在页面,而是通过中介(数据库、xml等)获取。
4. 服务器
1)概念
服务器就是一个软件,任何电脑只要安装了服务器软件,那么该电脑的指定目录下的资源就能提供对外访问。
2)作用
用来提供计算、服务的设备,把本地资源传输给浏览器。
3)分类
1)mysql
通过指令去访问,用来操作数据,对数据进行增删改查操作。
2)nginx
通过浏览器去访问,用来部署静态资源项目,让所有人通过浏览器去访问。
3)tomcat
通过浏览器访问,既可以部署静态资源,也可以部署动态资源,让所有人去访问。是免费的小型服务器软件。
4)weblogic
大型收费服务器软件,oracle公司。
5. Java Web规范
1) 概述
Java Web 规范是一个规范的集合,它包含了开发 Java Web 应用所需的一系列官方技术标准。
包括整个web层:(View 层 + Controller 层)。
2) 主要内容
1. Servlet 规范
作用:定义如何处理请求、响应、Session、Filter、Listener、同步/异步处理。
主要关注 请求--响应 的底层处理(Controller 层)。
2. JSP 规范
作用:定义如何编写和运行 Java 服务端页面(已较老旧)。
3. EL 规范
作用:定义表达式语言(${user.name}),用于在 JSP/模板中取值。
4. WebSocket 规范
作用:定义如何实现服务端与客户端的全双工通信,用于即使通讯。
5. JSTL 规范
作用:定义标准标签库,用于简化 JSP 开发。
6. Servlet
1)概述
servlet 是一种服务器端的java 应用程序,具有独立于平台和协议的特性,可以生成动态的web页面。
它担当客户请求(web浏览器或者其他http客户程序) 与 服务器响应 的中间层。
servlet 是位于web 服务器 内部的 服务器端的 java应用程序,与传统的从命令行启动的java 应用程序不同,servlet 由web 服务器进行加载,该web 服务器 必须包含支持 servlet 的 java 虚拟机,
是运行在web服务器上的小型java程序。本质上是一个类,但它是一个特殊的类,
首先,这个类需要实现一个接口:Servlet接口。
其次,这个类必须在servlet容器(web服务器)上运行。
最后,servlet可以接收用户请求并返回响应结果。
作用:接收服务器端产生的数据并展示,可以简化html 书写,同时动态生成页面。
2)生命周期
servlet生命周期可以分为4个阶段:加载和实例化、初始化、服务、销毁。
1)当客户第一次请求时,首先判断是否存在 servlet 对象,若不存在,则由 web 容器创建对象,而后调用 init() 方法对其初始化,这个初始化方法在整个servlet 生命周期中只调用一次,servlet对象也只创建一个,是单例对象。
2)当之后再访问该servlet的时候,不会再调用init()方法,而是调用 service() 方法来处理请求,调用一次,执行一次。
3)当web 服务器关闭或者 servlet 对象要从容器中被删除时,会自动调用 destory() 方法,销毁当前servlet对象,只调用一次。
3) 转发和重定向
转发在服务器端完成, 重定向在客户端完成。
转发的速度块, 重定向的速度慢。
转发是同一次请求,重定向是2次不同的请求。
转发不会执行转发后的代码,重定向会执行重定向后的代码。
转发地址栏没有变化,重定向地址栏会变化。
转发必须在同一台服务器下完成,重定向可以在不同的服务器下完成。
7. JSP
1)概述
JSP 的全称是 Jakarta Server Pages(曾用名:JavaServer Pages),是一种用于开发动态网页的 Java Web 技术。
它的核心思想是:在 HTML 页面中嵌入 Java 代码,让静态页面“活”起来,能够根据用户请求动态生成内容。
2)本质
JSP 本质上是一种简化的 Servlet 设计。
工作流程:
1)用户请求一个 .jsp 页面。
2)Web 服务器(如 Tomcat)会将这个 JSP 文件翻译成一个 Java 文件(这个 Java 文件本质上就是一个 Servlet 类)。
3)服务器编译这个 Java 文件,生成 .class 字节码。
4)服务器执行这个 Servlet,生成 HTML 响应返回给浏览器。
3)核心组成
JSP 通常不单独使用,而是与另外两个技术组成经典的 JSP + Servlet + JavaBean 架构.
JSP:负责展示数据(视图层 View)
Servlet:负责处理请求和控制流程(控制层 Controller)。
JavaBean:负责封装数据和业务逻辑(模型层 Model)。
4)优点
1)开发简单:对于 Java Web 初学者来说,JSP 比纯 Servlet 更直观,可以快速写出动态页面。
2)与 Java 无缝集成:可以方便地使用 Java 强大的类库(JDBC、多线程、集合等)。
3)一次编写,到处运行:继承了 Java 的跨平台特性。
5)缺点
1)前后端高度耦合:Java 代码和 HTML 标签混在一起,页面逻辑复杂时,代码变得难以阅读和维护。
2)开发效率低:修改一点 Java 逻辑往往需要重启整个 Web 服务器。
3)性能瓶颈:每次访问 JSP 都要经历“翻译 -> 编译 -> 执行”的过程(虽然有缓存,但首次访问较慢)。
4)职责不清晰:精通 HTML 的前端工程师很难维护夹杂着 Java 代码的 JSP 文件。
5)技术生态落后:随着前后端分离(前端用 Vue/React,后端只提供 JSON 接口)和模板引擎(如 Thymeleaf、Freemarker)的兴起,JSP 逐渐被取代。
6)作用域
在web应用中,JSP创建的对象有一定的生存周期,可以被其他对象或者其他组件访问,对象的生存周期及可访问性称为 作用域。
JSP有4大作用域,按照可以访问域的范围从小到大为:page --> request --> session --> application。
1)pageContext(页面域)
pageContext 有效范围仅限于当前页面,可以近似理解为 this 。
对象在离开当前页面后,无论是 request 或者是 redirect 等方式离开的,当前页面的相关属性值都会丢失。
2)request (请求域)
request 表示一次请求,它的有效范围是当前请求周期。
所谓请求周期,就是从 http 发送请求,到服务器接收并处理请求,将结果返回到客户端响应。在这一过程中,可能使用 forward 跳转了多个 jsp 页面,而在这多个 jsp 页面中,属性值都有效,但如果是通过 redirect 方式进行跳转,会重新发送请求,这样属性值就会丢失。
注意:
forward() 转发是服务器端的,地址栏地址不会改变。
redirect() 是请求重定向,是客户端的,地址栏的地址为重新定向的页面,会改变。
3)session(会话域)
session有效范围是当前会话,当前会话表示浏览器打开到浏览器关闭这一过程。
但会出现这种情况:浏览器一直处于打开状态,这样session永远不会销毁,而且在浏览器关闭时,并不会通知服务器,另外session是存放于服务器的内存上,这样对服务器是一种负担。
所以通过这种方式来判断:如果一段时间内客户端没有相应,就认为会话结束。
tomcat默认会话时常是120分钟,但是可以通过HttpSession和setMaxinactivelnteval()方法来设置。
4)application(应用域)
application 有效范围是整个应用。从应用开启到应用结束,在服务器停止之前,应用没有结束,application 对象都有效,可以被所有会话共享。
application作用域的变量的存活时间是最长的,如果不手动删除,就会一直存在。
application的变量是共享的,如果a修改了application的变量,那么b访问的是修改后的值。这在其他作用域是不会发生的,因为page、request、session是完全隔离的,用户之间不会影响。
8. http协议
1) 概述
全名是 超文本传输协议,是互联网上运用最广泛的一种协议,所有的www 文件都必须遵守这个标准。
互联网底层传输协议主要是TCP+UDP,http是架构在tcp协议之上的,它规定了浏览器向服务器发送数据的内容和格式,以及服务器响应浏览器的内容和格式。
2) 请求协议
1. 请求行:
请求方式:get、post
请求url
http版本号:HTTP/1.1 、 HTTP/2
2. 请求头
一系列的键值对,用来描述请求、客户端或附加信息。
3. 请求体
承载着客户端要发送给服务器的主要数据。
3) 响应协议
1. 响应行
HTTP版本号、状态码信息、状态消息等。
2. 响应头
一系列键值对,用于描述响应本身或服务器的信息。
3. 响应体
服务器返回的实际数据。
4)get 和 post 请求区别
1. get请求的参数是在请求行中,拼接在url之后的,是可见的,相对不安全。
post请求的参数是在请求体中,没有直接暴露,相对安全。
2. HTTP 协议本身并没有对 GET 请求的长度设置任何限制,但是 get请求的长度受限于url 长度,而url 的长度 又由浏览器和服务器所影响决定,不同浏览器长度不一样,Chrome 和 Edge 最大url 长度为2M作用,Firefox 最大长度为64k 左右,当超过长度限制时,get请求会报错。
post请求的数据是放在请求体中,没有大小限制。
3. get请求可以被收藏为书签,post请求不可以被收藏为书签。
4. get请求可以缓存,post 请求不可以缓存。
5. get请求后退时,不产生影响。
post请求后退时,会重新提交请求。
6. get 请求的参数保存在浏览器历史中。
post请求的参数不会保存在浏览器历史中。
7. get请求只允许使用 ASCII 字符。
post 请求没有限制,也可以是二进制数据。
5)request对象
用来封装所有的请求信息:
1)获取请求行的数据
2)获取请求头的数据
3)获取请求体的数据
4)获取当前项目名:getContextPath()
5)请求转发:request.getRequestDispatcher().forward(req)
6)response对象
用来封装所有的响应信息:
1. 设置状态码
2. 设置响应头
3. 发送响应体
4. 设置响应内容类型:response.setContentType("文件类型",charset="utf-8")
5. 设置重定向:response.sendRedirect("url")
7)域对象
Java Web规范中定义了4个不同作用范围的域对象,从小到大分别是:
1. pageContext
作用范围:Page (页面)
生命周期:当前JSP页面执行期间
典型用途:仅在当前JSP页面内共享,非常短暂。
2. HttpServletRequest
作用范围: 一次Request (请求)
生命周期:一次请求之内是同一个request,从请求开始到响应结束,只要响应数据给浏览器,request请求就会销毁。
典型用途:同一个请求中的多个组件之间(Servlet -> JSP)传递数据。
前提:只能在同一个request 中才可以。
作用:
1)存取数据:setAttribute(String name, Object o)
注意:请求转发属于一次请求,多次转发,是同一个request,可以实现资源共享,传递数据。
3. HttpSession
作用范围:一次Session (会话)
生命周期:不会自动创建,需要显示调用,当第一次调用request.getSession()方法时,会创建session对象。一次会话中,数据共享,关闭浏览器,session对象并没有销毁,只是因为cookie销毁了,拿不到sessionId信息,所以找不到原来的session,就会再创建一个返回。生命周期为 用户首次访问到会话超时或被销毁。
销毁方式:
主动销毁:调用 invalidate()方法。
默认销毁:30分钟不使用该session,会销毁。
服务器非正常关闭会销毁,正常关闭不会销毁。
典型用途:存储特定用户的私有数据,如登录信息、购物车。
注意:服务器正常关闭,session不销毁,session中的数据如果实现了序列化,那么会全部保留,如果没有实现序列化,会全部销毁,String、Map、List默认都实现了序列化接口。
4. ServletContext
作用范围:整个Application (应用)
生命周期:从应用启动到应用关闭,服务器一启动就会创建,关闭的时候才销毁。相当于一个全局的静态变量,整个项目中所有资源全部共享,只有一份。
作用:
1)资源共享:servletContext.setAttribute()
2)根据文件名获取文件类型:getMimeType(String filename)
3) 获取当前项目在磁盘中的根路径:getRealPath()
4)根据服务器上的资源获取流:InputStream in = servletContext.getResourceAsStream(“文件路径”)
典型用途:存储所有用户全局共享的数据,如网站访问计数器、全局配置信息。
9. 会话技术
1)概述
1. 概念:在打开浏览器后,浏览器和服务器之间 进行的一系列 交互行为,叫做 会话技术。
2. 作用:用来存储会话过程中,浏览器和服务器产生的数据。
3. 分类:
1)cookie:客户端会话技术(数据保留在浏览器端)
2)session:服务器端会话技术(数据保存在服务器端)
4. 为什么将数据存到cookie和session?
1)request一次请求中可以进行数据传递,但响应后数据就会丢失。servletContext虽然是全局的,但是如果有多个用户,那么数据因为是共享的,就没有办法确认到底是谁的。
2)cookie和session能够实现多个用户和多个服务器之间的数据传递。
cookie 是浏览器端的会话技术,所有的数据都保存在浏览器端。
session是服务器端的会话技术,所有的数据都保存在服务器端。
5. 是否是域对象?
域对象必须是服务器端的技术,所以,cookie不是域对象,session 是域对象。
2)cookie
1. 概述
web服务器发送给浏览器的信息,浏览器会在本地文件将每一个web以及其对应的信息存储起来。等到下次向服务器发送请求的时候,会把web带过来的信息发送给服务器。
2. 创建
cookie是由 服务器 端创建,通过响应头 传递给浏览器端,由浏览器端 存储和维护的。
Cookie cookie = new Cookie(String key,String value);
3. 服务器端怎么把cookie给浏览器
response.setHeader("set-cookie");
response.addCookie(cookie);
4. 保存
浏览器 获取cookie中的信息,并保存在浏览器端。
5. 再传递
之后再传递的时候,request对象会把之前保存的cookie信息也一起传递过去。
6. 服务器端获取cookie
Cookie[ ] = request.getCookies();
7. cookie的生存周期
1)默认是会话级别的,也就是说只要浏览器不关闭,那么cookie 信息就一直保存,浏览器关闭后,cookie信息就会销毁。
2)可以自己设置过期时间:cookie.setMaxAge(x 秒),如果自己设置了过期时间,那么过期时间会完全按照这个标准,没到时间前,哪怕关闭浏览器或者关机,cookie都仍然存在。到了时间后,哪怕没有关闭浏览器的操作,cookie也会过期。
8. cookie 的路径
cookie.setPath("c/aa/bb")
9. cookie 的唯一性
Cookie的唯一性不由单一的 key 决定,而是由 (key, domain, path) 这个三元组共同决定。
key:name
domain:域 指定cookie可以发送给哪个域名及其子域名。默认是当前请求的完整主机名。
path:路径 指定cookie可以发送给该域名下的哪个路径。默认是当前请求的路径。
10. 注意点
1)服务器可以给浏览器传递多个cookie信息,浏览器也都会保存,但是存在key值覆盖。
2)cookie存入的数据大小有限制,通常是4kb。
3)不能直接存入特殊字符,如果想存特殊字符,需要先编码成 utf-8,再解码
String value = URLEncoder.encode(jsonString, "UTF-8");
Cookie cookie = new Cookie("user", value);
//读取
String encoded = cookie.getValue();
String decoded = URLDecoder.decode(encoded, "UTF-8");
3)session
1. 概述
存储在web服务器端的一块信息,主要是存储特定用户会话所需的属性及配置信息。
当用户在web程序的应用页之间跳转时,存储session 对象的变量将不会丢失,而是在整个用户会话中一直存在下去。
2. 创建
由服务器端创建,并自己保存。
3. 特点
是一个域对象,对应方法:setAttribute() getAttribute()
4. 获取
request.getSession();
5. 如何保证一次会话中,使用的是同一个session对象
1)当第一次获取session对象的时候,会先去cookie 中查看有没有携带 sessionId 相关的信息,如果没有,那么就会在服务器中开辟一片空间,创建一个新的session 对象,并将地址值返回,服务器向浏览器端响应数据的时候,也会把这个sessionId 响应回去。
2)之后再获取session 对象,还是会先去cookie 中查看有没有携带sessionId 相关的信息,如果没有会创建,如果有的话,那么就会直接获取对应的session 对象,并可以获取里面的信息。
3)当处于同一个会话中的时候,cookie 是同一个,那么cookie 中保存的 sessionId 是同一个,session 也是同一个。
4)当浏览器关闭的时候,一次会话结束,cookie会销毁,那么此时浏览器再访问服务器,会生成一个新的cookie,这个cookie中没有sessionId 相关的信息,此时再获取session,那么就又会创建一个新的session 对象,并将地址返回给cookie 保存,这样cookie中下次再请求的时候,就会携带新生成的session对象信息。
5)session跟cookie 是同步的,因为sessionId的信息是存储在cookie 中。当cookie 中没有了sessionId 时,那么就会创建新的session,并将sessionId 返回。
6. 如何实现关闭浏览器,还有session 数据?
因为session数据是通过session 对象获取,session对象是通过cookie对象中的sessionId 获取,所以只要保证cookie中还有sessionId 信息,那么关闭浏览器后,就还可以获取到session数据,而实现关闭浏览器还有cookie信息的途径是:自己人为的设置cookie 的生存周期。
4)cookie 和 session 区别
1. cookie 是浏览器端的会话技术。
session是服务器端的会话技术。
2. cookie的数据是由 服务器 端创建,通过响应头 传递给浏览器端,由浏览器端 存储和维护。
session的数据是由服务器端创建,并且自己维护。
3. cookie存储内容有大小限制,一般是4kb。
session存储数据没有大小限制。
4. cookie存储数据不安全,session存储数据相对安全。
5. 无论客户在前端做怎样的设置,session都能正常工作,
但当客户端禁用cookie时,cokkie会失效,无法使用。
6. session能够存储任意的java对象。
cookie只能存储String类型的对象。
10. Ajax
1) 概述
是一种创建交互式网页应用的网页开发技术。 Asynchronous JavaScript and Xml 的缩写。
它可以实现局部刷新,在不更新整个页面的前提下维护数据,提升用户体验度。
2)优势
1. 通过异步模式,提升用户体验。
2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少带宽占用。
3. Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,较少了大用户量下的服务器负载。
更多推荐




所有评论(0)