最近用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" οnclick="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即可