-
什么是servlet?
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
-
Servlet 架构
-
Servlet 任务
- 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
- 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
- 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
- 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
- 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
-
Servlet 生命周期
- Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
- Servlet 初始化后调用 init () 方法,在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。
- Servlet 调用 service() 方法来处理客户端的请求,调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
- Servlet 销毁前调用 destroy() 方法,destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
-
Servlet 实例
// 导入必需的 java 库 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // 扩展 HttpServlet 类 public class HelloWorld extends HttpServlet { private String message; public void init() throws ServletException { // 执行必需的初始化 message = "Hello World"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容类型 response.setContentType("text/html"); // 实际的逻辑是在这里 PrintWriter out = response.getWriter(); out.println("<h1>" + message + "</h1>"); } public void destroy() { // 什么也不做 } } Servlet 部署(web.xml): <web-app> <servlet> <servlet-name>HelloWorld</servlet-name> <servlet-class>HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/HelloWorld</url-pattern> </servlet-mapping>
-
ServleContext
代表了当前Web应用程序的上下文(Context)。
这个上下文包括了整个Web应用程序的信息,可以被Web应用中的所有Servlet共享。
可以将ServletContext看作是一个全局存储区,用于存储和访问Web应用中的全局数据和资源。-
获取:
-
通过Servlet的getServletContext方法
ServletContext context = getServletContext();
- 通过ServletConfig的getServletContext方法
ServletContext context = getServletConfig().getServletContext();
- 应用
- 共享数据
可以在ServletContext中存储全局配置信息、共享的数据库连接池、全局计数器等。这些数据可以在不同的Servlet之间共享,而不仅仅在同一个Servlet内部。
context.setAttribute("counter", counter); //不同的servlet可以获取值 int counter = (int) context.getAttribute("counter");
- 访问资源文件
允许访问Web应用程序中的资源文件,如HTML、CSS、JavaScript等。这意味着可以轻松地在不同的Servlet中引用这些资源。
ServletContext context = getServletContext(); InputStream cssStream = context.getResourceAsStream("/css/styles.css");
- 获取初始化参数
可以在web.xml文件中配置初始化参数,然后使用ServletContext获取它们。可以在应用程序级别配置和定制自己的应用程序。
在web.xml中配置初始化参数: <context-param> <param-name>databaseUrl</param-name> <param-value>jdbc:mysql://localhost/mydb</param-value> </context-param> 在Servlet中获取初始化参数: ServletContext context = getServletContext(); String dbUrl = context.getInitParameter("databaseUrl");
- 设置全局上下文属性
设置全局上下文属性,这些属性可以在整个Web应用程序中使用。这些属性可以用于存储应用程序的配置信息、状态信息或其他全局数据。
设置一个全局上下文属性来存储应用程序的名称: ServletContext context = getServletContext(); context.setAttribute("appName", "MyWebApp"); 在其他Servlet中,可以获取这个全局属性: ServletContext context = getServletContext(); String appName = (String) context.getAttribute("appName");
- 获取Web应用程序信息
ServletContext提供了许多方法来获取关于Web应用程序的信息,如Web应用程序的名称、服务器信息、Servlet API版本等。
ServletContext context = getServletContext(); String appName = context.getServletContextName(); String serverInfo = context.getServerInfo(); int majorVersion = context.getMajorVersion(); int minorVersion = context.getMinorVersion();
- 获取文件路径
通过ServletContext,可以获取Web应用程序中的文件的绝对路径。这对于读取和写入文件非常有用。
ServletContext context = getServletContext(); String realPath = context.getRealPath("/WEB-INF/config.properties"); File file = new File(realPath);
- 获取资源路径
获取Web应用程序中的资源文件的URL路径。这对于构建链接和访问资源文件非常有用。
ServletContext context = getServletContext(); URL resourceUrl = context.getResource("/images/logo.png");
-