J2EE 基础知识

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

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
等学习网站或项目中的知识点,均为自己手打键盘系列且内容会根据继续学习情况而不断地调整和完善!

  • 学习

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

    171 引用 • 512 回帖
  • Java

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

    3190 引用 • 8214 回帖 • 1 关注
  • 面试

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

    325 引用 • 1395 回帖 • 1 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3454 回帖 • 189 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    27 引用 • 225 回帖 • 163 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    123 引用 • 74 回帖 • 2 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    692 引用 • 535 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 2 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 667 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    23014 引用 • 92572 回帖
  • WebComponents

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

    1 引用 • 4 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 216 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 440 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    492 引用 • 926 回帖
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 1 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 253 关注
  • jQuery

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

    63 引用 • 134 回帖 • 724 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖 • 1 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    265 引用 • 666 回帖 • 1 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 772 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 538 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 401 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    51 引用 • 25 回帖
  • 反馈

    Communication channel for makers and users.

    123 引用 • 913 回帖 • 250 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖
  • 大数据

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

    93 引用 • 113 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 584 关注