1、说一说Servlet的生命周期?
Servlet的生命周期主要由以下三个阶段组成:初始化,服务和销毁。
-
初始化(Initialization): 当一个Servlet被载入到内存中时(例如,第一次访问或者服务器启动并且在web.xml中配置了load-on-startup),Servlet容器(例如Tomcat)就会调用Servlet的
init()
方法进行初始化。此方法在Servlet的生命周期中只被调用一次。 -
服务(Servicing): 一旦Servlet被初始化,对其的每一次请求(例如HTTP请求)Servlet容器都会根据请求类型调用相应的方法(例如
doGet()
,doPost()
等)。这个阶段会重复执行,每次有新的请求时都会被调用。 -
销毁(Destruction): 当Servlet容器需要从内存中移除Servlet实例时(例如服务器关闭或者手动卸载Servlet),就会调用Servlet的
destroy()
方法。它也只在Servlet的生命周期中被调用一次。
举一个应用场景的例子,假设我们有一个用于处理用户登录请求的LoginServlet
。当服务器第一次启动或者第一次收到登录请求时,LoginServlet
会被初始化,调用init()
方法。然后,每当有用户发送登录请求时,LoginServlet
就会调用 doPost()
方法处理这个请求。最后,当服务器关闭或者我们不再需要LoginServlet
时,就会调用destroy()
方法,销毁这个Servlet。
2、Servlet API中forward()与redirect()的区别?
forward()
和 redirect()
都是用于在服务器端处理请求后,将请求/响应转发或重定向到另一个资源(例如另一个 Servlet,或者是一个 HTML 页面等)的方法。但是,它们的工作方式和使用场景有些不同。
1. forward():
forward()
方法是在服务器端进行的,客户端(浏览器)并不知道发生了转发,所以浏览器的 URL 地址栏不会改变。- 转发是在服务器内部进行的,所以它更快,且不需要服务器和客户端之间的额外通信。
- 当使用
forward()
方法时,请求对象和响应对象可以在资源之间共享,这意味着你可以在请求的属性中设置数据,然后在被转发的资源中获取这些数据。
2. redirect():
redirect()
方法是通过向客户端(浏览器)发送一个带有新 URL 的响应来工作的,然后客户端会向这个新 URL 发送一个新的请求。所以,浏览器的URL地址栏会显示新的地址。- 重定向需要服务器和客户端之间的额外通信,所以它比转发稍慢一些。
- 由于
redirect()
会导致新的请求,所以原始请求对象中的数据不会被保留。
举个例子,假设有一个电子商务网站,用户在浏览商品的时候,如果他们未登录,我们可能会使用 forward()
方法将请求转发到登录页面,因为我们需要保留用户原来的请求(即他们浏览的商品),以便在他们登录后可以继续处理。然而,如果用户完成了购物,我们可能会使用 redirect()
方法将他们重定向到一个确认页面,因为我们希望这个确认页面在浏览器的历史记录中有一个单独的条目,这样用户就可以使用浏览器的后退按钮返回到购物页面,而不会再次提交购物请求。
3、request.getAttribute()和 request.getParameter()有何区别?
request.getAttribute()
和 request.getParameter()
是 Java Web 编程中常见的两种方法,它们在 HTTP 请求处理中有着不同的用途和含义。
-
request.getParameter():这个方法是用来获取客户端(通常是一个网页表单)发送的参数。这些参数是通过 GET 或 POST 请求发送的。例如,如果您有一个登录表单,其中包含用户名和密码字段,那么您可以使用
request.getParameter("username")
和request.getParameter("password")
来获取这些字段的值。 -
request.getAttribute():这个方法是用来从请求范围(request scope)获取对象的。当您在处理一个请求时,可以在请求范围内设置对象,然后在稍后的处理阶段或者在 JSP 页面中获取这些对象。例如,一个 Servlet 可以通过
request.setAttribute("data", data)
来设置一个名为 “data” 的属性,然后在 JSP 页面中可以通过${data}
来获取和显示这个对象。
所以,主要的区别在于,getParameter()
是用来获取客户端发送的参数,而 getAttribute()
是用来在服务器端的请求处理过程中共享对象。
举个例子,假设您有一个用来处理用户登录的 Servlet。用户会从一个 HTML 表单中输入他们的用户名和密码,然后这些信息会通过 POST 请求发送到您的 Servlet。在您的 Servlet 中,您可以使用 request.getParameter("username")
和 request.getParameter("password")
来获取这些信息。然后,您可能会验证这些信息,并根据验证结果,将一些信息(如用户对象或错误消息)放入请求范围,以便在转发到不同的 JSP 页面时使用。这就是 request.setAttribute()
和 request.getAttribute()
的用途。
4、jsp静态包含和动态包含的区别
在 JSP 中,包含操作可以是静态的(也被称为编译时包含)或动态的(也被称为运行时包含)。它们的主要区别在于包含操作发生的时间和方式。
-
静态包含:静态包含使用 JSP 指令
<%@ include file="file.jsp" %>
来实现。这种包含在 JSP 页面编译时发生。换句话说,被包含的 JSP 页面的内容在编译时就被插入到主 JSP 页面中,然后作为一个整体一起编译。因此,如果被包含的页面在包含后发生更改,这些更改将不会反映在主页面上,除非主页面重新编译。 -
动态包含:动态包含使用 JSP 动作
<jsp:include page="file.jsp" />
来实现。这种包含在请求处理期间,也就是运行时发生。每次请求主 JSP 页面时,都会执行包含操作,并执行被包含的 JSP 页面的代码。因此,如果被包含的页面在包含后发生更改,这些更改将会在下次请求主页面时反映出来。
举个例子,假设我们有一个网站的头部和尾部是在所有页面上都一样的,我们可以用静态包含将它们包含在每个页面中。但是,如果我们有一个天气小部件,它需要根据当前的天气实时更新,那么我们可能会选择使用动态包含,以确保每次请求页面时都能获取最新的天气信息。
5、MVC的各个部分都有那些技术来实现?如何实现?
MVC(Model-View-Controller)是一种设计模式,用于分离应用程序的数据访问、用户界面和业务逻辑,主要用于简化应用程序的组织和实现。在 Java Web 开发中,通常使用以下技术来实现 MVC 设计模式:
-
Model(模型):模型代表应用程序的数据和业务逻辑。它通常包含与数据库交互的代码,以及处理数据的算法和逻辑。在 Java Web 应用程序中,模型通常由 POJO (Plain Old Java Object) 类来实现,这些类通常与数据库表一一对应。另外,数据访问对象(DAO)和服务层也可以被看作是模型的一部分,用于封装具体的数据库操作和业务逻辑。
在 J