悠悠楠杉
为了创建一个JSP(JavaServerPages)的通用分页组件,并支持基于标题、关键词、描述等条件进行文章检索,我们可以采用以下技术栈:
- 后端: 使用Java Servlet处理业务逻辑,如数据库查询、分页计算等。
- 数据库: 选用MySQL或PostgreSQL等关系型数据库存储文章数据。
- 前端: 结合HTML和JSP,使用CSS和JavaScript(或jQuery)来增强用户体验。
- 分页逻辑: 服务器端处理分页逻辑,通过SQL的LIMIT和OFFSET子句实现。
数据库设计
首先,设计一个简单的文章表 articles
如下:
sql
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
keywords TEXT,
description TEXT,
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
后端逻辑(Java Servlet)
在Java Servlet中,处理分页请求的逻辑可以如下:
```java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.sql.*;
import java.util.*;
public class ArticleSearchServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String title = request.getParameter("title");
String keywords = request.getParameter("keywords");
String description = request.getParameter("description");
int page = Integer.parseInt(request.getParameter("page")); // 确保是整数且非负数
int pageSize = 10; // 每页显示的文章数
int offset = (page - 1) * pageSize;
String sql = "SELECT * FROM articles WHERE 1=1"; // 基础查询条件为真
List
if (title != null && !title.isEmpty()) {
conditions.add("title LIKE CONCAT('%', ?, '%')");
}
if (keywords != null && !keywords.isEmpty()) {
conditions.add("keywords LIKE CONCAT('%', ?, '%')");
}
if (description != null && !description.isEmpty()) {
conditions.add("description LIKE CONCAT('%', ?, '%')");
}
if (!conditions.isEmpty()) {
sql += " AND " + String.join(" AND ", conditions); // 拼接条件语句
}
sql += " ORDER BY id DESC LIMIT ? OFFSET ?"; // 添加排序和分页逻辑
try (Connection conn = DriverManager.getConnection(DBURL, USER, PASS);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(2, pageSize); // 设置分页大小和起始偏移量(第一个参数用于模糊匹配)
pstmt.setInt(3, offset); // 偏移量(从0开始计算)
if (title != null) pstmt.setString(1, title); // 替换占位符参数为实际值(如果有)
if (keywords != null) pstmt.setString(1, keywords); // 替换占位符参数为实际值(如果有)
if (description != null) pstmt.setString(1, description); // 替换占位符参数为实际值(如果有)
ResultSet rs = pstmt.executeQuery(); // 执行查询并获取结果集 ……} catch (SQLException e) { e.printStackTrace(); } } } // 其他处理省略... } } // 注意异常处理和资源关闭等 ... 省略 ... } } // 注意替换DBURL, USER, PASS为你的数据库连接信息 ... 省略 ... } } } } } } } } // 注意: 这只是一个示例,实际开发中应更细致地处理输入和异常 ... } } } } } } ……等省略部分代码。