首先,我在这方面完全是个初学者.

所以,我试着通过搜索栏和流派过滤器进行简单的数据库搜索,使用我在SQL数据库上放置的流派表.

<form action="ItemListController">
    <div class="btn-group me-2" role="group" aria-label="Genres">
    <button class="btn btn-outline-secondary" type="submit" name="gnr"
    value="<%= genre = "Fantasy" %>">Fantasy</button>

    <button class="btn btn-outline-secondary" type="submit" name="gnr"
    value="<%= genre = "Action" %>">Action</button>

    <button class="btn btn-outline-secondary" type="submit" name="gnr"
    value="<%= genre = "FPS" %>">FPS</button>
    </div>
</form>
public List<Item> findByKeyword(ServletContext context, String word, String genre) {
        List<Item> result = new ArrayList<>();

        try {
            Class.forName("org.sqlite.JDBC");

            String url = "jdbc:sqlite:" + context.getRealPath("WEB-INF/webapp.db");

            Connection conn = DriverManager.getConnection(url);
            String sql = "select * from games where GameName like ? order by GameID";
            String sql2 = "select * from games where Genre like ? order by GameID";
            PreparedStatement stmt1 = conn.prepareStatement(sql);
            PreparedStatement stmt2 = conn.prepareStatement(sql2);
            stmt1.setString(1, "%" + word + "%");
            stmt2.setString(1, "%" + genre + "%");

            ResultSet rs = stmt1.executeQuery();
            ResultSet rs1 = stmt2.executeQuery();

            while (rs.next()) {
                Item item = new Item();
                item.setItemId(rs.getInt("GameID"));
                item.setItemName(rs.getString("GameName"));
                item.setGenre(rs.getString("Genre"));
                item.setDescription(rs.getString("Description"));
                item.setImage(rs.getString("GameCover"));
                item.setPrice(rs.getInt("Price"));
                item.setLink(rs.getString("Link"));
                result.add(item);
            }
            conn.close();

            while (rs1.next()) {
                Item item = new Item();
                item.setItemId(rs1.getInt("GameID"));
                item.setItemName(rs1.getString("GameName"));
                item.setGenre(rs1.getString("Genre"));
                item.setDescription(rs1.getString("Description"));
                item.setImage(rs1.getString("GameCover"));
                item.setPrice(rs1.getInt("Price"));
                item.setLink(rs1.getString("Link"));
                result.add(item);
            }
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
@WebServlet("/ItemListController")
public class ItemListController extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        
        String word = request.getParameter("keyword");
        String genre = request.getParameter("gnr");

        if (word == null) {
            word = "";
        }

        L
        ItemModel im = new ItemModel();
        // List<Item> items = im.findAll(getServletContext());
        List<Item> items = im.findByKeyword(getServletContext(), word, genre);

        
        request.setAttribute("items", items);
        request.setAttribute("word", word);
        request.setAttribute("genre", genre);
        request.getRequestDispatcher("/itemListView3.jsp").forward(request, response);
    }

}

问题是,参数对URL起作用,我可以看到这一点,但不会基于过滤器进行任何搜索.它返回时就好像它是空的,并显示所有数据.

推荐答案

首先,您可以直接赋值

<button class="btn btn-outline-secondary" type="submit" name="gnr" value="Fantasy">Fantasy</button>
<button class="btn btn-outline-secondary" type="submit" name="gnr" value="Action">Action</button>
<button class="btn btn-outline-secondary" type="submit" name="gnr" value="FPS">FPS</button>

此外,您将在执行第一个查询后关闭数据库连接

public List<Item> findByKeyword(ServletContext context, String word, String genre) {
    List<Item> result = new ArrayList<>();

    try {
        Class.forName("org.sqlite.JDBC");

        String url = "jdbc:sqlite:" + context.getRealPath("WEB-INF/webapp.db");
        Connection conn = DriverManager.getConnection(url);

        String sql;
        PreparedStatement stmt;

        if (genre != null && !genre.isEmpty()) {
            sql = "select * from games where Genre like ? order by GameID";
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, "%" + genre + "%");
        } else {
            sql = "select * from games where GameName like ? order by GameID";
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, "%" + word + "%");
        }

        ResultSet rs = stmt.executeQuery();

        while (rs.next()) {
            Item item = new Item();
            item.setItemId(rs.getInt("GameID"));
            item.setItemName(rs.getString("GameName"));
            item.setGenre(rs.getString("Genre"));
            item.setDescription(rs.getString("Description"));
            item.setImage(rs.getString("GameCover"));
            item.setPrice(rs.getInt("Price"));
            item.setLink(rs.getString("Link"));
            result.add(item);
        }
        conn.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

    return result;
}

Java相关问答推荐

如何在Spring Security中设置CustomLogin路径?

Spring安全实现多个SQL表身份验证

日食IDE 2024-03在Ubuntu下崩溃,导致hr_err_pid.log

上下文初始化期间遇到异常-使用Java配置配置HibernateTemplate Bean时

使用@MappdSuperClass扩展ParentClass&Won t继承ParentClass属性

使用联接和分页的SpringBoot Spring数据JPA

条件加载@ManyToMany JPA

使用Testcontainers与OpenLiberty Server进行集成测试会抛出SocketException

具有多种令牌类型和段的复杂Java 17正则表达式

为什么Spring Boot项目无法为基于MySQL的CRUD应用程序找到从JPARepository接口扩展的ProductRepository?

为什么我的回收视图会显示重复的列表?

Domino Designer 14中的保存代理添加了重影库

如何在不作为类出现的表上执行原生查询?

当我在Java中有一个Synchronized块来递增int时,必须声明一个变量Volatile吗?

没有Tomcat,IntelliJ如何在本地运行API?

JavaFX复杂项目体系 struct

java21预览未命名的符号用于try-with-resources

将天数添加到ZonedDateTime不会更改时间

java.exe如何执行java源代码?

Spring Integration SFTP 连接失败 - 无法协商 kex 算法的密钥交换