最近用ssh做个小东西,总结下:
1. struts 表单回显为空或者为乱码的问题,JSP页面用的是utf-8: 对这个问题最普通的场景就是对一条记录进行修改,在修改页面应该回显些记录的信息。 对这个问题,处理的方法是:在action中,不应该new 一个form,比如:ModuleForm moduleForm=new ModuleForm(); 而应该ModuleForm moduleForm=(ModuleForm)form;
2. 表格中记录号的显示问题 通过我们把记录以列表的形式显示出来的时候,都希望第一列显示行号,这个问题可以用JS解决,比如:table的id为main。
var obj = document.getElementById("main"); var startIndex = document.getElementById("startIndex").value; var rowNum = obj.rows.length; for (var i = 1; i < rowNum; i = i + 1) { obj.rows[i].cells[0].style.textAlign = "center"; obj.rows[i].cells[0].style.width = 20; obj.rows[i].cells[0].innerHTML = (parseInt(startIndex) + i).toString(); }
3 iframe动态加载: 环境:当点击一个按钮时,改变ifream的src,这个src为.do,即请求一个Action处理业务。要求不刷新页面
<html> <body> <input type="button" value="changeit" onclick="changeIframe()" /> <script language="javascript"> function changeIframe() { document.frames["hiddenframe"].document.location = '2.do'; } </script> <iframe id='hiddenframe' src=''> </iframe> </body> </html>
4. 当返回一个页面时,刷新另外一个页面在返回页面中:
<html:messages id="item" property="flashUrl" message="true"> <input type="hidden" name="flashTarget" value="<bean:write name="item"/>"> </html:messages> <script type="text/javascript"> if(document.getElementById("flashTarget")!=null){ var windowTarget=document.getElementById("flashTarget").value; eval(windowTarget+".location.reload()"); } </script> 在后台: ActionMessages requestMessages = new ActionMessages(); requestMessages.add("targeturl", new ActionMessage("message.targeturl",Contains.BOARDS_LIST)); this.addMessages(request, requestMessages);
5. 点击一个按钮,框架中树的大小由0变为200
parent.boards_container.framesetId.cols="200,*"; 其中framesetId为boards_container中的一个frameset元素的ID
6. struts+hibernate+spring的DAO层设计:
设计一个通用DAO接口,再设计一个实现该接口的实现类DAOIMPL
public interface BaseHibernateDao<T>{ public T get(Serializable id) ; public List<T> getAll(); } public class BaseHibernateDaoImpl<T> extends HibernateDaoSupport { private Class<T> entityClass; public BaseHibernateDaoImpl() { Type genType = getClass().getGenericSuperclass(); if (genType instanceof ParameterizedType) { Type[] params = ((ParameterizedType) genType) .getActualTypeArguments(); entityClass = (Class<T>) params[0]; } } public Class getEntityClass() { return entityClass; } }
再设计我们自己的系统DAO,可以有多个[在J2EE框架设计中,多个DAO对应一个DAO实现类,可以考虑下]
public interface UserDao extends BaseHibernateDao<User>{ } public class UserDaoImpl extends BaseHibernateDaoImpl<User> implements UserDao { }
因为UserDaoImpl继承自BaseHibernateDaoImpl,而BaseHibernateImpl继承自HibernateDaoSupport ,所以
在UserDaoImpl中不用定义SessionFactory 及其get/set方法,因为HibernateDaoSupport 中有,Spring的配制
如下:
<bean id="daoTemplate" abstract="true"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="userDaoTarget" class="com.songbx.console.dao.impl.UserDaoImpl" parent="daoTemplate"/>
而HibernateDaoSupport 不用配
7.分页的代码:
package com.songbx.common.page; import java.util.ArrayList; import java.util.List; public class Page implements java.io.Serializable { private int currentOfPage;//当前页号 private int sizeOfPage = Constants.DEFAULT_PAGE_SIZE;//每页的记录数 private int totalOfRecords;//总记录数 private Object resultList;//当前页中存放的记录 public int getCurrentOfPage() { return currentOfPage; } public int getSizeOfPage() { return sizeOfPage; } public int getTotalOfRecords() { return totalOfRecords; } /** * 构造方法,只构造空页 */ public Page() { this(1,Constants.DEFAULT_PAGE_SIZE , 0, new ArrayList()); } /** * 默认构造方法 * @param currentOfPage 当前页码 * @param sizeOfPage 每页记录数 * @param totalOfRecords 总记录数 * @param resultList 当前页包含的数据 */ public Page(int currentOfPage, int sizeOfPage, int totalOfRecords, Object resultList) { this.currentOfPage = currentOfPage; this.sizeOfPage = sizeOfPage; this.totalOfRecords = totalOfRecords; this.resultList = resultList; } /** * 取总页数 */ public int getTotalOfPage() { if (totalOfRecords % sizeOfPage == 0 && totalOfRecords!=0) return totalOfRecords / sizeOfPage; else return totalOfRecords / sizeOfPage + 1; } /** * 是否有下一页 */ public boolean hasNextPage() { return (this.currentOfPage < this.getTotalOfPage()); } /** * 是否有上一页 */ public boolean hasPreviousPage() { return (this.currentOfPage > 1); } /** * 是否有第一页 */ public boolean hasFirstPage() { return (this.currentOfPage !=1); } /** * 是否有第一页 */ public boolean hasLastPage() { return (this.currentOfPage !=getTotalOfPage()); } /** * 取当前页的记录 */ public Object getResultList() { return this.resultList; } /** * 记当前页第一条记录在数据库中的编号 * @param currentOfPage * @param sizeOfPage * @return */ public static int getStartOfPage(int currentOfPage,int sizeOfPage){ return (currentOfPage-1)*sizeOfPage; } /** * 产生分页信息 */ public static String generatePageInfo(Page page,String url){ if(page==null){ return null; } StringBuffer sb=new StringBuffer(); if(page.hasFirstPage()){ sb.append("<a href=/""+url+"?currentPage=1/">第一页</a>"); } if(page.hasPreviousPage()){ sb.append("<a href=/""+url+"?currentPage="+(page.getCurrentOfPage()-1)+"/">上一页</a>"); } sb.append("第<font color=red>"+page.getCurrentOfPage()+"</font>页"); sb.append("共"+page.getTotalOfPage()+"页"); sb.append("共"+page.getTotalOfRecords()+"条"); if(page.hasNextPage()){ sb.append("<a href=/""+url+"?currentPage="+(page.getCurrentOfPage()+1)+"/">下一页</a>"); } if(page.hasLastPage()){ sb.append("<a href=/""+url+"?currentPage="+page.getTotalOfPage()+"/">最后页</a>"); } return sb.toString(); } }
在DAO中:
/** * HQL分页查询,可以指定具体的模式, 采用getCount方式,须在此层完成hsql的转换与查询。 * 注意参数Object...args的应用,可以在查询的设置查询条件用的(JDK5.0语法) */ public Page pagedQuery(String hql, int pageNo, int pageSize, Object[] args) { Assert.hasText(hql); Query query = getSession().createQuery(hql); List countlist = null; String countQueryString = " select count (*) " + HibernateTools.removeSelect(HibernateTools.removeOrders(hql)); if (args != null) { for (int i = 0; i < args.length; i++) { query.setParameter(i, args[i]); } countlist = getHibernateTemplate().find(countQueryString, args); }else{ countlist = getHibernateTemplate().find(countQueryString); } int totalCount = Integer.parseInt(countlist.get(0).toString()); Page page= getPageResult(query, totalCount, pageNo, pageSize); return page; } public Page getPageResult(Query q, int totalCount, int pageNo, int pageSize) { if (totalCount < 1) return new Page(); int startIndex = Page.getStartOfPage(pageNo, pageSize); List list = q.setFirstResult(startIndex).setMaxResults(pageSize).list(); return new Page(pageNo, pageSize, totalCount, list); }
在Action中:
Page page = systemService.getBoardPage(currentOfPage, sizeOfPage); request.setAttribute("pageInfo", Page.generatePageInfo(page, request.getContextPath()+ "/listBoardsAction.do"));
然后在页面上得到这个pageInfo即可