1、JSP的内置对象有哪些?
JSP内置对象被称为隐式对象,因为这些对象由JSP容器提供,无需明确声明就可直接使用。以下是JSP提供的9个内置对象及其作用:
request:代表客户端的请求,此对象是javax.servlet.http.HttpServletRequest类的实例。可用于获取客户端发出的请求信息,如参数、头信息等。response:代表对客户端的响应,此对象是javax.servlet.http.HttpServletResponse类的实例。可用于控制发送给客户端的响应,如设置内容类型、字符编码等。pageContext:封装了与JSP页面相关的所有对象,此对象是javax.servlet.jsp.PageContext类的实例。提供对JSP页面范围内所有对象和命名空间的访问,也提供了一些辅助功能。session:代表用户的会话,此对象是javax.servlet.http.HttpSession类的实例。常用于存取跨多个页面或多个请求的用户特定信息。application:代表整个Web应用程序的上下文环境,此对象是javax.servlet.ServletContext类的实例。可用于在应用程序范围内存取数据。out:提供了向客户端输出响应内容的一种方法,此对象是javax.servlet.jsp.JspWriter类的实例。常用于将内容输出到客户端的Web浏览器。config:此对象是javax.servlet.ServletConfig类的实例,提供了关于Servlet配置的信息,如初始化参数。page:此对象是对JSP页面自身的引用,它是java.lang.Object类的实例(实际上是当前Servlet类的实例)。exception:仅在出现错误时,错误页面可以访问此对象。此对象是java.lang.Throwable类的实例。若页面指令属性isErrorPage设为true,则此对象可用。
每个内置对象都有它特定的范围和用途,在编写JSP时,可以灵活使用这些对象来完成对请求的处理和响应的生成。
2、jsp页面之间对象传递的方法。
在JSP页面之间传递对象或数据,可以通过以下几种不同的方法:
-
使用请求参数 (Request Parameters)
- 通过URL或表单提交的请求参数可以在JSP页面之间传递数据。
- 示例:
<a href="nextPage.jsp?param=value">Link</a>
-
使用请求属性 (Request Attributes)
- 在一个请求的范围内,可以设置属性来传递对象。
- 示例:请求转发之前,
request.setAttribute("attributeName", object);然后在另一个JSP页面中,使用request.getAttribute("attributeName");来获取对象。
-
使用会话对象 (Session Object)
- 你可以将对象存储在用户的session中,以便跨多个页面和请求使用。
- 示例:
session.setAttribute("attributeName", object);
-
使用应用上下文 (Application Context)
- 应用上下文中的属性可以被同一Web应用程序中的所有用户和请求访问。
- 示例:
application.setAttribute("attributeName", object);
-
使用Cookie
- 可以创建Cookie来存储数据,并将其发送到客户端浏览器中。这适用于需要跨会话持久存储的小量数据。
- 示例:创建一个新的Cookie对象并将其添加到response中,
Cookie cookie = new Cookie("cookieName", "cookieValue"); response.addCookie(cookie);
-
使用 HttpServletResponse 对象
- 可以在响应中包含某些数据,将其发送回客户端,并在另一个请求中再次取回数据。
- 这可以结合使用隐藏表单字段、URL重写等技术。
-
使用重定向 (Redirection)
- 当使用HTTP重定向时,可以在URL中加入查询字符串来传递简单的数据。
- 注意,使用重定向时创建的是新的请求,所以不能用请求属性来传递对象,因为新的请求不会保持原来的请求属性。
具体使用哪种方法,取决于你的具体需求,比如传递的数据大小、是否跨会话传递数据,以及你关于性能和安全的考虑。通常,Servlet/JSP容器会处理这些对象的序列化和反序列化,从而方便开发者存取数据。
3、jsp有哪些动作?作用分别是什么?
JSP动作用于控制Servlet的行为、实现页面之间的通讯以及使用JavaBean等。以下是一些常见的JSP动作及其作用:
<jsp:include>:包含其他资源,如JSP、HTML页面或Servlet等。在当前JSP执行时,即时包含其他资源的内容到该JSP页面。可以实现页面模块化。<jsp:forward>:将请求转发到另一个资源(如另一个JSP页面、Servlet或HTML文件)。该动作执行后,当前页面不再执行,控制权交给新资源。<jsp:useBean>:查找或实例化一个JavaBean组件(如果指定的bean不存在,则实例化)。通常与<jsp:setProperty>和<jsp:getProperty>配合使用来设置和获取bean属性的值。<jsp:setProperty>:设置存在于当前页面的JavaBean的属性值。如果属性与请求参数同名,还可以自动从请求参数中设置属性值。<jsp:getProperty>:从JavaBean中获取属性的值并自动插入到输出流中,用于展示在页面上。<jsp:param>:与<jsp:include>,<jsp:forward>以及<jsp:plugin>等动作联合使用,用于传递参数。<jsp:plugin>:为客户端浏览器生成适当的HTML代码,以便下载并运行指定的Applet或JavaBean组件。<jsp:element>:动态定义XML元素。此动作能够在运行时生成元素的名字和内容。<jsp:attribute>:用于为动态创建的XML元素定义属性。<jsp:body>:用于指定<jsp:element>,或者其它体标签的体内容。
这些动作提供了一个标准的方式来控制Servlet的行为,而无需在JSP页面中编写Java代码。它们的主要目的是为了简化在JSP页面中执行常见任务的复杂性,使JSP代码更加简明和维护更易。通过这些动作,我们可以有效地利用JSP与JavaBeans的交互、进行页面间的转发和包含来创建动态响应的web页面。
4、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
JSP (Java Server Pages) 和 Servlet 都是 Java EE 规范的一部分,它们用于在Web应用程序中生成动态内容。虽然它们目的相同,但是在使用和执行机制上有所不同。
相同点
- 平台无关性:JSP和Servlet都是用Java编写的,因此它们都能够在任何支持Java的Web服务器上运行。
- 生成动态内容:两者都可以生成动态的Web页面。
- 可以访问相同的对象:JSP和Servlet都可以访问相同的请求和响应对象,并且可以共享数据通过使用相同的上下文(如session和application scope)。
- Web服务器支持:都需要一个支持Java的Web服务器(如 Apache Tomcat)来运行。
不同点
-
设计目的:
- Servlet是用Java编写的服务器端程序,它主要用于处理业务逻辑。
- JSP是以HTML为主的文本文档,它主要用于展现数据,即提供网页的视图部分。
-
编写方式:
- Servlet完全由Java代码组成。
- JSP是HTML中嵌入Java代码,或使用特定的JSP标记和表达式。
-
转换和编译:
- Servlet代码直接被编译成.class文件。
- JSP页面在第一次请求时,被编译成一个Servlet(.java文件),然后编译成.class文件。实际上,JSP就是Servlet的简化形式。
-
易用性与易读性:
- JSP更容易编写,特别是对于页面设计人员和前端开发者来说,因为它更像是编写HTML文档。
- Servlet则适合那些熟悉Java语言的开发者,适合处理更复杂的业务逻辑。
-
修改后更新:
- 对JSP页面的修改可以立即反映出来,只需简单刷新页面,无需重新编译(只要服务器配置了自动编译)。
- 修改Servlet通常需要重新编译Java代码并重启服务器。
他们之间的联系
- 互操作性:在JSP页面中可以使用JavaBean处理业务逻辑,然后通过JSP输出结果;同时,也可以在Servlet中生成业务逻辑,并通过RequestDispatcher将结果转发到JSP页面进行展示。
- 底层实现:实际上,每个JSP页面都会被转换成一个实现了
javax.servlet.jsp.JspPage接口的Java Servlet。 - 功能替代:某些情况下,可以互相替代。即你可以选择仅使用Servlet或JSP来生成整个Web应用程序的响应,虽然这样做并不是最佳实践。
在实际的Web应用开发中,最佳实践是将两者结合使用,利用JSP来负责页面展示,利用Servlet来处理更为复杂的业务逻辑,这样可以将视图层和业务逻辑层分离,使得Web应用程序更容易维护和管理。
5、serverlet的生命周期及各阶段的作用。
Servlet 的生命周期由 Web 容器(如 Tomcat)控制,它通过调用 Servlet 类的特定方法来进行。Servlet 的生命周期主要包括以下三个阶段及其作用:
-
初始化阶段(Initialization)
- 作用:创建 Servlet 实例并为其初始化资源。
- 方法:
init(ServletConfig config)方法在 Servlet 被创建后调用,只执行一次。它接受一个ServletConfig对象,包含 Servlet 的初始化参数。在此方法中,可以执行如打开数据库连接等资源初始化的操作。
-
处理请求阶段(Service/Request Handling)
- 作用:响应客户端请求。
- 方法:
service(ServletRequest req, ServletResponse res)方法是主要的执行点,用于处理来自客户端(通常是浏览器)的请求。每当客户端请求该 Servlet 时,该方法就会被调用一次。它会根据请求的类型(比如 GET 或 POST)进一步调用doGet、doPost、doPut、doDelete等方法。在这些方法中实现了具体的业务逻辑和数据处理。
-
销毁阶段(Destruction)
- 作用:释放 Servlet 占用的资源并进行清理操作。
- 方法:
destroy()方法在 Servlet 生命周期即将结束之前调用,也只调用一次。在这个方法中,可以释放 Servlet 开辟的资源,如关闭数据库连接、清理缓存等。
在 Servlet 的整个生命周期中,init() 方法和 destroy() 方法只会被调用一次,分别标志着 Servlet 对象的创建和销毁。而 service() 方法则会被调用多次,每次处理客户端的请求。Servlet 由容器控制,当需要 Servlet 服务时容器会创建 Servlet 实例,并在不再需要时销毁它。如果 Servlet 已经存在于内存中,容器将重用现有的 Servlet 来处理进来的请求。
Servlet 的这种生命周期设计能够使得资源使用更加高效,因为你不必为每个请求都创建一个新的 Servlet 实例,同时也保证了在销毁前可以清理资源。