J2EE 基础知识

本贴最后更新于 1959 天前,其中的信息可能已经事过景迁

ZERO

    持续更新 请关注:https://zorkelvll.cn/blogs/zorkelvll/articles/2018/12/08/1544280958346

背景

    本文主要是记录在学习 J2EE 过程中的一些知识点备忘!

20190414

J2EE:sun 公司提出的多层、分布式、基于组件的企业级应用模型
层次:客户层组件、web 层组件、business 层组件、企业信息系统层(EIS)
简记:J2EE=Components(规范-Servlet/jsp/ejb/jsf)+Container(容器-Web 容器/EJB 容器/Spring 容器)+MVC 模式 +Service 服务 + 多层次

20181213

1、JSP 工作原理

JSP 是一种 Servlet,且不同于 HttpServlet;

HttpServlet 是先由源代码编译为 class 文件后,在部署到服务器下,是先编译后部署,而 JSP 则是先部署后编译;

JSP 会在客户端第一次请求 JSP 文件时被编译为 HttpJspPage 类(接口 Servlet 的一个子类),该类会被服务器临时存放在服务器工作目录里面!

2、JSP 内置对象及其作用

  • request:封装客户端的请求,包含来自 GET/POST 请求的参数
  • response:封装服务器对客户端的响应
  • pageContext:通过该对象可以获取其他对象
  • session:封装用户会话的对象
  • application:封装服务器运行环境的对象
  • out:输出服务器响应的输出流对象
  • config:Web 应用的配置对象
  • page:JSP 页面本身
  • exception:封装页面抛出异常的对象

3、Request 对象的方法

  • setAttribute:设置名为 name 的 request 的参数值
  • getAttribute:返回由 name 指定的属性值
  • getAttributeNames:返回 request 对象所有属性的名字集合,结果是一个枚举的实例
  • getCookies:返回客户端的所有 Cookie 对象,结果是一个 Cookie 数组
  • getCharacterEncoding:返回请求中的字符编码方式
  • getContentLength:返回请求的 Body 的长度
  • getHeader:获得 HTTP 协议定义的文件头信息
  • getHeaders:返回指定名字的 request Header 的所有值,结果是一个枚举的实例
  • getHeaderNames:返回所有 request Header 的名词,结果是一个枚举 ed 实例
  • getInputStream:返回请求的输入流,用于获得请求中的数据
  • getMethod:获得客户端向服务器端传送数据的方法
  • getParameter:获得客户端传送给服务器端的由 name 指定的参数值
  • getParameterNames:获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
  • getParameterValues:获得由 name 指定的参数的所有值
  • getProtocol:获得客户端像服务器端传送数据所依据的协议名称
  • getQueryString:获得查询字符串
  • getRequestURI:获得发出请求字符串的客户端地址
  • getRemoteAddr:获得客户端的 IP 地址
  • getRemoteHost:获得客户端的名字
  • getSession:返回和请求相关 Session
  • getServerName:获取服务器的名字
  • getServletPath:获取客户端所请求的脚本文件的路径
  • getServerPort:获取服务器的端口号
  • removeAttribute:删除请求中的一个属性

4、request.getAttribute() VS request.getParameter()

从获取方向来看:getAttribute 获取对象容器中的数据值,getParameter 获取 POST/GET 传递的参数值

从用途来看:

  • getAttribute:用于服务器端重定向时,即在 servlet 中使用 forward 函数或 struts 中使用 mapping.findForward,只能受到程序用 setAttribute 传过来的值
  • getParameter:用于客户端重定向,即点击了链接或提交按钮时传值用,用于在利用表单或者 url 重定向传值时接收数据使用
  • getAttribute 可以接收 setAttribute 设置的对象,而 getParameter 只能传字符串;setAttribute 是应用服务器把这个对象放在该页面所对应的一块内存中去,当页面服务器重定向另一个页面时,应用服务器会吧这块内存拷贝到另一个页面所对应的内存中,session 也一样仅仅区别在于对象在内存中的生命周期不一样;getParameter 是应用服务器分析 request 页面的文本时,取得设在表单或 url 重定向时的值

5、include 指令 VS include 行为

  • include 指令:JSP 可以通过 include 指令来包含其他文件,被包含的文件可以是 JSP 文件、HTML 或文本文件,会随着 JSP 本身一起呗同时编译执行,语法格式如下: <%@ include file="文件相对 url 地址" %>

  • include 动作:jsp:include 动作元素用来包含静态和动态的文件。该动作把指定文件插入正在生成的页面。语法格式如下: jsp:include page="相对 URL 地址" flush="true"

6、JSP 四种作用域

  • page:表示与一个页面相关的对象和属性
  • request:表示与 web 客户机发出的一个请求相关的对象和属性,一个请求如果跨域多个页面涉及多个 web 组件,则可以将需要在页面显示的临时数据置于此作用域
  • session:代表某个用户与服务器建立的一次会话相关的对象和属性
  • application:代表与整个 web 应用相关对象和属相,是一个全局作用域

7、如何实现 JSP OR Servlet 的单线程模式

  • JSP:通过 page 指令设置,<%@page isThreadSafe=”false”%>
  • Servlet:自定义 Servlet 实现 SingleThreadModel 接口

=> 单线程工作模式,会导致每个请求创建一个 Servlet 实例!

8、实现会话跟踪的技术

  • 使用 Cookie
  • URL 重写
  • 隐藏的表单域
  • HttpSession

9、Cookie VS Session

Session 是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;

Cookie 是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现 Session 的一种方式

20181209

1、Forward 转发 VS Redirect 重定向

  • Forward 是服务器行为,Redirect 是客户端行为
  • Forward:通过 RequestDispatcher 对象的 forward(HttpServletRequest req,HttpServletResponse res)方法实现的,RequestDispatcher 可以通过 HttpServletRequest 的 getRequestDispatcher()方法获得
  • Redirect:利用服务器返回的状态码来实现的;客户端浏览器请求服务器的时候,服务器会返回一个状态码,服务器通过 HttpServletRequestResponse 的 setStatus(int status)方法设置状态码;如果服务器返回 301 或者 302,则浏览器会到新的网址重新请求该资源
  • (1)从地址栏显示:forward 是服务器请求资源,服务器直接访问目标地址的 URL,把那个 URL 的响应内容读取过来,然后把这些内容发送给浏览器,浏览器根本不知道服务器发送的内容来自于哪里,地址栏还是原来的地址的;而 redirect 则是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,地址栏显示的是新的 URL
  • (2)从数据共享:forward 是转发页面和转发到的页面可以共享 request 里面的数据;而 redirect 不能共享数据
  • (3)从运用地方:forward 一般用于用户登录的时候,根据角色转发到相应的模块;redirect 一般用于用户注销登录时返回主页面或跳转到其他的网站等
  • (4)从效率上:forward 高,redirect 低

2、Refresh 刷新

自动刷新不仅可以实现一段时间之后自动跳转到另一个页面,也还可以实现一段时间之后自动刷新本页面。Servlet 中通过 HttpServletResponse 对象设置 Header 属性实现自动刷新。

3、Servlet & 线程安全

Servlet 不是线程安全的,多线程并发的读写会导致数据不同步的问题。=> 解决办法:尽量不要定义 name 属性,而是要把 name 变量分别定义在 doGet 和 doPost 方法内;使用 synchronized(name){}语句块可以解决问题,但是会造成线程的等待!注意:多线程并发的读写 Servlet 类属性会导致数据不同步,但是如果只是并发地读取属性而不写入,则不存在数据不同步的问题,因此 Servlet 中的只读属性是定义为 final 类型的

4、JSP & Servlet

Servlet 是一种特殊的 Java 程序,运行于服务器的 JVM 中,能够依靠服务器的支持向浏览器提供显示内容;JSP 本质上是 Servlet 的一种简易形式,会被服务器处理成一个类似于 Servlet 的 Java 程序,可以简化页面内容的生成!

二者的区别在于,Servlet 的应用逻辑是在 Java 文件中的并且完全从表示层中的 HTML 分离开来,而 JSP 则是 Java 和 HTML 组合成一个扩展名为 jsp 的文件(可以粗浅地认为:Servlet 是在 java 中写 HTML,JSP 是在 HTML 中写 Java 代码)!JSP 侧重于视图,Servlet 更侧重于控制逻辑!在 MVC 架构模式中,JSP 适合充当视图 view,而 Servlet 适合充当控制器 controller

20181208

1、Servlet

    JavaWeb 中,Servlet 主要负责接收用户请求 HttpServletRequest,在 doGet(),doPost()中做相应的处理,并将回应 HttpServletResponse 反馈给用户。Servlet 可以设置初始化参数,供 Servlet 内部使用,一个 Servlet 类只会有一个实例,在它初始化时调用 init()方法,销毁时调用 destroy()方法。Servlet 需要在 web.xml 中配置,一个 Servlet 可以设置多个 URL 访问,Servlet 不是线程安全的(使用类变量需要谨慎)

2、Servlet VS CGI

(1)CGI 缺点:

  • 需要为每个请求启动一个操作 CGI 程序的系统进程,如果请求频繁则会带来很大的开销
  • 需要为每个请求加载和运行一个 CGI 程序,开销也很大
  • 需要重复编写处理网络协议的代码及编码,这些工作非常耗时

(2)Servlet 优点:

  • 只需要启动一个操作系统进程以及加载一个 JVM,大大降低了系统开销
  • 如果多个请求需要做同样处理的时候,此时只需架子啊一个类,大大降低开销
  • 所有动态加载的类可以实现对网络协议以及请求解码的共享,大大降低了工作量
  • Servlet 能直接与 wbe 服务器交互,而普通的 CGI 程序不能;Servlet 也可以在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现

(3)补充:Servlet 技术是 Sun 公司于 1996 年发布与 CGI 进行竞争的,是一个特殊的 java 程序,一个基于 java 的 web 应用,通常包含一个或多个 Servlet 类,Servlet 不能够自行创建并执行,必须是在 Servlet 容器中运行的,容器将用户的请求传递给 Servlet 程序并将 Servlet 的响应回传给用户。通常一个 Servlet 会关联一个或多个 JSP 页面,以前 CGI 经常因为性能开销上的问题被诟病,其实 Fast CGI 早就已经解决了 CGI 效率上的问题,所以也不要心口开销地诟病 CGI,事实上很多熟悉的网站都使用了 CGI 技术

3、Servlet 方法 && Servlet 生命周期

(1)Servlet 接口中定义了 5 个方法,且前 3 个与其生命周期相关:

  • void init(ServletConfig config) throws ServletException
  • void service(ServletRequest req,ServletResponse resp) throw ServletException,java.io.IOException
  • void destory()
  • java.lang.String getServletInfo()
  • ServletConfig getServletConfig()

(2)生命周期:web 容器加载 Servlet 并将其实例化后,Servlet 生命周期开始,容器运行其 init()方法进行 Servlet 的初始化;请求到达时调用 Servlet 的 service()方法,service()方法会根据需要调用与请求对应 doGet()或 doPost()等方法;当服务器关闭或项目被卸载时服务器会将 Servlet 销毁,此时会调用 Servlet 的 destroy()方法。init 和 destroy 方法只会执行一次,service 方法客户端每次请求 Servlet 都会执行。

4、get 请求 VS post 请求

  • get 请求用来从服务器上获得资源,而 post 请求用来向服务器提交数据,GET 方式提交表单的典型应用是搜索引擎。GET 方式就是被设计为查询用的。
  • get 请求将表单中数据按照 name=value 形式添加到 action 所指向的 URL 后面,并且 URL 与数据之间使用?连接,而数据中的各个变量使用&连接;post 则是将表单中的数据放在 HTTP 协议的请求头或消息体中,传递到 action 所指向 URL
  • get 请求传输的数据会受到 URL 长度限制(1024 字节即 256 个字符),而 post 则可以传输大量的数据,如上传文件通常需要使用 post 请求
  • get 请求时参数会显示在地址栏上,因此敏感数据最好还是使用 post
  • get 请求使用 MIME 类型 application/x-www-form-urlencoded 的 URL 编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成
  • Form 标签中 method 的属性是 get 时调用 doGet(),为 post 时调用 doPost()

说明:本 JavaGuide 系列博客为来源于 https://github.com/Snailclimb/JavaGuide
等学习网站或项目中的知识点,均为自己手打键盘系列且内容会根据继续学习情况而不断地调整和完善!

  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    163 引用 • 473 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
zorkelvll
只为成功找方法,不为失败找借口!@一只不甘沦为码农的程序猿

推荐标签 标签

  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    5 引用 • 26 回帖
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 576 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 1 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 623 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖 • 1 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 461 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1429 引用 • 10050 回帖 • 486 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    11 引用 • 54 回帖 • 146 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 143 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 457 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 3 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    174 引用 • 814 回帖
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 2 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    175 引用 • 994 回帖
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 2 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    106 引用 • 152 回帖 • 2 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    76 引用 • 429 回帖 • 5 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 3 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 1 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 18 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 8 关注
  • CodeMirror
    1 引用 • 2 回帖 • 127 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 728 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 25 关注