JavaWeb篇常见小细节内容 这边做了笔记 方便更深层次理解
JAVA基础篇知识点笔记
目录
5. jsp 和 servlet 的区别、共同点、各自应用的范围?
6.转发(forward)和重定向(redirect)的区别?
7. request.getAttribute()和 request.getParameter()有何区别?
11. Http 请求的 get 和 post 方法的区别。
12. tomcat 容器是如何创建 servlet 类实例?用到了什么原理?
16.execute,executeQuery,executeUpdate 的区别是什么?
23.JSP 中动态 INCLUDE 与静态 INCLUDE 的区别?
26.说出 Servlet 的生命周期,并说出 Servlet 和 CGI 的区别?
38. Servlet Filter Listener 启动顺序?
1. session 和 cookie 的区别?
-
session 是存储在服务器端,cookie 是存储在客户端的,所以安全来讲 session 的安全性要比 cookie 高,然后我们获取 session 里的信息是通过存放在会话 cookie 里的 sessionid 获取的。又由于 session 是存放在服务器的内存中,所以 session 里的东西不断增加会造成服务器的负担,所以会把很重要的信息存储在 session 中,而把一些次要东西存储在客户端的 cookie 里,然后 cookie 确切的说分为两大类分为会话 cookie 和持久化 cookie,会话 cookie 确切的说是,存放在客户端浏览器的内存中,所以说他的生命周期和浏览器是一致的,浏览器关了会话 cookie 也就消失了,然而持久化 cookie 是存放在客户端硬盘中,而持久化 cookie 的生命周期就是我们在设置 cookie 时候设置的那个保存时间,然后我们考虑一问题当浏览器关闭时 session 会不会丢失,从上面叙述分析 session 的信息是通过会话 cookie 的 sessionid 获取的,当浏览器关闭的时候会话 cookie 消失所以我们的 sessionid 也就消失了,但是 session 的信息还存在服务器端,这时我们只是查不到所谓的 session 但它并不是不存在。那么,session 在什么情况下丢失,就是在服务器关闭的时候,或者是 session 过期(默认时间是 30 分钟),再或 者 调 用 了 invalidate() 的 或 者 是 我 们 想 要 session 中 的 某 一 条 数 据 消 失 调 用session.removeAttribute()方法,然后 session 在什么时候被创建呢,确切的说是通过调用getsession()来创建,这就是 session 与 cookie 的区别.
2. session 和 cookie 联系?
-
session 是通过 cookie 来工作的 session 和 cookie 之间是通过$COOKIE['PHPSESSID']来联系的,通过$COOKIE['PHPSESSID']可以知道 session 的 id,从而获取到其他的信息。 在购物网站中通常将用户加入购物车的商品联通 session_id 记录到数据库中,当用户再次访问是,通过 sessionid 就可以查找到用户上次加入购物车的商品。因为 sessionid 是唯一的,记录到数据库中就可以根据这个查找了。
3. servlet 的生命周期?
-
Servlet 生命周期可以分成四个阶段:加载和实例化、初始化、服务、销毁。 当客户第一次请求时,首先判断是否存在 Servlet 对象,若不存在,则由 Web 容器创建对象,而后调用 init()方法对其初始化,此初始化方法在整个 Servlet 生命周期中只调用一次。 完成 Servlet 对象的创建和实例化之后,Web 容器会调用 Servlet 对象的 service()方法来 处理请求。
-
Web 容器关闭或者 Servlet 对象要从容器中被删除时,会自动调用 destory()方法。
4. 什么是 webservice?
-
从表面上看,WebService 就是一个应用程序向外界暴露出一个能通过 Web 进行调用的 API,也就是说能用编程的方法通过 Web 来调用这个应用程序。我们把调用这个 WebService 的应用程序叫做客户端,而把提供这个 WebService 的应用程序叫做服务端。从深层次看, WebService 是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。它定义了应用程序如何在 Web 上实现互操作性,你可以用任何你喜欢的语言,在任何你喜欢的平台上写 Web service ,只要我们可以通过 Web service 标准对这些服务进行查询和访问。
5. jsp 和 servlet 的区别、共同点、各自应用的范围?
-
JSP 是 Servlet 技术的扩展,本质上就是 Servlet 的简易方式。JSP 编译后是“类 servlet”。Servlet 和 JSP 最主要的不同点在于,Servlet 的应用逻辑是在 Java 文件中,并且完全从表示层中的 HTML 里分离开来。而 JSP 的情况是 Java 和 HTML 可以组合成一个扩展名为.jsp 的文件。JSP侧重于视图,Servlet 主要用于控制逻辑。在 struts 框架中,JSP 位于 MVC 设计模式的视图层, 而 Servlet 位于控制层.
6.转发(forward)和重定向(redirect)的区别?
-
从地址栏显示来说 forward 是服务器请求资源,服务器直接访问目标地址的 URL,把那个 URL 的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址. redirect 是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的 URL.
-
从数据共享来说 forward:转发页面和转发到的页面可以共享 request 里面的数据. redirect:不能共享数据. 3. 从运用地方来说 forward:一般用于用户登陆的时候,根据角色转发到相应的模块. redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等 4. 从效率来说forward:高. redirect:低.
7. request.getAttribute()和 request.getParameter()有何区别?
-
request.getParameter()取得是通过容器的实现来取得通过类似 post,get 等方式传入的数
-
request.setAttribute()和 getAttribute()只是在 web 容器内部流转,仅仅是请求处理阶段。
-
getAttribute 是返回对象,getParameter 返回字符串
-
getAttribute()一向是和 setAttribute()一起使用的,只有先用 setAttribute()设置之后,才能够通过 getAttribute()来获得值,它们传递的是 Object 类型的数据。而且必须在同一个 request 对象中使用才有效。,而 getParameter()是接收表单的 get 或者 post 提交过来的参数
9. MVC 的各个部分都有哪些技术来实现?如何实现?
-
MVC 是 Model-View-Controller 的简写。"Model" 代表的是应用的业务逻辑(通过 JavaBean, EJB 组件实现), "View" 是应用的表示面(由 JSP 页面产生),"Controller" 是提供应用的处理过程控制(一般是一个 Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用
11. Http 请求的 get 和 post 方法的区别。
-
Get 是向服务器发索取数据的一种请求,而 Post 是向服务器提交数据的一种请求
-
Get 是获取信息,而不是修改信息,类似数据库查询功能一样,数据不会被修改
-
Get 请求的参数会跟在 url 后进行传递,请求的数据会附在 URL 之后,以?分割 URL 和传输数据,参数之间以&相连,%XX 中的 XX 为该符号以 16 进制表示的 ASCII,如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用 BASE64 加密。
-
Get 传输的数据有大小限制,因为 GET 是通过 URL 提交数据,那么 GET 可提交的数据量就跟 URL 的长度有直接关系了,不同的浏览器对 URL 的长度的限制是不同的。
-
GET 请求的数据会被浏览器缓存起来,用户名和密码将明文出现在 URL 上,其他人可以查到历史浏览记录,数据不太安全。在服务器端,用 Request.QueryString 来获取 Get 方式提交来的数据 Post 请求则作为 http 消息的实际内容发送给 web 服务器,数据放置在 HTML Header 内提交, Post 没有限制提交的数据。Post 比 Get 安全,当数据是中文或者不敏感的数据,则用 get,因为使用 get,参数会显示在地址,对于敏感数据和不是中文字符的数据,则用 post。
-
POST 表示可能修改变服务器上的资源的请求,在服务器端,用 Post 方式提交的数据只能用 Request.Form 来获取。
12. tomcat 容器是如何创建 servlet 类实例?用到了什么原理?
-
当容器启动时,会读取在 webapps 目录下所有的 web 应用中的 web.xml 文件,然后对 xml 文件进行解析,并读取 servlet 注册信息。然后,将每个应用中注册的 servlet 类都进行加载,并通过反射的方式实例化。(有时候也是在第一次请求时实例化)
-
在 servlet 注册时加上<load-on-startup>1</load-on-startup>如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。
13.JDBC 访问数据库的基本步骤是什么?
第一步:Class.forName()加载数据库连接驱动;
第二步:DriverManager.getConnection()获取数据连接对象;
第三步:根据 SQL 获取 sql 会话对象,有 2 种方式 Statement、PreparedStatement ;
第四步:执行 SQL,执行 SQL 前如果有参数值就设置参数值 setXXX();
第五步:处理结果集;
第六步:关闭结果集、关闭会话、关闭连接。
14.为什么要使用 PreparedStatement?
PreparedStatement 接口继承 Statement,PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象。 作为 Statement 的子类, PreparedStatement 继承了 Statement 的所有功能。三种方法execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。 在 JDBC 应用中,多数情况下使用 PreparedStatement,原因如下: 代码的可读性和可维护性。Statement 需要不断地拼接,而 PreparedStatement 不会。 PreparedStatement 尽最大可能提高性能。DB 有缓存机制,相同的预编译语句再次被调用不会再次需要编译。 最重要的一点是极大地提高了安全性。Statement 容易被 SQL 注入,而 PreparedStatement 传入的内容不会和 sql 语句发生任何匹配关系。
15.数据库连接池的原理。为什么要使用连接池?
1、数据库连接是一件费时的操作,连接池可以使多个操作共享一个连接。 2、数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量、使用情况,为系统开发,测试及性能调整提供依据。 3、使用连接池是为了提高对数据库连接资源的管理
16.execute,executeQuery,executeUpdate 的区别是什么?
1、Statement 的 execute(String query)方法用来执行任意的 SQL 查询,如果查询的结果是一个ResultSet,这个方法就返回 true。如果结果不是 ResultSet,比如 insert 或者 update 查询,它就会返回 false 。我们可以通过它的 getResultSet 方法来获取 ResultSet ,或者通过getUpdateCount()方法来获取更新的记录条数。 2、Statement 的 executeQuery(String query)接口用来执行 select 查询,并且返回 ResultSet。 即使查询不到记录返回的 ResultSet 也不会为 null。我们通常使用 executeQuery 来执行查询语句,这样的话如果传进来的是 insert 或者 update 语句的话,它会抛出错误信息为 “executeQuery method can not be used for update”的 java.util.SQLException。 , 3、Statement 的 executeUpdate(String query)方法用来执行 insert 或者 update/delete(DML) 语句,或者 什么也不返回,对于 DDL 语句,返回值是 int 类型,如果是 DML 语句的话,它就是更新的条数,如果是 DDL 的话,就返回 0。 只有当你不确定是什么语句的时候才应该使用 execute() 方法,否则应该使用 executeQuery 或者 executeUpdate 方法。
17.JDBC 的 ResultSet 是什么?
在查询数据库后会返回一个 ResultSet,它就像是查询结果集的一张数据表。 ResultSet 对象维护了一个游标,指向当前的数据行。开始的时候这个游标指向的是第一行。如果调用了 ResultSet 的 next()方法游标会下移一行,如果没有更多的数据了,next()方法会返回 false。可以在 for 循环中用它来遍历数据集。 默认的 ResultSet 是不能更新的,游标也只能往下移。也就是说你只能从第一行到最后一行遍历一遍。不过也可以创建可以回滚或者可更新的 ResultSet 当生成 ResultSet 的 Statement 对象要关闭或者重新执行或是获取下一个 ResultSet 的时候,ResultSet 对象也会自动关闭。可以通过 ResultSet 的 getter 方法,传入列名或者从 1 开始的序号来获取列数据。
18.什么是 Servlet?
Servlet 是使用 Java Servlet 应用程序接口(API)及相关类和方法的 Java 程序,所有的 Servlet 都必须要实现的核心接口是 javax.servlet.servlet。每一个 servlet 都必须要直接或者间接实现这个接口,或者继承 javax.servlet.GenericServlet 或 javax.servlet.HTTPServlet。 Servlet 主要用于处理客户端传来的 HTTP 请求,并返回一个响应。
19.doGet 和 doPost 方法有什么区别?
doGet:GET 方法会把名值对追加在请求的 URL 后面。因为 URL 对字符数目有限制,进而限制了用在客户端请求的参数值的数目。并且请求中的参数值是可见的,因此,敏感信息不能用这种方式传递。 doPOST:POST 方法通过把请求参数值放在请求体中来克服 GET 方法的限制,因此,可以发送的参数的数目是没有限制的。最后,通过 POST 请求传递的敏感信息对外部客户端是不可见的。
22.页面间对象传递的方法?
request、session、application、cookie
23.JSP 中动态 INCLUDE 与静态 INCLUDE 的区别?
动态 include 用于 jsp:include 动作实现<jsp:include page = “include.jsp” flush = “true”/>它总是会检查所含文件的变化,适用于包含动态页面,并且可以带参数。 静态 include 用 include 伪码实现,不会检查所含文件的变化,适用于包含静态页面<%@include file=“include.html”%>.
24.JSP 的四大范围?
JSP 中的四种作用域包括 page、request、session 和 application,具体来说: page 代表与一个页面相关的对象和属性。 request 代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件;需要在页面显示的临时数据可以置于此作用域。 session 代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的 session 中。 application 代表与整个 Web 应用程序相关的对象和属性,它实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。
25.BS 与 CS 的联系与区别?
1.硬件环境不同: C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务. B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比 C/S 更强的适应范围, 一般只要有操作系统和浏览器就行
2.对安全要求不同 C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用 C/S 结构适宜. 可以通过 B/S 发布部分可公开信息. B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。
3.对程序架构不同 C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑. B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比 C/S 有更高的要求 B/S 结构的程序架构是发展的趋势, 从 MS 的.Net 系列的 BizTalk 2000 Exchange 2000 等, 全面支持网络的构件搭建的系统. SUN 和 IBM 推的 JavaBean 构件技术等,使 B/S 更加成熟.
4.软件重用不同C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在 B/S 要求下的构件的重用性 好.B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子
5.系统维护不同
C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统 B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.
6.处理问题不同 C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关.应该都是相同的系统 B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是 C/S 无法作到的. 与操作系统平台关系最小.
7.用户接口不同 C/S 多是建立的 Window 平台上,表现方法有限,对程序员普遍要求较高 B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低, 减低开发成本.
8.信息流不同 C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低 B/S 信息流向可变化, B-B B-C B-G 等信息、流向的变化, 更像交易中心。
26.说出 Servlet 的生命周期,并说出 Servlet 和 CGI 的区别?
Web 容器加载 Servlet 并将其实例化后,Servlet 生命周期开始,容器运行其 init 方法进行 Servlet 的初始化,请求到达时运行其 service 方法,service 方法自动派遣运行与请求对应的 doXXX 方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其 destroy 方法。与 cgi 的区别在于 servlet 处于服务器进程中,它通过多线程方式运行其 service 方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而 CGI 对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于 servlet。
27.如何防止表单重复提交?
针对于重复提交的整体解决方案: 1.用 redirect(重定向)来解决重复提交的问题 2.点击一次之后,按钮失效 3.通过 loading(Loading 原理是在点击提交时,生成 Loading 样式,在提交完成之后隐藏该样式) 4.自定义重复提交过滤器
28.request 作用?
1、获取请求参数 getParameter() 2、获取当前 Web 应用的虚拟路径 getContextPath 3、转发 getRequestDispatcher(路径).forward(request,response); 4、它还是一个域对象
29.get 请求中文乱码?
1、乱码的根本原因: 浏览器的编码方式 UTF-8 和 服务器的解码方式 ISO-859-1 不一样2、解决方法: 1)第一种方式 使用 URLEncoder 和 URLDecoder 两个类 编解码。先以 iso-8895-1 进行编码,然后再以 utf-8 进行解码 2)第二种方式 使用 String 类的方法进行编解码 3)第三种方式 更改 server.xml 配置文件。 GET 请求是在 URL 地址栏中传递请求参数的,它会被 Tomcat 服务器自动解码,而 Tomcat 服务器默认的字符集也是 ISO-8859-1,所以我们需要修改 Tomcat 服务器的字符集为 UTF-8。
30.post 请求中文乱码问题?
1、post 请求方式乱码的原因是:因为 post 是以二进制流的形式发送到的服务器。服务器收到数据后。默认以 iso-8859-1 进行编码。 2、post 请求乱码解决,只需要在获取请求参数之前调用 request.setCharacterEncoding("UTF-8"); 方法设置字符集 即可。
31.响应乱码?
1、原因: 由服务器编码,默认使用 ISO-8859-1 进行编码 由浏览器解码,默认使用 GBK 进行解码 2、解决方案方法 1:设置响应头 response.setHeader("Content-Type","text/html;charset=utf-8"); 方法 2:设置响应的内容类型
response.setContentType("text/html;charset=utf-8"); 通过这种方式可以在响应头中告诉浏览器响应体的编码方式是 UTF-8;同时服务器也会采用该字符集进行编码但需要注意的是,两种方法一定要在 response.getWriter()之前进行。
32.Cookie 对象的缺陷?
1、Cookie 是明文的,不安全 2、不同的浏览器对 Cookie 对象的数量和大小有限制 3、Cookie 对象携带过多费流量 4、Cookie 对象中的 value 值只能是字符串,不能放对象网络中传递数据只能是字符串
33.Session 的运行机制?
1、在服务器端创建 Session 对象,该对象有一个全球唯一的 ID
2、在创建 Session 对象的同时创建一个特殊的 Cookie 对象,该 Cookie 对象的名字是 JSESSIONID,该 Cookie 对象的 value 值是 Session 对象的那个全球唯一的 ID,并且会将这个特殊的 Cookie 对象携带发送给浏览器
3、以后浏览器再发送请求就会携带这个特殊的 Cookie 对象 4、服务器根据这个特殊的 Cookie 对象的 value 值在服务器中寻找对应的 Session 对象,以此来区分不同的用户
34.钝化和活化?
1、Session 与 session 域中的对象一起从内存中被序列化到硬盘上的过程我们称为钝化。服务器关闭时会发生钝化。 2、Session 与 session 域中的对象一起从硬盘上反序列化到内存中的过程我们称为活化。服务器再次开启时会发生活化。 3、要保证 session 域中的对象能和 Session 一起被钝化和活化,必须保证对象对应的类实现 Serializable 接口
35.Filter 的工作原理?
Filter 接口中有一个 doFilter 方法,当我们编写好 Filter,并配置对哪个 web 资源进行拦截后, WEB 服务器每次在调用 web 资源的 service 方法之前,都会先调用一下 filter 的 doFilter 方法,因此,在该方法内编写代码可达到如下目的: 调用目标资源之前,让一段代码执行。 是否调用目标资源(即是否让用户访问 web 资源)。调用目标资源之后,让一段代码执行。 web 服务器在调用 doFilter 方法时,会传递一个 filterChain 对象进来,filterChain 对象是 filter 接口中最重要的一个对象,它也提供了一个 doFilter 方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则 web 服务器就 会调用 web 资源的 service 方法,即 web 资源就会被访问,否则 web 资源不会被访问
36. Filter 链是什么?
在一个 web 应用中,可以开发编写多个 Filter,这些 Filter 组合起来称之为一个 Filter 链。web服务器根据 Filter 在 web.xml 文件中的注册顺序,决定先调用哪个 Filter,当第一个 Filter 的 doFilter 方法被调用时,web 服务器会创建一个代 表 Filter 链的 FilterChain 对象传递给该方法。在 doFilter 方法中,开发人员如果调用了 FilterChain 对象的 doFilter 方法,则 web 服务器会检查 FilterChain 对象中是否还有 filter,如果有,则调用第 2 个 filter,如果没有,则调用目标资源。
38. Servlet Filter Listener 启动顺序?
启动的顺序为 listener->Filter->servlet. 简单记为:理(Listener)发(Filter)师(servlet). 执行的顺序不会因为三个标签在配置文件中的先后顺序而改变。