Servlets - 问题与解答
Java Servlet 是在 Web 或应用程序服务器上运行的程序,充当来自 Web 浏览器或其他 HTTP 客户端的请求与 HTTP 服务器上的数据库或应用程序之间的中间层。
与 CGI 相比,Servlet 具有多项优势。
性能明显更好。
Servlet 在 Web 服务器的地址空间内执行。没有必要创建单独的进程来处理每个客户端请求。
Servlet 是独立于平台的,因为它们是用 Java 编写的。
服务器上的 Java 安全管理器强制执行一组限制来保护服务器计算机上的资源。因此 servlet 是值得信赖的。
Servlet 可以使用 Java 类库的全部功能。它可以通过您已经看到的套接字和 RMI 机制与小程序、数据库或其他软件进行通信。
Servlet 执行以下主要任务:
读取客户端(浏览器)发送的显式数据。这包括网页上的 HTML 表单,也可能来自小程序或自定义 HTTP 客户端程序。
读取客户端(浏览器)发送的隐式 HTTP 请求数据。这包括浏览器理解的 cookie、媒体类型和压缩方案等。
处理数据并生成结果。此过程可能需要与数据库对话、执行 RMI 或 CORBA 调用、调用 Web 服务或直接计算响应。
将显式数据(即文档)发送到客户端(浏览器)。此文档可以采用多种格式发送,包括文本(HTML 或 XML)、二进制(GIF 图像)、Excel 等。
将隐式 HTTP 响应发送到客户端(浏览器)。这包括告诉浏览器或其他客户端返回什么类型的文档(例如 HTML)、设置 cookie 和缓存参数以及其他此类任务。
servlet 生命周期可以定义为从创建到销毁的整个过程。以下是 servlet 所遵循的路径。
通过调用 init () 方法来初始化 servlet。
servlet 调用 service() 方法来处理客户端的请求。
通过调用 destroy() 方法终止 servlet。
最后,servlet 由 JVM 的垃圾收集器进行垃圾收集。
init 方法设计为仅调用一次。它在 servlet 首次创建时被调用,并且不会在每个用户请求时再次调用。因此,它用于一次性初始化,就像小程序的 init 方法一样。
每次服务器收到对 servlet 的请求时,服务器都会生成一个新线程并调用服务。 service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等)并根据需要调用 doGet、doPost、doPut、doDelete 等方法。
GET 请求来自对 URL 的正常请求或来自未指定 METHOD 的 HTML 表单,应由 doGet() 方法处理。
POST 请求来自明确将 POST 列为 METHOD 的 HTML 表单,应由 doPost() 方法处理。
destroy() 方法在 servlet 生命周期结束时仅被调用一次。
init() 方法只是创建或加载一些将在 servlet 的整个生命周期中使用的数据。
此方法使您的 servlet 有机会关闭数据库连接、暂停后台线程、将 cookie 列表或命中计数写入磁盘以及执行其他此类清理活动。
此方法应用于从服务器获取数据。
此方法应用于在服务器上处理数据。
service() 方法是执行实际任务的主要方法。servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求并将格式化的响应写回客户端。
每次服务器收到 servlet 请求时,服务器都会生成一个新线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等)并根据需要调用 doGet、doPost、doPut、doDelete 等方法。
这是此方法的签名:
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{ }
service()方法由容器调用,service方法会根据需要调用doGe、doPost、doPut、doDelete等方法。因此,您无需处理 service() 方法,但可以根据从客户端收到的请求类型覆盖 doGet() 或 doPost()。
Servlet 根据情况使用以下方法自动处理表单数据解析:
getParameter(): 您调用 request.getParameter() 方法来获取表单参数的值。
getParameterValues(): 如果参数出现多次并返回多个值(例如复选框),请调用此方法。
getParameterNames(): 如果您想要当前请求中所有参数的完整列表,请调用此方法。
HttpServletRequest 的 getParameterNames() 方法返回当前请求中所有参数的完整列表。此方法返回一个枚举,其中包含未指定顺序的参数名称。
一旦我们有了枚举,我们就可以以标准方式循环枚举,使用 hasMoreElements() 方法确定何时停止,并使用 nextElement() 方法获取每个参数名称。
我们可以使用 HttpServletRequest 的 getHeaderNames() 方法来读取 HTTP 标头信息。此方法返回一个枚举,其中包含与当前 HTTP 请求相关的标头信息。
一旦我们有了枚举,我们就可以以标准方式循环枚举,使用 hasMoreElements() 方法确定何时停止,并使用 nextElement() 方法获取每个参数名称。
当浏览器请求网页时,它会向 Web 服务器发送大量信息,这些信息无法直接读取,因为这些信息作为 HTTP 请求标头的一部分传输。HTTPServletRequest 代表此 HTTP 请求。
当Web服务器响应浏览器的HTTP请求时,响应通常由状态行,一些响应头,一个空白行和文档组成。HTTPServletResponse代表此HTTP响应。
使用请求获取PrintWriter的对象。
PrintWriter out = response.getWriter();
现在打印html。
out.println("Hello World");
我们可以使用 HttpServletResponse 的 setStatus(statuscode) 方法发送身份验证错误。
// 设置错误代码和原因。 response.sendError(407, "需要身份验证!!!" );
页面重定向通常用于当文档移动到新位置并且我们需要将客户端发送到此新位置或者可能是由于负载平衡或简单的随机化时。 将请求重定向到另一个页面的最简单方法是使用响应对象的 sendRedirect() 方法。
此方法生成 302 响应以及提供新文档 URL 的 Location 标头。
此方法发送状态代码(通常为 404)以及在 HTML 文档中自动格式化并发送到客户端的短消息。
Servlet 过滤器是 Java 类,可用于 Servlet 编程,目的如下:
在客户端访问后端资源之前拦截客户端的请求。
在服务器响应返回客户端之前对其进行处理。
规范建议使用各种类型的过滤器:
身份验证过滤器。
数据压缩过滤器。
加密过滤器。
触发资源访问的过滤器事件。
图像转换过滤器。
日志记录和审计过滤器。
MIME-TYPE 链过滤器。
标记化过滤器。
转换 XML 内容的 XSL/T 过滤器。
过滤器部署在部署描述符文件 web.xml 中,然后映射到应用程序部署描述符中的 servlet 名称或 URL 模式。
此方法由 Web 容器调用,以向过滤器指示它正在投入服务。
每次由于客户端请求链末尾的资源而使请求/响应对通过链时,容器都会调用此方法。
Web 容器调用此方法,以向过滤器指示它正在退出服务。
Yes.
可以。web.xml 中的 filter-mapping 元素的顺序决定了 Web 容器将过滤器应用于 servlet 的顺序。要反转过滤器的顺序,您只需反转 web.xml 文件中的 filter-mapping 元素即可。
使用 web.xml 中的 error-page 元素指定对某些异常或 HTTP 状态代码的 servlet 调用。
如果您想为所有异常设置一个通用错误处理程序,那么您应该定义以下错误页面,而不是为每个异常定义单独的错误页面元素:
<error-page> <exception-type>java.lang.Throwable</exception-type > <location>/ErrorHandler</location> </error-page>
Cookie 是存储在客户端计算机上的文本文件,用于各种信息跟踪目的。Java Servlet 透明地支持 HTTP Cookie。
使用 servlet 设置 Cookie 涉及三个步骤:
(1) 创建 Cookie 对象:使用 Cookie 名称和 Cookie 值调用 Cookie 构造函数,这两个都是字符串。
Cookie cookie = new Cookie("key","value");
请记住,名称和值都不应包含空格或以下任何字符: [ ] ( ) = , " / ? @ : ;
(2) 设置最大年龄:使用 setMaxAge 指定 cookie 的有效时间(以秒为单位)。以下将设置一个 24 小时的 cookie。
cookie.setMaxAge(60*60*24);
(3) 将 Cookie 发送到 HTTP 响应标头:使用 response.addCookie 在 HTTP 响应标头中添加 cookie,如下所示:
response.addCookie(cookie);
要读取 cookie,您需要通过调用 HttpServletRequest 的 getCookies( ) 方法创建一个 javax.servlet.http.Cookie 对象数组。然后循环遍历该数组,并使用 getName() 和 getValue() 方法访问每个 cookie 及其关联值。
删除 cookie 非常简单。如果您想要删除一个 cookie,那么您只需执行以下三个步骤:
读取已经存在的 cookie 并将其存储在 Cookie 对象中。
使用 setMaxAge() 方法将 cookie 年龄设置为零以删除现有 cookie。
将此 cookie 重新添加到响应标头中。
会话提供了一种在多个页面请求或网站访问中识别用户并存储有关该用户的信息的方法。会话在用户的多个连接或页面请求中持续指定的时间段。
您可以在每个 URL 的末尾附加一些额外的数据来标识会话,并且服务器可以将该会话标识符与其存储的有关该会话的数据相关联。 例如,对于 http://tutorialspoint.com/file.htm;sessionid=12345,会话标识符附加为 sessionid=12345,可以在 Web 服务器上访问该标识符以识别客户端。
您可以通过调用 HttpServletRequest 的公共方法 getSession() 来获取 HttpSession 对象,如下所示:
// 如果尚未创建会话对象,则创建一个。 HttpSession session = request.getSession();
处理完用户会话数据后,您有多种选择:
删除特定属性:您可以调用 public void removeAttribute(String name) 方法来删除与特定键关联的值。
删除整个会话:您可以调用 public void invalidate() 方法来丢弃整个会话。 设置会话超时:您可以调用 public void setMaxInactiveInterval(int interval) 方法单独设置会话的超时时间。
注销用户:在支持 servlet 2.4 的服务器中,您可以调用 logout 将客户端从 Web 服务器注销,并使所有用户的所有会话无效。
HTTPSession 对象的 setAttribute(String name, Object value) 使用指定的名称将对象绑定到此会话,并可用于更新会话中的属性。
HTTPSession 对象的 setMaxInactiveInterval(int interval) 指定客户端请求之间的时间(以秒为单位),超过此时间 servlet 容器将使此会话无效。
刷新网页的最简单方法是使用响应对象的 setIntHeader() 方法。
这意味着允许网站提供翻译成访问者语言或国籍的不同版本的内容。
这意味着向网站添加资源以使其适应特定的地理或文化区域,例如将印地语翻译到网站。
这是一个特定的文化或地理区域。它通常被称为语言符号,后跟国家符号,中间用下划线分隔。例如"en_US"代表美国的英语语言环境。
以下是请求对象的方法,它返回 Locale 对象。
java.util.Locale request.getLocale()
以下方法返回适合显示给用户的语言环境国家名称。
String getDisplayCountry()