需求:

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

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

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+mysql实现页面多条件模糊查询的更多相关文章

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

    之前写过一篇JSP+Servlet+javabean+mysql实现页面多条件模糊查询 使用的是mysql进行的分页查询,mysql用limit控制,而oracle则是用rownum,今天第一次写or ...

  2. MVC jsp+servlet+javabean 连接Mysql数据库測试demo

    本文介绍的是怎样使用MVC架构去实现jsp+servlet+javabean连接数据库 首先我们应该了解什么是MVC: MVC包含三个部分 : ①View:由各种JSP页面组成. ②Controlle ...

  3. JSP中使用的模式——JSP+Servlet+JavaBean

    上一篇博文写到模式一:JSP+JavaBean 链接地址:http://wxmimperio.coding.io/?p=155 JSP中两种模式的总结 链接地址:http://wxmimperio.c ...

  4. 深入浅出Java MVC(Model View Controller) ---- (JSP + servlet + javabean实例)

    在DRP中终于接触到了MVC,感触是确实这样的架构系统灵活性不少,现在感触最深的就是使用tomcat作为服务器发布比IIS好多了,起码发布很简单,使用起来方便. 首先来简单的学习一下MVC的基础知识, ...

  5. (jsp+servlet+javabean )MVC架构

    MVC是三个单词的缩写,这三个单词分别为:模型.视图和控制. 使用的MVC的目的:在于将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式.比如Windows系统资源管理器文件夹内容的显示方 ...

  6. Maven+JSP+Servlet+JDBC+Mysql实现的dbExper宾馆管理系统

    本文存在视频版本,请知悉 项目简介 项目来源于:https://github.com/mafulong/databaseExper-hotelMaster 这次分享的也是毕设或课程设计选择一样很多的宾 ...

  7. JSP+Servlet+JDBC+Mysql实现的天才会议管理系统

    本文存在视频版本,请知悉 项目简介 项目来源于:https://github.com/hegexunmeng/meeting-system 这次分享一个会议管理系统,前端后端几乎没有使用任何框架,适合 ...

  8. JSP+Servlet+JDBC+mysql实现的个人日记本系统

    项目简介 项目来源于:https://gitee.com/wishwzp/Diary 本系统基于JSP+Servlet+Mysql 一个基于JSP+Servlet+Jdbc的个人日记本系统.涉及技术少 ...

  9. JSP+Servlet+JDBC+mysql实现的学生成绩管理系统

    项目简介 项目来源于:https://gitee.com/zzdoreen/SSMS 本系统基于JSP+Servlet+Mysql 一个基于JSP+Servlet+Jdbc的学生成绩管理系统.涉及技术 ...

随机推荐

  1. 如何对于几百行SQL语句进行优化?

    1.最近在开发中遇到的一些关于几百行SQL语句做查询的问题,需要如何的解决优化SQL这确实是个问题,对于当下的ORM 框架 EF 以及其他的一些的开源的框架例如Drapper ,以及Sqlite-Su ...

  2. JS是按值传递还是按引用传递

    按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本.修改形参的值并不会影响实参. 按引用传递(call by reference)时,函数的形参接收实参的隐式 ...

  3. model 的验证

    Ext.onReady(function(){ Ext.define('User', { extend: 'Ext.data.Model', fields: [ { name: 'name', typ ...

  4. ueditor1.3.6jsp版在struts2应用中上传图片报"未找到上传文件"解决方案

    摘要: ueditor1.3.6jsp版在struts2应用中上传图片报"未找到上传文件"解决方案 在struts2应用中使用ueditor富文本编辑器上传图片或者附件时,即使配置 ...

  5. [转]html js中name和id的区别和使用分析

    js中web页面元素的调用可以有两种识别方法:id和name 自己在用的过程中总结一下id和name的使用区别. 一,使用范围 除 BASE, HEAD, HTML, META, SCRIPT, ST ...

  6. 【POJ 2653】Pick-up sticks 判断线段相交

    一定要注意位运算的优先级!!!我被这个卡了好久 判断线段相交模板题. 叉积,点积,规范相交,非规范相交的简单模板 用了“链表”优化之后还是$O(n^2)$的暴力,可是为什么能过$10^5$的数据? # ...

  7. mysql5.5的安装与配置(亲测版)

    mysql5.5.x的编译安装 说明:5.5和5.1差不多,只是在编译时增加了一个cmake,其他基本一样,mysql5.5默认编码是utf-8,在使用mysql5.5配置lnmp或者lamp后安装d ...

  8. js闭包详解

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的特性 闭包有三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数 ...

  9. 绘图: Shape, Path

    Shape - 图形 Path - 路径 示例1.演示“Shape”相关知识点Drawing/Shape.xaml <Page x:Class="Windows10.Drawing.S ...

  10. Servlet 工作原理解析

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-servlet/ Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 J ...