Jsp/Servlet面试题总结

1、说一说Servlet生命周期

Servlet的生命周期分为三部分
初始化:Web容器加载servlet,调用init()方法进行初始化。
处理请求:当请求到达时,运行其service()方法。Service()会根据表单的请求类型调用相对doGet()方法或者是doPost()方法。
销毁:当服务器关闭时,调用distroy()方法销毁servlet。

2、get提交和post提交有何区别

get一般用于从服务器上获取数据,post一般用于向服务器传送数据。
get的请求参数是拼接在url后面,可以在浏览器地址栏看见,post是放在http包的包体中。
get方法提交的数据只能是文本,大小不能超过1024个字节,而post不仅可以提交文本还有二进制文件。所以要上传文件,就使用post请求方式。

3、jsp与servlet有什么区别

jsp的本质就是一个servlet 他会被容器转化成servlet,在编译成class文件,调用jspService()处理请求。
jsp注重的是页面展示,servlet注重的是流程控制和事务处理

4、doGet与doPost方法的两个参数是什么

HttpServletRequest:封装了与请求相关的信息
HttpServletResponse:封装了与响应相关的信息

5、request.getAttribute()和request.getParameter的区别?

a.有setAttribute,没有setParameter方法 
b.getParameter获取到的值只能是字符串,不可以是对象,而getAttribute获取到的值是Object类型的。
c.getParameter获取from表单传递过来的值;getAttribute只能获取使用setAttribute设置的值。

6、jsp有哪些内置对象,作用是什么

request:包含用户端请求的信息
response:包含服务器传回客户端的响应信息
session:与请求有关的会话期
pageContext:管理网页属性
application:服务器启动时创建,服务器关闭时停止,为多个应用程序保存信息
out:向客户端输出数据
config:servlet的架构部件
page:指网页本身
exception:针对错误页面才可使用

7、四种会话跟踪技术作用域

page:一个页面
request::一次请求
session:一次会话
application:服务器从启动到停止。

8、JSP中动态INCLUDE和静态INCLUDE有什么区别

(动态包含使用使用page属性实现。)
(静态包含使用<%@include file=””>使用file属性实现。)
Include指令用于把另外一个页面包含到当前页面中,在转换成servlet的时候包含进去的。
动态include用动作实现,它总会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。
静态include用伪码实现,不会检查所包含的文件变化,使用于包含静态页面

9、forward和redirect的区别

请求转发与重定向
请求转发:服务器内部跳转,浏览器地址栏的地址不变,重定向:告诉浏览器,发送二次跳转。
请求转发:可以共享request里面的数据,重定向:不能共享数据。
请求转发:只能在同一个项目跳转,重定向:可以跨域访问。
请求转发:效率高,重定向:效率低。

10、说出JSP的6个动作指令和作用?

jsp:include:在页面被请求的时候引入一个静态或动态的文件。
jsp:useBean:实力化一个对象。
jsp:setProperty:设置对象的属性。
jsp:getProperty:获取对象的属性。
jsp:forward:请求转发。

11、JSP的3种跳转方式

response.sendRedirct( “path” ):请求重定向
页面的路径是相对路径。sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中。 跳转后浏览器地址栏变化。

request.getRequestDispatcher(“path”).forward( request,response ) :请求转发
Servlet页面跳转的路径是相对路径。forward方式只能跳转到本web应用中的页面上。
跳转后浏览器地址栏不会变化。
使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute

12、谈谈Servlet过滤器的作用?

在请求到达servlet之前,执行过滤器,过滤器决定是否执行(可以进行权限控制),可以提前设置一些参数(比如在执行action前设置统一字符集)。
当你在执行一个方法,在这个方法前或方法后执行一些方法(防止重复提交)。

13、谈谈Servlet监听器的作用

对特定的事件进行监听,当产生这些事件的时候,会执行监听器的代码,分为生命周期监听器和数据变化监听器(统计在线人数(监听session)、网站的访问量(request))。

14、请简要描述jstl

JSP标准标签库(JSTL)是一个JSP标签集合,它封装了核心库
c标签,fmt格式化标签,fn字符串处理标签,sql标签,xml标签。Jstl还提供了实现自定义标签功能,方便我们的页面控件编写。

15、如何现实servlet的单线程模式

Jsp修改page指令   <%@ page isThreadSafe=”false”%>,将编译后的servlet实现SingleThreadModel接口。

16、介绍el表达式

EL表达式全名是Expression Language
EL表达式一般操作的是作用域(page、request、session、application)中的属性,使用${标识符}.

17、tomcat如何调优

对jvm的堆的最大值修改为可用内存的80%(修改catalina.bat的相关参数)。
禁用DNS查询(直接使用IP地址访问)。
修改最大线程连接数。
设置超时机制。

18、tomcat部署的方式有几种

1.将web项目文件拷贝到webapps目录中。
2.在tomcat中的conf目录下修改server.xml文件,在host节点中添加标签。并指向项目所在路径。
3.在tomcat中conf\Catalina\localhost目录下添加一个xml文件 文件名可用随意取,并写入一个标签,并指向项目所在路径。
4.用tomcat在线后台管理器,一般tomcat都打开了,直接上传war就可以

0

SpringBoot + websocket 实现模拟设备上下线

之前有做过车联网项目,gps设备都会有上下线检测的功能,但有的时候没有真实设备测试,如何模拟设备上下线呢?可以使用websocket实现,因为它是长连接,性能开销小且通信高效。

下面就直接上代码

pom.xml

DemoApplication.java

WebSocketServer.java

WebSocketConfig.java

application.properties

启动springboot,这时就可以在客户端模拟调用了,就是这个地址

123456789是设备id

问题总结

1.WebSocketServer里是无法通过@autowired或者@resource注入bean的

2.如果是打包成war到外部tomcat运行,则不需要WebSocketConfig.java这个配置类

0

通过文件(.txt、.csv、.sql、.xml)向MySQL表中导入数据总结

准备数据表

txt

准备txt文件

将空值用\N代替,每行数据内的分隔符为\t,行与行之间换行符为\r\n。然后将txt文件存放到/var/lib/mysql-files路径下

继续阅读“通过文件(.txt、.csv、.sql、.xml)向MySQL表中导入数据总结”
0

Linux和Windows系统下分别如何完全卸载MySQL总结

通常我们卸载MySQL的时候,有些配置或者数据文件并不会被删除,所以需要我们再进行有针对性的删除。

Linux下完全卸载MySQL

首先检查是否有安全MySQL

卸载

查询MySQL安装目录

或者

删除对应的MySQL目录

再手动删除配置文件

删除MySQL开机自启服务

最后再检查下

Windows下完全卸载MySQL

1.先停止MySQL服务

开始->所有应用->Windows管理工具->服务,将MySQL服务停止

2.再卸载MySQL

控制面板->所有控制面板项->程序和功能,卸载mysql

3.删除mysql文件夹下的my.ini文件及所有文件

4.运行“regedit”文件,打开注册表

删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL文件夹
删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL文件夹。
删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL的文件夹。
若没有则不用删除。

5.删除C盘下的“C:\ProgramData\MySQL ”文件夹

6.删除服务名

如果已经将MySQL卸载,但通过“开始->所有应用->Windows管理工具->服务”查看到MySQL服务仍然残留在系统服务里。
若想将其删除,可以在cmd里输入”sc delete mysql”命令将服务删除

0

MySQL启动出错InnoDB: Check that you do not already have another mysqld process解决方法

昨天关闭服务器的时候,没有先关闭MySQL,今天再启动MySQL,出现错误

看错误提示,也能猜出个大概,中文意思是请检查您还没有另一个mysqld进程,其他的线程启动已经在运行无法再次创建相关的读文件进程的权限,意思就是,咱们的ibddata文件已经被其它线程读取了,无法再次启动了!

可以通过以下命令来查找已经存在的MySQL进程;

或者,咱们都知道自己MySQL的端口号,一般是3306,也可以输入如下命令:

然后就是杀掉它

最后重启MySQL

MySQL启动成功。

0

MySQL迁移启动报错InnoDB: The innodb_system data file ‘./ibdata1’ is of a different

MySQL机器迁移后,启动出错

报错原因

参数文件中的系统表空间大于实际的系统表空间大小,导致启动报错。

解决办法

将参数文件中系统表空间的大小改为小于实际系统表空间大小的值。

0

SpringBoot里使用log4j2把日志推入kafka

生产环境里,有的时候查看日志不太方便,这时,我们可以把平常输出到控制台里的日志输出到kafka里,再进行相应处理。

pom文件

需要注意的是,排除掉默认的spring-boot-starter-logging,引用spring-boot-starter-log4j2

application.properties

log4j2.xml

Controller

0

Redis的key长度对性能影响分析

Redis的key最大可以多长,太长了对性能会有影响吗?其实这些官方已经给出了解释。

官方解释

Redis keys are binary safe, this means that you can use any binary sequence as a key, from a string like “foo” to the content of a JPEG file. The empty string is also a valid key.

A few other rules about keys:

Very long keys are not a good idea. For instance a key of 1024 bytes is a bad idea not only memory-wise, but also because the lookup of the key in the dataset may require several costly key-comparisons. Even when the task at hand is to match the existence of a large value, hashing it (for example with SHA1) is a better idea, especially from the perspective of memory and bandwidth.

Very short keys are often not a good idea. There is little point in writing “u1000flw” as a key if you can instead write “user:1000:followers”. The latter is more readable and the added space is minor compared to the space used by the key object itself and the value object. While short keys will obviously consume a bit less memory, your job is to find the right balance.

Try to stick with a schema. For instance “object-type:id” is a good idea, as in “user:1000”. Dots or dashes are often used for multi-word fields, as in comment:1234:reply.to or comment:1234:reply-to.

The maximum allowed key size is 512 MB.

正常情况下我们都是用一个字符串作为Redis的key,其实Redis允许使用任何二进制序列作为key,比如像一个JPEG文件的内容。甚至空字符串也是可以的。

关于key使用的一些常识

1.不推荐使用非常长的key。太长的key会造成内存和带宽的浪费。
2.太短的key通常也不推荐使用。比如像这个d1000p,根本看不懂啥意思,可以用device:1000:private代替,可读性更好。
3.最大的key允许512MB

测试Key长度对Redis性能影响

环境

Redis和测试程序都是运行在本地,不看单次的性能,只看不同的长度堆读写性能的影响。

测试方法

使用长度分别为10, 100, 500, 1000, 2500, 5000, 7500, 10,000, and 20,000的key,value长度1000,读写1000次。

从结果来看随着长度的增加,读写的耗时都随之增加。

长度为10:写平均耗时0.053ms,读0.040ms
长度为20000:写平均耗时0.352ms,读0.084ms

测试代码

+2

如何在Win10系统中解决SQL Server2012的error40错误

问题

在与SQL Server建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且SQL Server已配置为允许远程连接。(provider:Named Pipes Provider,error:40)-无法打开到SQL Server的连接)(Microsoft SQL Server,错误:2)
系统找不到指定的文件。

环境

操作系统:Win 10
SQL Server版本:SQL Server2012

解决

开始—>Microsoft SQL Server2012—>配置工具—>SQL Server配置管理器—>找到并单击[SQL Server服务]—>在右边栏里找见并单击[SQL Server(MSSQLSERVER)]—>右击选择[启动]。

0

Node里使用Redis作为MongoDB数据库的中间缓存

MongoDB是世界上最受欢迎的NoSQL数据库之一。 系统的简单性使其易于调整和维护。

当我们在Web服务中使用MongoDB之类的数据库时,我们往往会忽略其中的性能部分。当数据库扩展到一个很大的容量时,它可能会变慢。 原因可能是基础架构设置或系统配置不正确(如无索引等)。 如果您的Web服务器和数据库服务器在不同的系统上运行,那么延迟也会成为问题。 这些都会影响服务的响应时间,从而影响整个应用程序的性能。

为了解决这些问题,我们应该在系统中引入数据库缓存。

什么是缓存

缓存是计算机科学中的一种技术,用于将经常访问的数据存储在临时存储区(称为缓存)中,以减少硬盘驱动器的读写次数。 我们的计算机有一个缓存,浏览器有一个缓存,Web服务器有一个缓存,本文也是从缓存中检索的。缓存无处不在,这种技术可以使您的Web应用程序的性能飞速增长。

工作原理

用户请求您的服务时。 Web服务器首先读取或写入数据库,然后返回响应。 对于缓存,服务器首先检查缓存副本是否存在,如果存在,它将从缓存中返回数据,而不是询问数据库。 它节省了时间和数据库的计算量。

示例应用程序

让我们构建一个简单的网络服务应用程序,该应用程序公开一个API以从MongoDB数据库中读取数据。

让我们开始一个新的项目。

然后运行此命令创建一个Node项目。

让我们下载依赖项。

Node dependencies

主要代码

app.js代码

models.js代码

运行代码并检查其工作情况。

结果

Redis缓存

添加Redis Cache让我们在代码中添加Redis缓存。

更新后的 models.js

在getArticle函数中代码中,我们正在使用ID参数检查缓存是否存在。 如果确实存在,我们将不做进一步处理就返回数据。 如果缓存不存在,我们将在MongoDB中查找该数据并将其添加到缓存中(如果找到)。逻辑很简单并且可以正常工作。再次运行该应用程序并检查工作情况。

保持缓存更新

缓存存在多长时间? 当有新的或更新的数据时会发生什么? 引入缓存时,我们需要解决这样的问题。保留缓存的时间取决于系统。 我将缓存保留了24小时,然后再次对其进行了重建。 根据数据的更新频率,您可能需要1个小时或100个小时。更新数据时,我们只需更新Redis缓存或从Redis中删除条目即可让系统重建缓存。

缓存策略

上面显示的代码库是基本的缓存系统。 不建议将所有内容都放在缓存中,这也会减慢系统速度。 我们只应将这些数据放入对“最受欢迎的文章”有很高要求的缓存中。Redis内置了各种缓存策略,我建议使用LRU(最近最少使用)缓存策略。 此策略将删除最近最少使用的缓存项。启动Redis时,可以将算法作为参数传递。

总结

在本文中,我们研究了缓存及其如何在构建高性能系统中使用。 数据库缓存是一个了不起的概念,越来越多的系统都在使用缓存。

0