目录
5.servlet,filter,listener,interceptor之间的区别和联系?
7.forward(请求转发)和redireet(重定向)的区别?
8.JSP中动态INCLUDE与静态INCLUDE 的区别?
9.什么是 xml,使用 xml 的优缺点,xml 的解析器有哪几种,分别有什么区别?
13.简单说明下request、response、session、application之间的作用域及各自的运行机制?
21.JDBC 的脏读是什么?哪种数据库隔离级别能防止脏读?
23.tomcat 容器是如何创建 servlet 类实例?
28.tomcat容器是如何创建servlet类实例?用到了什么原理?
53.Request和Session的取值区别,以及出现乱码的解决方式(不能在java代码中设置)?
1.说下原生 jdbc 操作数据库流程?
-
第一步:Class.forName()加载数据库连接驱动;
-
加载数据库连接驱动
-
-
第二步:DriverManager.getConnection()获取数据连接对象;
-
获取数据连接对象
-
-
第三步:根据 SQL 获取 sql 会话对象,有 2 种方式 Statement、PreparedStatement ;
-
根据 SQL 获取 sql 会话对象
-
-
第四步:执行 SQL 处理结果集,执行 SQL 前如果有参数值就设置参数值 setXXX();
-
执行 SQL 处理结果集
-
-
第五步:关闭结果集、关闭会话、关闭连接。
-
关闭结果集、关闭会话、关闭连接
-
2.HTTP有哪些请求方法?
-
HTTP请求的常用方法有:GET方法、POST方法、HEAD方法、PUT方法、DELETE方法、CONNECT方法、OPTIONS方法、TRACE方法。
3.如何解决跨域问题?
-
Jsonp 和 CORS
-
CORS 是一个 W3C 标准,全称是"跨域资源共享"(Cross-origin resource sharing)。CORS 需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE 浏览器不能低于 IE10。 它允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 只能同源 使用的限制。整个 CORS 通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来 说,CORS 通信与同源的 AJAX 通信没有差别,代码完全一样。浏览器一旦发现 AJAX 请求跨 源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。 因此,实现 CORS 通信的关键是服务器。只要服务器实现了 CORS 接口,就可以跨源通信。 CORS 请求默认不发送 Cookie 和 HTTP 认证信息。如果要把 Cookie 发到服务器,一方面要服 务器同意,指定 Access-Control-Allow-Credentials 字段。另一方面,开发者必须在 AJAX 请求 中打开 withCredentials 属性。否则,即使服务器同意发送 Cookie,浏览器也不会发送。或者, 服务器要求设置 Cookie,浏览器也不会处理。
4.简述Get,Post请求的区别以及他们的传参方式?
-
get和post的区别首先:从本质上区别
-
1.GET用于信息获取(查)
-
2.POST表示可能修改变服务器上的资源的请求(增删改)
-
-
再者:从表现形式上区别
-
1.如果使用GET请求,需要传递参数时,只能通过URL传值
-
2.如果使用POST请求,需要传递参数时,能够通过表单传值
-
5.servlet,filter,listener,interceptor之间的区别和联系?
-
1.servlet:servlet 是一种运行服务器端的 java 应用程序
-
2.filter:filter 是一个可以复用的代码片段,可以用来转换 HTTP 请求、响应和头信息
-
3.listener:监听器,通过 listener 可以监听 web 服务器中某一个执行动作,并根据其要求作出相 应的响应。
-
4.interceptor:是在面向切面编程的,就是在你的 service 或者一个方法,前调用一个方法,或 者在方法后调用一个方法。比如动态代理就是拦截器的简单实现 servlet、filter、listener 是配置到 web.xml 中,interceptor 不配置到 web.xml 中,struts 的拦截 器配置到 struts.xml 中。spring 的拦截器配置到 spring.xml 中。
-
5.加载顺序 web.xml 的加载顺序是:context- param -> listener -> filter -> servlet
6.JSP有哪些内置对象和动作?它们的作用分别是什么?
-
1、request对象:客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。
-
2、response对象:response对象包含了响应客户请求的有关信息。
-
3、session对象:session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。
-
4、out对象:是向客户端输出内容常用的对象
-
5、page对象:page对象就是指向当前JSP页面本身,有点象类中的this指针。
-
6、application对象:application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。
-
7、exception对象:exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。
-
8、pageContext对象:pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本类名也叫pageContext。
-
9、config对象:config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)。
7.forward(请求转发)和redireet(重定向)的区别?
-
本质区别:转发是服务器行为,重定向是客户端行为。
-
重定向特点:两次请求,浏览器地址发生变化,可以访问自己 web 之外的资源,传输的数据会 丢失。
-
请求转发特点:一次强求,浏览器地址不变,访问的是自己本身的 web 资源,传输的数据不会 丢失
8.JSP中动态INCLUDE与静态INCLUDE 的区别?
-
动态INCLUDE
-
用法:<jsp:include page="included.jsp" flush="true" />
-
说明:它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数,先编译之后再进行处理。
-
原因:
-
1、静态include的结果是把其他jsp引入当前jsp,两者合为一体。
-
2、静态include纯粹是把代码写在外面的一种共享方法,所有的变量都是可以和include它的主文件共享,两者高度紧密结合,不能有变量同名的冲突.而页面设置也可以借用主文件的.
-
-
-
静态INCLUDE
-
用法:<%@ include file="included.htm" %>
-
说明:用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面,直接将内容先包含后处理。
-
原因:
-
1、动态include的结构是两者独立,直到输出时才合并( 看看jsp生成的java文件就可以知道了)。
-
2、动态include的jsp文件独立性很强,是一个单独的jsp文件,需要使用的对象,页面设置,都必须有自己创建,当然,还好它和include它的页面的request范围是一致的。
-
-
9.什么是 xml,使用 xml 的优缺点,xml 的解析器有哪几种,分别有什么区别?
-
1.xml 是一种可扩展性标记语言,支持自定义标签(使用前必须预定义)使用 DTD 和 XML Schema 标准化 XML 结构。
-
2.优点:用于配置文件,格式统一,符合标准;用于在互不兼容的系统间交互数据,共享数据方便;
-
3.缺点:xml 文件格式复杂,数据传输占流量,服务端和客户端解析 xml 文件占用大量资源且不易 维护Xml
-
4.常用解析器有 2 种,分别是:DOM 和 SAX;
-
5.主要区别在于它们解析 xml 文档的方式不同。使用 DOM 解析,xml 文档以 DOM 树形结构加载入内存,而 SAX 采用的是事件模型
10.Session和Cookie的区别?
-
1.Cookie 是 web 服务器发送给浏览器的一块信息,浏览器会在本地一个文件中给每个 web 服务 器存储 cookie。 以后浏览器再给特定的 web 服务器发送请求时,同时会发送所有为该服务器存储的 cookie。
-
2.Session 是存储在 web 服务器端的一块信息。session 对象存储特定用户会话所需的属性及配置 信息。 当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
-
Cookie 和 session 的不同点:
-
1、无论客户端做怎样的设置,session 都能够正常工作。当客户端禁用 cookie 时将无法使用 cookie。
-
2、在存储的数据量方面:session 能够存储任意的 java 对象,cookie 只能存储 String 类型的对象。
-
11.在单点登录中,如果 cookie 被禁用了怎么办?
-
单点登录的原理是后端生成一个 session ID,然后设置到 cookie,后面的所有请求浏览器都 会带上 cookie,然后服务端从 cookie 里获取 session ID,再查询到用户信息。所以,保持登录 的关键不是 cookie,而是通过 cookie 保存和传输的 session ID,其本质是能获取用户信息的数 据。除了 cookie,还通常使用 HTTP 请求头来传输。但是这个请求头浏览器不会像 cookie 一样 自动携带,需要手工处理。
12.什么是Ajax异步请求和同步请求?
-
1.同步:指发送一个请求,需要等待返回,然后才能够发送下一个请求zhi,有个等待过程;
-
2.异步:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。
-
3.区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。
13.简单说明下request、response、session、application之间的作用域及各自的运行机制?
-
作用域
-
1.request:服务器获取用户请求; 其作用域为在当前页面有效
-
2.response:服务器答复用户请求的资源;其作用域为在当前http请求中有效
-
3.session:用户使用服务器开始到结束的过程; 其作用域为在当前会话中有效
-
4.application:网站服务器启动到停止的过程;其作用域为在所有应用程序中有效,应用程序就是访问的网站服务器
-
-
运行机制
-
5.request就是一个HTTP客户端请求,处理request可能需要多个Servlet合作, 几个Servlet之间可以通过某种方式传递信息,但这个信息在请求结束后就无效了
-
6.response就是一个HTTP服务器答复,将servlet处理结果答复给客户端
-
7.session与用户是一对一关系,一个web应用程序可以同时有多个用户在线,每个用户都有对应唯一的session,一个session就是一个用户从开始使用客户端到结束使用客户端的过程,这个过程可以有多个request和response。
-
8.application与用户是一对多关系,类似于一个web应用程序对应于多个用户在线使用,每个web应用程序对应只有一个aaplication,在一起协同工作以完成某项任务的一组 ASP 文件称作应用程序(application)。ASP 中的 Application 对象用于将这些文件捆绑在一起。application就是网站服务器从启动到停止的过程。
-
14.请描述下cookie、sessionStorage、localStorage的区别?
-
1.localStorage长期存储数据,浏览器关闭数据后不丢失;
-
2.sessionStorage数据在浏览器关闭后自动删除;
-
3.cookie是网站为了标识用户身份而存储在用户本地终端(Client Side)上的数据(通常经过加密)。cookie始终在同源的http请求中携带(即使不需要)都会在浏览器和服务器端间来回传递。session storage和local storage不会自动把数据发给服务器,仅在本地保存;
-
4.存储大小:cookie数据大小不会超过4K,session storage和local storage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或者更多;
-
5.有期时间:local storage存储持久数据,浏览器关闭后数据不丢失,除非自动删除数据。session storage数据在当前浏览器窗口关闭后自动删除。cookie 设置的cookie过期时间之前一直有效,即使窗口或者浏览器关闭;
15.关系数据库中连接池的机制是什么?
-
前提:为数据库连接建立一个缓冲池。
-
1:从连接池获取或创建可用连接
-
2:使用完毕之后,把连接返回给连接池
-
3:在系统关闭前,断开所有连接并释放连接占用的系统资源
-
4:能够处理无效连接,限制连接池中的连接总数不低于或者不超过某个限定值。
-
-
其中有几个概念需要大家理解:
-
1.最小连接数是连接池一直保持的数据连接。如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费掉。
-
2.最大连接数是连接池能申请的最大连接数。如果数据连接请求超过此数,后面的数据连接请求将被加入到等待队列中,这会影响之后的数据库操作。
-
3.如果最小连接数与最大连接数相差太大,那么,最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。
-
4.上面的解释,可以这样理解:数据库池连接数量一直保持一个不少于最小连接数的数量,当数量不够时,数据库会创建一些连接,直到一个最大连接数,之后连接数据库就会等待。
-
16.数据库连接池的原理。为什么要使用连接池?
-
1.数据库连接是一件费时的操作,连接池可以使多个操作共享一个连接。
-
2.数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数 量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我 们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过 连接池的管理机制监视数据库的连接的数量、使用情况,为系统开发,测试及性能调整提供依据。
-
3.使用连接池是为了提高对数据库连接资源的管理
-
常用的数据库连接池:DBCP、C3P0、Druid
17.什么是反射,反射能干嘛?
-
反射是:指程序可以访问、检测和修改它本身状态或行为的一种能力在java中就是:反射将加载后的类中的各个组成部分封装为其他对象;
-
我们平时用反射主要做:
-
1.获取类型的相关信息
-
2.动态调用方法
-
3.动态构造对象
-
4.从程序集中获得类型
-
18.说几个开发中常见的异常?
-
1.StackOverFlower(栈溢出错误)
-
2.OutOfMemoryError(JVM内存空间不足)
-
3.NullPointerException(空指针异常)
-
4.ArrayIndexOutOfBoundsException (下标越界异常)使用数组,尤其是做for循环判断条件的时候,很容易引发的一个问题。
-
5.UnkownTypeException (不知道类型异常) 有时候不强制转换,会报这个异常。
-
6.ClassNotFoundException (类)报错是确实是常见的
19.HTTP 和 HTTPS 的区别?
-
1.HTTP 协议传输的数据都是未加密的,也就是明文的,因此使用 HTTP 协议传输隐私信息非常不 安全,为了保证这些隐私数据能加密传输,于是网景公司设计了 SSL(Secure Sockets Layer) 协议用于对 HTTP 协议传输的数据进行加密,从而就诞生了
-
2.HTTPS。 简单来说,HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,要 比 http 协议安全
-
主要区别:
-
1、https 协议需要到 ca 申请证书,一般免费证书较少,因而需要一定费用。 2、http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。
-
3、http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
-
4、http 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、 身份认证的网络协议,比 http 协议安全
-
20.说说事务的概念,在 JDBC 编程中处理事务的步骤?
-
1.事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务。
-
事务处理步骤:
-
1.conn.setAutoComit(false);设置提交方式为手工提交
-
2.conn.commit()提交事务
-
3.出现异常,回滚 conn.rollback()
-
21.JDBC 的脏读是什么?哪种数据库隔离级别能防止脏读?
-
脏读:有一行数据刚更新,与此同时另一个查询读到了这个刚更新的值。
-
防止脏读的隔离级别:
-
Read committed (读已提交)
-
Serializable (串行化)
-
Repeatable read (可重复读)
-
22.Http 常见的状态码有哪些?
-
200 OK //客户端请求成功
-
301 Moved Permanently(永久移除),请求的 URL 已移走。Response 中应该包含一个 Location URL, 说明资源现在所处的位置
-
302 found 重定向
-
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
-
401 Unauthorized //请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
-
403 Forbidden //服务器收到请求,但是拒绝提供服务
-
404 Not Found //请求资源不存在,eg:输入了错误的 URL
-
500 Internal Server Error //服务器发生不可预期的错误
-
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
23.tomcat 容器是如何创建 servlet 类实例?
-
1.当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对 xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过 反射的方式实例化。(有时候也是在第一次请求时实例化)
-
2.在servlet注册时加上1如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。
24.EL表达式的功能,为什么要用EL表达式?
-
1.EL(Expression Language) 是为了使JSP写起来更加简单。减少java代码,便于开发和维护。
-
功能作用:
-
1.获取数据:EL表达式主要用于du替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取dao数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
-
2.执行运算:利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
-
3.获取web开发常用对象:EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
-
4.调用Java方法:EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
-
5.使用EL表达式获取数据语法:“${标识符}”EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、requestsession、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。
-
25.什么要使用 PreparedStatement?
-
1、 PreparedStatement 接口继承 Statement, PreparedStatement 实例包含已编译的 SQL 语句, 所以其执行速度要快于 Statement 对象。
-
2 、 作 为 Statement 的 子 类 , PreparedStatement 继 承 了 Statement 的 所 有 功 能 。 三 种 方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数
-
3、在 JDBC 应用中,在任何时候都不要使用 Statement
-
原因如下:
-
一、代码的可读性和可维护性.Statement 需要不断地拼接,而 PreparedStatement 不会。
-
二、PreparedStatement 尽最大可能提高性能.DB 有缓存机制,相同的预编译语句再次被调用不 会再次需要编译。
-
三、最重要的一点是极大地提高了安全性.Statement 容易被 SQL 注入,而 PreparedStatementc 传入的内容不会和 sql 语句发生任何匹配关系
-
26.什么是幻读,哪种隔离级别可以防止幻读?
-
幻读是指一个事务多次执行一条查询返回的却是不同的值。假设一个事务正根据某个条件进行数 据查询,然后另一个事务插入了一行满足这个查询条件的数据。之后这个事务再次执行了这条查 询,返回的结果集中会包含刚插入的那条新数据。这行新数据被称为幻行,而这种现象就叫做幻 读。
-
只有 TRANSACTION_SERIALIZABLE 隔离级别才能防止产生幻读。
27.Servlet生命周期?
-
1、Servlet 通过调用 init () 方法进行初始化。
-
2、Servlet 调用 service() 方法来处理客户端的请求。
-
3、Servlet 通过调用 destroy() 方法终止(结束)。
28.tomcat容器是如何创建servlet类实例?用到了什么原理?
-
当容器启动时,会读取在 webapps 目录下所有的 web 应用中的 web.xml 文件,然后对 xml 文 件进行解析,并读取 servlet 注册信息。然后,将每个应用中注册的 servlet 类都进行加载,并通 过反射的方式实例化。(有时候也是在第一次请求时实例化)
-
在 servlet 注册时加上<load-on-startup>1</load-on-startup>如果为正数,则在一开始就 实例化,如果不写或为负数,则第一次请求实例化。
29.谈谈你对 ajax 的认识?
-
Ajax 是一种创建交互式网页应用的的网页开发技术
-
Ajax 的最大特点:可以实现局部刷新,在不更新整个页面的前提下维护数据,提升用户体验度。
30.说下jsonp 原理?
-
jsonp 的最基本的原理是:动态添加一个<script>标签,使用 script 标签的 src 属性没有跨域的 限制的特点实现跨域。首先在客户端注册一个 callback, 然后把 callback 的名字传给服务器。此 时,服务器先生成 json 数据。 然后以 javascript 语法的方式,生成一个 function , function 名 字就是传递上来的参数 jsonp。最后将 json 数据直接以入参的方式,放置到 function 中,这样 就生成了一段 js 语法的文档,返回给客户端。
-
客户端浏览器,解析 script 标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了 客户端预先定义好的 callback 函数里。
31.在JS中==和===的区别?
-
==:叫相等运算符
-
===:叫严格运算符
-
区别:
-
== :表示值相等则都为true
-
===:表示 不仅要值相等,双方类型也要相等才为true
-
32.http的长连接和短连接区别?
-
1.HTTP协议有HTTP/1.0版本和HTTP/1.1版本。HTTP1.1默认保持长连接(HTTP persistent connection,也翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。
-
2.在 HTTP/1.0 中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。从HTTP/1.1起,默认使用的是长连接,用以保持连接特性。
33.描述Servlet调用过程?
-
(1)在浏览器输入地址,浏览器先去查找hosts文件,将主机名翻译为ip地址,如果找不到就再去查询dns服务器将主机名翻译成ip地址。
-
(2)浏览器根据ip地址和端口号访问服务器,组织http请求信息发送给服务器。
-
(3)服务器收到请求后首先根据Host请求头判断当前访问的是哪台虚拟主机。
-
(4)服务器根据http请求头中的请求URI判断当前访问的是哪个web应用。
-
(5)服务器根据http请求头中的请求URI判断当前访问的是web应用中的哪个web资源。
-
(6)检查web应用的web.xml文件,如果根据路径找到具体的servlet处理类的全路径名交给该servlet处理,如果找不到就交给缺省servlet处理。
-
(7)这个过程中浏览器只知道自己发出来http请求,不久就收到了http响应,浏览器不知道也不关心服务器内部是如何处理的。浏览器和服务器之间的关系是非常单纯的,只有HTTP协议。
-
(8)解析请求、封装RequestResponse对象、创建Servlet、调用Service方法都是服务器自动进行的,开发人员只需要写好Servlet配置进容器中即可,无需操心具体的底层实现。
34.简述Servlet生命周期?
-
(1)Servlet第一次被访问到时创建对象,创建出来后立即执行init方法执行初始化的操作。
-
(2)从此以后该对象一直驻留在内存中为后续的对这个Servlet的请求进行服务。
-
(3)直到服务器关闭或web应用移除出容器时,随着web应用的销毁Servlet对象销毁掉,在销毁之前调用destory方法执行善后工作。
-
(4)在存活期间,每次对Servlet 的调用都会导致Service方法的执行。
35.HTTP协议的特点是什么 ?
-
(1) 它是一个无状态的协议,服务器端在处理相应请求后不会保留任何客户端的信息,每次请求都是独立的
-
(2) 客户端与服务器端的每一次数据交互,都要经过一次请求/响应的过程。
-
(3) 服务器端无法识别能够出发客户端请求的方法。
-
(4) 一个典型的HTTP请求分为 一个请求行 若干请求头 一个空行 实体内容。
36.请求乱码产生的原因?
-
浏览器用什么码表来打开表单页面就用什么编码来发送数据。当前我们的注册页面指定了用utf-8来打开。这就决定了浏览器是用utf-8打开的页面,浏览器在提交表单时是用utf-8编码的。而tomcat默认情况下会使用iso8859-1来进行解码。我们知道全世界的码表都兼容iso8859-1,所以英文处理是没有问题的。但是iso8859-1中并没有中文,iso8859-1对于无法处理的字节都使用?(问号)替代,所以我们看到的都是?(问号)
37.如何来处理get请求产生的乱码?
-
由于客户端发送时使用的是utf-8编码而服务器用iso8859-1解码造成了乱码,虽然字符已经乱掉了,但底层的字节仍然是正确的,我们只要将乱码字符getBytes(“iso8859-1”)转换为字节,就是正确的字节,再将这些字节new String(bytes,“utf-8”)按照正确的码表编码,就可以转换回正确的字符了。从而解决了乱码。
38.如何处理响应乱码?
-
通过response.setHeader("Content-Type", "text/html;charset=utf-8")方法,通知服务器发送数据时的码表;通过response.setCharacterEncoding("utf-8")方法,通知浏览器解析时使用的码表。两码相同就不会有乱码了。
-
response提供了setContentType("text/html;charset=UTF-8")快捷方法,在它的底层,会同时做上面两件事,所以可以一行代码解决response产生的乱码问题。
39.简述ServletContext生命周期?
-
ServletContext对象代表当前web应用。当服务器启动时,服务器在启动时会依次加载web应用,每一个web应用加载完成后都会创建一个ServletContext对象唯一代表该web应用,这个对象一直存活,直到web应用移除出容器或服务器关闭时,随着应用销毁,ServletContext对象跟着销毁。
40.Session生命周期?
-
当程序第一次调用到request.getSession()代码时,服务器明确的知道了需要用到session了,此时创建session。
-
如果session超过30分钟(可以在web.xml中配置的)没人使用,服务器认为这个session超时了,销毁session。
-
明确的调用session.invalidate(),session立即销毁。
-
服务器被非正常关闭或web应用被移除出容器,此时随着web应用的销毁session销毁.如果是正常关闭,session会被钝化.当下次服务器正常启动时,没有超时的session还会被活化回来。
41.session的原理?
-
session的原理:在服务器第一次调用request.getSession()方法的时候,会在内存中创建一个session对象,此对象具有一个独一无二的id值,此id值将会以cookie(JSESSIONID)的形式发送给浏览器,浏览器以后每次访问都会带着此cookie,服务器就利用此cookie区分浏览器找到对应的session空间。
42.如何防止SQL注入攻击呢?
-
SQL注入:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
-
防止的办法:
-
(1) 永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等。
-
(2) 永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。
-
(3) 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
-
(4) 不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。
-
(5) 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。
-
43.如何自己实现一个数据库连接池?
-
1:利用class实现DataSource接口
-
2:在class的构造器一次性创建指定的链接将链接保存LinkedList中
-
3:实现getConnection从LinkedList返回一个链接
-
4:提供将链接放回方法
44.Filter的作用是什么?
-
init为初始化方法,在Filter对象被创建出来时,Servlet容器会调用该方法对filter进行初始化。
-
destory为销毁的方法,在过滤器对象被销毁之前,服务器会调用这个方法执行善后工作。
-
doFilter为过滤器中最核心的方法,对访问的请求和响应进行拦截,当过滤器拦截到对资源的访问时,服务器会自动调用该方法执行过滤代码。 我们只需要在这个方法中设计过滤器的逻辑代码即可。
45.Filter的生命周期?
-
当服务器启动,web应用加载后,立即创建出这个web应用中的所有过滤器对象,创建出来后立即调用过滤器的init方法执行初始化操作.从此这些过滤器对象驻留在内存中为后续的拦截进行服务.每当拦截到资源时,都会导致dofilter方法执行.最终直到服务器关闭或web应用移除出容器时,随着web应用的销毁,过滤器对象销毁,销毁之前调用destory方法执行善后工作。
46.Servlet的单例问题?
-
Servlet是一个供其他java程序调用的类,它不能独立运行,针对客户端的多次请求,通常状况下,Servlet只会创建一个Servlet实例对象,一旦创建它就会驻留在内存中,为后续的请求提供服务,直至退出web应用为止,也就是当我们关闭了浏览器之后我们的Servlet就终止了。
-
当Servlet第一次访问的时候,就被加载到内存中,以后该实例对各个请求服务,没次情况会调用一次service方法。
-
这样会出现什么问题:因为Servlet是单例的,所以会出现线程安全问题
47.Servlet的多线程同步问题?
-
Servlet本身是单实例的,这样当有多个用户同时访问某个Servlet时,会访问该唯一的Servlet实例中的成员变量,如果对成员变量进行写入操作,那就会导致Servlet的多线程问题,即数据不一致。
-
1.解决Servlet多线程同步问题的最好方式:去除实例变量,使用局部变量。不使用成员变量,而使用局部变量,因为局部变量在每个线程中都有各自的实例。所以对Servlet来说,如果要对某个变量做写入操作,一定不要使用成员变量,而要使用局部变量。
-
2.使用同步代码块 synchronized{}
-
3.Servlet实现javax.serlvet.SingleThreadModel,Servlet2.4中已经废弃了该接口,此时Servlet容器将保证Servlet实例以单线程方式运行,也就是说,同一时刻,只会有一个线程执行Servlet的service()方法。
48.如何防止表单重复提交?
-
使用session技术:
-
a、在regist.jsp页面中生成一个为一个随机值,将其保存到session中,同时将其保存为表单的隐藏域的值。
-
b、在处理注册的请求时,获取session中的值,获取请求参数的值,比较两者是否相同,如果相同说明不是重复提交,请求通过同时删除session中保存的的值,如果不相同则是重复提交,不能通过。
-
49.什么是web容器?
-
给处于其中的应用程序组件(JSP、Servlet)提供一个环境,是JSP、Servlet直接跟容器中的变量交互,不必关注其他系统问题。
-
主要有web服务器来实现。例如:tomcat、weblogic、sphere、JBoss等。该容器提供的接口严格遵守J2EE规范中的web application标准。
-
我们把遵守以上标准的web服务器叫做J2EE的web容器。
50.HTML和xml的区别?
-
XML是可扩展标记语言,而HTML超文本标记语言。不同之处:
-
1、语法有所不同。XML语法比较严谨而HTML语法比较松散。
-
2、用途不同。XML主要用于数据格式化存储而HTML主要用于网页的编辑。
51.Tomcat配置,部署优化?
-
1.内存优化:Tomcat依赖于JVM,可以配置JVM的内存配置
-
2.最大连接数配置(并发能力)
-
通常搭配Nginx提升Tomcat的并发性能
52.事务有哪些特性?
-
事务的特性:ACID
-
A - 原子性 Atomic
-
数据操作的最小单元是事务,而不是SQL语句
-
-
C - 一致性 Consistency
-
转账前 a+b = 100
-
转帐后 a+b = 100
-
-
I - 隔离性 Isolation
-
一个事物进行中时,另一事物不能操作数据
-
-
D - 持久性 Durancy
-
提交事务之后,数据持久生效
-
-
53.Request和Session的取值区别,以及出现乱码的解决方式(不能在java代码中设置)?
-
1、Request可以通过getAttribute()方法直接取值,也可通过getParameter()取值
-
2、Session需要通过request.getSession().getAttribute()才能取值
-
3、Request是针对一次请求,Session是针对整个会话
-
4、在页面通过contentType,pageEncoding,content设置编码格式,必须要一致
54.对数据库连接池的理解?
-
用来提高程序的效率,创建一个容器,容器中存放已经获取到了的数据库连接对象,对外提供获取连接和还回连接的方法,外界需要时就从容器中获取,用完就还回容器中。