第二阶段面试题

1.1. 描述 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 配置进容器中即可,无需操心具体的底层实现。
1.2. 简述 Servlet 生命周期?
答案:
1)Servlet 第一次被访问到时创建对象,创建出来后立即执行 init 方法执行初始化的操 作。
2)从此以后该对象一直驻留在内存中为后续的对这个 Servlet 的请求进行服务。
3)直到服务器关闭或 web 应用移除出容器时,随着 web 应用的销毁 Servlet 对象销毁
掉,在销毁之前调用 destory 方法执行善后工作。
4)在存活期间,每次对 Servlet 的调用都会导致 Service 方法的执行。
1.3. 什么是 http 协议?
答案:
HTTP 协议就是一套基于 tcp/ip 协议的应用层协议 。简单来说,就是一个基于应用层的通
信规范,双方要进行通信,大家都要遵守一个规范,这个规范就是 HTTP 协议。它规定了客
户端(通常是浏览器)和服务器之间的通信方式。
1.4. HTTP 协议工作原理?
答案:
HTTP 协议基于请求响应模型。
一次请求对应一次响应。
首先客户端发送一个请求(request)给服务器,服务器在接收到这个请求后将生成一个响应
(response)返回给客户端。
1.5. HTTP 协议的特点是什么 ?
答案:
1) 它是一个无状态的协议,服务器端在处理相应请求后不会保留任何客户端的信息,
每次请求都是独立的
2) 客户端与服务器端的每一次数据交互,都要经过一次请求/响应的过程。
3) 服务器端无法识别能够出发客户端请求的方法。
4) 一个典型的 HTTP 请求分为 一个请求行 若干请求头 一个空行 实体内容。
1.6. get 和 post 请求的区别?
答案:
1) get 请求用来从服务器上获得资源,而 post 是用来向服务器提交数据;
2) get 将表单中数据按照 name=value 的形式,添加到 action 所指向的 URL 后面,
并且两者使用"?"连接,而各个变量之间使用"&"连接;post 是将表单中的数据放在
HTTP 协议的请求头或消息体中,传递到 action 所指向 URL;
3) get 传输的数据要受到 URL 长度限制(1024 字节);而 post 可以传输大量的数
据, POST 数据是没有限制的,上传文件通常要使用 post 方式;
4) 使用 get 时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用
get;对于敏感数据还是应用使用 post;
5) get 使用 MIME 类型 application/x-www-form-urlencoded 的 URL 编码(也叫
百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一
个空格的编码是"%20"。
6) Jsp 页面中的 FORM 标签里的 method 属性为 get 时调用 doGet(),为 post 时
调用 doPost()。
1.7. 请求乱码产生的原因?
答案:
浏览器用什么码表来打开表单页面就用什么编码来发送数据。当前我们的注册页面指定了用
utf-8 来打开。
这就决定了浏览器是用 utf-8 打开的页面,浏览器在提交表单时是用 utf-8 编码的。 而 tomcat 默认情况下会使用 iso8859-1 来进行解码。
我们知道全世界的码表都兼容 iso8859-1,所以英文处理是没有问题的。
但是 iso8859-1 中并没有中文,iso8859-1 对于无法处理的字节都使用?替代,所以我们看
到的都是?。
1.8. 如何来处理 get 请求产生的乱码?
答案:
由于客户端发送时使用的是 utf-8 编码而服务器用 iso8859-1 解码造成了乱码,虽然字符已
经乱掉了,但底层的字节仍然是正确的,我们只要将乱码字符 getBytes(“iso8859-1”)
转换为字节,就是正确的字节,再将这些字节 new String(bytes,“utf-8”)按照正确的码
表编码,就可以转换回正确的字符了。从而解决了乱码。
1.9. Request 生命周期
答案:
request 对象的生命周期是针对一个客户端(一个浏览器应用程序)的一次请求,当请求完毕
之后,request 里边的内容也将被释放,一个请求开始时创建,请求结束后销毁。
1.10. 如何处理响应乱码?
答案:
通过 response.setHeader("Content-Type", "text/html;charset=utf-8")方法,通知服务 器发送数据时的码表;通过 response.setCharacterEncoding("utf-8")方法,通知浏览器
解析时使用的码表。两码相同就不会有乱码了。
response 提供了 setContentType("text/html;charset=UTF-8")快捷方法,在它的底层,
会同时做上面两件事,所以可以一行代码解决 response 产生的乱码问题。
1.11. 简述 ServletContext 生命周期?
答案:
ServletContext 对象代表当前 web 应用。当服务器启动时,服务器在启动时会依次加载
web 应用,每一个web 应用加载完成后都会创建一个 ServletContext对象唯一代表该web
应用,这个对象一直存活,直到 web 应用移除出容器或服务器关闭时,随着应用销毁,
ServletContext 对象跟着销毁。
1.12. 转发与重定向的比较?
答案:
转发是服务器内部资源跳转,重定向是通过 302+Location 实现浏览器跳转访问。
转发一次请求一次响应,重定向两次请求两次响应。
转发地址栏不发生变化,重定向地址栏会发生变化。
转发之前和转发之后 request 是一个,重定向之前和之后不是一个 request。
1.13. Session 生命周期?
答案: 当程序第一次调用到 request.getSession()代码时,服务器明确的知道了需要用到 session
了,此时创建 session。
如果 session 超过 30 分钟(可以在 web.xml 中配置的)没人使用,服务器认为这个 session 超
时了,销毁 session。
明确的调用 session.invalidate(),session 立即销毁。
服务器被非正常关闭或 web 应用被移除出容器,此时随着 web 应用的销毁 session 销毁.如
果是正常关闭,session 会被钝化.当下次服务器正常启动时,没有超时的 session 还会被活化
回来。
1.14. session 的原理?
答案:
session 的原理:在服务器第一次调用 request.getSession()方法的时候,会在内存中创建
一个 session 对象,此对象具有一个独一无二的 id 值,此 id 值将会以 cookie(JSESSIONID)
的形式发送给浏览器,浏览器以后每次访问都会带着此 cookie,服务器就利用此 cookie
区分浏览器找到对应的 session 空间。
1.15. cookie 与 session 的区别
答案:
cookie 数据存放在客户的浏览器上,session 数据放在服务器上 cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗,考虑到安
全应当使用 session
session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑
到减轻服务器性能方面,应当使用 COOKIE
1.16. JSP 和 Servlet 是什么关系?
答案:
其实这个问题在上面已经阐述过了,Servlet 是一个特殊的 Java 程序,它运行于服务器的
JVM 中,能够依靠服务器的支持向浏览器提供显示内容。JSP 本质上是 Servlet 的一种简易
形式,JSP 会被服务器处理成一个类似于 Servlet 的 Java 程序,可以简化页面内容的生成。
Servlet 和 JSP 最主要的不同点在于,Servlet 的应用逻辑是在 Java 文件中,并且完全从表
示层中的 HTML 分离开来。而 JSP 的情况是 Java 和 HTML 可以组合成一个扩展名为.jsp
的文件。有人说,Servlet 就是在 Java 中写 HTML,而 JSP 就是在 HTML 中写 Java 代码,
当然这个说法是很片面且不够准确的。JSP 侧重于视图,Servlet 更侧重于控制逻辑。
1.17. JSP 的九大隐式对象是哪九个
答案:
1:request: 请求对象 在 javax.servlet.ServletRequest 作用域为 Request 来自客服端
的请求,如:FORM 表单中填写的信息,常用的方法有 getParameter,getParamterName
和 getParamterValue 通过表用获取请求对象中包含的参数值。
2:response 表示客服端的响应。 3:pageContext 对象为页面的上下文对象,代表当请运行页面的一些属性。
4:session:对象代码服务器与客服端所建立的会话,比如在写购物,客服轨迹跟踪,
session”是建立在 cookie 的基础之上的。常用方法有 getId,getValues 等。
5:application 对象负责提供应用程序在服务端运行时的一些全局信息,方法有
getMimeType 等。
6:out:与 response 不同,通过 out 对象发送的内容是浏览器需要的显示内容,还可以
直接想客服端编写一个有程序动态生成的 HTML 的文件。
7:page:page 里的变量没法从 index.jsp 传递到 test.jsp。只要页面跳转了,就不见了。
8: exception:他是一个列外的对象,当页面发生了列外,就会会创建该对象。
9:config:是在 servlet 初始化 Servlet 的时候,JSP 引擎向他传递信息用的,此消息包括
Servlet 初始化时所需要的参数。
1.18. 如何防止 SQL 注入攻击呢?
答案:
SQL 注入:就是通过把 SQL 命令插入到 Web 表单递交或输入域名或页面请求的查询字符
串,最终达到欺骗服务器执行恶意的 SQL 命令。具体来说,它是利用现有应用程序,将(恶
意)的 SQL 命令注入到后台数据库引擎执行的能力,它可以通过在 Web 表单中输入(恶
意)SQL 语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行 SQL
语句。
防止的方法:
1) 永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,
或限制长度,对单引号和双"-"进行转换等。
2) 永远不要使用动态拼装 SQL,可以使用参数化的 SQL 或者直接使用存储过程
进行数据查询存取。
3) 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数
据库连接。
4) 不要把机密信息明文存放,请加密或者 hash 掉密码和敏感的信息。
5) 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始
错误信息进行包装,把异常信息存放在独立的表中。
1.19. Mysql 数据库优化
答案:
(1)查询时,能不用* 就不用,尽量写全字段名。
(2)索引不是越多越好,每个表控制在 6 个索引以内。范围 where 条件的情况下,索引不起
作用,比如 where value<100
(3)大部分情况连接效率远大于子查询,但是有例外。当你对连接查询的效率都感到不能接
受的时候可以试试用子查询,虽然大部分情况下你会更失望,但总有碰到惊喜的时候不是
么...
(4)多用 explain 和 profile 分析查询语句
(5)有时候可以 1 条大的 SQL 可以分成几个小 SQL 顺序执行,分了吧,速度会快很多。
(6)每隔一段时间用 alter table table_name engine=innodb;优化表
(7)连接时注意:小表 jion 大表的原则
(8)学会用 explain 和 profile 判断是什么原因使你的 SQL 慢
(9)查看慢查询日志,找出执行时间长的 SQL 进行优化
(10)尽量避免使用 order by
(11)因为 where 子句后面的条件是执行顺序是从右到左,所以尽量把能过滤掉大部分数据 的条件放在最后
1.20. Filter 的作用是什么?
答案:
init 为初始化方法,在 Filter 对象被创建出来时,Servlet 容器会调用该方法对 filter 进行初
始化。
destory 为销毁的方法,在过滤器对象被销毁之前,服务器会调用这个方法执行善后工作。
doFilter 为过滤器中最核心的方法,对访问的请求和响应进行拦截,当过滤器拦截到对资源
的访问时,服务器会自动调用该方法执行过滤代码。 我们只需要在这个方法中设计过滤器
的逻辑代码即可。
1.21. Filter 的生命周期?
答案:
当服务器启动,web 应用加载后,立即创建出这个 web 应用中的所有过滤器对象,创建出来后
立即调用过滤器的 init 方法执行初始化操作.从此这些过滤器对象驻留在内存中为后续的拦
截进行服务.每当拦截到资源时,都会导致 dofilter 方法执行.最终直到服务器关闭或 web 应
用移除出容器时,随着 web 应用的销毁,过滤器对象销毁,销毁之前调用 destory 方法执行善
后工作。
1.22. 什么是数据库连接池及其工作原理
答案: 对于共享资源,有一个很著名的设计模式:资源池(resource pool)。该模式正是为
了解决资源的频繁分配﹑释放所造成的问题。为解决上述问题,可以采用数据库连接池技术。
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定
数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放
回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是
我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及
性能调整提供依据。
1.23. 如何自己实现一个数据库连接池
答案:
思路如下:
1:利用 class 实现 DataSource 接口
2:在 class 的构造器一次性创建指定的链接将链接保存 LinkedList 中
3:实现 getConnection 从 LinkedList 返回一个链接
4:提供将链接放回方法
Public class MyDataSource inplements DataSource{
Private LinkedList<Connection> dataSource=new LinkedList<>();
Public MyDataSource(){
For( int a=0;a<1000;a++){
Try{
DriverManager.registerDriver(new SQLServerDriver());
Connection
con=DriverManager.getConnection( “ jdbc:sqlserver://localhost:1443;DatabaseNa
me=liming”,”root”,”liming”
}catch(Exception e){
}
}
Public Connection getConnetion(){
Final Connection conn=dataSource.removeFirst();
}
Public void releasConnection(Connection conn){
dataSource.add(conn);
}
}
}
1.24. http 和 https 的区别?
答案:
HTTP 协议传输的数据都是未加密的,也就是明文的,因此使用 HTTP 协议传输隐私信息非常不安全,为
了保证这些隐私数据能加密传输,于是网景公司设计了 SSL(Secure Sockets Layer)协议用于对 HTTP
协议传输的数据进行加密,从而就诞生了 HTTPS。简单来说,HTTPS 协议是由 SSL+HTTP 协议构建的可
进行加密传输、身份认证的网络协议,要比 http 协议安全。
1.25. Servlet 的单例问题
答案:
Servlet 是一个供其他 java 程序调用的类,它不能独立运行,针对客户端的多次请求,通常状况下,
Servlet 只会创建一个 Servlet 实例对象,一旦创建它就会驻留在内存中,为后续的请求提供服务,直至退
出 web 应用为止,也就是当我们关闭了浏览器之后我们的 Servlet 就终止了。
当 Servlet 第一次访问的时候,就被加载到内存中,以后该实例对各个请求服务,没次情况会调用一次
service 方法。
这样会出现什么问题:因为 Servlet 是单例的,所以会出现线程安全问题
1.26. "" 和 null 的区别
答案:
如果说 str 是 null,那么内存根本没创建字符串对像,并由 str 引用。不能调用 object 的方
法。 如果说 str 是空串,那么确实存在一个由 str 引用的字符串对像,只不过这个字符
串的值是""。长度为 0;
在获取请求参数的时候为什么要这样判断呢?
if(null==str || "".equals(str)){
return "不合法参数";
}
如果我们在表单中什么都不填 接收到的字符串就是 null;
如果我们在表单中填“”,接受到的字符串是“”,但是存入数据库后,查询出来
的就是 null;
1.27. Servlet 的多线程同步问题
答案:
Servlet 本身是单实例的,这样当有多个用户同时访问某个 Servlet 时,会访问该唯一的 Servlet 实例
中的成员变量,如果对成员变量进行写入操作,那就会导致 Servlet 的多线程问题,即数据不一致。
1.解决 Servlet 多线程同步问题的最好方式:去除实例变量,使用局部变量。
不使用成员变量,而使用局部变量,因为局部变量在每个线程中都有各自的实例。
所以对 Servlet 来说,如果要对某个变量做写入操作,一定不要使用成员变量,而要使用局部变量。
2.使用同步代码块
synchronized{}
3.Servlet 实现 javax.serlvet.SingleThreadModel,Servlet2.4 中已经废弃了该接口,此时 Servlet 容器
将保证 Servlet 实例以单线程方式运行,也就是说,同一时刻,只会有一个线程执行 Servlet 的 service()
方法。
1.28. request.getParameter() 和 request.getAttribute()
的区别?
答案:
a、request.getParameter()获取的类型是 String; request.getAttribute()获取的类型是 Object
b、request.getPrameter()获取的是 POST/GET 传递的参数值和 URL 中的参数;
request.getAttribute()获取的是对象容器中的数据值/对象
c、request.setAttribute()和 request.getAttribute()可以发送、接收对象;
request.getParamter()只能接收字符串,官方不开放 request.setParamter()(也
就是没有这个方法)
setAttribute()和 getAttribute()的传参原理:
setAttribute()是应用服务器把这个对象放在该页面所对应的一块内存中去,当你的
页面服务器重定向到另外一个页面时,
应用服务器会把这块内存拷贝到另一个页面所对应的那块内存中。这个就可以通过
getAttribute()获取到相应的参数值或者对象。
1.29. JSP 中动态 include 和静态 include 的区别?
答案:
a、静态 include:语法:<%@ include file="文件名" %>,相当于复制,编辑时将对应
的文件包含进来,当内容变化时,不会再一次对其编译,不易维护。
b、动态 include:语法:<jsp:include page="文件名">,能够自动检查被包含文件,当客
户端对 JSP 文件进行请求时,会重新将对应的文件包含进来,进行实时的更新。
1.30. 详细描述 MVC。
答案:
基于 java 的 web 应用系统采用 MVC 设计模型,即用 Model(模型)、View(视图)和
Controller(控制)分离设计,这是目前 web 应用服务系统的主流设置方向。
Model:处理业务逻辑的模块。
View:负责页面显示,显示 Model 的处理结果给用户,主要实现数据到页面的转换 过程。
Controller:负责每个请求的分发,把 Form 数据传递给 Model 进行处理,处理完成
后,把处理结果返回给相应的 View 显示给用户。
1.31. EL 表 达 式 的 功 能 , 为 什 么 要 用 EL 表 达 式 ?
(Expression Language)
答案:
功能:
a、从四个域对象中取出数据数据显示。
b、取出请求参数数据显示。
原因:
在页面中用 jsp 脚本和 jsp 表达式来获取数据显示比较麻烦
a、需要判断
b、可能需要强转
1.32. 如何防止表单重复提交?
答案:
使用 session 技术:
a、在 regist.jsp 页面中生成一个为一个随机值,将其保存到 session 中,同时将其保存为
表单的隐藏域的值。
b、在处理注册的请求时,获取 session 中的值,获取请求参数的值,比较两者是否相同, 如果相同说明不是重复提交,请求通过同时删除 session 中保存的的值,如果不相同则是重
复提交,不能通过。
1.33. 什么是 web 容器?
答案:
给处于其中的应用程序组件(JSP、Servlet)提供一个环境,是 JSP、Servlet 直接跟容器
中的变量交互,不必关注其他系统问题。
主要有 web 服务器来实现。例如:tomcat、weblogic、sphere、JBoss 等。该容器提供
的接口严格遵守 J2EE 规范中的 web application 标准。
我们把遵守以上标准的 web 服务器叫做 J2EE 的 web 容器。
1.34. J2EE 常用的设计模式?说明工厂模式。
答案:
Java 中一共有 23 中设计模式:
Factory(工厂模式)、Builder(建造模式)、Factory Method(工厂方法模式)、ProtoType
(原始模型模式)、Singleton(单例模式)、
Facade(门面模式)、Adapter(适配器模式)、Bridge(桥梁模式)、Composite(合
成模式)、Decorator(装饰模式)、
FlyWeight(享元模式)、Proxy(代理模式)、Command(命令模式)、Interpreter(解
释器模式)、Visitor(访问者模式)、
Iterator(迭代子模式)、Mediator(调停者模式)、Memento(备忘录模式)、Observer (观察者模式)、State(状态模式)、
Strategy(策略模式)、Template Method(模板方法模式)、Chain Of Responsibility
(责任链模式)、
工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数
据生成一组类中某个类的实例,通常一组类中有一个公共的抽象父类并且实现了相同的方
法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类
通过不同的方法实现了基类中的方法。然后定义一个工厂类,工厂类可以根据条件生成不同
的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的
是哪一个子类的实例。
1.35. 什么是事务?
答案:
事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为ACID
(原子性、一致性、隔离性和持久性)属性,
只有这样才能成为一个事务:
原子性:事务必须是原子工作单元,对于其数据修改,要么全都执行,要么全都不执行。
一致性:事务在完成时,必须使所有的数据保持一致的状态。在相关数据库中,所有规则都
必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如
B 树索引或双向链表)都必须是正确的。
隔离性:由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据时
数据所处的状态,要么是另一并发事务修改它之前
的状态,要么是另一并发事务修改它之后的状态,事务不会查看中间状态的数据。这称为可 串行性,因为它能够重新装载起始数据,并且重播
一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
持久性:事务完成后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保
持。
1.36. 数据库有几种隔离级别?
答案:
1、Serializable (串行化):可避免脏读、不可重复读、幻读的发生
2、Repeatable read (可重复读):可避免脏读、不可重复读的发生。
3、Read committed (读已提交):可避免脏读的发生。
4、Read uncommitted (读未提交):最低级别,任何情况都无法保证
1.37. 简述 web.xml 的作用
答案:
属于部署描述符,在整个 JAVA 中只要是容器都会存在部署描述符,此部署描述符可以控制
整个 WEB 中各个组件的运行状态,也可以配置整个窗口的状态
1.38. sql 优化:(索引、范式)
答案:
三范式:
第一范式( 确保每列保持原子性 )最基本范式。数据库表中所有字段值都是不可分解的 原子值,就满足了第一范式。
第二范式( 确保表中的每列都和主键相关 )在第一范式上更近一层。确保数据库表中的每一
列都和主键相关,而不能只与主键的某一部分相关,也就是说一个表中只能保存一种数据,
不可以吧多种数据保存在一张表中。
第三范式: 确保每列都和主键列直接相关,不是间接相关
索引:
避免对索引字段进行计算、避免索引在字段上使用 not、<>、!=、 避免在索引上使用
IS NULL 和 NOT NULL 避免在索引列上出现数据类型转换、避免索引字段使用函数、避
免建立索引的列出现空值
1.39. Ajax 原理
答案:
Ajax 的工作原理相当于在用户和服务器之间加了—个中间层,使用户操作与服务器响应异步
化。并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给 Ajax 引擎
自己来做, 只有确定需要从服务器读取新数据时再由 Ajax 引擎代为向服务器提交请求。
Ajax 其核心只有 JavaScript、XMLHTTPRequest 和 DOM,在旧的交互方式中,由用户
触发一个HTTP请求到服务器,服务器对其进行处理后再返回一个新的HTHL页到客户端, 每
当服务器处理客户端提交的请求时,客户都只能空闲等待,并且哪怕只是一次很小的交互、只
需从服务器端得到很简单的一个数据,都要返回一个完整的 HTML 页,而用户每次都要浪费
时间和带宽去重新读取整个页面。而使用 Ajax 后用户从感觉上几乎所有的操作都会很快响
应没有页面重载(白屏)的等待。 1.40. JDBC 的原理
答案:
1.41. SQL 注入攻击
答案:
SQL 注入是一种将 SQL 代码添加到输入参数中,传递到服务器解析并执行的一种攻击手法。
SQL 注入攻击是输入参数未经过滤,然后直接拼接到 SQL 语句当中解析,执行达到预想之
外的一种行为,称之为 SQL 注入攻击。
1.42. 如何防止 SQL 注入攻击
答案:
利用新对象 PreparedStatement 对象完成,先将 SQL 骨架发送给数据库服务器,然后再 将参数单独发给服务器,并将参数中的关键字当做一个普通字符串来处理,进而起到防止
SQL 注入的问题
1.43. 对连接池的理解
答案:
用来提高程序的效率,创建一个容器,容器中存放已经获取到了的数据库连接对象,对外提
供获取连接和还回连接的方法,外界需要时就从容器中获取,用完就还回容器中。
1.44. HTML 和 xml 的区别?
答案:
XML 是可扩展标记语言,而 HTML 超文本标记语言。不同之处:
1、语法有所不同。XML 语法比较严谨而 HTML 语法比较松散。
2、用途不同。XML 主要用于数据格式化存储而 HTML 主要用于网页的编辑。
1.45. 在 JS 中==和===的区别?
答案:
简单来说: == 代表相同, ===代表严格相同, 为啥这么说呢,
这么理解:
当进行双等号比较时候:
先检查两个操作数数据类型,如果相同,
则进行===
比较, 如果不同, 则愿意为你进行一次类型转换, 转换成相同类型后再进行比较, 而
===比较时, 如果类型不同,直接就是 false. 1.46. SQL 优化
答案:
1. SELECT 子句中避免使用‘
*’
2. SQL 语句用大写的
3. 用 IN 来替换 OR
4. 查询语句中不要使用 *
5. 尽量减少子查询,使用关联查询(left join,right join,inner join)替代
6. 减少使用 IN 或者 NOT IN ,使用 exists,not exists 或者关联查询语句替代
7. or 的查询尽量用 union 或者 union all 代替
8. 合理的增加冗余的字段(减少表的联接查询)
9. 增加中间表进行优化(这个主要是在统计报表的场景,
1.47. Tomcat 配置,部署优化
答案:
1. 内存优化:Tomcat 依赖于 JVM,可以配置 JVM 的内存配置
2. 最大连接数配置(并发能力)
通常搭配 Nginx 提升 Tomcat 的并发性能
1.48. 自动刷新,定时刷新
答案:
自动刷新不仅可以实现一段时间之后自动跳转到另一个页面,还可以实现一段时间之后自动 刷新本页面。Servlet 中通过 HttpServletResponse 对象设置 Header 属性实现自动刷新
例如:
Response.setHeader("Refresh","1000;URL=http://localhost:8080/servlet/example.h
tm");
其中 1000 为时间,单位为毫秒。URL 指定就是要跳转的页面(如果设置自己的路径,就会
实现没过一秒自动刷新本页面一次)
1.49. BS 和 CS 的区别?
答案:
1. C/S 用户固定,并且处于相同区域,要求拥有相同的 操作系统 B/S 要有 操作系统 和浏
览器就行。与 操作系统 平台无关。
2. C/S 客户端的计算机电脑配置要求较高。 B/S 客户端的计算机电脑配置要求较低。
3. C/S 每一个客户端都必须安装和配置软件 , 客户端不必安装,使用浏览器访问,易推广。
B/S 最大的优点就是可以在任何地方进行操作而不用安装任何专门的软件。
4. C/S 每一个客户端都要升级程序。可以采用自动升级。 BS 客户端不必安装及维护。
5. C/S 一般面向相对固定的用户群,程序更加注重流程,它可以对权限进行多层次校验,
提供了更安全的存取模式,对信息安全的控制能力很强。一般高度机密的信息系统采用
C/S 结构适宜。
1.50. 事务有哪些特性
事务的特性:ACID
A - 原子性 Atomic
数据操作的最小单元是事务,而不是 SQL 语句
C - 一致性 Consistency
转账前 a+b = 100 转帐后 a+b = 100
I - 隔离性 Isolation
一个事物进行中时,另一事物不能操作数据
D - 持久性 Durancy
事务没有提交之前,数据操作只保存在日志文件中
提交事务之后,数据持久生效
1.51. html 和 jsp 的区别及优缺点
答案:
HTML(Hypertext Markup Language)文本标记语言,它是静态页面,和 JavaScript
一样解释性语言,为什么说是解释性语言呢?因为,只要你有一个浏览器那么它就可以正常
显示出来,而不需要指定的编译工具,只需在 TXT 文档中写上 HTML 标记就 OK。
JSP(Java Server Page)看这个意思就知道是 Java 服务端的页面,所以它是动态的,它是
需要经过 JDK 编译后把内容发给客户端去显示,我们都知道,Java 文件编译后会产生一个
class 文件,最终执行的就是这个 class 文件,JSP 也一样,它也要编译成 class 文件!JSP
不止要编译,它还得要转译,首先把 JSP 转译成一个 Servlet 文件,然后在编译成 class 文
件。当用户访问 JSP 时就执行了 class 文件,最 终......
1.最简单的区别就是,HTML 能直接打开,jsp 只能发布到 Tomact 等服务器上才能打开
2.定义上 HTML 页面是静态页面可以直接运行,JSP 页面是动态页它运行时需要转换成
servlet
3.他们的表头不同,这个是 JSP 的头“
<%@ page language="java" import="java.util.*"
pageEncoding="gbk"%>”在表头中有编码格式和导入包等 4.也是很好区分的在 jsp 中用<%%>就可以写 Java 代码了,而 html 没有<%%>
1.52. HTML 和 Servlet 的异同
答案:
不同: Html 是静态,servlet 是动态 html 页面由服务器直接返回, servlet 是用来处理
客户请求,并返回 html 页面 ,Servlet 需要服务器调用 servlet 方法生成动态 html 页面,
且需要在 web.xml 中配置 url 路径
1.53. request ,response,session 和 application 是
怎么用的
答案:
1、Request 是客户端向服务端发送请求
2、Response 是服务端对客户端请求做出响应
3、Session 在 servlet 中不能直接使用,需要通过 getSession()创建,如果没有设定它的
生命周期,或者通过 invildate()方法销毁,关闭浏览器 session 就会消失
4、Application 不能直接创建,存在于服务器的内存中,由服务器创建和销毁
1.54. Request 和 Session 的取值区别,以及出现乱码的解
决方式(不能在 java 代码中设置)
答案: 1、Request 可以通过 getAttribute()方法直接取值,也可通过 getParameter()取值
2、Session 需要通过 request.getSession().getAttribute()才能取值
3、Request 是针对一次请求,Session 是针对整个会话
4、在页面通过 contentType,pageEncoding,content 设置编码格式,必须要一致
1.55. 说明一下 jsp 中<jsp: include page..>和<%@
include file%>的区别
答案:
动态导入
是行为元素、是在请求处理阶段引入的,引入执行页面或 servlet 所生成的应答文本
先编译,后包含,就是将每个 jsp 页面都单独转化成 html 页面,最后再将所有的 html 页面
相加,如果有相同变量不会冲突
<%@ include file="" %> 静态导入
是指令元素,是编译时包含,引入静态文本(html,jsp),在 JSP 页面被转化成 servlet 之前和
它融和到一起。先包含,后编译
1.56. Spring 在 ssm 中起什么作用?
答案:
Spring:轻量级框架
作用:Bean 工厂,用来管理 Bean 的生命周期和框架集成。
两大核心: 1、IOC/DI(控制反转/依赖注入) :把 dao 依赖注入到 service 层,service 层反转给 action
层,Spring 顶层容器为 BeanFactory。
2、AOP:面向切面编程
1.57. Spring 的配置文件中的内容?
答案:
开启事务注解驱动
事务管理器
开启注解功能,并配置扫描包
配置数据库
配置 SQL 会话工厂,别名,映射文件
不用编写 Dao 层的实现类
1.58. Spring 主要使用了什么模式?
答案:
工厂模式:每个 Bean 的创建通过方法
单例模式:默认的每个 Bean 的作用域都是单例
代理模式:关于 Aop 的实现通过代理模式
1.59. Struts2 和 SpringMvc 的区别?
答案: 入口不同:
Struts2:filter 过滤器
SpringMvc:一个 Servlet 即前端控制器
开发方式不同:
Struts2:基于类开发,传递参数通过类的属性,只能设置为多例
SpringMvc:基于方法开发(一个 url 对应一个方法),请求参数传递到方法形参,可以为单
例也可以为多例(建议单例)
请求方式不同:
Struts2:值栈村塾请求和响应的数据,通过 OGNL 存取数据
SpringMvc:通过参数解析器将 request 请求内容解析,给方法形参赋值,将数据和视图
封装成 ModelAndView 对象,最后又将 ModelAndView 中的模型数据通过 request 域传
输到页面,jsp 视图解析器默认使用的是 jstl。
1.60. Mybatis 的好处?
答案:
把 Sql 语句从 Java 中独立出来。
封装了底层的 JDBC,API 的调用,并且能够将结果集自动转换成 JavaBean 对象,简化了
Java 数据库编程的重复工作。
自己编写 Sql 语句,更加的灵活。
入参无需用对象封装(或者 map 封装),使用@Param 注解
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值