Java Web 开发必备:Servlet + JSP 实战应用,构建高可用网站

举报
江南清风起 发表于 2025/05/12 20:29:44 2025/05/12
【摘要】 Java Web 开发必备:Servlet + JSP 实战应用,构建高可用网站在 Java Web 开发领域,Servlet 和 JSP 是构建高可用网站的基石。本文将深入探讨 Servlet + JSP 的实战应用,帮助你掌握这一核心技能。 一、Servlet 与 JSP 的基础概念 (一)ServletServlet 是一种服务器端的 Java 编程小程序,运行在支持 Java 的 ...

Java Web 开发必备:Servlet + JSP 实战应用,构建高可用网站

在 Java Web 开发领域,Servlet 和 JSP 是构建高可用网站的基石。本文将深入探讨 Servlet + JSP 的实战应用,帮助你掌握这一核心技能。

一、Servlet 与 JSP 的基础概念

(一)Servlet

Servlet 是一种服务器端的 Java 编程小程序,运行在支持 Java 的 Web 服务器或应用服务器上。以下是一个简单的 Servlet 示例代码:

import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        response.setContentType("text/html");
        response.getWriter().println("<h1>Hello, Servlet!</h1>");
    }
}

web.xml 文件中进行配置:

<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

当用户访问 /hello 路径时,就会触发 HelloServlet 的 doGet 方法,返回 “Hello, Servlet!” 页面。

(二)JSP

JSP(Java Server Pages)是一种简化页面开发的技术,可以在 HTML 页面中嵌入 Java 代码。示例代码:

如下```jsp
<%@ page contentType=“text/html; charset=UTF-8” %>

<html> <body>

Welcome, JSP!

The time on the server is <%= new.util java.Date() %>.

</body> </html> ```

直接将该 JSP 文件放置在 Web 应用的目录中,访问对应的 URL 就能看到带有服务器时间的页面。

二、Servlet + JSP 的应用实战

(一)用户注册功能

  1. 请求处理(Servlet)
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.HttpServletResponse.http;

public class UserRegisterServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // 这里可以添加用户注册的业务逻辑,如存储到数据库等
        User user = new User(username, password);
        // 假设注册成功
        request.setAttribute("user", user);
        request.getRequestDispatcher("/registerSuccess.jsp").forward(request, response);
    }
}

web.xml 中配置:

<servlet>
    <servlet-name>UserRegisterServlet</servlet-name>
    <servlet-class>UserRegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>UserRegisterServlet</servlet-name>
    <url-pattern>/register</url-pattern>
</servlet-mapping>
  1. 页面展示(JSP)

register.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<body>
    <form action="register" method="post">
        <label>Username:</label>
        <input type="text" name="username"><br>
        <label>Password:</label>
        <input type="password" name="password"><br>
        <input type="submit" value="Register">
    </form>
</body</>
html>

registerSuccess.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<body>
    <h1>Registration Successful!</h1>
    <p>Welcome, ${user.username}!</p>
</body>
</html>

(二)购物车功能

  1. 请求处理(Servlet)
import java.io.IOException;
import java.util;
.ArrayListimport java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class CartServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String action = request.getParameter("action");
        String product = request.getParameter("product");
        HttpSession session = request.getSession(true);

        List<String> cart = (List<String>) session.getAttribute("cart");
        if (cart == null) {
            cart = new ArrayList<>();
            session.setAttribute("cart", cart);
        }

        if ("add".equals(action)) {
            cart.add(product);
            request.setAttribute("message", "Product added to cart: " + product);
        } else if ("remove".equals(action)) {
            if (!cart.isEmpty()) {
                cart.remove(product);
                request.setAttribute("message", "Product removed from cart: " + product);
            } else {
                request.setAttribute("message", "Cart is empty!");
            }
        } else if ("clear".equals(action)) {
            cart.clear();
            request.setAttribute("message", "Cart cleared!");
        }

        request.getRequestDispatcher("/cart.jsp").forward(request, response);
    }
}

web.xml 中配置:

<servlet>
    <servlet-name>CartServlet</servlet-name>
    <servlet-class>CartServlet</servlet-class>
</s>
ervlet<servlet-mapping>
    <servlet-name>CartServlet</servlet-name>
    <url-pattern>/cart</url-pattern>
</servlet-mapping>
  1. 页面展示(JSP)

cart.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<body>
    <h1>Your Cart</h1>
    <p>${message}</p>
    <ul>
        <% 
            List<String> cart = (List<String>) session.getAttribute("cart");
            if (cart != null) {
                for (String product : cart) {
        %>
        <li><%= product %></li>
        <form action="cart" method="get">
            <input type="hidden" name="action" value="remove">
            <input type="hidden" name="product" value="<%= product %>">
            <input type="submit" value="Remove">
        </form>
        <               %
 }
            }
        %>
    </ul>
    <form action="cart" method="get">
        <input type="hidden" name="action" value="clear">
        <input type="submit" value="Clear Cart">
    </form>
    <form action="cart" method="get">
        <input type="hidden" name="action" value="add">
        <input type="text" name="product" placeholder="Enter product name">
        <input type="submit value"="Add to Cart">
    </form>
</body>
</html>

三、优化与提高网站可用性

(一)异常处理

在 Servlet 中添加异常处理代码:

public class ErrorHandlerServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        String servletName = (String) request.getAttribute("javax.servlet.error.servlet_name");
        String requestUri = (String) request.getAttribute("javax.servlet.error.request_uri");

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.print("<html><body>");
        out.print("<h2>System Error</h2>");
        if (statusCode != null) {
            out.print("Error code: " + statusCode + "<br>");
        }
        if (servletName != null) {
            out.print("Servlet name: " + servletName + "<br>");
        }
        if (requestUri != null) {
            out.print("Request URI: " + requestUri + "<br>");
        }
        if (throwable != null) {
            out.print("Exception type: " + throwable.getClass().getName() + "<br>");
            out.print("Message: " + throwable.getMessage());
        }
        out.print("</body></html>");
    }
}

web.xml 中配置:

<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/ErrorHandlerServlet</location>
</error-page>

(二)会话管理

在购物车示例中,我们已经使用了 HttpSession 来管理用户的购物车。可以进一步优化会话管理,设置会话超时时间:

HttpSession session = request.getSession(true);
session.setMaxInactiveInterval(30 * 60); // 30 分钟

(三)性能优化

  1. 对静态资源的处理
    • 可以通过配置 Web 服务器(如 Apache Tomcat)来设置静态资源的缓存策略,减少对静态资源的频繁请求。
    • 例如,在 web.xml 中添加以下配置:
<init-param>
    <param-name>expiresByType</param-name>
    <param-value>
        image/png=access plus 1 week
        image/jpeg=access plus 1 week
        text/css=access plus 1 week
        application/javascript=access plus 1 week
    </param-value>
</init-param>
  1. 数据库连接池
    • 使用数据库连接池可以提高数据库访问的效率。在 Servlet 中可以使用 HikariCP 等开源连接池库。
    • 示例代码:
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class DatabaseUtil {
    private static HikariDataSource dataSource;

    static {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
        config.setUsername("root");
        config.setPassword("password");
        config.setMaximumPoolSize(10);
        dataSource = new HikariDataSource(config);
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

在使用数据库操作时,从连接池中获取连接,操作完成后关闭连接(实际上会将连接归还到连接池)。

四、总结

通过 Servlet + JSP 的组合,我们可以构建出功能丰富、高可用的 Java Web 网站。在实际开发中,要注重异常处理、会话管理和性能优化等方面,以提升网站的质量和用户体验。不断学习和实践新的技术,结合 Servlet + JSP 的基础,能够更好地应对复杂的 Web 开发场景。

image.png

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。