10- 【JavaWeb】Tomcat、Servlet基础

1. Mac OS配置Tomcat服务器教程

Mac OS配置Tomcat服务器教程

2. Servlet 基础

1. 创建 Servlet

Servlet 是一个扩展服务器功能的 Java 类,主要用于处理 HTTP 请求。以下是一个简单的 Servlet 示例:

java 复制代码
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        response.getWriter().write("你好,世界!");
    }
}

它的作用是在接收到特定 HTTP 请求时返回一段简单的 HTML 内容。"@WebServlet("/hello")" 注解将该 Servlet 与 URL 映射关联起来。以下是详细解释:

  1. @WebServlet("/hello"):

    • 这是一个注解,用于将 HelloServlet 类映射到 /hello URL 路径。
    • 当用户访问 http://<服务器地址>/hello 时,服务器会调用这个 Servlet 来处理请求。
  2. public class HelloServlet extends HttpServlet:

    • 这是定义 Servlet 的类,它继承了 HttpServlet,用于处理 HTTP 请求。
    • HttpServlet 是一个专门用来处理 HTTP 请求的抽象类,通常需要重写其中的 doGet()doPost() 方法来处理请求。
  3. @Override protected void doGet(HttpServletRequest request, HttpServletResponse response):

    • 这是重写 HttpServlet 类的 doGet() 方法,用于处理 HTTP GET 请求。
    • HttpServletRequest 对象包含请求的信息,例如 URL 参数、请求头等。
    • HttpServletResponse 对象用于构建和发送响应给客户端。
  4. response.setContentType("text/html"):

    • 设置响应的内容类型为 "text/html",表示返回的是 HTML 格式的内容。
    • 服务器会根据内容类型告诉浏览器如何处理返回的数据。
  5. response.getWriter().write("你好,世界!"):

    • 通过 getWriter() 获取一个输出流,然后使用 write() 方法将字符串内容写入响应。
    • 当用户访问 /hello 时,浏览器会显示 "你好,世界!" 这段文字。

2. 注册和使用 Servlet

在现代 Java Web 开发中,我们使用 @WebServlet 注解来注册一个 Servlet。URL 映射 (/hello) 定义了 Servlet 响应的 URL。除了注解,还可以通过 web.xml 文件来配置。

  • 注解方式(如上示例代码)

  • web.xml 方式

    xml 复制代码
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.example.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

1. 标签

  • HelloServlet :定义该 Servlet 的名字。这里使用了 HelloServlet,但可以根据需要设置其他名称。这在复杂项目中有助于区分不同的 Servlet。
  • com.example.HelloServlet :指定 Servlet 的完整类名(包括包名)。这个类需要继承自 HttpServlet,并且负责处理请求。

2. 标签

  • HelloServlet :将这个 Servlet 映射到先前定义的 HelloServlet 名字上。通过这种方式,web.xml 可以找到并正确定位 Servlet 类。
  • /hello :定义了该 Servlet 对应的 URL 路径。当用户访问 /hello 时,服务器会调用 com.example.HelloServlet 类来处理请求。

工作原理:

  1. 当用户访问 http://<服务器地址>/hello 时,服务器通过 web.xml 文件找到 URL 模式 /hello 对应的 Servlet。
  2. 服务器根据 servlet-mapping 中的 servlet-name 找到对应的 HelloServlet 类。
  3. 最终,服务器将请求交给 com.example.HelloServlet 类处理。

通过 web.xml 文件配置的方式,可以更灵活地管理和维护多个 Servlet,特别是在需要使用不同的 URL 映射时。在早期的 Java Web 应用开发中,web.xml 是主要的配置方式。

3. Servlet 接口的实现

Servlet 接口定义了三个核心的生命周期方法:

  • init(): 初始化方法。
  • service(): 每次请求时调用。
  • destroy(): 在 Servlet 被销毁前执行清理操作。

大多数 Servlet 继承自 HttpServlet,它提供了 service() 的默认实现,并将请求分派给 doGet()doPost() 等方法。

4. @WebServlet 注解详解

@WebServlet 用于将 Servlet 映射到特定的 URL,它支持多个参数:

java 复制代码
@WebServlet(
    name = "HelloServlet", 
    urlPatterns = {"/hello", "/welcome"}, 
    loadOnStartup = 1, 
    initParams = { 
        @WebInitParam(name = "param1", value = "value1") 
    }
)
  • name: Servlet 的可选名称。
  • urlPatterns: 指定该 Servlet 的 URL 模式。
  • loadOnStartup: 表示该 Servlet 的加载优先级。如果设置为 1 或更高值,则会在服务器启动时加载。
  • initParams: 提供初始化参数。

5. 使用 POST 请求实现登录

以下是使用 POST 请求进行登录验证的示例:

java 复制代码
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        // 简单验证
        if("admin".equals(username) && "password".equals(password)) {
            response.sendRedirect("welcome.html");
        } else {
            response.sendRedirect("login.html");
        }
    }
}

6. 文件上传和下载

  • 文件上传 :Servlet 可以使用 MultipartConfig 处理多部分表单数据。
java 复制代码
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Part filePart = request.getPart("file");
        String fileName = filePart.getSubmittedFileName();
        filePart.write("upload/" + fileName);
        response.getWriter().write("文件上传成功!");
    }
}
  • 文件下载
java 复制代码
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String fileName = "example.pdf";
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        
        // 读取文件并将其发送到输出流的代码
    }
}

7. 使用 XHR 请求数据

下面是一个使用 XMLHttpRequest(XHR)从 Servlet 请求数据的示例。

javascript 复制代码
const xhr = new XMLHttpRequest();
xhr.open("GET", "dataServlet", true);
xhr.onreadystatechange = function() {
    if(xhr.readyState === 4 && xhr.status === 200) {
        console.log(xhr.responseText);
    }
};
xhr.send();

Servlet 处理 XHR 请求的示例:

java 复制代码
@WebServlet("/dataServlet")
public class DataServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("application/json");
        response.getWriter().write("{\"message\":\"来自Servlet的数据\"}");
    }
}

8. 重定向与请求转发

  • 重定向:

    java 复制代码
    response.sendRedirect("anotherPage.jsp");
  • 请求转发:

    java 复制代码
    RequestDispatcher dispatcher = request.getRequestDispatcher("anotherPage.jsp");
    dispatcher.forward(request, response);

9. ServletContext

ServletContext 允许多个 Servlet 之间共享信息,并与服务器环境交互。

java 复制代码
public class ContextServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        ServletContext context = getServletContext();
        context.setAttribute("appName", "我的应用");
    }
}

其他 Servlet 可以访问共享信息:

java 复制代码
ServletContext context = getServletContext();
String appName = (String) context.getAttribute("appName");

10. 初始化参数

Servlet 可以通过注解或 web.xml 接收初始化参数。

  • 注解示例

    java 复制代码
    @WebServlet(value = "/initServlet", initParams = {
        @WebInitParam(name = "dbUrl", value = "jdbc:mysql://localhost:3306/test")
    })
    public class InitServlet extends HttpServlet {
        @Override
        public void init() {
            String dbUrl = getServletConfig().getInitParameter("dbUrl");
        }
    }
  • web.xml 示例

    xml 复制代码
    <servlet>
        <servlet-name>InitServlet</servlet-name>
        <servlet-class>com.example.InitServlet</servlet-class>
        <init-param>
            <param-name>dbUrl</param-name>
            <param-value>jdbc:mysql://localhost:3306/test</param-value>
        </init-param>
    </servlet>
相关推荐
Daniel 大东14 分钟前
idea 解决缓存损坏问题
java·缓存·intellij-idea
wind瑞20 分钟前
IntelliJ IDEA插件开发-代码补全插件入门开发
java·ide·intellij-idea
HappyAcmen20 分钟前
IDEA部署AI代写插件
java·人工智能·intellij-idea
马剑威(威哥爱编程)26 分钟前
读写锁分离设计模式详解
java·设计模式·java-ee
鸽鸽程序猿27 分钟前
【算法】【优选算法】前缀和(上)
java·算法·前缀和
修道-032327 分钟前
【JAVA】二、设计模式之策略模式
java·设计模式·策略模式
九圣残炎33 分钟前
【从零开始的LeetCode-算法】2559. 统计范围内的元音字符串数
java·算法·leetcode
当归10241 小时前
若依项目-结构解读
java
hlsd#1 小时前
关于 SpringBoot 时间处理的总结
java·spring boot·后端
iiiiiankor1 小时前
C/C++内存管理 | new的机制 | 重载自己的operator new
java·c语言·c++