彩票网站的统计怎么做,网站推广优化如何做,wordpress 首页尾页,找家里做的工作上哪个网站目录
一.重构-提取公用方法 1.为了进行公共方法的抽取#xff0c;需要找出上面实习中的可通用部分#xff0c;和差异化部分 2.公用方法封装思路 3. 具体实现
二.分页标签
2.1 准备一个Servlet 3.2 结果展示页面
三. 过滤器解决中文乱码问题
四.加入分页功能
四…目录
一.重构-提取公用方法 1.为了进行公共方法的抽取需要找出上面实习中的可通用部分和差异化部分 2.公用方法封装思路 3. 具体实现
二.分页标签
2.1 准备一个Servlet 3.2 结果展示页面
三. 过滤器解决中文乱码问题
四.加入分页功能
四.封装分页标签 编写助手类
标签库描述文件中添加paging标签 使用分页标签首先在页面中引入标签
将原来的分页功能替换为标签即可
MySQL分页 最后结果展示页面 一.重构-提取公用方法 1.为了进行公共方法的抽取需要找出上面实习中的可通用部分和差异化部分
.只要是分页就会统计总记录数而总记录数的统计是在业务sql外封装了一个select count(*)是有规律可循的可以通用只要是分页则封装分页sql也是有规律可循的在业务sql后加limit子句即可可以通用因为每个查询对应的业务实体即模型不同所以ORM映射部分不能通用 2.公用方法封装思路 将可通用的部分封装到模板中 差异化部分即不可通用部分可以定义一个处理接口以便于通过参数传入个性化的实现部分 3. 具体实现
通用分页查询模板类
public final class DBTemplate {private DBTemplate() {}public static interface IORMConvertT {ListT convert(ResultSet rs) throws SQLException;}public static T ListT query(String sql, Object[] params, PageBean pageBean, IORMConvertT convert) {ListT datas new ArrayList();Connection con null;PreparedStatement ps null;ResultSet rs null;//不需要分页if (pageBean null || !pageBean.isPagination()) {try {con DBUtil.getConection();ps con.prepareStatement(sql);setParam(params, ps);rs ps.executeQuery();datas convert.convert(rs);return datas;} catch(Exception e) {e.printStackTrace();} finally {DBUtil.closeDB(rs, ps, con);}} else {//1. 查询总记录数//2. 查询当前页数据//1. 生成统计总记录数的SQL 查询总记录数try {String countSql select count(*) from ( sql ) tmp;con DBUtil.getConection();ps con.prepareStatement(countSql);setParam(params, ps);rs ps.executeQuery();while(rs.next()) {pageBean.setTotal(rs.getInt(1));}/** 如果统计的总记录数为0则表示没有符合条件的记录直接返回一个空结果集即可。*/if(pageBean.getTotal() 0) {return datas;}} catch (Exception e) {e.printStackTrace();} finally {if(pageBean.getTotal() 0) {DBUtil.closeDB(rs, ps, con);}DBUtil.closeDB(rs, ps);}//查询当前页数据try {String pagingSql sql limit pageBean.getStartRow() , pageBean.getRows();ps con.prepareStatement(pagingSql);setParam(params, ps);rs ps.executeQuery();datas convert.convert(rs);} catch (SQLException e) {e.printStackTrace();} finally {DBUtil.closeDB(rs, ps, con);}}return datas;}private static void setParam(Object[] params, PreparedStatement ps) throws SQLException {if (params ! null) {int i 1;for (Object param : params) {ps.setObject(i, param);i;}}}}
使用示例
public class StudentDao2 {public ListStudent getStudents(String sname, PageBean pageBean) {String sql select * from t_student where sname like ?;return DaoTemplate.query(sql, new Object[] {sname}, pageBean, new IORMConvertStudent() {Overridepublic ListStudent convert(ResultSet rs) throws SQLException {ListStudent stus new ArrayList();while(rs.next()) {Student stu new Student();stu.setSid(rs.getInt(sid));stu.setSname(rs.getString(sname));stu.setAge(rs.getInt(age));stu.setRemark(rs.getString(remark));stus.add(stu);}return stus;}});}public static void main(String[] args) {StudentDao2 dao new StudentDao2();PageBean pageBean new PageBean();pageBean.setPage(3);ListStudent students dao.getStudents(张%, pageBean);students.forEach(s - System.out.println(s));}}
二.分页标签
2.1 准备一个Servlet
准备一个servlet用于处理请求获取数据库中的数据并转发到结果显示页面
WebServlet(value /students)
public class StudentAction extends HttpServlet {private static final long serialVersionUID 3152900867611381148L;private StudentDao2 studentDao new StudentDao2();Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {PageBean pageBean new PageBean();pageBean.setRequest(request);request.setAttribute(pageBean, pageBean);String sname request.getParameter(sname);ListStudent students studentDao.getStudents(sname%, pageBean);request.setAttribute(students, students);System.out.println(dopost .......... );request.getRequestDispatcher(/students/stuList.jsp).forward(request, response);}} 3.2 结果展示页面
创建一个页面该页面用于显示结果 使用jstl的c标签来展示结果为正常使用c标签需要引入jstl-1.2.jar和standard-1.1.2.jar。
% page languagejava contentTypetext/html; charsetutf-8pageEncodingutf-8%
%taglib prefixz uri/zking %
%taglib prefixc urihttp://java.sun.com/jsp/jstl/core%
!DOCTYPE html
html
head
meta http-equivContent-Type contenttext/html; charsetISO-8859-1
titleInsert title here/title
/head
bodyh1学生信息/h1form action%request.getContextPath()%/students methodpostinput typetext namesnameinput typesubmit value查询/formtable border1 stylewidth: 98%;trtd学号/tdtd姓名/tdtd年龄/tdtd备注/td/trc:forEach items${students} varstudenttrtd${student.sid}/tdtd${student.sname}/tdtd${student.age}/tdtd${student.remark}/td/tr/c:forEachz:paging pageBean${pageBean}//table
/body
/html
三. 过滤器解决中文乱码问题
/*** 中文乱码处理*/WebFilter(/*)
public class EncodingFiter implements Filter {private String encoding UTF-8;// 默认字符集public EncodingFiter() {super();}public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest req (HttpServletRequest) request;HttpServletResponse res (HttpServletResponse) response;// 中文处理必须放到 chain.doFilter(request, response)方法前面res.setContentType(text/html;charset this.encoding);if (req.getMethod().equalsIgnoreCase(post)) {req.setCharacterEncoding(this.encoding);} else {Map map req.getParameterMap();// 保存所有参数名参数值(数组)的Map集合Set set map.keySet();// 取出所有参数名Iterator it set.iterator();while (it.hasNext()) {String name (String) it.next();String[] values (String[]) map.get(name);// 取出参数值[注参数值为一个数组]for (int i 0; i values.length; i) {values[i] new String(values[i].getBytes(ISO-8859-1),this.encoding);}}}chain.doFilter(request, response);}public void init(FilterConfig filterConfig) throws ServletException {String s filterConfig.getInitParameter(encoding);// 读取web.xml文件中配置的字符集if (null ! s !s.trim().equals()) {this.encoding s.trim();}}}
四.加入分页功能
先不考虑功能性在页面上的table标签下加入及分页工具条
div styletext-align: right; width:98%;第1页nbsp;nbsp;nbsp;共100条记录nbsp;nbsp;nbsp;a首页/anbsp;nbsp;nbsp;a上页/anbsp;nbsp;nbsp; a下页/anbsp;nbsp;nbsp; a尾页/anbsp;nbsp;nbsp;第input typetext size2 / a href#GO/a/div
不考虑通过的分页如下实现先在结果页面中实现分页功能。
% page languagejava contentTypetext/html; charsetutf-8pageEncodingutf-8%
%taglib prefixz uri/zking %
%taglib prefixc urihttp://java.sun.com/jsp/jstl/core%
!DOCTYPE html
html
head
meta http-equivContent-Type contenttext/html; charsetISO-8859-1
titleInsert title here/title
/head
bodyh1学生信息/h1form action%request.getContextPath()%/students methodpostinput typetext namesname/input typesubmit value查询/formtable border1 stylewidth: 98%;trtd学号/tdtd姓名/tdtd年龄/tdtd备注/td/trc:forEach items${students} varstudenttrtd${student.sid}/tdtd${student.sname}/tdtd${student.age}/tdtd${student.remark}/td/tr/c:forEach/table!-- 分页页面元素 --div styletext-align: right; width:98%;第${pageBean.page}页nbsp;nbsp;nbsp;共${pageBean.total}条记录nbsp;nbsp;nbsp;a hrefjavascript: goPage(1);首页/anbsp;nbsp;nbsp;a hrefjavascript: goPage(${pageBean.previousPage});上页/anbsp;nbsp;nbsp; a hrefjavascript: goPage(${pageBean.nextPage});下页/anbsp;nbsp;nbsp; a hrefjavascript: goPage(${pageBean.totalPage})尾页/anbsp;nbsp;nbsp;第input typetext idpagingPageNum size2 onkeypressgoSpecifiedPage(event,this.value);/ a hrefjavascript: goPage(document.getElementById(pagingPageNum).value)GO/a/div!-- 用于分页的隐藏表单 --form action${pageBean.url} idpagingForm methodpostinput typehidden namepage value${pageBean.page}/!-- 先只考虑本功能的查询参数没有考虑公用性不同功能的参数不同 --input typehidden namesname value%request.getParameter(sname)%//form!-- 用于分页的js代码 --scriptfunction goPage(pageNum) {var form document.getElementById(pagingForm);form.page.value pageNum;form.submit();}function goSpecifiedPage(event) {if(event.keyCode 13) {var pageNum document.getElementById(pagingPageNum).value;var form document.getElementById(pagingForm);form.page.value pageNum;form.submit();}}/script/body
/html
目前为止分页功能已经实现了。
遗留下来的问题 1 如果其他功能需要分页则需要复制大量代码才能重用该功能 2 如果系统需要修改分页工具栏的显示风格呢
四.封装分页标签
为了方便代码的复用及可维护性我们将分页功能封装了一个自定义标签其实就是将原来写在页面中的代码通过移入到自定义标签中去实现开发自定义标签分成三步
编写助手类编写标签描述文件在页面上引入标签库并使用 编写助手类 public class PagingTag extends BodyTagSupport {private PageBean pageBean;public PageBean getPageBean() {return pageBean;}public void setPageBean(PageBean pageBean) {this.pageBean pageBean;}Overridepublic int doStartTag() throws JspException {JspWriter out this.pageContext.getOut();try {out.println(buildHtml());return SKIP_BODY;} catch (IOException e) {throw new JspException(分页标签异常, e);}}//生成Html内容private String buildHtml() {//构建分页页面元素String pagingElement div style\text-align: right; width:98%;\\r\n 第 pageBean.getPage() 页nbsp;nbsp;nbsp;\r\n 共 pageBean.getTotal() 条记录nbsp;nbsp;nbsp;\r\n a href\javascript: goPage(1);\首页/anbsp;nbsp;nbsp;\r\n a href\javascript: goPage( pageBean.getPreviousPage() );\上页/anbsp;nbsp;nbsp; \r\n a href\javascript: goPage( pageBean.getNextPage() );\下页/anbsp;nbsp;nbsp; \r\n a href\javascript: goPage( pageBean.getTotalPage() )\尾页/anbsp;nbsp;nbsp;\r\n 第input type\text\ id\pagingPageNum\ size\2\ valuepageBean.getPage() onkeypress\goSpecifiedPage(event,this.value);\/ \r\n a href\javascript: goPage(document.getElementById(pagingPageNum).value)\GO/a\r\n /div;//构建隐藏表单用于在分页时传递分页参数String hiddenForm form action pageBean.getUrl() id\pagingForm\ method\post\ input type\hidden\ name\page\ /;MapString, String[] parameterMap pageBean.getParameterMap();for(Map.EntryString, String[] param: parameterMap.entrySet()) {String paramName param.getKey();if(page.equals(paramName)) continue;String[] values param.getValue();for(String val: values) {hiddenForm input typehidden name paramName value val ;}}hiddenForm /form;//构建分页功能需要的js代码块String script script\r\n function goPage(pageNum) {\r\n var form document.getElementById(\pagingForm\);\r\n form.page.value pageNum;\r\n form.submit();\r\n }\r\n \r\n function goSpecifiedPage(event) {\r\n if(event.keyCode 13) {\r\n var pageNum document.getElementById(\pagingPageNum\).value;\r\n var form document.getElementById(\pagingForm\);\r\n form.page.value pageNum;\r\n form.submit();\r\n }\r\n }\r\n /script;return pagingElement hiddenForm script;}}
标签库描述文件中添加paging标签
tagnamepaging/nametag-classcom.zking.mvc.tag.PagingTag/tag-classbody-contentempty/body-contentattributenamepageBean/namerequiredtrue/requiredrtexprvaluetrue/rtexprvalue/attribute/tag 使用分页标签 首先在页面中引入标签
%taglib prefixz uri/zking %
将原来的分页功能替换为标签即可
z:paging pageBean${pageBean}/
MySQL分页 limit语法
select * from table_name limit [offset] rows 参数说明
参数说明offset指定第一个返回记录行的偏移量即从哪一行开始返回注意初始行的偏移量为0offset 返回具体行数 最后结果展示页面