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("

Hello, Servlet!

");

}

}

在 web.xml 文件中进行配置:

HelloServlet

HelloServlet

HelloServlet

/hello

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

(二)JSP

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

如下```jsp

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

Welcome, JSP!

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

```

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

二、Servlet + JSP 的应用实战

(一)用户注册功能

请求处理(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 中配置:

UserRegisterServlet

UserRegisterServlet

UserRegisterServlet

/register

页面展示(JSP)

register.jsp:

<%@ page contentType="text/html; charset=UTF-8" %>



html>

registerSuccess.jsp:

<%@ page contentType="text/html; charset=UTF-8" %>

Registration Successful!

Welcome, ${user.username}!

(二)购物车功能

请求处理(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 cart = (List) 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 中配置:

CartServlet

CartServlet

ervlet

CartServlet

/cart

页面展示(JSP)

cart.jsp:

<%@ page contentType="text/html; charset=UTF-8" %>

Your Cart

${message}

    <%

    List cart = (List) session.getAttribute("cart");

    if (cart != null) {

    for (String product : cart) {

    %>

  • <%= product %>
  • < %

    }

    }

    %>

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

(一)异常处理

在 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("");

out.print("

System Error

");

if (statusCode != null) {

out.print("Error code: " + statusCode + "
");

}

if (servletName != null) {

out.print("Servlet name: " + servletName + "
");

}

if (requestUri != null) {

out.print("Request URI: " + requestUri + "
");

}

if (throwable != null) {

out.print("Exception type: " + throwable.getClass().getName() + "
");

out.print("Message: " + throwable.getMessage());

}

out.print("");

}

}

在 web.xml 中配置:

java.lang.Throwable

/ErrorHandlerServlet

(二)会话管理

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

HttpSession session = request.getSession(true);

session.setMaxInactiveInterval(30 * 60); // 30 分钟

(三)性能优化

对静态资源的处理

可以通过配置 Web 服务器(如 Apache Tomcat)来设置静态资源的缓存策略,减少对静态资源的频繁请求。

例如,在 web.xml 中添加以下配置:

expiresByType

image/png=access plus 1 week

image/jpeg=access plus 1 week

text/css=access plus 1 week

application/javascript=access plus 1 week

数据库连接池

使用数据库连接池可以提高数据库访问的效率。在 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 开发场景。

top
Copyright © 2088 世界杯四强_世界杯裁判 - tylwn.com All Rights Reserved.
友情链接