JSP+Servlet+javabean+mysql实现页面多条件模糊查询
2016-09-12 15:06
871 查看
需求:
一般列表页上面会有一个查询框,有各种的查询条件组合,一般都采用模糊查询方式 ,以下以自己做的实例来说明一下实现方法:
需要实现的界面原型:要满足条件:
1、单选分类,点GO按扭
2、单独输入标题关键字,点GO按扭
3、选择分类,再输入关键字,点GO按扭
我这里用了MVC分层模式来进行的,所以一步步讲解吧,上源码:
因为我一个class里写了很多不同的业务,所以帖代码只帖当前步
dao层:
daoImpl层:
这里方法中加的参数是where,因为我不确定前台可能有几个模糊查询的条件,所以这里只能用个整体的字符串来定义,到时候用StringBuffer来拼就行
这里注意一下字符串拼接加变量的写法
service接口:
serviceImpl接口实现类:
因为业务比较简单,所以代码也很简单哈,service只是调一下dao即可
以下是重点,套页面JSP+Servlet
newsDetailList.jsp:我把样式那些都省略了,只列出整体的页面框架元素
可以看出,我图1中的查询那块是一个form,HTML框架比较清晰,那么我的servlet要做的事就是:获取用户选择的select下拉框选择的分类和用户输入的title关键字
form表单提交的数据,我们可以在servlet通过getParameter方法来获取
NewsListByLike2代码如下:
因为有上面这个问题,所以想到了就是实际上进入首页出全部列表信息,只是select下拉列表中默认选中【全部】选项,实际上并未有全部查询
如果这个时候也不选类型也不输入title关键字点击GO进行查询,那么必须加上这段,因为JSP页面select下拉列表元素【全部】这个项value=0
(上面代码已加上,这里只做原理说明时使用):
web.xml配置:
这里的流程我要说一下,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:只是定义需要的方法
service:跟dao层方法一样,只是拿过来加个壳给servlet调用而已,毕竟规范在这,不直接操作dao层,如果不加其实对实际业务并无多少影响
准备写一篇分离分页,把分页封装到一个类中的实例
一般列表页上面会有一个查询框,有各种的查询条件组合,一般都采用模糊查询方式 ,以下以自己做的实例来说明一下实现方法:
需要实现的界面原型:要满足条件:
1、单选分类,点GO按扭
2、单独输入标题关键字,点GO按扭
3、选择分类,再输入关键字,点GO按扭
我这里用了MVC分层模式来进行的,所以一步步讲解吧,上源码:
因为我一个class里写了很多不同的业务,所以帖代码只帖当前步
dao层:
//当前页显示的新闻信息pageNo 当前页码,pagePerCount是每页多少条数据 public List<NewsDetail> getPageNewsList(int pageNo,int pagePerCount,String where);
daoImpl层:
这里方法中加的参数是where,因为我不确定前台可能有几个模糊查询的条件,所以这里只能用个整体的字符串来定义,到时候用StringBuffer来拼就行
这里注意一下字符串拼接加变量的写法
public List<NewsDetail> getPageNewsList(int pageNo, int pagePerCount,String where) { List<NewsDetail> newslist =new ArrayList<NewsDetail>(); String sql = "select d.id,d.title,d.author,d.summary,d.content,d.picPath,d.createDate,d.modifyDate," + "d.createDate,d.categoryId,c.name as categoryname from news_detail as d,news_category as c" + " where c.id=d.categoryId and d.status=1 "+where+"order by d.createDate desc limit ?,?"; Object[] params ={(pageNo-1)*pagePerCount,pagePerCount}; if(this.getconnection()){ ResultSet rs = this.executeQuery(sql, params); try { while(rs.next()){ NewsDetail news = new NewsDetail(); int id = rs.getInt("id"); String title1 = rs.getString("title"); String author =rs.getString("author"); int categoryId = rs.getInt("categoryId"); String categoryname=rs.getString("categoryname"); String summary = rs.getString("summary"); String content = rs.getString("content"); String picPath =rs.getString("picPath"); Timestamp createDate =rs.getTimestamp("createDate"); Timestamp modifyDate =rs.getTimestamp("modifyDate"); news.setId(id); news.setCategoryId(categoryId); news.setAuthor(author); news.setCategoryname(categoryname); news.setContent(content); news.setSummary(summary); news.setPicPath(picPath); news.setCreateDate(createDate); news.setModifyDate(modifyDate); news.setTitle(title1); newslist.add(news); } } catch (SQLException e) { e.printStackTrace(); }finally{ this.clossconnection(); } } return newslist; }
service接口:
//当前页显示的新闻信息pageNo 当前页码,pagePerCount是每页多少条数据 public List<NewsDetail> getPageNewsList(int pageNo,int pagePerCount,String where);
serviceImpl接口实现类:
因为业务比较简单,所以代码也很简单哈,service只是调一下dao即可
public class NewsServiceImpl implements NewsService { private NewsDao newsdao =null; public NewsServiceImpl(){ newsdao=new NewsDaoImpl(); newscategory1 =new NewsCategoryDaoImpl(); } public int getNewsCount(String where) { return newsdao.getNewsCount(where); } }
以下是重点,套页面JSP+Servlet
newsDetailList.jsp:我把样式那些都省略了,只列出整体的页面框架元素
<div class="main-content-right"> <!--即时新闻--> <div class="main-text-box"> <div class="main-text-box-tbg"> <div class="main-text-box-bbg"> <form name ="searchForm" id="searchForm" action="<%=request.getContextPath() %>/servlet/newsListByLikeServlet" method="post"> <div> 新闻分类: <select name="categoryId"> <option value="0">全部</option><!--这里要注意,到servlet中获取分类的时候,值为0要加判断,为0不需要加查询,默认是全部就是不选择分类的情况--> <c:forEach var="category" items="${categorylist }" varStatus="status"> <option value='${category.id }' >${category.name }</option> </c:forEach> </select> 新闻标题<input type="text" name="title" id="title" value=''/> <button type="submit" class="page-btn" onclick="javascript:window.location.href='<%=request.getContextPath() %>/servlet/newsListByLikeServlet'">GO</button> <button type="button" onclick="addNews();" class="page-btn">增加</button> <!--隐藏域,当前页码 --> <input type="hidden" id="pageIndex" name="pageIndex" value="1"/> <input type="hidden" name="pageSize" value="10"/> </div> </form> <table cellpadding="1" cellspacing="1" class="admin-list"> <thead > <tr class="admin-list-head"> <th align="center">新闻标题</th> <th align="center">新闻类别</th> <th align="center">作者</th> <th align="center">创建时间</th> <th align="center">操作</th> </tr> </thead> <tbody> <c:forEach var="news" items="${newsList}" varStatus="status"> <tr <c:if test="${status.count%2==0 }"> class="admin-list-td-h2"</c:if>> <td><a href='<%=request.getContextPath() %>/servlet/NewsViewServlet?id=${news.id }'>${news.title }</a></td> <td>${news.categoryname }</td> <td>${news.author }</td> <td><fmt:formatDate value="${news.createDate}" pattern="yyyy-MM-dd"/></td> <td><a href='<%=request.getContextPath() %>/servlet/EditViewServlet?id=${news.id }'>修改</a> <a href="javascript:if(confirm('确认是否删除此新闻?')) location='<%=request.getContextPath() %>/servlet/DelNewsServlet?id=${news.id }'">删除</a> </td> </tr> </c:forEach> <input type="hidden" id="totalPageCount" name="totalPageCount" value="${totalPageCount }"/> </tbody> </table> <c:import url="rollPage.jsp"> <c:param name="totalCount" value="${totalCount }"></c:param> <c:param name="currentPageNo" value="${currentPageNo }"></c:param> <c:param name="totalPageCount" value="${totalPageCount}"></c:param> </c:import> </div> </div> </div> </div>
可以看出,我图1中的查询那块是一个form,HTML框架比较清晰,那么我的servlet要做的事就是:获取用户选择的select下拉框选择的分类和用户输入的title关键字
form表单提交的数据,我们可以在servlet通过getParameter方法来获取
NewsListByLike2代码如下:
public class NewsListByLike2 extends HttpServlet { NewsService newsService =new NewsServiceImpl(); @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try{ //定义一个sb来接收模糊查询的sql StringBuffer sb = new StringBuffer(1024); //form表单提交过来的用户输入的title模糊查询关键字 String title = request.getParameter("title"); //如果title有输入的时候,才拼接sql进行查询 if (title != null && !"".equals(title)) { sb.append(" and d.title like '%" + title + "%'"); } //取模类糊查询分类选择,是页面select标签的name String categoryId = request.getParameter("categoryId"); //取过来是个字符串,需要转一下int,但是一定要Try-catch一下,不然会报格式转换错误 int categoryid = Integer.parseInt(categoryId); //这里一定要判断一下,因为jsp页面下拉框有一个【全部】的分类选项,value=0,所以大于零,我才去拼接字符串查询,=0就是查全部,不需要加分类 的条件 if (categoryid > 0) { sb.append(" and d.categoryId=" + categoryid + " "); } List<NewsCategory> categorylist = newsService.getcategorylist(); // 页面容量 int pageSize = 5; // 当前页码 int currentPageNo = 1; //newsDetailList.jsp中加的隐藏域,当前页码是包括了下一页上一页或用户自己输入的当前页面参数值 String pageNo = request.getParameter("pageIndex");// 获取当前页码隐藏域1 //对当前页码进行容错处理,当当前页为空的时候,默认显示第1页 if (pageNo == null) { currentPageNo = 1; } else {// 不为空的话,就链接提交给我的当前页码即是用户请求的页码传给我的值,我赋予给我定的当前页码参数值 currentPageNo = Integer.parseInt(pageNo); } //获取总数据量的方法,参数里面也加了where条件,全列表和查询后列表均可用分页 int totalCount = newsService.getNewsCount(sb.toString());// 总记录数 /* 总页数 */ int totalPageCount = totalCount / pageSize + 1; // 首页和尾页的异常控制 if (currentPageNo <= 0) { currentPageNo = 1; } else if (currentPageNo > totalPageCount) { currentPageNo = totalPageCount; } // 显示每页新闻信息列表 List<NewsDetail> newsList = newsService.getPageNewsList(currentPageNo,pageSize, sb.toString()); //以下变量是要把变量值set到请求中转发给页面,页面要用的 request.setAttribute("currentPageNo", currentPageNo); request.setAttribute("pageSize", pageSize); request.setAttribute("totalPageCount", totalPageCount); request.setAttribute("totalCount", totalCount); request.setAttribute("categorylist", categorylist); request.setAttribute("newsList", newsList); request.getRequestDispatcher("/jsp/admin/newsDetailList.jsp").forward(request, response); }catch(Exception e){ e.printStackTrace(); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } @Override protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { super.service(arg0, arg1); } }
上面的servlet可能会报错:
int categoryid = Integer.parseInt(categoryId); 这个可能会报
java.lang.NumberFormatException: null的问题:
原因:首次进入首页,是doGet请求,不会去调查询那里的form的doPost方法,所以我们执行request.getParameter("categoryId")为空,因为这个获取表单数据值,只有Post提交才可以 当值为空的时候,转换就会出错,Integer类中有这个异常 所以要更改代码为:当不为空的时候,才转换
//取模类糊查询分类选择,是页面select标签的name String categoryId = request.getParameter("categoryId"); System.out.println("categoryId==================="+categoryId); //取过来是个字符串,需要转一下int,但是一定要Try-catch一下,不然会报格式转换错误 if(categoryId!=null&& !"".equals(categoryId)){ int categoryid = Integer.parseInt(categoryId); //这里一定要判断一下,因为jsp页面下拉框有一个【全部】的分类选项,value=0,所以大于零,我才去拼接字符串查询,=0就是查全部,不需要加分类 的条件 if (categoryid > 0) { sb.append(" and d.categoryId=" + categoryid + " "); } }
因为有上面这个问题,所以想到了就是实际上进入首页出全部列表信息,只是select下拉列表中默认选中【全部】选项,实际上并未有全部查询
如果这个时候也不选类型也不输入title关键字点击GO进行查询,那么必须加上这段,因为JSP页面select下拉列表元素【全部】这个项value=0
<option value="0">全部</option>
(上面代码已加上,这里只做原理说明时使用):
if (categoryid > 0) { sb.append(" and d.categoryId=" + categoryid + " "); }
web.xml配置:
<!--模糊查询多条件 --> <servlet> <servlet-name>newsListByLikeServlet</servlet-name> <servlet-class>com.cn.pb.servlet.NewsListByLike2</servlet-class> </servlet> <servlet-mapping> <servlet-name>newsListByLikeServlet</servlet-name> <url-pattern>/servlet/newsListByLikeServlet</url-pattern> </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); }
准备写一篇分离分页,把分页封装到一个类中的实例
相关文章推荐
- JSP+Servlet+javabean+oracle实现页面多条件模糊查询
- jsp+servlet+javabean实现简单的查询
- jsp+javabean+servlet+Mysql实现MVC模式下的注册登录留言功能
- JSP作业4 - 使用JSP+JavaBean+Servlet实现用户登录注册页面
- (jsp 和 servlet功能篇) jsp+servlet+javaBean 实现分页代码(mysql 数据库)
- Mysql通用查询操作类(Jsp+servlet+javaBean+Mysql)
- jsp+servlet+JavaBean+MySQL实现登陆实例
- jsp+jstl+servlet+javaBean+Mysql用户登录注册页面
- jsp+javaBean+servlet+mysql完整的实现一个登录功能
- jsp+Javabean+servlet实现分页查询
- 用JSP+Servlet+JavaBean模式实现一个简单的登录网页设计(JSP+Tomcat+MySQL)
- jsp页面15个输入条件框 多条件模糊查询方法
- 基于MVC 用户登录的实现(JavaBean + Servlet + JSP)
- 《研磨struts2》 第二章 Struts2的HelloWorld 之从Servlet+JSP+JavaBean实现MVC开始
- 使用servlet,jdbc将mysql中数据显示在jsp页面中,且实现直接删除数据库数据
- jsp+servlet+javaBean实现上传功能
- 《研磨struts2》 第二章 Struts2的HelloWorld 之从Servlet+JSP+JavaBean实现MVC开始
- jsp课程(7)---jsp+servlet+javabean 实现的简单网上购物车
- 用JSP+Javabean+Servlet实现一个投票系统
- javaBean+servlet+jsp实现分页效果