J2EE 基础知识

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

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

  • 学习

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

    161 引用 • 473 回帖
  • Java

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

    3167 引用 • 8207 回帖
  • 面试

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

    324 引用 • 1395 回帖 • 1 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Caddy

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

    10 引用 • 54 回帖 • 130 关注
  • 音乐

    你听到信仰的声音了么?

    59 引用 • 509 回帖
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    164 引用 • 407 回帖 • 526 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 293 关注
  • MySQL

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

    675 引用 • 535 回帖
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 492 关注
  • Pipe

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

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

    131 引用 • 1114 回帖 • 150 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 453 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6522 引用 • 29305 回帖 • 248 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 635 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 597 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • C++

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

    106 引用 • 152 回帖 • 1 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 85 回帖
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖 • 1 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖
  • 创造

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

    172 引用 • 990 回帖
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    333 引用 • 323 回帖 • 70 关注
  • 服务

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

    41 引用 • 24 回帖 • 4 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 54 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 15 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 317 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • API

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

    76 引用 • 421 回帖
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 5 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 168 关注