2023年11月28日发(作者:)

JAVA前端与后端交互⾯试题

1.前端与后端交互⾯试题

1.1. 描述Servlet调⽤过程?

答案:

(1)在浏览器输⼊地址,浏览器先去查找hosts⽂件,将主机名翻译为ip地址,如果找不到就再去查询dns服务器将主机名翻译成ip地址。

(2)浏览器根据ip地址和端⼝号访问服务器,组织http请求信息发送给服务器。

(3)服务器收到请求后⾸先根据Host请求头判断当前访问的是哪台虚拟主机。

(4)服务器根据http请求头中的请求URI判断当前访问的是哪个web应⽤。

(5)服务器根据http请求头中的请求URI判断当前访问的是web应⽤中的哪个web资源。

(6)检查web应⽤的⽂件,如果根据路径找到具体的servlet处理类的全路径名交给该servlet处理,如果找不到就交给缺省servlet

处理。

(7)这个过程中浏览器只知道⾃⼰发出来http请求,不久就收到了http响应,浏览器不知道也不关⼼服务器内部是如何处理的。浏览器和

服务器之间的关系是⾮常单纯的,只有HTTP协议。

(8)解析请求、封装RequestResponse对象、创建Servlet、调⽤Service⽅法都是服务器⾃动进⾏的,开发⼈员只需要写好Servlet配置

(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.13. Session⽣命周期?

答案:

当程序第⼀次调⽤到sion()代码时,服务器明确的知道了需要⽤到session了,此时创建session。

如果session超过30分钟(可以在中配置的)没⼈使⽤,服务器认为这个session超时了,销毁session。

明确的调⽤date(),session⽴即销毁。

服务器被⾮正常关闭或web应⽤被移除出容器,此时随着web应⽤的销毁session销毁.如果是正常关闭,session会被钝化.当下次服务器正常

启动时,没有超时的session还会被活化回来。

1.14. session的原理?

答案:

session的原理:在服务器第⼀次调⽤sion()⽅法的时候,会在内存中创建⼀个session对象,此对象具有⼀个独⼀⽆⼆的

id值,此id值将会以cookie(JSESSIONID)的形式发送给浏览器,浏览器以后每次访问都会带着此cookie,服务器就利⽤此cookie区分

浏览器找到对应的session空间。

SQL注⼊:就是通过把SQL命令插⼊到Web表单递交或输⼊域名或页⾯请求的查询字符串,最终达到欺骗服务器执⾏恶意的SQL命令。具

体来说,它是利⽤现有应⽤程序,将(恶意)的SQL命令注⼊到后台数据库引擎执⾏的能⼒,它可以通过在Web表单中输⼊(恶意)SQL

语句得到⼀个存在安全漏洞的⽹站上的数据库,⽽不是按照设计者意图去执⾏SQL语句。

防⽌的⽅法:

(1) 永远不要信任⽤户的输⼊,要对⽤户的输⼊进⾏校验,可以通过正则表达式,或限制长度,对单引号和双"-"进⾏转换等。

答案:

思路如下:

1:利⽤class实现DataSource接⼝

2:在class的构造器⼀次性创建指定的链接将链接保存LinkedList中

3:实现getConnection从LinkedList返回⼀个链接

4:提供将链接放回⽅法

Public class MyDataSource inplements DataSource{

Private LinkedList dataSource=new LinkedList<>();

Public MyDataSource(){

For( int a=0;a<1000;a++){

Try{

erDriver(new SQLServerDriver());

Connection

con=nection(“jdbc:sqlserver://localhost:1443;DatabaseName=liming”,”root”,”liming”

}catch(Exception e){

}

}

Public Connection getConnetion(){

答案:

Servlet本⾝是单实例的,这样当有多个⽤户同时访问某个Servlet时,会访问该唯⼀的Servlet实例中的成员变量,如果对成员变量进

⾏写⼊操作,那就会导致Servlet的多线程问题,即数据不⼀致。

1.解决Servlet多线程同步问题的最好⽅式:去除实例变量,使⽤局部变量。

不使⽤成员变量,⽽使⽤局部变量,因为局部变量在每个线程中都有各⾃的实例。

所以对Servlet来说,如果要对某个变量做写⼊操作,⼀定不要使⽤成员变量,⽽要使⽤局部变量。

2.使⽤同步代码块

synchronized{}

t实现ThreadModel,Servlet2.4中已经废弃了该接⼝,此时Servlet容器将保证Servlet实例以单线程⽅式运

⾏,也就是说,同⼀时刻,只会有⼀个线程执⾏Servlet的service()⽅法。

1.28. ameter()ribute()的区别?

答案:

a、ameter()获取的类型是String;

ribute()获取的类型是Object

b、meter()获取的是POST/GET传递的参数值和URL中的参数;

ribute()获取的是对象容器中的数据值/对象

c、ribute()和ribute()可以发送、接收对象;

答案:

使⽤session技术:

a、在页⾯中⽣成⼀个为⼀个随机值,将其保存到session中,同时将其保存为表单的隐藏域的值。

b、在处理注册的请求时,获取session中的值,获取请求参数的值,⽐较两者是否相同,如果相同说明不是重复提交,请求通过同时删除

session中保存的的值,如果不相同则是重复提交,不能通过。

1.33. 什么是web容器?

答案:

给处于其中的应⽤程序组件(JSP、Servlet)提供⼀个环境,是JSP、Servlet直接跟容器中的变量交互,不必关注其他系统问题。

1.38. sql优化:(索引、范式)

答案:

三范式:

第⼀范式(确保每列保持原⼦性)最基本范式。数据库表中所有字段值都是不可分解的原⼦值,就满⾜了第⼀范式。

第⼆范式(确保表中的每列都和主键相关)在第⼀范式上更近⼀层。确保数据库表中的每⼀列都和主键相关,⽽不能只与主键的某⼀部分相

关,也就是说⼀个表中只能保存⼀种数据,不可以吧多种数据保存在⼀张表中。

第三范式:确保每列都和主键列直接相关,不是间接相关。

索引:

避免对索引字段进⾏计算、避免索引在字段上使⽤not、<>、!=、避免在索引上使⽤IS NULL和NOT NULL、避免在索引列上出现数据类

型转换、避免索引字段使⽤函数、避免建⽴索引的列出现空值

1.39. Ajax原理

答案:

Ajax的⼯作原理相当于在⽤户和服务器之间加了—个中间层,使⽤户操作与服务器响应异步化。并不是所有的⽤户请求都提交给服务器,像—

些数据验证和数据处理等都交给Ajax引擎⾃⼰来做, 只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。

Ajax其核⼼只有JavaScript、XMLHTTPRequest和DOM,在旧的交互⽅式中,由⽤户触发⼀个HTTP请求到服务器,服务器对其进⾏处理后

再返回⼀个新的HTHL页到客户端, 每当服务器处理客户端提交的请求时,客户都只能空闲等待,并且哪怕只是⼀次很⼩的交互、只需从服务器

端得到很简单的⼀个数据,都要返回⼀个完整的HTML页,⽽⽤户每次都要浪费时间和带宽去重新读取整个页⾯。⽽使⽤Ajax后⽤户从感觉上

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的并发性能

答案:

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=“.*” pageEncoding=“gbk”%>”在表头中有

编码格式和导⼊包等

4.也是很好区分的在jsp中⽤<%%>就可以写Java代码了,⽽html没有<%%>

1.52. HTMLServlet的异同

答案:

不同: Html是静态,servlet是动态 html页⾯由服务器直接返回, servlet是⽤来处理客户请求,并返回html页⾯ ,Servlet需要服务器调

⽤servlet⽅法⽣成动态html页⾯,且需要在中配置url路径

1.53. request responsesession application是怎么⽤的

答案:

1、Request是客户端向服务端发送请求

2、Response是服务端对客户端请求做出响应

3、Session在servlet中不能直接使⽤,需要通过getSession()创建,如果没有设定它的⽣命周期,或者通过invildate()⽅法销毁,关闭浏

览器session就会消失

4、Application不能直接创建,存在于服务器的内存中,由服务器创建和销毁

1.54. RequestSession的取值区别,以及出现乱码的解决⽅式(不能在java代码中设置)

答案:

1、Request可以通过getAttribute()⽅法直接取值,也可通过getParameter()取值

2、Session需要通过sion().getAttribute()才能取值

答案:

开启事务注解驱动

事务管理器

开启注解功能,并配置扫描包

配置数据库

配置SQL会话⼯⼚,别名,映射⽂件

不⽤编写Dao层的实现类