春节前的最后一天课……班里面现在连一半人都不到了……
BBS逻辑层和数据层封装:
新建Web工程mybbs,加入Struts特性。
加入Hibernate特性:数据源名称:java:comp/env/jdbc/datadialect名称:MySQL
meta-inf里面建立一个context.xml:把数据源的东西拷贝进去<Context path="/mybbs" docBase="mybbs"> <Resource name="jdbc/data" auth="" type=""………………………… ……………………url="……………………………………"></Context>
加入Hibernate的特性的过程中可以选择生成Session和SessionFactory的类。添加show_sql和format_sql属性为true---------------------------------------system.properties:
characterEncoding=gbk---------------------------------------org.mybbs.util包里面新建SystemConfig:
public class SystemConfig(作用:去读取资源包){ public static ResourceBundle bundle = ResourceBundle .getBundle("system"); public static final String CHARACTER_ENCODING = "characterEncoding"; //做成静态的,根据属性名得到属性值 public static String getProperty(String name) { String s = null ; try { s = bundle.getString(name); } catch(RuntimeException e) { e.printStackTrace() ; } return s ; }
public static String getCharacterEncoding() { return getProperty(SystemConfig.CHARACTER_ENCODING); }}
BBSActionServlet:package org.mybbs.action;public class BBSActionServlet extends ActionServlet{ protected void process(HttpServletRequest request,HttpServletResponse response) { request.setCharacterEncoding(SystemConfig.getCharacterEncoding()); response.setCharacterEncoding(SystemConfig.getCharacterEncoding()); super.process(request,response);//这句话一定不能丢!!! }
}
既然重写了ActionServlet,那么必须修改ActionServlet中的配置!
<servlet-class>org.mybbs.action.BBSActionServlet</servlet-class>
现在重新实现Action:package org.mybbs.action;public class GeneralAction extends Action{ //查询返回集合。这里面涉及分页的问题 protected List query(HttpServletRequest request,Class clazz,boolean needPagination) { List list = null ; if(needPagination) { Pagination pagination = new Pagination() ; list = pagination.getNextPage(request,clazz) ; } else { Session session = null ; try { session = HibernateSessionFactory.getSession() ; session.beginTransaction() ; list = session.createCriteria(clazz).list(); session.getTransaction().commit(); } catch(HibernateException e) { if(session!=null&&session.getTransaction()!=null) { session.getTransaction().rollback(); } e.printStackTrace(); } finally { HibernateSessionFactory.closeSession() ; } } return list ; } //封装插入功能,将异常全部抛给客户端,让struts去处理 protected void save(Class clazz Map map) throws Exception { Session session = null;
Object obj = null ; obj = clazz.newInstance() ; BeanUtils.populate(obj,map) ; if(obj!=null) { try { session = HibernateSessionFactory.getSession(); session.beginTransaction(); session.save(obj); session.getTransaction().commit(); } catch(HibernateException e) { if(session!=null && session.getTransaction()!=null) { session.getTransaction().rollback() ; } e.printStackTrace() ; } finally { HibernateSessionFactory.closeSession() ; } } }
protected void modify(Object obj) throws Exception { }
protected void delete(Object obj) throws Exception { }
}
package org.mybbs.util;//解决分页问题:public class Pagination{ private int perPage = Pagination.defaultPerPage ;//每页显示条目 private int page = 1; //当前的页数 public static final String PER_PAGE = "org.mybbs.per_page" ; public static final String PAGE = "org.mybbs.page" ; public static final String TOTAL_PAGE = "org.mybbs.total_page";
public static int defaultPerPage = 2 ; //生成getters和setters方法 public List getNextPage(HttpServletRequest request,Class clazz) { List result = null ;
Session session = null ; String perPageStr = request.getParameter(Pagination.PER_PAGE); String pageStr = request.getParameter(Pagination.PAGE) ; try { page = Integer.parseInt(pageStr); } catch(NumberFormatException e1) { page = 1 ; }
try { Pagination.defaultPerPage = Integer.parseInt(perPageStr); perPage = Pagination.defaultPerPage ; } catch(NumberFormatException e1) { perPage = Pagination.defaultPerPage ; } session = HibernateSessionFactory.getSession(); //HibernateSessionFactory是myeclipse给你封装好的一个类。 //我们要的是记录的总数目,在HQL中,select count(*) from User //就是选出记录数,但是怎么用Criteria来实现选出记录数呢?
//关系表的三种操作:选取(选行)、连接、投影(选列) session.beginTransaction() ; Criteria criteria = session.createCriteria(clazz) .setProjection(Projections.rowCount()); //这就得到了记录数 Integer rowCount = (Integer) criteria.uniqueResult(); int totalPage = (rowCount.intValue()+perPage-1)/perPage ;//总页数 if(page<1 || page>totalPage) { page = 1 ; }
result = session.createCriteria(clazz).setFirstResult((page-1)*perPage) .setMaxResults(perPage) .list() ; session.getTransaction().commit(); request.setAttribute(Pagination.PAGE,new Integer(page));//当前页数 request.setAttribute(Pagination.TOTAL_PAGE,new Integer(totalPage)); //总页数存入请求作用域
HibernateSessionFactory.closeSession() ; //不仅关闭了Session,还把ThreadLocal中清空了,这里不能使用Session.close() return result ;
}}
--------------------------------------------------------------------------------
前台封装:
显示分页的结果:
第1页/共10页 上一页 下一页 跳转到__页 每页6条
应该封装成标签较好。
建一个标签处理类:
package org.mybbs.taglib;
public class PaginationTag extends SimpleTagSupport{ private String url = null ;
private boolean showPerPage = true ; private boolean showToPage = true ; //别忘了给上面的三个属性加入getter和setter方法!!! public void doTag() throws JspException,IOException { PageContext pageContext = (PageContext)getJspContext ; JspWriter out = pageContext.getOut() ; StringBuffer sb = new StringBuffer() ; if(url==null) { url = ((HttpServletRequest)pageContext.getRequest()).getRequestURI(); } System.out.println(url); sb.append("<form action='") .append(url) .append("'>");
renderInfo(pageContext,sb); //第1页/共10页 renderPrePage(pageContext,sb);//上一页 renderNextPage(pageContext,sb);//下一页 if(showToPage) renderToPage(sb);// 跳转到__页 if(showPerPage) renderPerPage(sb);//每页6条 sb.append("</form>"); out.println(sb.toString()); }
protected void renderInfo(PageContext pageContext,StringBuffer sb) throws JspException,IOException { Integer page = (Integer)pageContext.getRequest().getAttribute(Pagination.PAGE); if(page==null) { page = new Integer(1) ; } Integer totalPage = (Integer)pageContext.getRequest() .getAttribute(Pagination.TOTAL_PAGE);
sb.append("第") .append(page.intValue()) .append("页"); if(totalPage!=null) { sb.append("/").append("共").append(totalPage).append(页); } }
protected void renderPrePage(PageContext pageContext,StringBuffer sb) throws JspException,IOException { Integer page = (Integer)pageContext.getRequest().getAttribute(Pagination.PAGE); if(page==null) { page = new Integer(1) ; }
if(page.intValue()<=0) { sb.append(" ").append("上一页"); } else { sb.append("<a href='").append(url).append("?").append(Pagination.PAGE) .append("=").append(page.intValue()-1) .append("'>").append("上一页").append("</a>"); } }
protected void renderNextPage(PageContext pageContext,StringBuffer sb) throws JspException,IOException { Integer page = (Integer)pageContext.getRequest().getAttribute(Pagination.PAGE); if(page==null) { page = new Integer(0) ; } Integer totalPage = (Integer)pageContext.getRequest() .getAttribute(Pagination.TOTAL_PAGE); if(totalPage==null) { return ; } if(page.intValue()>=totalPage.intValue()) { sb.append(" ").append("下一页"); } else { sb.append("<a href='").append(url).append("?").append(Pagination.PAGE) .append("=").append(page.intValue()+1) .append("'>").append("下一页").append("</a>"); } }
protected void renderToPage(StringBuffer sb) throws JspException,IOException { sb.append("到<input type='text' name='") .append(Pagination.PAGE) .append("' size='1' οnblur='document.forms[0].submit()'>页"); }
protected void renderPerPage(StringBuffer sb) throws JspException,IOException { sb.append("每页显示<input type='text' name='") .append(Pagination.PER_PAGE) .append("' size='1' οnblur='document.forms[0].submit()'>条"); }}
建立一个tld文件mybbs.tld
<tlib-version>2.0</tlib-version><short-name>mybbs</shourt-name>
<tag> <name>pagination</name> <tag-class>org.mybbs.taglib.PaginationTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>url</name> <required>no</required> <rtexprvalue>yes</rtpextvalue> </attribute> <attribute> <name>showToPage</name> <required>no</required> <rtexprvalue>yes</rtpextvalue> </attribute> <attribute> <name>showPerPage</name> <required>no</required> <rtexprvalue>yes</rtpextvalue> </attribute></tag>
------------------------------------------------
做一个Action来测试一下上面的分页封装:org.mybbs.action.GeneralActioni作为Action的直接父类
<action path="/listSection" type="org.mybbs.action.ListSectionAction"> <forward name="success" path="/WEB-INF/jsp/listSection.jsp"></action>public class ListSectionAction extends GeneralAction{ public ActionForward execute() { request.setAttribute("sections",query(request,Sections.class,true)); return mapping.findForward("success"); }}
在WEB-INF中建立一个jsp页面listSection.jsp
引入mybbs的tld文件和logic的tld文件。
<body> <table border="1"> <logic:iterate id="section" name="sections"> <tr> <td>${section.sectionId}</td> <td>${section.sectionName}</td> <td>${section.sectionEnglishName}</td> <td>${section.sectionTable}</td> <td>${section.onlineAmount}</td> <td>${section.sectionCreateTime}</td> </tr> </logic:iterate> <tr> <td colspan="6" align="right"> <mybbs:pagination url="${pageContext.request.contextPath}/listSection.do"/> </td> </tr> </table></body>