ToB企服应用市场:ToB评测及商务社交产业平台

标题: 深入明白 Servlet:从基础概念到高级特性与实战应用 [打印本页]

作者: 宝塔山    时间: 2024-12-25 09:07
标题: 深入明白 Servlet:从基础概念到高级特性与实战应用
一、Servlet简介与工作原理

Servlet是Java Web开辟中的重要组件,它运行在服务器端,用于处理客户端的哀求并返回响应。其工作原理涉及多个组件和步调,从客户端发起哀求到服务器端的处理和响应,整个过程井然有序地进行。
(一)Servlet容器与Tomcat

Servlet容器是Servlet运行的环境,负责管理Servlet的生命周期、资源分配和哀求处理等工作。Tomcat是常用的Servlet容器之一,它具有强大的功能和良好的性能。在Tomcat中,Context容器直接管理Servlet的包装类Wrapper,一个Context对应一个Web工程。比方,在Tomcat的配置文件中,可以通过标签来配置Web应用的相关参数,如路径、文档库等。
(二)Servlet的生命周期

  1. public void init(ServletConfig config) throws ServletException {
  2.     super.init(config);
  3.     // 在这里进行初始化操作,如获取初始化参数
  4.     String paramValue = config.getInitParameter("paramName");
  5.     // 其他初始化逻辑
  6. }
复制代码
  1. protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2.     // 获取用户名和密码
  3.     String username = request.getParameter("username");
  4.     String password = request.getParameter("password");
  5.     // 进行登录验证等业务逻辑处理
  6.     if (isValidUser(username, password)) {
  7.         response.getWriter().println("登录成功");
  8.     } else {
  9.         response.getWriter().println("登录失败");
  10.     }
  11. }
复制代码
  1. public void destroy() {
  2.     // 释放资源的逻辑,如关闭数据库连接
  3.     if (connection!= null) {
  4.         try {
  5.             connection.close();
  6.         } catch (SQLException e) {
  7.             e.printStackTrace();
  8.         }
  9.     }
  10.     super.destroy();
  11. }
复制代码
(三)Servlet的体系结构

Servlet规范基于几个关键类运转,其中ServletConfig、ServletRequest和ServletResponse与Servlet自动关联。ServletConfig在初始化时传递给Servlet,用于获取Servlet的配置属性;ServletRequest和ServletResponse在哀求处理时传递给Servlet,分别用于获取哀求信息和设置响应信息。
在Tomcat容器中,存在门面计划模式的应用。比方,StandardWrapper和StandardWrapperFacade实现了ServletConfig接口,传给Servlet的是StandardWrapperFacade对象,它能包管Servlet获取到所需数据而不暴露无关数据。同样,ServletContext也有类似结构,Servlet中获取的实际对象是ApplicationContextFacade,用于获取应用的相关信息。
二、Servlet的基本利用与配置

(一)创建Servlet类

创建Servlet类需要继承HttpServlet类并重写相应方法。比方,创建一个简单的HelloWorldServlet:
  1. import javax.servlet.ServletException;
  2. import javax.servlet.http.HttpServlet;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5. import java.io.IOException;
  6. import java.io.PrintWriter;
  7. public class HelloWorldServlet extends HttpServlet {
  8.     @Override
  9.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  10.         // 设置响应内容类型为HTML
  11.         response.setContentType("text/html");
  12.         // 获取输出流对象
  13.         PrintWriter out = response.getWriter();
  14.         // 输出HTML内容
  15.         out.println("<html><body>");
  16.         out.println("<h1>Hello, World!</h1>");
  17.         out.println("</body></html>");
  18.     }
  19. }
复制代码
(二)在web.xml中配置Servlet

在web.xml文件中,需要配置Servlet的相关信息,包罗名称、类名、初始化参数和映射路径等。以下是上述HelloWorldServlet的配置示例:
  1. <servlet>
  2.     <servlet-name>HelloWorldServlet</servlet-name>
  3.     <servlet-class>com.example.HelloWorldServlet</servlet-class>
  4.     <init-param>
  5.         <param-name>greeting</param-name>
  6.         <param-value>Hello!</param-value>
  7.     </init-param>
  8. </servlet>
  9. <servlet-mapping>
  10.     <servlet-name>HelloWorldServlet</servlet-name>
  11.     <url-pattern>/hello</url-pattern>
  12. </servlet-mapping>
复制代码
(三)Servlet与JSP的关系

JSP本质上是Servlet的扩展,JSP页面在第一次被访问时会被翻译成Servlet并执行。在Tomcat中,通过JspServlet来处理JSP页面的翻译工作,其在conf/web.xml中有相应的配置,会拦截全部以.jsp或.jspx为后缀的哀求并进行翻译。比方,一个简单的JSP页面:
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>JSP Example</title>
  6. </head>
  7. <body>
  8.     <%
  9.     // 这里可以嵌入Java代码
  10.     String message = "This is a JSP page.";
  11.     %>
  12.     <h1><%=message%></h1>
  13. </body>
  14. </html>
复制代码
当访问该JSP页面时,Tomcat会将其翻译成对应的Servlet类并执行,终极将生成的HTML内容返回给客户端。
三、Servlet 3.0新特性详解

(一)异步处理支持

  1. @WebServlet(urlPatterns = "/asyncDemo", asyncSupported = true)
  2. public class AsyncDemoServlet extends HttpServlet {
  3.     @Override
  4.     public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
  5.         resp.setContentType("text/html;charset=UTF-8");
  6.         PrintWriter out = resp.getWriter();
  7.         out.println("进入Servlet的时间:" + new Date() + ".");
  8.         out.flush();
  9.         // 启动异步处理
  10.         AsyncContext ctx = req.startAsync();
  11.         // 执行异步业务逻辑
  12.         new Thread(new AsyncTask(ctx)).start();
  13.         out.println("结束Servlet的时间:" + new Date() + ".");
  14.         out.flush();
  15.     }
  16. }
  17. class AsyncTask implements Runnable {
  18.     private AsyncContext ctx;
  19.     public AsyncTask(AsyncContext ctx) {
  20.         this.ctx = ctx;
  21.     }
  22.     @Override
  23.     public void run() {
  24.         try {
  25.             // 模拟耗时业务操作,这里等待5秒
  26.             Thread.sleep(5000);
  27.             PrintWriter out = ctx.getResponse().getWriter();
  28.             out.println("业务处理完毕的时间:" + new Date() + ".");
  29.             out.flush();
  30.             ctx.complete();
  31.         } catch (Exception e) {
  32.             e.printStackTrace();
  33.         }
  34.     }
  35. }
复制代码
(二)新增的注解支持

  1. @WebServlet(urlPatterns = {"/demoServlet"}, asyncSupported = true, loadOnStartup = 1, name = "DemoServlet", displayName = "DS", initParams = {@WebInitParam(name = "param1", value = "value1")})
  2. public class DemoServlet extends HttpServlet {...}
复制代码
  1. @WebFilter(servletNames = {"DemoServlet"}, filterName = "DemoFilter")
  2. public class DemoFilter implements Filter {...}
复制代码
  1. @WebListener("This is a demo listener")
  2. public class SimpleListener implements ServletContextListener {...}
复制代码
  1. @MultipartConfig(fileSizeThreshold = 1024 * 1024, location = "/tmp/uploads", maxFileSize = 1024 * 1024 * 5, maxRequestSize = 1024 * 1024 * 10)
  2. @WebServlet("/uploadServlet")
  3. public class UploadServlet extends HttpServlet {...}
复制代码
(三)可插性支持

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-fragment xmlns="http://java.sun.com/xml/ns/javaee"
  3.                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0"
  4.                xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3.0.xsd"
  5.                metadata-complete="true">
  6.     <servlet>
  7.         <servlet-name>FragmentServlet</servlet-name>
  8.         <servlet-class>com.example.FragmentServlet</servlet-class>
  9.     </servlet>
  10.     <servlet-mapping>
  11.         <servlet-name>FragmentServlet</servlet-name>
  12.         <url-pattern>/fragment</url-pattern>
  13.     </servlet-mapping>
  14. </web-fragment>
复制代码
(四)ServletContext的性能增强

  1. ServletContext context = getServletContext();
  2. ServletRegistration.Dynamic dynamicServlet = context.addServlet("DynamicServlet", DynamicServlet.class);
  3. dynamicServlet.addMapping("/dynamic");
  4. dynamicServlet.setLoadOnStartup(2);
复制代码
(五)HttpServletRequest对文件上传的支持

  1. @WebServlet("/upload")
  2. @MultipartConfig
  3. public class FileUploadServlet extends HttpServlet {
  4.     @Override
  5.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  6.         Part filePart = request.getPart("file");
  7.         if (filePart!= null) {
  8.             filePart.write("/tmp/uploadedFile.txt");
  9.             response.getWriter().println("文件上传成功");
  10.         } else {
  11.             response.getWriter().println("没有选择文件上传");
  12.         }
  13.     }
  14. }
复制代码
四、Servlet在实际应用中的场景与案例分析

(一)在Web应用中的常见应用场景

(二)案例分析:利用Servlet实现简单的用户登录系统

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>Login Page</title>
  6. </head>
  7. <body>
  8.     <h1>Login</h1>
  9.     <form action="login" method="post">
  10.         <label for="username">Username:</label><input type="text" id="username" name="username">
  11.         <label for="password">Password:</label><input type="password" id="password" name="password">
  12.         <input type="submit" value="Login">
  13.     </form>
  14. </body>
  15. </html>
复制代码
  1. import javax.servlet.ServletException;
  2. import javax.servlet.http.HttpServlet;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5. import java.io.IOException;
  6. import java.io.PrintWriter;
  7. public class LoginServlet extends HttpServlet {
  8.     @Override
  9.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  10.         // 设置响应内容类型为HTML
  11.         response.setContentType("text/html");
  12.         // 获取输出流对象
  13.         PrintWriter out = response.getWriter();
  14.         // 获取用户名和密码
  15.         String username = request.getParameter("username");
  16.         String password = request.getParameter("password");
  17.         // 假设这里进行简单的用户名和密码验证,实际应用中应与数据库比对
  18.         if ("admin".equals(username) && "123456".equals(password)) {
  19.             // 登录成功,跳转到欢迎页面
  20.             response.sendRedirect("welcome.jsp");
  21.         } else {
  22.             // 登录失败,返回错误提示
  23.             out.println("<html><body>");
  24.             out.println("<h1>Login Failed</h1>");
  25.             out.println("<p>Invalid username or password.</p>");
  26.             out.println("</body></html>");
  27.         }
  28.     }
  29. }
复制代码
  1. <servlet>
  2.     <servlet-name>LoginServlet</servlet-name>
  3.     <servlet-class>com.example.LoginServlet</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6.     <servlet-name>LoginServlet</servlet-name>
  7.     <url-pattern>/login</url-pattern>
  8. </servlet-mapping>
复制代码
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>Welcome</title>
  6. </head>
  7. <body>
  8.     <h1>Welcome, <%= request.getParameter("username") %>!</h1>
  9. </body>
  10. </html>
复制代码
通过这个案例,可以看到Servlet在处理用户哀求、验证用户身份以及控制页面跳转等方面的实际应用,它是构建Java Web应用的重要基础组件,在实际开辟中还有更多复杂和高级的应用场景等待开辟者去探索和实践。
五、总结与展望

Servlet作为Java Web开辟的焦点技术之一,在服务器端处理哀求和生成响应方面有着不可替代的作用。从其基本的工作原理、生命周期到配置利用,再到Servlet 3.0带来的一系列新特性,都为Java Web开辟提供了更强大、更灵活的工具。在实际应用中,它广泛应用于各种Web系统的构建,从简单的网站到复杂的企业级应用。随着技术的不停发展,Servlet也在不停演进,未来大概会在性能优化、与新兴技术的融合等方面有更多的突破,开辟者需要持续关注其发展动态,以便更好地利用Servlet构建高效、稳定的Web应用。
作者:代老师的编程课
出处:https://zthinker.com/
如果你喜欢本文,请长按二维码,关注 Java码界探秘
.


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4