JSP+Servlet+javabean+mysql实现页面多条件模糊查询(转载)

需求:

一般列表页上面会有一个查询框,有各种的查询条件组合,一般都采用模糊查询方式 ,以下以自己做的实例来说明一下实现方法:

需要实现的界面原型:要满足条件:

1、单选分类,点GO按扭

2、单独输入标题关键字,点GO按扭

3、选择分类,再输入关键字,点GO按扭

我这里用了MVC分层模式来进行的,所以一步步讲解吧,上源码:

因为我一个class里写了很多不同的业务,所以帖代码只帖当前步

dao层:

1 //当前页显示的新闻信息pageNo 当前页码,pagePerCount是每页多少条数据
2     public List<NewsDetail> getPageNewsList(int pageNo,int pagePerCount,String where);

daoImpl层:

这里方法中加的参数是where,因为我不确定前台可能有几个模糊查询的条件,所以这里只能用个整体的字符串来定义,到时候用StringBuffer来拼就行

这里注意一下字符串拼接加变量的写法

 1 public List<NewsDetail> getPageNewsList(int pageNo, int pagePerCount,String where) {
 2         List<NewsDetail> newslist =new ArrayList<NewsDetail>();
 3         String sql = "select d.id,d.title,d.author,d.summary,d.content,d.picPath,d.createDate,d.modifyDate," +
 4                 "d.createDate,d.categoryId,c.name as categoryname from news_detail as d,news_category as c" +
 5                 " where c.id=d.categoryId and d.status=1 "+where+"order by d.createDate desc limit ?,?";
 6         Object[] params ={(pageNo-1)*pagePerCount,pagePerCount};
 7         if(this.getconnection()){
 8             ResultSet rs = this.executeQuery(sql, params);
 9             try {
10                 while(rs.next()){
11                     NewsDetail news = new NewsDetail();
12                     int id = rs.getInt("id");
13                     String title1 = rs.getString("title");
14                     String author =rs.getString("author");
15                     int categoryId = rs.getInt("categoryId");
16                     String categoryname=rs.getString("categoryname");
17                     String summary = rs.getString("summary");
18                     String content = rs.getString("content");
19                     String picPath =rs.getString("picPath");
20                     Timestamp createDate =rs.getTimestamp("createDate");
21                     Timestamp modifyDate =rs.getTimestamp("modifyDate");
22                     news.setId(id);
23                     news.setCategoryId(categoryId);
24                     news.setAuthor(author);
25                     news.setCategoryname(categoryname);
26                     news.setContent(content);
27                     news.setSummary(summary);
28                     news.setPicPath(picPath);
29                     news.setCreateDate(createDate);
30                     news.setModifyDate(modifyDate);
31                     news.setTitle(title1);
32                     newslist.add(news);
33
34                 }
35             } catch (SQLException e) {
36                 e.printStackTrace();
37             }finally{
38                 this.clossconnection();
39             }
40         }
41         return newslist;
42     }

service接口:

1 //当前页显示的新闻信息pageNo 当前页码,pagePerCount是每页多少条数据
2         public List<NewsDetail> getPageNewsList(int pageNo,int pagePerCount,String where);

serviceImpl接口实现类:

因为业务比较简单,所以代码也很简单哈,service只是调一下dao即可

 1 public class NewsServiceImpl implements NewsService {
 2     private NewsDao newsdao =null;
 3     public NewsServiceImpl(){
 4         newsdao=new NewsDaoImpl();
 5         newscategory1 =new NewsCategoryDaoImpl();
 6     }
 7 public int getNewsCount(String where) {
 8         return newsdao.getNewsCount(where);
 9     }
10 }

以下是重点,套页面JSP+Servlet

newsDetailList.jsp:我把样式那些都省略了,只列出整体的页面框架元素

 1 <div class="main-content-right">
 2         <!--即时新闻-->
 3         <div class="main-text-box">
 4             <div class="main-text-box-tbg">
 5                 <div class="main-text-box-bbg">
 6                     <form name ="searchForm" id="searchForm" action="<%=request.getContextPath() %>/servlet/newsListByLikeServlet" method="post">
 7              <div>
 8                          新闻分类:
 9                              <select name="categoryId">
10                                  <option value="0">全部</option><!--这里要注意,到servlet中获取分类的时候,值为0要加判断,为0不需要加查询,默认是全部就是不选择分类的情况-->
11                                  <c:forEach var="category" items="${categorylist }" varStatus="status">
12                                  <option  value=‘${category.id }‘ >${category.name }</option>
13                                  </c:forEach>
14
15
16
17                             </select>
18                          新闻标题<input type="text" name="title" id="title" value=‘‘/>
19                              <button type="submit" class="page-btn" onclick="javascript:window.location.href=‘<%=request.getContextPath() %>/servlet/newsListByLikeServlet‘">GO</button>
20                              <button type="button" onclick="addNews();" class="page-btn">增加</button>
21                              <!--隐藏域,当前页码  -->
22                              <input type="hidden" id="pageIndex" name="pageIndex" value="1"/>
23
24                              <input type="hidden" name="pageSize" value="10"/>
25
26              </div>
27              </form>
28             <table cellpadding="1" cellspacing="1" class="admin-list">
29                 <thead >
30                     <tr class="admin-list-head">
31                         <th align="center">新闻标题</th>
32                         <th align="center">新闻类别</th>
33                         <th align="center">作者</th>
34                         <th align="center">创建时间</th>
35                         <th align="center">操作</th>
36                     </tr>
37                 </thead>
38
39                 <tbody>
40               <c:forEach var="news" items="${newsList}" varStatus="status">
41                     <tr <c:if test="${status.count%2==0 }"> class="admin-list-td-h2"</c:if>>
42                         <td><a href=‘<%=request.getContextPath() %>/servlet/NewsViewServlet?id=${news.id }‘>${news.title }</a></td>
43                         <td>${news.categoryname }</td>
44                         <td>${news.author }</td>
45                         <td><fmt:formatDate value="${news.createDate}" pattern="yyyy-MM-dd"/></td>
46                         <td><a href=‘<%=request.getContextPath() %>/servlet/EditViewServlet?id=${news.id }‘>修改</a>
47                             <a href="javascript:if(confirm(‘确认是否删除此新闻?‘)) location=‘<%=request.getContextPath() %>/servlet/DelNewsServlet?id=${news.id }‘">删除</a>
48                         </td>
49                     </tr>
50                 </c:forEach>
51
52
53                     <input type="hidden" id="totalPageCount" name="totalPageCount" value="${totalPageCount }"/>
54                 </tbody>
55
56             </table>
57             <c:import url="rollPage.jsp">
58                 <c:param name="totalCount" value="${totalCount }"></c:param>
59                 <c:param name="currentPageNo" value="${currentPageNo }"></c:param>
60                 <c:param name="totalPageCount" value="${totalPageCount}"></c:param>
61
62             </c:import>
63
64         </div>
65        </div>
66    </div>
67    </div>

可以看出,我图1中的查询那块是一个form,HTML框架比较清晰,那么我的servlet要做的事就是:获取用户选择的select下拉框选择的分类和用户输入的title关键字

form表单提交的数据,我们可以在servlet通过getParameter方法来获取

NewsListByLike2代码如下:

 1 public class NewsListByLike2 extends HttpServlet {
 2     NewsService newsService =new NewsServiceImpl();
 3
 4     @Override
 5     protected void doGet(HttpServletRequest request, HttpServletResponse response)
 6             throws ServletException, IOException {
 7         try{
 8             //定义一个sb来接收模糊查询的sql
 9             StringBuffer sb = new StringBuffer(1024);
10             //form表单提交过来的用户输入的title模糊查询关键字
11             String title = request.getParameter("title");
12             //如果title有输入的时候,才拼接sql进行查询
13             if (title != null && !"".equals(title)) {
14                 sb.append(" and d.title like ‘%" + title + "%‘");
15             }
16             //取模类糊查询分类选择,是页面select标签的name
17             String categoryId = request.getParameter("categoryId");
18             //取过来是个字符串,需要转一下int,但是一定要Try-catch一下,不然会报格式转换错误
19             int categoryid = Integer.parseInt(categoryId);
20             //这里一定要判断一下,因为jsp页面下拉框有一个【全部】的分类选项,value=0,所以大于零,我才去拼接字符串查询,=0就是查全部,不需要加分类 的条件
21             if (categoryid > 0) {
22                 sb.append(" and d.categoryId=" + categoryid + " ");
23             }
24             List<NewsCategory> categorylist = newsService.getcategorylist();
25             // 页面容量
26             int pageSize = 5;
27             // 当前页码
28             int currentPageNo = 1;
29             //newsDetailList.jsp中加的隐藏域,当前页码是包括了下一页上一页或用户自己输入的当前页面参数值
30             String pageNo = request.getParameter("pageIndex");// 获取当前页码隐藏域1
31             //对当前页码进行容错处理,当当前页为空的时候,默认显示第1页
32             if (pageNo == null) {
33                 currentPageNo = 1;
34             } else {// 不为空的话,就链接提交给我的当前页码即是用户请求的页码传给我的值,我赋予给我定的当前页码参数值
35                 currentPageNo = Integer.parseInt(pageNo);
36             }
37             //获取总数据量的方法,参数里面也加了where条件,全列表和查询后列表均可用分页
38             int totalCount = newsService.getNewsCount(sb.toString());// 总记录数
39             /* 总页数 */
40             int totalPageCount = totalCount / pageSize + 1;
41             // 首页和尾页的异常控制
42             if (currentPageNo <= 0) {
43                 currentPageNo = 1;
44             } else if (currentPageNo > totalPageCount) {
45                 currentPageNo = totalPageCount;
46             }
47             // 显示每页新闻信息列表
48             List<NewsDetail> newsList = newsService.getPageNewsList(currentPageNo,pageSize, sb.toString());
49             //以下变量是要把变量值set到请求中转发给页面,页面要用的
50             request.setAttribute("currentPageNo", currentPageNo);
51             request.setAttribute("pageSize", pageSize);
52             request.setAttribute("totalPageCount", totalPageCount);
53             request.setAttribute("totalCount", totalCount);
54             request.setAttribute("categorylist", categorylist);
55             request.setAttribute("newsList", newsList);
56             request.getRequestDispatcher("/jsp/admin/newsDetailList.jsp").forward(request, response);
57         }catch(Exception e){
58             e.printStackTrace();
59         }
60
61     }
62
63     @Override
64     protected void doPost(HttpServletRequest req, HttpServletResponse resp)
65             throws ServletException, IOException {
66         doGet(req, resp);
67     }
68
69     @Override
70     protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
71             throws ServletException, IOException {
72         super.service(arg0, arg1);
73     }
74
75 }

上面的servlet可能会报错:
 int categoryid = Integer.parseInt(categoryId); 这个可能会报

java.lang.NumberFormatException: null的问题:

原因:首次进入首页,是doGet请求,不会去调查询那里的form的doPost方法,所以我们执行

request.getParameter("categoryId")为空,因为这个获取表单数据值,只有Post提交才可以 当值为空的时候,转换就会出错,Integer类中有这个异常 所以要更改代码为:当不为空的时候,才转换

 1 //取模类糊查询分类选择,是页面select标签的name
 2             String categoryId = request.getParameter("categoryId");
 3             System.out.println("categoryId==================="+categoryId);
 4             //取过来是个字符串,需要转一下int,但是一定要Try-catch一下,不然会报格式转换错误
 5             if(categoryId!=null&& !"".equals(categoryId)){
 6                 int categoryid = Integer.parseInt(categoryId);
 7                 //这里一定要判断一下,因为jsp页面下拉框有一个【全部】的分类选项,value=0,所以大于零,我才去拼接字符串查询,=0就是查全部,不需要加分类 的条件
 8                 if (categoryid > 0) {
 9                     sb.append(" and d.categoryId=" + categoryid + " ");
10                 }
11             }

因为有上面这个问题,所以想到了就是实际上进入首页出全部列表信息,只是select下拉列表中默认选中【全部】选项,实际上并未有全部查询

如果这个时候也不选类型也不输入title关键字点击GO进行查询,那么必须加上这段,因为JSP页面select下拉列表元素【全部】这个项value=0

<option value="0">全部</option>

(上面代码已加上,这里只做原理说明时使用):

if (categoryid > 0) {
                    sb.append(" and d.categoryId=" + categoryid + " ");
                }

web.xml配置:

1   <!--模糊查询多条件 -->
2     <servlet>
3       <servlet-name>newsListByLikeServlet</servlet-name>
4       <servlet-class>com.cn.pb.servlet.NewsListByLike2</servlet-class>
5   </servlet>
6   <servlet-mapping>
7       <servlet-name>newsListByLikeServlet</servlet-name>
8       <url-pattern>/servlet/newsListByLikeServlet</url-pattern>
9   </servlet-mapping>

这里的流程我要说一下,servlet为什么写在doGet方法中,是get请求而不是Post请求:因为页面走向是这样的用户请求访问:

1、http://localhost:8080/news/servlet/newsListByLikeServlet进来的是这个列表页,

2、请求这个servlet会映射到朝NewsListByLike2.java,

3、然后这个servlet中把页面中需要的各个对象和变量取到再传给newsDetailList.jsp页面

4、模糊查询的form提交的action也是到NewsListByLike2.java这个servlet中去的,查出的结果也还是要在newsDetailList.jsp页面显示,所以与第3步一致

5、那为什么form提交的是post,而一般页面查询请求是get,上面我的servlet写在doGet方法中了,但要注意,我的doPost方法中调用了doGet方法,也就是说一进来查询条件(分类和关键字)用户没有输入的都为空的,这时候我还是要出全列表数据的,这时候是Get操作,当我用户选择分类和关键字点GO的时候,form表单进行了Post提交,还是提交给我的这个servlet处理,这时候走doPost,但实际上方法里还是可以执行的我doGet里的代码,代码可以复用的。

补:

dao+service

dao:只是定义需要的方法

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

package com.cn.pb.dao;

import java.sql.ResultSet;

import java.util.Date;

import java.util.List;

import com.cn.pb.dao.util.PageBase;

import com.cn.pb.pojo.NewsCategory;

import com.cn.pb.pojo.NewsDetail;

/*使用面向对象对程序进行二次改进

 * 新闻信息表操作接口:针对新闻信息单表的操作

 */

public interface NewsDao {

    //增加数据

    public boolean insert(NewsDetail news);

    //删除数据

    public boolean delete(NewsDetail news);

    //修改数据:修改标题和id

    public boolean update(NewsDetail news);

    //修改数据:所有字段

        public boolean updateall(NewsDetail news);

    //查找所有新闻信息

    public  List<NewsDetail> getNewList();

    //按ID查询数据

    public NewsDetail select(int id);

    //查询某个新闻类别下的新闻详细信息

    public int delCategoryNewsDetail(NewsDetail news);

    

    

    //查询新闻并显示类别名称

    public List<NewsDetail> getnewslist();

    

    //获取NewsDetail表中总行数

    public int getNewsCount(String where);

    

/*  //得到总页数count代表一页多少行

    public int getpageCount(int count);*/

    

    //当前页显示的新闻信息pageNo 当前页码,pagePerCount是每页多少条数据

    public List<NewsDetail> getPageNewsList(int pageNo,int pagePerCount,String where);

    

    //模糊查询

    public List<NewsDetail> getNewsByLike(int pageNo,int pagePerCount,String title);

    /*//模糊查询加上分类

    public List<NewsDetail> getNewsByLikeCategory(String category,String title);*/

    

    //最新新闻:倒序前10

    public  List<NewsDetail> getNewNewsList();

    

    

    //查找那些被删除的主题,查找状态为0的列表信息

    public  List<NewsDetail> delNewsList(int pageNo,int pagePerCount);

    

    //删除后的新闻信息进行恢复

    public boolean recoverNews(int id);

    

    //查找某个分类下有多少条新闻信息

    public int getNewsByCategory(int categoryId);

}

service:跟dao层方法一样,只是拿过来加个壳给servlet调用而已,毕竟规范在这,不直接操作dao层,如果不加其实对实际业务并无多少影响

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

package com.cn.pb.service;

import java.sql.ResultSet;

import java.util.Date;

import java.util.List;

import com.cn.pb.dao.util.PageBase;

import com.cn.pb.pojo.NewsCategory;

import com.cn.pb.pojo.NewsDetail;

/*

 * service层:放业务逻辑处理

 */

public interface NewsService {

    //增加数据

        public boolean insert(NewsDetail news);

        //删除数据

        public boolean delete(NewsDetail news);

        //修改数据

        public boolean update(NewsDetail news);

        

        //按ID查询数据

        public NewsDetail select(int id);

        //查找所有新闻数据

        public List<NewsDetail> getNewsList();

        /*//删除新闻类型

        public boolean deletecategory(int id);*/

        /*//删除新闻类型,类型下面有新闻信息

        public boolean deletecategory2(NewsCategory newsCategory,String title);*/

        

        //查看新闻类别

        public List<NewsCategory> getcategorylist();

        

        //修改数据:所有字段

        public boolean updateall(NewsDetail news);

        

        //查询新闻并显示类别名称

        public List<NewsDetail> getnewslist();

        

        //获取NewsDetail表中总行数

        public int getNewsCount(String title);

        

        /*//得到总页数count代表一页多少行

        public int getpageCount(int count);*/

        

        

        //当前页显示的新闻信息pageNo 当前页码,pagePerCount是每页多少条数据

        public List<NewsDetail> getPageNewsList(int pageNo,int pagePerCount,String where);

        

        //模糊查询

        public List<NewsDetail> getNewsByLike(int pageNo,int pagePerCount,String title);

        

        //最新新闻:倒序前10

        public  List<NewsDetail> getNewNewsList();

        

        //查找那些被删除的主题,查找状态为0的列表信息

        public  List<NewsDetail> delNewsList(int pageNo,int pagePerCount);

        

        //删除后的新闻信息进行恢复

        public boolean recoverNews(int id);

        

        //查找某个分类下有多少条新闻信息

        public int getNewsByCategory(int categoryId);

        //分页和list独立出一个javabean

        public PageBase<NewsDetail> getPages(int pageNo,String where);

}

时间: 2024-08-08 13:52:57

JSP+Servlet+javabean+mysql实现页面多条件模糊查询(转载)的相关文章

JSP+Servlet+javabean+oracle实现页面多条件模糊查询

之前写过一篇JSP+Servlet+javabean+mysql实现页面多条件模糊查询 使用的是mysql进行的分页查询,mysql用limit控制,而oracle则是用rownum,今天第一次写oracle,查了一下资料试了一下,把代码帖出来 oracle的数据源配置也不同: driverName=oracle.jdbc.driver.OracleDriver url=jdbc\:oracle\:thin\:@127.0.0.1\:1521\:orcl username=marketManag

JSP+Servlet+javabean实现页面多条件模糊查询

需求: 一般列表页上面会有一个查询框,有各种的查询条件组合,一般都采用模糊查询方式 ,以下以自己做的实例来说明一下实现方法: 需要实现的界面原型:要满足条件: 1.单选分类,点GO按扭 2.单独输入标题关键字,点GO按扭 3.选择分类,再输入关键字,点GO按扭 我这里用了MVC分层模式来进行的,所以一步步讲解吧,上源码: 因为我一个class里写了很多不同的业务,所以帖代码只帖当前步 dao层: 1 //当前页显示的新闻信息pageNo 当前页码,pagePerCount是每页多少条数据 2 p

Java Web学习(30): 使用JSP+Servlet+JavaBean实现用户登录

实现用户登录 用户名admin,密码admin,登录成功使用服务器内部跳转到login_success2.jsp页面,并且提示登录成功的用 户名,如果登录失败则跳转到login_failure2.jsp页面. 之前我们使用JSP实现过,也JSP+JavaBean实现过,这一次我们更加细化,使用JSP+Servlet+JavaBean实现用 户登录,好多的源码也是在前面写过. 我们先来看整体的目录结构: 再来看看源代码: 实体类Users.java源代码: package com.entity;

基于JSP+Servlet+JavaBean的图片或文件上传

基于JSP+Servlet+JavaBean的图片或文件上传 一.概述 现在不管是博客论坛还是企业办公,都离不开资源的共享.通过文件上传的方式,与大家同分享,从而达到大众间广泛的沟通和交流,我们既可以从中获得更多的知识和经验,也能通过他人的反馈达到自我改进和提升的目的. 下面我就为大家介绍 web项目中的这一上传功能,那么文件是如何从本地发送到服务器的呢?大家可以在在线视频课程进修学习<基于JSP+Servlet+JavaBean的人力资源管理系统开发>中第22课-项目开发-其它功能完善-图片

基于JSP+Servlet+JavaBean的人力资源管理系统开发课程

<基于JSP+Servlet+JavaBean的人力资源管理系统开发> 课程观看地址:http://www.xuetuwuyou.com/course/53 讲师:蒋子厚(http://www.xuetuwuyou.com/user/1984) 课程出自学途无忧网:http://www.xuetuwuyou.com 课程介绍 一.课程使用到的软件及对应的版本 1.jdk 1.7 2.tomcat 7.0 3.MySQL6.0+ 4.navicat 9 + 5.Macromedia Dreamw

Jsp+Servlet+JavaBean学习阶段案例-留言板(MessageBoard)

Jsp+Servlet+JavaBean学习阶段的一个案例总结 名称:留言板(MessageBoard) 开发技术:Jsp+Servlet+JavaBean 数据库:Mysql 开发工具:IntelliJ IDEA 2016.1.3 服务器:Tomcat 8.0.36 功能说明 普通用户:增加删除修改留言信息 管理员:增加删除修改留言信息.管理用户.设置用户发帖留言权限 数据库结构 tb_user表 字段 类型 名称 说明 id int id name nvarchar 姓名 password

JSP+Servlet+JavaBean

MVC是三个单词的缩写:M,Model(模型):V,View( 视图 ),C,Control(控制). MVC模式的目的就是实现Web系统的职能分工, Model层:实现系统的业务逻辑,即javaBean部分 View层:负责与用户交互,即在界面上展示数据对象给用户,即html,jsp Control层:Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作,当然就是Servlet的职责了 下面我们用MVC设

JSP+Servlet+JDBC+Mysql实现的博客系统

本文存在视频版本,请知悉 项目简介 项目来源于:https://gitee.com/nanpingping/jsp-blog 这次分享个人博客系统,界面简洁大气,功能齐全,是不可多得的比较容易的系统,非常适合毕业设计或者课程设计. 本系统基于JSP+Servlet+JDBC+Mysql.涉及技术少,易于理解,适合JavaWeb初学者学习使用. 难度等级:简单 技术栈 编辑器 IntelliJ IDEA 2019.1.1 (Ultimate Edition) 前端技术 基础:html+css+Ja

Jsp+Servlet+JavaBean经典MVC模式理解

MVC 模式目的(实现Web系统的职能分工). 在Java EE中,Jsp+Servlet+JavaBean算是里面经典的模式,是初学者必备的知识技能. M, Model(模型)实现系统的业务逻辑 1. 通过DAO实现操作数据库的业务逻辑 2. 其他系统业务逻辑 JavaBean职能 V, View(视图)负责与用户交互,即在界面上展示数据对象给用户 Jsp职能 C, Controler(控制)Model与View之间沟通的桥梁 1. 分派用户的请求并选择适当的视图用于显示 2. 解释用户的输入