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
等学习网站或项目中的知识点,均为自己手打键盘系列且内容会根据继续学习情况而不断地调整和完善!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于