工作总结

来源:互联网 发布:数据库设计e-r图 编辑:程序博客网 时间:2024/04/28 06:53

最近用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;elsereturn 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即可