javaweb的常见面试题

1.mysql数据库的引擎?

       数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。
常用的数据库引擎:Innodb和MyISAM
Innodb引擎
  Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。

MyISAM引擎
  MyISAM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。不过和Innodb不同,MyISAM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyISAM也是很好的选择。

2.对于Tomcat容器有没有什么特殊的了解?用Tomcat的时候遇到过什么坑?

      tomcat容器的核心点是connecter 连接器 和container处理容器,connecter用于监听并接收http请求,并分配线程让container对请求进行处理。

3.tomcat可以承受多少的请求?tomcat做连接限制的实现原理?如果用java做限流怎么做(提示:多线程)

      tomcat默认的请求数为100, 可以通过acceptCount参数进行自定义。tomcat8以前一个请求对应一个socket对应一个线程,tomcat做连接限制其实就是对socket创建数量的限制。如果使用java做限流,一般可以在filter中或者拦截器中做限制。

4.JSP的原理

WEB容器(Servlet引擎)接收到以.jsp为扩展名的URL的访问请求时,它将把该访问请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。

每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。

5.注解的原理

注解在目前而言最主流的应用:代替配置文件
关于配置文件与注解开发的优缺点:
注解优点:开发效率高 成本低
注解缺点:耦合性大 并且不利于后期维护

使用注解最主要的部分在于对注解的处理,那么就会涉及到注解处理器。从原理上讲,注解处理器就是通过反射机制获取被检查方法上的注解信息,然后根据注解元素的值进行特定的处理。

6.联合索引查询遵守什么原则,如何定义联合索引的顺序?

最左前缀匹配原则:在mysql建立联合索引时,会遵循最左前缀匹配的原则,即最左优先,在检索数据从联合索引的最左边开始匹配。

建立联合索引要把经常等值查询的放在前面。
例如 :表中有 name, time 两个字段,name经常被等值查询,time经常被范围查询

7.怎么查看 sql 执行效率,怎么查找慢查询的 sql 语句?

      Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。type:这列最重要,显示了连接使用了哪种类别,有无使用索引,是使用Explain命令分析性能瓶颈的关键项之一。

8.数据库左右链接和内链接的区别

左连接:左边的全部展示,右边的展示满足条件的
右连接:右边的全部展示,左边的展示满足条件的
内连接:显示左边右边共有的

9.in和like查询可以使用索引么?

in查询可以使用索引, 对于like查询, 只有不以%开头的时候,才会使用到索引,如果是其他情况就不会使用索引

10.事务的四大特性

原子性(atomicity):强调事务的不可分割,事务是最小的单位;
一致性(consistency):事务的执行前后数据的完整性保持一致;
隔离性(isolation):一个事务的执行的过程中,不应该受到其他事务的干扰,也就是同一时间段内多个事务的执行互不影响。
持久性(durability):事务一旦结束,数据就持久到数据库。

11.spring的事务传播机制

propagation_required 如果没有,就开启一个事务;如果有,就加入当前事务(方法B看到自己已经运行在 方法A的事务内部,就不再起新的事务,直接加入方法A)

propagation_requires_new 如果没有,就开启一个事务;如果有,就将当前事务挂起。(方法A所在的事务就会挂起,方法B会起一个新的事务,等待方法B的事务完成以后,方法A才继续执行)

propagation _nested 如果没有,就开启一个事务;如果有,就在当前事务中嵌套其他事务

propagation _supports 如果没有,就以非事务方式执行;如果有,就加入当前事务(方法B看到自己已经运行在 方法A的事务内部,就不再起新的事务,直接加入方法A)

propagation _not_supported 如果没有,就以非事务方式执行;如果有,就将当前事务挂起,(方法A所在的事务就会挂起,而方法B以非事务的状态运行完,再继续方法A的事务)

propagtion_never 如果没有,就以非事务方式执行;如果有,就抛出异常。

propagtion_mandatory 如果没有,就抛出异常;如果有,就使用当前事务

12.有一张表t_login_log,包含了登录用户user_id、登录时间login_time,每次用户登录后都会往表新增一条记录,请用sql找出登录天数最多的前10位用户user_id。

select user_id,count(day_count.c) days from (
select user_id,count(d) c from (
select DISTINCT user_id,DATE_FORMAT(login_time,'%Y-%m-%d') d from t_login_log
) day_log GROUP BY user_id,day_log.d
) day_count GROUP BY user_id ORDER BY days desc limit 0,10

13.servlet、jsp区别?jsp的九大对象,七大动作,三大指令分别是?

Servlet是服务端的程序,主要为了实现页面中数据的动态输出而存在。使用java代码完成所有数据的输出。
Jsp的本质也是Servlet,是为了解决Servlet中的HTML代码存在的,在jsp中可以编写HTML代码和java代码,但是我们通常不会选择在jsp中编写java代码。

Jsp的九大内置对象
1、request对象
request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。
2、response对象
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。
3、session对象
session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。
4、application对象
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。
5、out 对象
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
6、pageContext 对象
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
7、config 对象
config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
8、page 对象
page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。
9、exception 对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

Jsp七大动作
1.include 动态包含(分别编译):
用jsp:include动作实现<jsp: include page=“included.jsp” flush=“true” />
它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。flush属性: 用true ,表示页面可刷新。默认为false;

2.useBean动作(jsp页面使用javaBean的第二种方式):
<jsp:useBean id=“对象名” class=“包名.类名” scope=“作用范围(request/page/application/session)”/>
作用域默认为page(本页面有效).
3.getProperty动作(name为useBean动作中的id).
从对象中取出属性值:<jsp:getProperty name=“javaBean对象” property=“javaBean对象属性名” />
4.setProperty动作(name为useBean动作中的id):
为对象设置属性值:<jsp:setProperty name=“javaBean对象” property=“javaBean对象属性名” value=http://www.hake.cc/kf/201109/“值”/>
为对象设置属性值:<jsp:setProperty property=“javaBean对象属性名” name=“javaBean对象” param=“username”/>
(param=“username” 相当于 value=http://www.hake.cc/kf/201109/<%=request.getParameter(“username”)%>)

5.param动作(传递参数)):
到达跳转页面可以通过 request.getParameter(“参数名”)方式取出参数值
<jsp:include page=“转向页面的url” >
<jsp:param name=“参数名1” value=http://www.hake.cc/kf/201109/“参数值1”>

<jsp:param name=“参数名2” value=http://www.hake.cc/kf/201109/“参数值2”>

</jsp:include>
或:
<jsp:forward page=“转向页面的url” >
<jsp:param name=“参数名1” value=http://www.hake.cc/kf/201109/“参数值1”>
<jsp:param name=“参数名2” value=http://www.hake.cc/kf/201109/“参数值2”>

</jsp:forward>

6.forward动作:
跳转页面:<jsp:forward page=“login.jsp” />

7.plugin动作:jsp:plugin:用于指定在客户端运行的插件

Jsp的三大指令
Page:该指令是针对当前页面的指令
<%@ page [Attribute=“Value”] %>
language:声明当前jsp页面使用的脚本语言的种类
通常是java,默认是java,无需设置
extends:指定jsp编译产生的类继承的父类,或者实现的接口
import:用于导入包,默认已经导入的包有
java.lang.,javax.servlet.,javax.servlet.jsp.,javax.servlet.http. session:设定这个jsp页面是否需要HttpSession
buffer:指定输出缓冲区的大小
autoflush:当缓冲区即将溢出时,是否自动强制输出缓冲区的内容
info:设置该JSp程序的信息,采用Servlet.getServletInfo()获取该值
errorPage:指定错误处理页
isErrorPage:设置本JSp是否为错误处理程序
ContentType:用于设定生成网页的文件格式和编码格式

include:用于指定包含另一个页面
<%@include file=“path”%>
taglib:用于定义和访问自定义标签

14.说说Tomcat类加载的机制

       tomcat作为一个服务器,在它上面可以部署多个应用。默认情况下是使用应用程序加载器加载类的,但往往部署的应用都会有多个jar依赖,所以第一点为了解决依赖问题,必须保证每个应用的类库独立。 为什么要保证每个应用的类库相互独立呢? 打个比方,我们都知道连接数据库需要数据库驱动,而数据库驱动的版本要与连接的数据库相对应,否则无法获取连接。 那假设部署在tomcat上的两个应用依赖的数据库驱动版本有很大差异,这样直接使用java的系统类加载器会导致这两个应用有一个无法启动。
a)、要保证部署在tomcat上的每个应用依赖的类库相互独立,不受影响。
b)、由于tomcat是采用java语言编写的,它自身也有类库依赖,为了安全考虑,tomcat使用的类库要与部署的应用的类库相互独立。
c)、有些类库tomcat与部署的应用可以共享,比如说servlet-api,使用maven编写web程序时,servlet-api的范围是provided,表示打包时不打包这个依赖,因为我们都知道服务器已经有这个依赖了。
d)、部署的应用之间的类库可以共享。这听起来好像与第一点相互矛盾,但其实这很合理,类被类加载器加载到虚拟机后,会生成代表该类的class对象存放在永久代区域,这时候如果有大量的应用使用spring来管理,如果spring类库不能共享,那每个应用的spring类库都会被加载一次,将会是很大的资源浪费。
       由于存在上述问题,tomcat实现了自己的类加载器,不仅仅是tomcat,所有的服务器基本都有或多或少上述所说的问题。

15.User表(id,name,address),现在要迁移到新表User2(id,address,state),sql怎么写

Insert into user2(id,address,state) select id,address,0 from user

16.线上系统在运行,有一张一千万数据的表,怎么做迁移。

       如果不用分区表,大致上就是一个 insert into 历史表 select from 表 where 条件,然后在删除掉表里历史的数据,你可以直接写个定时任务,也可以用数据库里的 定时任务

17.监听器的使用

       监听各大作用域。如监听servletContext,ServletRequest,HttpSession等域对象的创建,更新和销毁等事件。如:1、监听session的创建和销毁,可以统计网站的在线人数。2、监听容器的更新,系统启动后,创建admin账号等.

发布了18 篇原创文章 · 获赞 1 · 访问量 416

猜你喜欢

转载自blog.csdn.net/weixin_43714592/article/details/104123927