1.描述Servlet调用过程?

答:
1. 在浏览器输入地址,浏览器先去查找hosts文件,将主机名翻译为ip地址,如果找不到就再去查询dns服务器将主机名翻译为ip地址。
2. 浏览器根据ip地址和端口号访问服务器,组织http请求信息发送给服务器。
3. 服务器收到请求后首先根据Host请求头判断当前访问的是那台虚拟主机。
4. 服务器根据http请求头中的请求URL判断当前访问的是个web应用中的哪个web资源。
5. 检查web应用的web.xml文件,如果根据路径找到具体的servlet处理类的全路径名交给该servlet处理,如果找不到就交给缺省servlet处理。
6. 这个过程中浏览器只知道自己发出来的http请求,不久就收到了http相应,浏览器不知道也不关心服务器内部是如何处理的。浏览器和服务器之间的关系是非常单纯的,只有HTTP协议。
7. 解析请求,封装RequestResponse对象。创建Servlet。调用Servlet方法都是服务器自动进行的,开发人员只要写好Servlet配置进容器中即可,无序操心具体的底层实现。

2.简述Servlet生命周期

答:
1. Servlet第一次被访问到时创建对象,创建出来以后立即执行init方法执行初始化操作。
2. 然后该对象就驻留在内存中对这个Servlet请求服务。
3. 直到服务器关闭或web应用一处容器是,随着web应用的销毁Servlet对象销毁,在销毁之前调用destory 方法执行善后工作。
4. 在存活期间,每次对Servlet调用都会执行Serivce方法。

3.什么是HTTP协议?

答:
HTTP协议就是一套给予TCP/IP协议的应用层协议。简单来说,就是一个给予应用层的通信规范,双方要进行通信,大家都要遵循一个规范,这个规范就是HTTP协议。它规定了客户端(通常是浏览器)和服务器之间的通信方式。

4.HTTP协议工作原理?

答:
HTTP协议基于请求响应模型。
一次请求对一次响应。
首先客户端先发送一个请求(request)给服务器,服务器在接受这个请求后将生成一个响应(response)返回给客户端。

5.HTTP协议的特点是什么?

答:
1. 它是一个无状态的协议,服务器端在处理相应的请求后不会保存任何客户端的信息,每次请求都是独立的;
2. 客户端与服务端的每一次数据小胡,都要经过一次请求/响应 的过程;
3. 服务器端无法识别能够发出客户端请求的方法。
4. 一个典型的HTTP请求分别为 一个请求行,若干请求头,一个空行,实体内容。

6.get和post请求的区别?

答:
1. get请求用来从服务器上获得资源,而post是用来向服务器提交数据;
2. get将表单中数据按照name=value的形式,添加到action所指向的URL后面,并且使用 ?拼接,而各个变量之间使用 & 连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指的URL中;
3.get传输的数据要受到URL长度限制(1024字节);而post数据是没有限制的,上传文件通常要使用post方式。
4. 使用get时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;
对于敏感数据还是要使用post;
5. get使用MIME类型 application/x-www-form-urlencoded的URL编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如 一个空格的编码是“%20”;
6. jsp页面中的FORM标签里的method属性为get请求时调用doGet(),为post请求时调用doPost();

7.请求乱码产生的原因?

答:
浏览器用什么码表来打开表单页面就用什么编码来发送数据。
如:当前我们的注册页面指定用utf-8来打开
这就决定了浏览器用utf-8打开的页面,浏览器在提交表单时使用utf-8编码。
而tomcat默认情况下会使用iso8859-1来进行解码。
全世界的码表都兼容iso8859-1,所以英文处理是没有问题的。
但是iso8859-1中 没有中文,iso8859-1对于无法处理的字节都使用 ? 代替,所以我们看到的都是 ? 。

8.如何来处理get请求产生的乱码?

答:
由于客户端发送时使用的是utf-8编码而服务器用的是iso8859-1解码造成的乱码,虽然字符已经乱码了,但是底层的字节仍然是正确的,我们只需要将乱码字符getBytes(“iso8859-1”)转换为字节就是正确的字节,再将正确的字节new String(bytes,“utf-8”)按照正确的码表进行编码,就可以转回正确的字符了。

9.Request生命周期

答:
request对象的生命周期是针对一个客户端(一个浏览器应用程序)的一个请求,当请求完毕之后request里边的内容也将被释放,一个请求开始时创建,请求结束后销毁。

10.如何处理响应乱码?

答:
通过response.setHeader(“Content-Type”,“text/html;charset=utf-8”)方法,通知服务器发送数据是的码表;通过response。setCharacterEncoding(“utf-8”)方法,通知浏览器解析时使用的码表。两码相同时就不会有乱码了。
response提供了setContentType(“text/html;charset=utf-8”)快捷方法,在它的底层,会同时左上边两件事,所以可以一行代码解决response产生 的乱码问题。

11简述ServletContext生命周期?

答:ServletContext对象代表当前web应用,当服务器启动时,服务器在启动时会依次加载web应用,每一个web应用加载完成后都会创建一个ServletContext对象唯一代表该web应用,这个对象一直存活,直到web应用移除容器或者服务器关闭时,随着应用销毁,ServletContext对象唯一代表web应用,这个对象一直存活,直到web应用移除容器或者服务器关闭,随着应用销毁,ServletContext对象跟着销毁。

12.转发与重定向的比较

答:
转发是服务器内部资源跳转,重定向是通过302+Location 实现浏览器跳转访问。
转发一次请求一次响应,重定向两次请求两次响应。
转发地址栏不会发生变化,重定向地址栏会发生变化。
转发之前和之后request是一个,重定向之前和之后不是一个request。

13.Session生命周期

答:
当程序第一次调用到request.getSession()代码时,服务器明确知道了需要用到session了,此时创建session。
如果session超过30分钟没人使用,服务器认为这个session超时,销毁session。
调用session.invalidate(),session立即销毁。
服务器非正常关闭或者应用被移除出容器时,session随着web应用的销毁而销毁。如果是正常关闭,session会被钝化,当下次服务器正常启动时,没有超时的session还会被活化回来。

14.Session的原理

答:
在服务器第一次调用request.getSession()方法的时候,会在内存中创建一个session对象,此对象具有一个独一无二的id值,此id值将会以cookie的形式发送给浏览器,浏览器每次访问都会带着此cookie,服务器就利用此cookie区分浏览器找到对应的session空间。

15.cookie与session的区别

答:
cookie数据存放在客户的浏览器上,session数据放在服务器上
cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session
session会在一定的时间内保存在浏览器上。当访问增多,会比较占用服务器性能,考虑减轻服务器性能,应当使用cookie.

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更侧重于逻辑的控制。

17.JSP的九大隐式对象是哪九个?

答:

  1. request:请求对象。 客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。
  2. response:表示客户端的响应。
  3. pageContext对象为页面的上下文对象,代表当前运行页面的一些属性。
  4. session:代表服务器与客户端所建立的会话。
  5. application:负责提供应用程序在服务器端运行时的一些全局信息。
  6. out: 通过out对象发送的内容是浏览器需要显示的内容,还可以直接向客户端编写一个由程序动态生成的HTML的文件。
  7. page:page里的变量没办法从index.jsp传递到test.jsp。只要页面跳转了,就不见了。
  8. exception:这是一个异常对象,当页面异常,就会创建该对象。
  9. config:是在初始化Servlet的时候,JSP引擎向Servlet传递信息用的,此信息包括Servlet初始化所需要的参数。

18.如何防止sql注入攻击

答:
sql注入:
就是通过sql命令插入到 web表单提交输入域名页面请求的查询字符串,最终达到欺骗服务器执行恶意的sql命令。

防止的方法:
1) 可以用正则表达式 或 限制长度,对单引号和双“-”等特殊字符进行转换。永远不要信任用户的输入,必须对输入进行校验。
2) 不要使用动态拼装sql,可以使用参数化的sql或者直接使用储存过程进行数据查询存取。
3) 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限限制数据库的连接。
4) 不要把机密信息明文存放,请加密或hash掉密码或敏感信息。
5) 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。

19.Mysql数据库优化

答:

  1. 查询时,能不用 * 就不用,尽量写全字段名。
  2. 索引不是越多越好,每个表控制在6个索引以内。范围where条件的情况下,索引不起作用,比如:where value<100.
  3. 尽量避免使用order by
  4. 连接时注意 : 小表 jion大表的原则
  5. 有时候可以 一条大的sql可以分为几条小sql顺序执行,分了吧,速度会快很多。
  6. 因为where子句后面的条件的执行顺序是从右到左,所以尽量把能过滤掉大部分数据的条件放在最后。
  7. 多用explain 和 profile 分析查询语句
  8. 学会用explain 和 profile判断是什么原因使sql慢。
  9. 查看慢查询日志,找出执行时间长的sql进行优化。
  10. 大部分情况连接查询效率远大于子查询,但是有个例外。当你对连接查询的效率都感到不能接受时,可以试试使用子查询,万一有惊喜呢。。。
  11. 每隔一段时间使用alter table table_name engine = innodb;优化表。

20.什么是数据库连接池?及其工作原理。

答:
对于共享资源 一个很著名的设计模式;
资源池(resource pool)。

  1. 该模式采用数据库连接池技术正是为了解决资源的频繁分配、释放所造成的问题。
  2. 数据库连接池的基本思想就是为数据库建立一个“缓冲池”,先在池中放入一定量的连接,当需要建立数据库连接时,只需从池中取出一个,使用完毕再放回去。
  3. 我们可以通过设定连接池最大连接数来防止系统无 尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。

21.如何实现一个数据库连接池

答:

  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;DatabaseName=liming”,”root”,”liming”
}catch(Exception e){
     
}

}
Public Connection getConnetion(){
   Final Connection conn=dataSource.removeFirst();
}
Public void releasConnection(Connection conn){
    dataSource.add(conn);
}
}
}

22.http和https的区别?

答:
http协议传输的数据都是未加密的,也就是明文的。因此使用http协议传输隐私信息非常不安全,为了保证这些隐私数据加密传输。于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http安全。

23.Filter的作用是什么?

答:
init为初始化方法,在Filter对象被创建出来时,servlet容器会调用该方法对Filter进行初始化。
destory为销毁的方法,在过滤器对象被销毁之前,服务器回调用这个方法执行善后工作。
doFilter为过滤器最核心的方法,对访问的请求和响应进行拦截,当过滤器拦截到对资源的访问时,服务器会自动调用该方法执行过滤代码。我们只需要在这个方法中设计过滤器的逻辑代码即可。

24." " 和null的区别

答:
如果说str等于null,那么内存根本没创建字符串对象,并由str引用。不能调用object的方法。
如果说str是空串,那么确实存在一个由str引用的字符串对象,只不过这个字符串的值是" " 。长度为0;
如果我们在表单中什么都不填,接受的字符串就是null;
如果我们在表单中填“”。那么接受到的字符串就是“”,但是存入数据库后查询出来的就是null。

25.详细描述MVC

基于Java的web应用系统采用MVC设计模式。
即用 Model(模型).View(视图)和Controller(控制器)分离设计,这是目前web应用服务系统的主流设计方向。
Model:处理业务逻辑的模块。
View:负责页面显示,显示Model的处理结果给用户,主要实现数据到页面的转换过程。
Controller:负责请求的分发,吧Form数据传递给Model进行处理完成,处理完成后,把处理结果返回给相应的View显示给用户。

26.El表达式的功能,为什么要用EL表达式?

答:
功能:
a.从四个域对象中取出数据。数据显示。
b.取出请求参数。数据显示
原因:
在页面中用jsp脚本和jsp表达式来获取数据显示比较麻烦
a.需要判断
b.可能需要强转

27.如何防止表单重复提交?

答:使用session技术:
a.在表单页面中生成一个subToken,将其保存到session中,同时将其保存为表单的隐藏域的值。
b.在表单提交时,服务器获取session中的值,获取请求参数的值,比较两者是否相同,
相同则说明不是重复提交。请求通过同时删除session 中保存的值,
如果不相同则是重复提交,不能通过。

28. 什么是事务

答:
事务是作为一个逻辑单元执行的一系列操作,一个逻辑单元必须有四个属性,称为ACID(原子性、一致性、隔离性、持久性)属性。
原子性:
对数据进行修改,要么全部执行,要么全不执行。
一致性:
事务在在完成时,必须使所有的数据保证一直的状态。
隔离性:
由并发事务所做的修改必须与任何其他事物所做的修改隔离。
持久性:
事务完成后,它对于系统的影响是永久性的。

29. 数据库有几种隔离级别

答:

  1. Serializable(串行化):可避免脏读、不可重复读、幻读的发生。
  2. Repeatable read(可重复读):可避免脏读、不可重复读的发生。
  3. Read committed(读已提交):可避免脏读的发生。
  4. Read uncommitted(读已提交):最低级别,任何情况都无法保证。

30. 简述web.xml的作用

答:
属于部署描述符,在整个java中只要是容器都会存在部署描述符,此部署描述符可以控制整个WEB中各组件的运行状态,也可以配置整个窗口的状态。

31. AJAX原理

答:
Ajax相当于在用户和服务器之间加了一个中间层,使用户操作与服务器响应异步。
并不是所有的用户请求都交给服务器,像一些数据验证和处理都可以交由Ajax引擎来做,只有确定需要从服务器读取新的数据时再由Ajax引擎向服务器提交请求。
Ajax其核心只有JavaScript、XMLHTTPRequest和DOM,在旧的交互方式中,由用户触发一个HTTP请求到服务器,服务器对其进行处理后再返回一个新的HTHL页到客户端, 每当服务器处理客户端提交的请求时,客户都只能空闲等待,并且哪怕只是一次很小的交互、只需从服务器端得到很简单的一个数据,都要返回一个完整的HTML页,而用户每次都要浪费时间和带宽去重新读取整个页面。而使用Ajax后用户从感觉上几乎所有的操作都会很快响应没有页面重载(白屏)的等待。

32.JDBC连接数据库的步骤

  1. 获取JDBC驱动程序
  2. 获取JDBC连接
  3. 创建数据库连接
  4. 获取传输器 执行SQL语句并返回结果
  5. 处理结果
  6. 释放资源 关闭JDBC对象

33.JDBC的原理

答:

  1. jdbc是一套标准,本质上就是一堆接口
  2. 数据库厂商提供了实现jdbc接口的实现类,放在jar包里,只要把jar包导入工程就可以操作数据库了。

34.如何防止SQL注入攻击

答:
利用对象PreparedStatement对象完成,现将SQL骨架发送给数据库服务器,然后再将参数单独发送给服务器,并且将参数中的关键字当做普通字符串处理从而起到了防止SQL注入攻击的问题。

35.对连接池的理解

答:
用来提高程序的效率,创建一个容器,容器中存放以获取到的数据库连接对象,对外提供获取和还回连接的方法,外界需要时就从容器中获取,用完就还回容器。

36. HTML和XML的区别

答:
XML是可扩展标记语言,而HTML是出奥文本标记语言。
不同:

  1. 用途不同。XML主要用于数据格式化储存。而HTML主要用于网页的编辑。
  2. 语法有所不同。XML语法比较严谨,而HTML语法比较松散。

37.Tomcat配置部署优化

答:

  1. 内存优化:Tomcat依赖于JVM,可以配置JVM的内存配置。
  2. 最大连接数配置(并发能力)
    通常搭配Nginxt提升Tomcat的并发性能。