zoukankan      html  css  js  c++  java
  • 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:只是定义需要的方法

    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层,如果不加其实对实际业务并无多少影响

    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);
    }
    

    准备写一篇分离分页,把分页封装到一个类中的实例

  • 相关阅读:
    iOS iPad开发之Modal
    iOS SVN终端指令
    iOS iPad开发之UIPopoverController的使用
    iOS Xcode6和Xcode5的区别?
    算法 查找算法--二分查找
    算法 排序算法--快速排序
    算法 排序算法--选择排序
    XCode签名证书死活不能选
    IOS7 适配时导航栏变黑
    Xcode Provisioning 路径
  • 原文地址:https://www.cnblogs.com/sincoolvip/p/5864845.html
Copyright © 2011-2022 走看看