模糊查询与分页功能的JavaWeb实现

模糊查询和分页功能

需要注意的是这里前端使用了thymeleaf模板,后端获取前端的参数,从定义方法到实现方法再再servlet中调用,其中servlet中调用了前文所写的一个判断是否为空的函数StringUtil,也可以写在servlet里(只是这里为稍作简化)

index.html
	<div style="border: 0px solid red; width: 60%;margin-left: 20%;text-align: right;">
		<form th:action="@{/index}" method="post" style="float: left;">
			<input type="hidden" name="oper" value="search"/>
			请输入查询关键字:<input type="text" name="keyword" th:value="${session.keyword}"/>
			<input type="submit" value="查询" class="btn"/>
		</form>
		<a th:href="@{/add.html}" style="border: 0px solid blue;margin-bottom: 4px;">添加新库存记录</a>
	</div>
	<div style="width: 60%;margin-left: 20%; padding-top: 6px;" class="center">
		<input type="button" value="首 页" class="btn" th:onclick="|page(1)|" th:disabled="${session.pageNo==1}"/>
		<input type="button" value="上一页" class="btn" th:onclick="|page(${session.pageNo-1})|" th:disabled="${session.pageNo==1}"/>
		<input type="button" value="下一页" class="btn" th:onclick="|page(${session.pageNo+1})|" th:disabled="${session.pageNo==session.pageCount}"/>
		<input type="button" value="尾 页" class="btn" th:onclick="|page(${session.pageCount})|" th:disabled="${session.pageNo==session.pageCount}"/>
	</div>
FruitDAO
public interface FruitDAO {
    //获取指定页码上的所有的库存列表信息,每页显示5条
    List<Fruit> getFruitList(String keyword,Integer pageNo);

    //查询库存总计录条目
    int getFruitCount(String keyword);
    }
FruitDAOImpl
public class FruitDAOImpl extends BaseDAO<Fruit> implements FruitDAO {
    //获取所有的库存列表信息
    @Override
    public List<Fruit> getFruitList(String keyword, Integer pageNo) {
        return super.executeQuery("select * from t_fruit where fname like ? or remark like ? limit ? , 5","%"+keyword+"%","%"+keyword+"%",(pageNo-1)*5);
    }

    //查询库存总计录条目
    @Override
    public int getFruitCount(String keyword) {
        return ((Long)super.executeComplexQuery("select count(*) from t_fruit where fname like ? or remark like ?","%"+keyword+"%","%"+keyword+"%")[0]).intValue();
    }
}
IndexServlet
//servlet从3.0开始支持注解方式的注册
@WebServlet("/index")
public class IndexServlet extends ViewBaseServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //设置编码
        req.setCharacterEncoding("UTF-8");

        //获取当前的会话session
        HttpSession session = req.getSession();

        //设置当前页默认值为1
        Integer pageNo = 1;

        //获取oper的值
        String oper = req.getParameter("oper");
        //若oper!=null则说明通过表单的查询按钮过来的,反之如果oper为空,则不是通过查询过来的
        String keyword = null;

        //这里的if语句:如果oper不为空,且它的值等于search
        if (StringUtil.isNotEmpty(oper) && "search".equals(oper)){
            //说明此处是点击表单查询发送过来的信息
            pageNo = 1;
            keyword = req.getParameter("keyword");
            //若keyword为空这里把它设置为空字符串"",否则查询时会拼接成%null%
            if (StringUtil.isEmpty(keyword)){
                keyword = "";
            }
            //将keyword保存到session
            session.setAttribute("keyword",keyword);
        } else {
            //说明此处不是点击表单查询发送过来的信息(比如点击上一页,下一页)
            //此时keyword应该从session作用域中获得
            String pageNoStr = req.getParameter("pageNo");
            if(StringUtil.isNotEmpty(pageNoStr)){
                pageNo = Integer.parseInt(pageNoStr);
            }
            //如果不是点击查询按钮,那么查询是基于session中保存的现有keyword进行查询
            Object keywordObj = session.getAttribute("keyword");
            if (keywordObj != null){
                keyword = (String)keywordObj;
            }else {
                keyword = "";
            }
        }

        //更新当前页的值
        session.setAttribute("pageNo",pageNo);

        //获取库存列表,保存到session中
        FruitDAO fruitDAO = new FruitDAOImpl();
        List<Fruit> fruitList = fruitDAO.getFruitList(keyword,pageNo);

        //保存到session作用域
        session.setAttribute("fruitList",fruitList);

        //获取总记录条数
        int fruitCount = fruitDAO.getFruitCount(keyword);
        //通过记录条数获取页数
        int pageCount = (fruitCount+5-1)/5;
        session.setAttribute("pageCount",pageCount);

        //此处的视图名称是index,那么thymeleaf会讲这个逻辑视图名称对应到物理视图上去

        super.processTemplate("index",req,resp);

    }
}

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现分页模糊查询需要使用到数据库的查询语句和Java分页处理函数。下面给出一个简单的示例代码实现了在Javaweb项目中使用MySQL数据库进行分页模糊查询。 首先,我们需要在JSP页面中添加一个表单,用于输入查询关键字和选择查询范围。如下所示: ```html <form action="search.jsp" method="get"> <input type="text" name="keyword"> <select name="range"> <option value="title">标题</option> <option value="content">内容</option> </select> <input type="submit" value="查询"> </form> ``` 接下来,在后台的servlet中处理查询请求。我们需要使用MySQL的LIKE运算符进行模糊查询,并且使用LIMIT语句进行分页。示例代码如下: ```java String keyword = request.getParameter("keyword"); String range = request.getParameter("range"); // 连接数据库 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password"); // 构造SQL语句 String sql = "SELECT * FROM mytable WHERE " + range + " LIKE ? LIMIT ?, ?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, "%" + keyword + "%"); stmt.setInt(2, (page - 1) * pageSize); stmt.setInt(3, pageSize); // 执行查询 ResultSet rs = stmt.executeQuery(); while (rs.next()) { // 处理查询结果 } ``` 在上面的代码中,我们使用了PreparedStatement对象来构造SQL语句,并且通过设置参数的方式来防止SQL注入攻击。同时,我们使用了LIMIT语句来进行分页处理,其中page和pageSize分别表示当前页码和每页的记录数。 最后,我们需要在JSP页面中显示查询结果,并且添加上一页和下一页的链接。示例代码如下: ```html <% // 获取查询结果 List<Result> results = (List<Result>) request.getAttribute("results"); int page = (int) request.getAttribute("page"); int total = (int) request.getAttribute("total"); // 显示查询结果 for (Result result : results) { // 显示每一条记录 } // 显示分页链接 if (page > 1) { out.println("<a href='search.jsp?page=" + (page - 1) + "&keyword=" + keyword + "&range=" + range + "'>上一页</a>"); } if (page < total) { out.println("<a href='search.jsp?page=" + (page + 1) + "&keyword=" + keyword + "&range=" + range + "'>下一页</a>"); } %> ``` 在上面的代码中,我们首先获取查询结果、当前页码和总页数等信息。然后,我们根据页码和查询关键字构造上一页和下一页的链接,并且在页面上显示出来。注意,我们需要根据当前页码来判断上一页和下一页是否可用。同时,我们需要将查询关键字和查询范围传递给下一页,以便查询结果的持续展示。 以上就是一个简单的Javaweb分页模糊查询实现方法。当然,实际项目中还需要考虑到性能、安全性等问题,这里只是给出了一个简单示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值