2022Java常见面试题整理----JavaWeb(持续更新)

JavaWeb

oracle:sql编写 做题

**mybatis **

jdbc servlet struts

html css javascript jsp

maven

框架

corejava:hashmap 线程 集合 数据类型

javaweb

1.Oracle 中主键的自动生成策略是什么?如何创建?

序列 sequence : Oracle 提供用于产生一系列唯一数字的数据库对象。

1. 创建 create sequence seq_user start with 1 increment by 1 maxvalue 10 minvalue 1;
2. 使用 sequence
序列名 .nextval  
insert into t_order values( 序列名 .nextval ,'123',4);
序列名 .currval     //获取当前序列的数值 前提序列必须先执行过一次
select  序列名 .currval from dual; 
注意:序列一旦被创建可以在任意表中使用,值一旦产生不能重复获取。

2.SELECT语句的关键字执行顺序? ***

SELECT COLUMN1,COLUMN2...FROM TABNAME WHERE ... GROUP BY ... HAVING... ORDER BY COLUMN ASC/DESC;

1.FROM 确定查询的表
2.WHERE 对数据按条件筛选
3.GROUP BY 对筛选后的数据分组
4.HAVING 对分组后的数据再次进行筛选
5.SELECT 生成结果集
6.ORDER BY 对结果集进行排序

3.什么是表连接查询?什么是自连接?什么是子查询? ***

A.子查询也称为嵌套查询,根据查询结果的不同,子查询分为:
	1.where子查询 结果是一行一列:where = (SQL语句)
	2.where子查询 结果是多行一列:in (SQL语句)
	3. from子查询 将查询结果视作一张新表应用,对查询内容做预处理工作。
	From(SQL语句)
b.展示数据时候有可能会涉及两张或者多张表数据的同时展现
	将多张表的数据一并查询出来进行展示。表连接查询分为内连接、左外连接、右外连接。
1.内连接:
  1.1 语法:SELECT ... FROM TAB1 INNER JOIN TAB2 ON 连接条件;
  1.2 特点:自动忽略NULL值,只会将两张表中可以连接的数据进行连接显示。
2.左外连接:
  1.1 语法:SELECT ... FROM TAB1 LEFT OUTER JOIN TAB2 ON 连接条件;
  1.2 特点:左表记录全部出现在查询结果中,右边表中的数据根据连接条件将可以连接的数据进行连接展示。
3.右外连接:
  1.1 语法:SELECT ... FROM TAB1 RIGHT OUTER JOIN TAB2 ON 连接条件;
  1.2 特点:右表记录全部出现在查询结果中, 左边表中的数据根据连接条件将可以连接的数据进行连接展示。
4.多表连接
     语法:select a.*,b.*,c.*  from A a
			 inner  join B b  on 连接条件
			 inner join  C c on 连接条件
			  .........
c.特殊的连接,一张表自己与自己进行连接查询。
	例子:使用员工表查询自己的first_name 以及管理者的first_name

4.什么是视图,并简述作用

概念: 是一种虚表 ( 相对而言 , 视图所依赖的表叫做基表 )
本质上视图不是一张表,只是单纯的逻辑定义,每次执行的时候都要重新执行 SQL 语句。

create view  视图名 as (select 语句 ) 视图本身没有任何效率上的提升
	1. 使用各种不同的方式将基表的数据展现在用户面前 , 简化用户的数据查询和处理。
	2. 屏蔽数据库的复杂性 , 用户不必了解数据库的复杂 , 简化查询语法。
	3. 只授予用户使用视图的权限,简化了用户权限的定义,敏感数据的屏蔽。
	4. 某些查询必须借助视图的帮助才能完成 .  比如 ,  有些查询需要连接一个分组统计后的表和另一表。

5.什么是索引,并简述原理及作用 ***

概念:索引是一种供服务器在表中快速查找一个行的数据库结构,合理使用索引能够大大提高数据库的运行效率。

1. 索引类似于字典目录,用于提高查询效率。
2. 索引并不是越多越好。(索引会占用存储空间,增删改操作的同时数据库需要维护索引列,消耗时间、内存以及 CPU 资源)
3. 表中的主键以及唯一列, Oracle 会为其自动添加索引。

6.什么是 ACID ? ***

ACID,是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。
	1. 原子性 Atomic 事务必须是原子工作单元 ( 不可分割 ) ;对于其数据修改,要么全都执行,要么全都不执行。
	2. 一致性 Consistent  操作前的数据,操作后的数据保持一致。
	3. 隔离性 Insulation  保证多用户并发访问的数据安全性,并发事务所作的修改必须与任何其它并发事务所作的修改隔离。
	4. 持久性 Duration 事务操作的数据 持久化到数据库当中 , 对于系统的影响是永久性的。

7.什么是脏读、不可重复读、幻读? ***

脏读 :  一个事务读取到了另一个事务未提交的数据操作结果。可能造成所有数据一起回滚!
不可重复读 :事务 T1 读取某一数据后,事务 T2 对其做了修改,当事务 T1 再次读该数据时得到与前一次不同的值。
	       这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不 可重复读。
幻读 : 事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(并不要求两次	    查询的 SQL 语句相同)。
这是因为在两次查询过程中有另外一个事务插入数据造成的。
不可重复读和幻读区别:
不可重复读的重点是修改,幻读的重点在于新增或者删除。

例1(同样的条件, 你读取过的数据, 再次读取出来发现值不一样了 ):事务1中的A先生读取自己的工资为 1000的操作还没完成,事务2中的B先生就修改了A的工资为2000,导 致A再读自己的工资时工资变为 2000;这就是不可重复读。 
例2(同样的条件, 第1次和第2次读出来的记录数不一样 ):假某工资单表中工资大于3000的有4人,事务1 读取了所有工资大于3000的人,共查到4条记录,这时事务2 又插入了一条工资大于3000的记录,事务1再次 读取时查到的记录就变为了5条,这样就导致了幻读。

8.谈谈你在项目中是如何进行具体的sql优化的? ***

(1)选择最有效率的表名顺序   
(2)当只需要一行数据时候使用limit 1;
(3)SELECT子句中避免使用‘*’
(4)用Where子句替换HAVING子句
(5)通过内部函数提高SQL效率  
(6)避免在索引列上使用计算。
(7)提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。

9.什么是sql注入?,如何防止sql注入

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。 [1]  比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.

后台身份验证绕过漏洞
验证绕过漏洞就是'or'='or'后台绕过漏洞,利用的就是AND和OR的运算规则,从而造成后台脚本逻辑性错误
例如管理员的账号密码都是admin,那么再比如后台的数据库查询语句是
user=request("user")
passwd=request("passwd")
sql='select admin from adminbate where user='&'''&user&'''&' and passwd='&'''&passwd&'''
那么我使用'or 'a'='a来做用户名密码的话,那么查询就变成了
select admin from adminbate where user=''or 'a'='a' and passwd=''or 'a'='a'  
这样的话,根据运算规则,这里一共有4个查询语句,那么查询结果就是 假or真and假or真,先算and 再算or,最终结果为真,这样就可以进到后台了

这种漏洞存在必须要有2个条件,第一个:在后台验证代码上,账号密码的查询是要同一条查询语句,也就是类似
sql="select * from admin where username='"&username&'&"passwd='"&passwd&'
如果一旦账号密码是分开查询的,先查帐号,再查密码,这样的话就没有办法了。
第二就是要看密码加不加密,一旦被MD5加密或者其他加密方式加密的,那就要看第一种条件有没有可以,没有达到第一种条件的话,那就没有戏了

10.JDBC核心步骤如何实现?

1.加载驱动。
	Class.forName(“oracle.jdbc.OracleDriver”)
2.创建数据库连接对象Connection
	Connection conn=DriverManager.getConnection(“jdbc:oracle:thin:localhost:1521:xe”,”hr”,”hr”);
3.创建Statement对象
	String sql=”select * from user whnere username=?”;
	PrepareStatement pstm=Conn.prepareStatement(sql);
	Pstm.setString(1,name)
4.执行Sql
5.处理结果集   
6.释放资源 

11.什么是 JDBC ,简述作用?

JDBC 是java的13中规范之一(13个接口)
应用 Java 程序访问和操作数据库的底层代码 ,SUN 公司提出的一组规范 ( 接口 )  。
1.1  接口规范:多种数据库产品, Sun 公司只是制定程序开发规则。 接口类型 : 屏蔽底层的代码实现差异 (访问不同的数据库)
1.2  实现在哪:驱动 Jar( 由数据库厂商提供 )  
	JDBC = SUN 公司提出的一组规范 ( 接口 ) +  驱动 Jar

12.Statement 和 PreparedStatement 的区别 ***

PreparedStatement 继承自 Statement, 都是接口
PreparedStatement 可以使用占位符,是预编译的,批处理比 Statement 效率高 . 防止 SQL 注入

13.什么是事务控制? ***

事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。
1.JDBC中默认事务是一条Sql语句自成一个事务,即一条Sql语句执行完毕会自动提交事务;无法保证业务功能的完整。需要程序员手动控制事务:
  1.1 设置手动控制事务: conn.setAutoCommit(false);
  1.2 手动提交事务:conn.commit();
  1.3 手动回滚事务:conn.rollback();

14.简单描述三层架构

1.三层架构是一种编程思想,在逻辑上将应用程序划分为三层,本着各司其职的思想划分。 
2.三层架构包含哪几层
2.1 DAO层 : 数据模型层
	- 主要负责与数据库交互,完成CRUD操作
	- 接收Service层传递的数据
2.2 Service(BIZ)层: 业务逻辑层
	- 主要完成业务功能操作
	- 会一到多次调用DAO层
	- 需要做事务控制
	- 接收视图层传递的数据,并做相应的运算处理
2.3 View层 : 视图层 (表显层)
	- 主要与用户进行交互 
	- 接收用户的信息
	- 将Service完成的功能,返回数据展示给用户

15.表单的action属性,method属性,name属性值有什么作用?

1.action属性用于指定表单数据提交的目标资源路径。
2.method属性指定表单数据提交的方式,可选值有GET和POST:
2.1.GET方式是将数据以地址栏拼接的方式提交。
2.2.POST方式是将数据打包成文件进行提交。
3.当表单提交时,表单元素的name属性值会作为数据的key进行提交,也是未来服务器获取表单数据的重要依据。

16.自定义 servlet 的三种方式,及区别

方式一: implements Servlet 接口 ( 不建议 ) 实现接口中所有抽象方法
	1 、 destroy()  
	2 、 init()   
	3 、 service()
	4 、 getServletConfig()
	5 、 getServletInfo()
方式二: extends GenericServlet ,覆盖 service 方法:不建议使用,
	与 http 协议无关 service(ServletRequest req, ServletResponse res)
方式三: extends Httpservlet  在这个抽象类中,所有的方法都是普通方法
	只需要覆盖 service 方法 接受请求,处理请求、把结果响应给 Client

17.向 server 端请求 servlet 的方式

1. 地址栏直接请求 :
	在地址栏输入: http://ip:port/web 应用名 /url-pattern
2. 超链接请求 :
	<a href="/web 应用名 /url-pattern"> 请求 Servlet</a>
3. 表单提交:
	<form action="/myweb/first"></from>

18.连接池的作用

数据库连接的建立是一种耗时、性能低、代价高的操作,频繁的数据库连接的建立和关闭极大的影响了系统的性能。
数据库连接池是系统初始化过程中创建一定数量的数据库连接放于连接池中,当程序需要访问数据库时,不再建立一个新的连接,
而是从连接池中取出一个已建立的空闲连接,使用完毕后,程序将连接归还到连接池中,供其他请求使用,从而实现的资源的共享,
连接的建立、断开都由连接池自身来管理。
数据库连接池为系统的运行带来了以下优势:
昂贵的数据库连接资源得到重用;减少了数据库连接建立和释放的时间开销,
提高了系统响应速度;统一的数据库连接管理,避免了连接资源的泄露。

19.Servlet 中的三大作用域对象是什么?及各自的作用范围? ***

三大作用域对比
作用域 作用范围 生命周期
request 一次请求有效 请求变了(地址栏,表单,超链接,重定向), request 作用域就发生改变。
session 一次会话有效 如果浏览器不发生改变,永远可以去获取到 Session 值。
ServletContext  客户端启动创建,服务器关闭销毁 整个 Web 应用不发生改变, ServletContext tomcat启动时创建,tomcat关闭时销毁,整个web的生命周期只有一个

20.表单提交的 2 种方式?及区别? ***

Get 方式
	get 传递数据的方式:通过地址栏传递,明文传递数据,不安全,传递的数据量少。
Post 方式
	post 传递数据的方式:通过请求体传递数据,密文传递数据,安全,传递的数量大。

21.jsp 的 9 个隐含对象?作用域对象? 1 个特殊的对象,特殊点是什么? ***

1 request
	作用域相关的操作。
	request.getContextPath();// 用于动态获取应用名(项目名)
	<form method="post/get" action="<%= request.getContextPath()%>/url-pattern">
2 response( 不怎么用得上 )
	response.getWriter();返回的是PrintWriter,这是一个打印输出流。
	response.sendRedirect();
	response.setContentType("text/html;charset=UTF-8");
3 session
	作用域相关的操作。
4 application(ServletContext)
5 (out) 等价于 <%= %>
6 (cofig) ServletConfig  获得 Servlet 中初始化参数信息
7 (exception) 上一个界面发生的异常,只能在 isErrorPage 的页面中使用。
8 page page  只得是当前页面 类似于 this 。
9 pageContext

request:  一次请求有效 session : 一个浏览器有效 application : 一个 web 应用, Tomcat 有效。
pageContext 可以操作其他作用域。
pageContext.setAttribute("age1","1",PageContext.REQUEST_SCOPE);
pageContext.setAttribute("age2","2",PageContext.SESSION_SCOPE);
pageContext.setAttribute("age3","3",PageContext.APPLICATION_SCOPE); 

22.servlet 运行是单例 or 多例?并简述优缺。

Servlet 是单例的,如果在 Servlet 中定义了实例变量 ( 实例变量存储在堆空间 ) ,那么就会存在多用户并发访问时线程安全 ( 保证数据一致 ) :
a 、对临界资源加 Synchronized 的关键字 ( 加锁,不建议,效率低 )
b 、尽量避免在 Servlet 中定义成员变量。

23.简述分层开发的好处

1 、开发人员可以只关注整个结构中的其中某一层 ;
2 、可以很容易的用新的实现来替换原有层次的实现 ;
3 、可以降低层与层之间的依赖 ;
4 、有利于标准化 ;
5 、利于各层逻辑的复用。
6 、结构更加的明确
7 、在后期维护的时候,极大地降低了维护成本和维护时间 

24.写出Servlet中的三大作用域,并分别说明各自的特点。

1.  HttpServletrequest 请求对象
           生命周期  : 创建 : 请求开始的时候创建 
                      销毁 : 一次响应开始的时候
           作用范围  : 在一次请求中共享数据 
2.  ServletSession 服务器端对象
          生命周期  : 创建 : 第一次调用 request.getsession()
                     销毁 : 默认30分钟以后      
                                  服务器关闭的时候
                                  session.invalidate()   手动销毁
			     session.remove(“ cart”)  销毁指定session
          作用范围 : 在一次会话中(多次请求)中共享数据
3.  servletConetext 
           生命周期  : 创建 : 服务器启动时 为每一个项目创建一个对象
                      销毁 : 服务器关闭的时候 或者项目移除的时候
           作用范围  : 当前项目下所有的程序都可以共享(永久共享)

25.Mybatis中#{}和${}的区别是什么? ***

Mybatis在处理${}时,会将sql中的${}替换为?号,调用Statement的set方法来赋值;
区别:  
#{}:是以预编译的形式,将参数设置到sql语句中(?,?,?)的形式,相当于原生JDBC中的PreparedStatement,可以防止sql注入;
${}:取出的值直接拼接在sql语句中,会有安全问题,执行sql语句慢
建议: 大多数情况下,我们取参数的值都应该去使用#{};

26.Struts2中Action是如何接收页面传递的参数的?

1.使用Action的属性接收(成员变量):在action 里面定义要接收的参数,
并提供相应的setter,getter,和提交参数的名称一致,
2.使用Request对象:即request.getParameter(”参数“)方法  	
ServletActioinCotext工具类获取request对象

27.struts2配置文件中result的type属性中(跳转方式)有哪几种结果类型?分别代表什么含义?

1.dispatcher 请求转发:默认跳转方式 请求转发跳转到另一个jsp页面,这时参数和session等都继续传递。
2.redirect	 请求重定向:重定向到一个jsp/Action/外部网址,重定向将丢失参数、值栈和Action处理的结果 
3.chain	     请求转发:将action和另外一个action链接起来,转发到Action被跳转的action中仍能获取上个页面的值,如request信息。
4.redirectAction   请求重定向:重定向到另一个 Action,跳转的页面中丢失传递的信息,如request

28.Struts2

1)简述struts2框架
	Struts2是一个典型的mvc框架,在整个mvc框架中充当控制器的角色,struts2替换原生的servlet技术,是对原生servlet代码的合理封装。
2)Struts2的前置控制器的类名
	StrutsPrepareAndExecuteFilter
3)Struts2的执行流程
	后台接收到request,经过struts2的前置控制器strutsPrepareAndExecuteFilter解析请求路径,去struts2的配置文件中找对应的	namespace和action的name属性,然后再找到对应的class和method,执行相关的代码,然后完成流程跳转。
4)Struts2如何接收参数
	使用成员变量收集参数,需要提供相应的get/set方法
5)如何在struts2中控制器的方法中获取request和response
	ServletActionContext.getRequest().getSession();
	servletActionContext.getResponse()
6)Struts2的跳转方式
    Action--->jsp:
        forward:默认(dispatcher)
        redirect: type="redirect"
    Action--->Action
        forward: type="chain"
        redirect: type="redirectAction"
7)Struts2中的拦截器
	Interceptor
	extends MethodFilterInterceptor
	注意: 拦截Action的相关请求  不能拦截jsp
	自定义拦截器
	自定义拦截器栈
	默认拦截器栈  
	自定义拦截器栈
8)Struts2中的文件上传与下载
	文件上传注意事项:
	1).导入jar包commons -io  commonsfileupload
	2).表单提交方式必须是post 
	3).表单enctype属性必须为multipart/form-data
		//1.根据相对路径获取绝对路径
		String realPath = ServletActionContext.getServletContext().getRealPath("/back/photo");	
		//根据文件路径去找文件夹
		File file = new File(realPath);
		//判断文件夹是否存在
		if(!file.exists()){
			file.mkdir();
		}	
		//获取文件名频接时间戳
		String newName= new Date().getTime()+"-"+srcFileName;
		//文件上传
		FileUtils.copyFile(src, new File(realPath,newName));

29.Mybatis

1)简述mybatis框架
	MyBatis 本是apache的一个开源项目,是一个基于Java的持久层框架,简化了JDBC对数据库的操作。
2)Mybatis的功能
	封装原生的jdbc代码,对数据库中的数据进行管理(CRUD)
3)什么是sql注入
	所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
4)# 和 $ 取值区别
	#{}的取值方式比较常用,可以避免sql注入的风险
	${}的取值方式在特定的场景下会用到,直接拼接参数到sql中,存在sql注入的风险
5)动态sql
	<sql id="">  标签,可以达到sql的复用  写sql片段
	<include refid=""/>
	<if test=""></if><else></else>,可以在sql语句中做判断
	<where>标签 用来去掉sql中多余and  or
	<set>标签 用来去掉update 语句中多余的","
	<choose>标签  类似于java中的switch语句
	<foreach>标签  对一个集合进行遍历,通常是在构建 IN 条件语句的时候
6)mybatis 关联关系
	一对一
	<resultMap id="" type="User">
		<id></id>
		...
		<association property="关系属性名",javaType="关系属性类型">
	</resultMap>
	
    一对多
    <resultMap id="" type="User">
        <id></id>
        ...
        <collection property="关系属性名",javaType="集合泛型",ofType="list">
    </resultMap>
    
    多对多
    <resultMap id="" type="User">
        <id></id>
        ...
        <collection property="",javaType="",ofType="">
    </resultMap>

30.JavaScript

1)JavaScript是一种弱类型直译式脚本语言
2)JavaScript中声明变量:var关键字
3)Bom:Browser Object Model,浏览器对象模型
4)Dom: Document Object Model,即文档对象模型。 
5)JavaScript中事件的定义与出发场景
	单击事件   onclick
	双击时间   ondblclick
    鼠标移入   onmouseover
    鼠标移出   onmouseout
    鼠标移动   onmousemove
    鼠标按下事件 onmousedown
    鼠标松开时间 onmouseup
    失去焦点事件  onblur
    失去焦点,值改变事件 onchange
    页面加载完毕的事件 onload
    表单提交时间  onsubmit

31.jQuery

1)jQuery是一个快速、简洁的JavaScript框架
2)jQuery中的选择器:$(“#**”),$(“.**”)
	id选择器$(“#”)
	类选择器$(“.**”)
	标签选择器$(“标签”)
	多路选择器$(“div,span”)
3)jQuery中事件的定义
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值