Java Web 开发必备:Servlet + JSP 实战应用,构建高可用网站
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
路径时,就会触发 Hello
Servlet 的 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() %>.
</body> </html> ```直接将该 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
中配置:
<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>
- 页面展示(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>
(二)购物车功能
- 请求处理(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>
- 页面展示(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 分钟
(三)性能优化
- 对静态资源的处理
- 可以通过配置 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>
- 数据库连接池
- 使用数据库连接池可以提高数据库访问的效率。在 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 开发场景。
- 点赞
- 收藏
- 关注作者
评论(0)