春节前的最后一天课……班里面现在连一半人都不到了……
BBS逻辑层和数据层封装:
新建Web工程mybbs,加入Struts特性。
加入Hibernate特性:
数据源名称:java:comp/env/jdbc/data
dialect名称: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>