贵阳网站建设葫芦岛,钓鱼网站链接,外包给网站建设注意事项,网站建设太原#x1f345; 作者简介#xff1a;哪吒#xff0c;CSDN2021博客之星亚军#x1f3c6;、新星计划导师✌、博客专家#x1f4aa; #x1f345; 哪吒多年工作总结#xff1a;Java学习路线总结#xff0c;搬砖工逆袭Java架构师 #x1f345; 技术交流#xff1a;定期更新… 作者简介哪吒CSDN2021博客之星亚军、新星计划导师✌、博客专家 哪吒多年工作总结Java学习路线总结搬砖工逆袭Java架构师 技术交流定期更新Java硬核干货不定期送书活动 关注公众号【哪吒编程】回复 1024 获取《10万字208道Java经典面试题总结(附答案)》2024修订版pdf背题更方便一文在手面试我有 目录 1、说说 Servlet 的基本架构2、说一说 Servlet 的生命周期?3、如何实现一个自定义的 servlet4、servlet中有哪些核心类都有什么特点5、什么情况下调用 doGet()和 doPost()6、request.getAttribute() 和 request.getParameter() 有何区别?7、forward 和 redirect 的区别8、jsp 有哪些内置对象作用分别是什么9、jsp 有哪些动作?作用分别是什么?10、JSP 中动态 INCLUDE 与静态 INCLUDE 的区别11、jsp 和 servlet 有什么区别12、说一下 jsp 的 4 种作用域13、session 和 cookie 有什么区别14、如果客户端禁止 cookie 能实现 session 还能用吗15、Token、Cookie、Session的区别16、说一下 session 的工作原理17、http 响应码 301 和 302 代表的是什么有什么区别18、tomcat 如何调优?19、如何增加 tomcat 的连接数20、如何增加Tomcat的内存21、Tomcat 有几种部署方式 1、说说 Servlet 的基本架构
Servlet 是 Java Web 应用程序中处理客户端请求并生成响应的重要组件它的基本架构可以分为以下几个部分
1Servlet 接口
Servlet 接口是所有 Servlet 类必须实现的接口它定义了处理客户端请求的常见方法包括初始化、请求处理和销毁等。在 Servlet 接口中最常见的方法包括 init()、service() 和 destroy()。
2Servlet 容器
Servlet 容器是负责管理和运行 Servlet 的环境可以理解为一个 Web 服务器或者应用服务器。Servlet 容器负责加载、实例化、初始化、调用服务方法和销毁 Servlet 实例。在 Java 中常见的 Servlet 容器包括 Tomcat、Jetty、Undertow 等。
3部署描述符
部署描述符是一个 XML 文件它包含了关于 Servlet 的配置信息包括 Servlet 名称、URL 映射、初始化参数、引入其他 Servlet 或过滤器等。在 Java Web 应用中典型的部署描述符是 web.xml 文件。
4Servlet 类
Servlet 类是实现 Servlet 接口的具体类它负责处理客户端请求并生成响应。在 Servlet 类中通常实现了 init()、service() 和 destroy() 方法也可以覆盖 doGet()、doPost() 等方法来处理不同类型的请求。
5请求和响应对象
在 Servlet 中可以通过请求对象 HttpServletRequest 和响应对象 HttpServletResponse 来与客户端进行通信。请求对象封装了客户端发送的请求信息而响应对象负责生成服务器返回的响应内容。
当客户端发送请求时Servlet 容器会根据部署描述符中的映射信息选择合适的 Servlet 实例来处理请求。Servlet 实例接收到请求后调用其 service() 方法来处理请求并生成响应。然后响应会被发回客户端。
这就是 Servlet 的基本架构它提供了一个在 Java Web 应用程序中处理客户端请求的标准化方式并且可以通过实现不同的 Servlet 类来实现特定的业务逻辑。
2、说一说 Servlet 的生命周期?
Servlet 的生命周期包括的阶段
加载和实例化当容器启动时会根据部署描述符web.xml或注解等配置信息加载并实例化 Servlet。容器会创建 ServletConfig 对象并将部署描述符中的初始化参数传递给 Servlet 实例。
初始化在 Servlet 实例化后容器会调用其 init() 方法来执行一些初始化任务。通常可以在 init() 方法中进行一些初始化操作比如建立数据库连接、加载配置文件等。init() 方法只会在 Servlet 实例第一次被创建时执行一次。
服务请求一旦初始化完成Servlet 就可以响应客户端的请求。当客户端发送请求时Servlet 容器会调用 Servlet 的 service() 方法来处理请求。service() 方法会根据请求类型GET、POST 等来调用相应的 doGet()、doPost() 等方法。这是 Servlet 生命周期中最频繁调用的阶段用来处理客户端的请求并生成响应。
销毁当 Servlet 容器决定将 Servlet 实例销毁时会调用其 destroy() 方法。在 destroy() 方法中可以清理资源比如关闭数据库连接、释放内存等。Servlet 实例销毁时会执行 destroy() 方法代表 Servlet 生命周期的结束。
3、如何实现一个自定义的 servlet
① 创建一个新的 Java 类并让它继承 HttpServlet 类。这样可以确保你的类成为一个 Servlet
② 在你的自定义类中你需要重写 doGet 或 doPost 方法。这些方法将定义你的 Servlet 处理请求的行为
③ 将你的自定义 Servlet 编译成 .class 文件并将它放在 WEB-INF/classes 目录下或者将 .class 文件打包成 .war 文件放在 webapps 目录下。你还需要在 web.xml 文件中配置你的 Servlet。
如下所示
servletservlet-nameMyServlet/servlet-nameservlet-classcom.nezha.MyServlet/servlet-class
/servletservlet-mappingservlet-nameMyServlet/servlet-nameurl-pattern/myservlet/url-pattern
/servlet-mapping根据实际需求你可能需要处理初始化、销毁等其他方法。另外你也可以使用注解来代替 web.xml 的配置。
4、servlet中有哪些核心类都有什么特点
1Servlet 接口
Servlet 接口是所有 servlet 类的基础接口。所有的 Servlet 类都必须实现这个接口并且提供处理客户端请求的逻辑。在 Servlet 接口中定义了一系列的生命周期方法包括 init、service 和 destroy。通过实现这些方法可以在 servlet 实例的生命周期中执行初始化、处理请求和资源销毁等操作。
2HttpServlet
HttpServlet 是 Servlet 的抽象子类它提供了专门用于处理 HTTP 请求的方法。它进一步扩展了 GenericServlet并增加了处理 HTTP GET、POST、PUT、DELETE 等请求的方法。大多数 Web 应用程序中的 Servlet 都是继承自 HttpServlet。
3HttpServletRequest
代表客户端的请求信息包含了请求行、请求头和请求体等信息提供了获取参数、请求头数据、请求属性等方法。
4HttpServletResponse
代表服务器的响应信息用于构建和发送回客户端的响应提供了设置状态码、添加响应头、写入响应体等方法。
5、什么情况下调用 doGet()和 doPost()
当客户端发送的请求使用了 HTTP GET 方法时Servlet 容器会调用 Servlet 的 doGet() 方法来处理该请求。
当客户端发送的请求使用了 HTTP POST 方法时Servlet 容器会调用 Servlet 的 doPost() 方法来处理该请求。
GET请求通常用于请求数据或查询信息它的特点是请求的数据会附加在URL之后并且是可见的。因此GET请求不适合传输敏感信息如密码或银行账户信息。
POST 请求通常用于向服务器发送数据进行数据修改、提交或发送较大的数据等操作。比如向服务器提交表单数据。
6、request.getAttribute() 和 request.getParameter() 有何区别?
request.getParameter() 方法用于获取客户端请求中的查询参数GET 请求或表单参数POST 请求。它返回的是一个字符串类型用于表示指定参数名对应的参数值。
request.getAttribute() 方法用于获取在服务器端范围内共享的数据这些数据通常是通过服务器端代码设置到请求域中的。它返回的是一个 Object 类型的数据因此需要进行类型转换才能使用。通过 request.setAttribute() 方法设置的数据可以在同一个请求中的不同资源如 Servlet、JSP之间共享。
7、forward 和 redirect 的区别
可以从三个方面来回答处理方式、应用场景、效率。
forward是服务器内部的资源转发浏览器地址栏不会发生变化用户无法感知到转发过程。而redirect则是服务端通知客户端进行页面跳转客户端会发起新的请求到指定的URL因此浏览器地址栏会显示新的地址。
forward通常用于需要根据用户角色或其他条件来展示不同内容的情况比如登录后根据用户权限转发到不同的管理页面。而redirect则常用于需要用户重新登录或在完成某项操作后返回上一个页面的场景如注销后重定向到登录页面。
forward由于是服务器内部处理通常效率较高因为它避免了额外的网络请求和响应的延迟。而redirect因为涉及到客户端的多次请求和响应所以效率相对较低。
8、jsp 有哪些内置对象作用分别是什么
request客户端的请求用于获取客户端通过HTTP协议发送到服务器的数据包括请求头、请求参数、请求方式等response服务器的响应用于向客户端发送数据包括设置响应头、发送响应体等out用于向客户端输出内容是JSP页面中的输出流session表示客户端与服务器之间的一次会话用于保存用户的状态信息如用户登录信息、购物车数据等application代表整个Web应用的上下文用于保存全局的信息这些信息在整个Web应用中都是可见的pageContext提供了对JSP页面内各种对象如request、response、session等的访问以及用于查找其他资源的APIconfig用于获取JSP页面的初始化参数和Servlet上下文信息page代表JSP页面本身可以通过它访问JSP页面的属性和方法exception当JSP页面发生异常时该对象会被自动设置为抛出的异常对象允许在JSP页面中处理异常。
9、jsp 有哪些动作?作用分别是什么?
在JSPJava Server Pages中动作Action是一种特殊的标签用于执行特定的操作比如转发请求、包含文件、设置属性等。
include 动作将其他JSP或HTML页面的内容嵌入到当前JSP页面中使得页面可以动态包含其他页面的内容。forward 动作将请求转发到其他资源比如转发到另一个JSP页面或Servlet这样可以共享请求属性并且URL会改变。param 动作用于设置请求参数可以将参数添加到包含或转发的请求中。setProperty 动作用于设置JavaBean属性。getProperty 动作用于获取JavaBean的属性值。useBean 动作用于实例化JavaBean如果JavaBean不存在则创建存在则不创建。plugin 动作用于包含插件一般用于内嵌多媒体对象。jsp:element 动作在JSP页面中生成XML元素。jsp:attribute 动作定义自定义标签的属性并为属性设置默认值。jsp:body 动作在自定义标签中定义标签体的内容。
这些动作能够在JSP页面中实现各种功能如包含内容、转发请求、操作JavaBean等。它们使JSP页面能够更加灵活和强大。
10、JSP 中动态 INCLUDE 与静态 INCLUDE 的区别
1动态 include
动态 include 是通过 jsp:include 动作实现的可以在运行时动态地包含另一个 JSP 页面或 Servlet 的输出。可以根据特定的条件或逻辑来决定包含哪个页面也可以在循环中动态包含不同的页面。使用 jsp:include 标签例如jsp:include page“included.jsp”/
2静态 include
静态 include 是在编译时将指定的 JSP 页面或 HTML 文件合并到当前 JSP 页面中形成一个单一的页面。在 JSP 页面执行之前包含的内容已经静态地合并到当前页面中了。使用 % include file“included.jsp” % 语法其中 file 属性指定要包含的文件。
动态 include 是在运行时进行包含可以动态决定包含哪个页面而静态 include 是在编译时静态地将指定文件的内容合并到当前页面中运行时无法改变包含的内容。具体使用时需要根据实际场景来选择使用动态 include 还是静态 include。
11、jsp 和 servlet 有什么区别
Servlet是用Java编写的服务器端程序它的主要功能是处理客户端的请求并生成动态Web内容。Servlet是Java Web应用的基础负责接收请求、处理请求、生成响应。
JSP本质上是一种特殊的Servlet它允许开发者在HTML页面中直接嵌入Java代码片段scriptlets、JSP动作、JSP指令以及表达式等以生成动态Web页面。JSP的主要目的是使开发者能够更容易地创建动态Web页面而无需编写大量的Java代码。
12、说一下 jsp 的 4 种作用域
1Page作用域
最窄的作用域它仅限于当前的JSP页面。当页面处理完成后存储在page作用域中的任何数据都将被丢弃。此作用域通常用于存储仅在当前页面中使用的临时变量。
2Request作用域
这个作用域涵盖了单个HTTP请求及其对应的响应。在此作用域中定义的任何数据都可以在同一请求中的多个页面之间共享但当请求处理完毕后这些数据就会失效。这适用于跨多个JSP页面传递数据的情况。
3Session作用域
此作用域与特定的用户会话相关联。在一个用户访问网站期间该用户的所有请求都可以访问session作用域中的数据。当用户离开网站或会话超时session中的数据才会被清除。这通常用于存储需要跟踪用户状态的信息比如购物车内容或者登录信息。
4Application作用域
最宽泛的作用域它适用于整个Web应用程序。在此作用域中声明的数据对所有用户和所有请求都是可见的并且在整个应用程序的生命周期内都有效。常用于存储应用程序级别的信息例如配置参数或统计信息。
13、session 和 cookie 有什么区别
Session和Cookie的主要区别在于存储位置、存储容量以及存储有效期。
① 存储位置Cookie数据信息存放在客户端浏览器中而Session的数据信息存放在服务器上。
② 存储容量Cookie的存储容量较小一般不超过4KB而Session的存储容量理论上没有限制但为了服务器性能考虑通常不会存放过多数据。
③ 存储有效期Cookie可以设置为长时间保持甚至可以设置到期时间来实现长期存储而Session的失效时间通常较短一般为会话结束或浏览器关闭时失效。
14、如果客户端禁止 cookie 能实现 session 还能用吗
一般默认情况下在会话中服务器存储 session 的 sessionid 是通过 cookie 存到浏览器里。
如果浏览器禁用了 cookie浏览器请求服务器无法携带 sessionid服务器无法识别请求中的用户身份session失效。
但是可以通过其他方法在禁用 cookie 的情况下可以继续使用session。
通过url重写把 sessionid 作为参数追加的原 url 中后续的浏览器与服务器交互中携带 sessionid 参数。服务器的返回数据中包含 sessionid浏览器发送请求时携带 sessionid 参数。通过 Http 协议其他 header 字段服务器每次返回时设置该 header 字段信息浏览器中 js 读取该 header 字段请求服务器时js设置携带该 header 字段。
15、Token、Cookie、Session的区别
Token 是一种用于认证和授权的令牌通常由服务器生成并发送给客户端。客户端在收到 Token 后将其存储在本地然后在每次需要进行身份验证或授权时使用该 Token。常见的 Token 包括 JWT (JSON Web Token) 和 OAuth Token。Token 在客户端和服务器之间进行持久性的认证和授权通常用于实现跨域身份验证。
Cookie 是一种在客户端中存储的小型文本数据由服务器发送给客户端随后在每次请求中通过 HTTP 头部发送回服务器。通常用于存储用户的身份验证信息、用户设置、浏览历史等。Cookie 是存储在客户端的可以设置过期时间和路径不同页面之间共享。
Session 是服务器端用于存储用户会话状态的机制通常使用 Session ID 来标识用户会话。当用户第一次访问服务器时服务器会为其创建一个 session然后将 session ID 存储在 cookie 或者 URL 中用于在该用户的后续请求中进行身份验证和状态管理。Session 数据存储在服务器端相对于 Cookie 更安全、更难被篡改但也需要服务器维护和消耗更多的资源。
16、说一下 session 的工作原理
① 客户端发送请求当用户发送请求到服务器时服务器会为该用户创建一个唯一识别的 session ID并将其返回给客户端在 HTTP Response Header 中可以使用 Set-Cookie 来设置这个 session ID。通常情况下这个 session ID 会以一个名为 “JSESSIONID” 的 Cookie 存储在客户端。
② 服务器端存储会话数据当服务器收到客户端的请求时会检查请求中是否包含有效的 session ID。如果存在有效的 session ID服务器就会使用这个 session ID 来获取对应的会话数据。如果没有有效的 session ID服务器会创建一个新的 session并为其分配一个新的 session ID。服务器端会针对每个 session ID 维护一个对应的会话数据存储可以存储用户的身份验证信息、用户设置、购物车数据等用户会话相关的信息。
③ 与客户端交互在处理完客户端的请求后服务器会将 session ID 返回给客户端在 HTTP Response Header 中使用 Set-Cookie。客户端会存储这个 session ID在后续的请求中将其包含在 HTTP 请求头中服务器通过 session ID 来识别用户并获取对应的会话数据进行处理。
④ 会话超时和销毁在一定的时间间隔后若用户没有活动服务器可能会认为该会话已经超时并销毁会话数据释放资源。这样可以保证服务器的资源不会被无效的会话占用。
简而言之Session 的工作原理是通过在服务器端创建、存储和管理会话数据并通过在客户端使用 session ID 进行身份验证和状态管理实现用户会话的跟踪和状态维护。
17、http 响应码 301 和 302 代表的是什么有什么区别
http 响应码 301
301表示请求的资源已经永久移动到了一个新的 URL 地址。当服务器返回 301 状态码时它会在响应头中包含一个 Location 属性客户端会根据该属性进行重定向。客户端在后续的请求中会直接请求新的 URL 地址。
http 响应码 302
302示请求的资源暂时性地移动到了一个新的 URL 地址。客户端会在收到响应后根据 Location 头信息跳转到新的 URL。但客户端在后续的请求中会继续请求原来的 URL 地址。302 响应不会被浏览器缓存每次请求时会重新执行跳转。
18、tomcat 如何调优?
调整Tomcat的性能和优化配置是提高Web应用程序性能的重要步骤。
以下是一些优化Tomcat的常见方法
1调整内存分配
将JVM最大堆大小-Xmx和初始堆大小-Xms设置为合适的值以确保应用程序运行期间有足够的内存一般建议堆的最大值设置为可用内存的最大值的 80%。
调整新生代和老年代的比例可以使用参数 -XX:NewSize 和 -XX:MaxNewSize 调整新生代堆大小。
2调整线程池和连接池
配置Tomcat的连接和线程池大小确保它能够处理预期的并发请求可以通过调整 maxThreads、minSpareThreads 和 maxConnections 等参数进行配置。
使用合适的连接池例如对于数据库连接可以使用连接池来管理连接以提高性能和资源利用率。
3启用压缩
启用Tomcat的压缩功能可以通过配置启用GZIP压缩减小传输内容的大小提高性能。
4优化静态资源处理
使用独立的Web服务器如Nginx或Apache作为前置服务器处理静态资源和缓存请求减轻Tomcat服务器负担。
针对Tomcat内置的静态资源缓存可以通过配置添加Expires或Cache-Control响应头来缓存静态资源。
5监控和调整
使用监控工具如JConsole、JVisualVM或者性能工具如VisualVM来监控Tomcat性能识别性能瓶颈并做相应调整。
根据监控结果适时调整JVM和Tomcat的配置参数以优化性能。
19、如何增加 tomcat 的连接数
maxConnections参数决定了Tomcat能够同时处理的最大连接数。在BIO模式下默认最大连接数是它的最大线程数一般设置为200。maxThreads参数表示Tomcat接收客户端请求的最大线程数即同时处理任务的个数。在高并发的I/O密集型应用中这个值可以设置为1000左右以提升处理能力。使用NIO模式因为NIO是非阻塞的IO可以提高Tomcat在高并发环境下的性能。调整acceptCount当线程数量达到maxThreads设置的值时acceptCount决定了所能接受的最大排队数量超过这个值新的请求会被拒绝。如果单个Tomcat实例无法满足需求可以考虑使用负载均衡器将流量分发到多个Tomcat实例。
20、如何增加Tomcat的内存
要增加 Tomcat 的内存你需要调整 Tomcat 运行时的JVM参数。以下是一般步骤
① 找到 Tomcat 的启动脚本
Tomcat 的启动脚本通常位于 bin 目录下具体文件名可能是 catalina.sh (Linux) 或 catalina.bat (Windows)。
② 编辑启动脚本设置 JVM 参数
在启动脚本中找到 JAVA_OPTS 或 CATALINA_OPTS 变量并增加 -Xmx 和 -Xms 参数来分别设置最大堆和初始堆大小。
示例
CATALINA_OPTS“$CATALINA_OPTS -Xms512m -Xmx1024m” 这将会将初始堆大小设置为512MB最大堆大小设置为1024MB。你可以根据实际情况调整这些值。
③ 重启 Tomcat 服务器
保存启动脚本并重启 Tomcat 服务器以应用新的内存设置。
21、Tomcat 有几种部署方式
① 将WAR包或文件夹直接放置到Tomcat的webapps目录下Tomcat会自动解压并部署项目缺点是需要重启项目。
② 不想放在webapps下也可以在Tomcat的server.xml文件中配置标签添加标签来指定项目的WAR包路径。一般采用①。
③ 可以将Tomcat运行在Docker容器中通过Dockerfile或者docker-compose文件来管理和部署应用程序。
④ 可以将 Tomcat 应用部署到云服务提供商如AWS、Azure、Google Cloud等的云服务器上实现灵活的弹性部署按需分配资源。 3万字80道Java经典面试题总结2024修订版- Java基础篇
2 万字 42 道Java经典面试题总结2024修订版- Java集合篇
4 万字 102 道Java经典面试题总结2024修订版- 多线程篇
10万字208道Java经典面试题总结2024修订版- SSM篇 文章收录于100天精通Java从入门到就业
全网最细Java零基础手把手入门教程系列课程包括Java基础、Java8新特性、Java集合、高并发、性能优化等适合零基础和进阶提升的同学。
哪吒多年工作总结Java学习路线总结搬砖工逆袭Java架构师。 华为OD机试 2023B卷题库疯狂收录中刷题点这里 刷的越多抽中的概率越大每一题都有详细的答题思路、详细的代码注释、样例测试发现新题目随时更新全天CSDN在线答疑。