围绕分页的练习(1)(ssh+freemarker)

      上一周突然想做一个分页的练习,就付诸于行动,主要是想围绕分页学习一下freemarker,随便学习很多以前没有很好掌握的东东,如怎样实现群删、表与表之间如何连接并显示出来、如何简单地将某一页的数据导出为Excel文件,如何改变一页的显示条数等等。通过近一周的努力,终于整出了比较满意的效果。现在我分享一下我的成果,对很多高手而言,我这种东东可以说不屑一看,但对我来言,很有意义,毕竟通过这次练习我学到很多东西,希望给予别人一些帮助吧。 

 

用到的工具MyEclipse 和SQL Server 2000

 主界面如图所示:主界面

    这次练习用到三张表(bbs_user、shi、sheng),主要围绕bbs_user作出分页。

create table bbs_user
(
user_id   varchar(32) not null,
username  varchar(20) not null,
password  varchar(20) not null,
sex  varchar(2),
email  varchar(20) not null,
question  varchar(20),
answer  varchar(20),
regdate  datetime,
state  int,
shiid  varchar(32),
primary key (user_id)
);

create table sheng
(
shengid  varchar(32) not null,
shengname  varchar(20),
adddate  datetime,
editdate  datetime,
state  int,
primary key (shengid)
);

create table shi
(
shiid   varchar(32) not null,
shengid  varchar(32),
shiname  varchar(20),
adddate  datetime,
editdate  datetime,
state  int,
primary key (shiid)
);

Hibernate的映射文件将对象与数据库作出了映射,所以在数据库的表与表之间不必设置外键的关系。具体的数据库请下载附件li_bbsData.rar。

1、实现省市二级联动。参照

2、保存、修改用户。

      1)、注册

          

// 验证注册
 @Transactional(propagation=Propagation.REQUIRED,readOnly=false)
 public void isCheckInsert(UserModel userModel) {
  User user = new User();
  try {
   BeanUtils.copyProperties(user,userModel);
//   String shi_name=userModel.getShiname();
//   System.out.println(shi_name);
//   String shi_id=shiDao.getShiid(shi_name);
   String shi_id=userModel.getShiid();
   System.out.println("shi_id="+shi_id);
   Shi shi=new Shi();
   shi=shiDao.getTheShi(shi_id);  
   user.setRegdate(new Date());
   user.setState(1);
   //user.setShiid(shi_id);
   user.setShi(shi);
   //只要setShi()就行,不需要setShiid()
   userDao.checkInsert(user);  
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (InvocationTargetException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } 
 }

 

    2)、修改

    

 //修改用户
  @Transactional(propagation=Propagation.REQUIRED,readOnly=false)
	public void updateuser(UserModel userModel){
	    User user = new User();
	    Shi shi=new Shi();
	    String id=userModel.getUid();
	    //System.out.println("用户ID为"+id);
	    user=userDao.findById(id);
	    user.setName(userModel.getName());
	    user.setSex(userModel.getSex());
	    user.setQuestion(userModel.getQuestion());
	    user.setAnswer(userModel.getAnswer());
	    String shiid=userModel.getShiid();
	    System.out.println("shiid="+shiid);
	    //第一次为shiname,第二次为shiid
	    //判断是shiname还是shiid即判断是否为中文
	    boolean flag=false;
	    Thecommon thecommon=new Thecommon();
	    flag=thecommon.isIncludeChanse(shiid);
	    if(flag){
	    	String theshiid=shiDao.getShiid(shiid);//由市名得到市id
	    	shi=shiDao.getTheShi(theshiid);
	    }
	    else{
	    	shi=shiDao.getTheShi(shiid);
	    }	  	    
	    user.setShi(shi);
	    userDao.update(user);			    	   	   	    
	}

 

 3、用left join 显示用户信息(含市名)。          

 

String hql_1="select u.id,u.name,u.password,u.sex,u.email,u.question,u.answer,u.regdate,s.shiname "; 
String hql_2="from User as u left join u.shi as s";
 //String hql_3=hql_1+"from User as u,Shi as s where u.shi.shiid=s.shiid";

 

    不用写 u.shiid=s.shiid,注意是u.shi,而不是Shi。

 4、实现分页

     1)、用freemarker操作一页数据的显示。

          a)、UserDaoImpl.java               

 

//得到一页用户列表
	public List getTheUserList(int pageSize, int startRow,String hql){
		List list=new ArrayList();
       	try{
            //String hql = "FROM User AS u ORDER BY u.id";
            Query q = getTheSession().createQuery(hql);
            q.setFirstResult(startRow);//0,5,10....
            q.setMaxResults(pageSize);
            list=q.list();
       	}
       	catch(RuntimeException e){
		  	throw e;
		  }		
	   return list;	
	}

 

 

          b)、UserAction.java

 

//显示初始用户列表
	public String getuserlist() throws Exception {		
		ActionContext ctx = ActionContext.getContext(); 
        Map m=ctx.getSession();   
		m.put("search_keyword",null);
		m.put("search_cat",null);	
		String hql_1="select u.id,u.name,u.password,u.sex,u.email,u.question,u.answer,u.regdate,s.shiname ";
		String hql_2="from User as u left join u.shi as s";//u.shi多对一的关系,不是nn.bbs.vo.Shi,不必写where u.shi.shiid=s.shiid		
		String hql_3="  order by u.regdate desc";
		String hql_4=hql_1+hql_2+hql_3;	
		//String hql_3=hql_1+"from User as u,Shi as s where u.shi.shiid=s.shiid";
		String hql_5="select count(*) "+hql_2;						
		
		page=userService.getuserlist(hql_5,20);//默认一页显示20条数据
		userList=new ArrayList();
		userList=userService.getTheUserList(page.getPageSize(),page.getStartRow(),hql_4);
		m.put("gettheexcel",userList);//为了导出数据
		return SUCCESS;
	}

 

      c)、userlist.html

       

<form id="form2" name="form2" action="touserlist.action" method="post"> 
<table width="100%" height="50" align="center"  cellSpacing=0 cellPadding=0>
  <tr>
    <td><a><input type="checkbox" name="all" id="all" οnclick="checkall(this.form)"/>序号</a></td>
	<td><a>姓名</a></td>
	<td><a>密码</a></td>
	<td><a>性别</a></td>
	<td><a>电子邮箱</a></td>
	<td><a>问题</a></td>
	<td><a>回答</a></td>
	<td><a>注册时间</a></td>
	<td><a>市名</a></td>
	<td><a>操作</a></td>
  </tr>
 <tbody id=listdata>
 <#list userList as x>
  <tr>    
     <td><a><input type="checkbox" name="userModel.delid" id="userModel.delid" οnclick="unselectall()" value="${x[0]?if_exists}"/>${x_index +1+page.startRow}</a></td>
     <td οnclick="redirecAction('${x[0]?if_exists}');"><a>${x[1]?if_exists}</a></td>
     <td οnclick="redirecAction('${x[0]?if_exists}');"><a>${x[2]?if_exists}</a></td>
     <td οnclick="redirecAction('${x[0]?if_exists}');"><a>${x[3]?if_exists}</a></td>
     <td οnclick="redirecAction('${x[0]?if_exists}');"><a>${x[4]?if_exists}</a></td>
     <td οnclick="redirecAction('${x[0]?if_exists}');"><a>${x[5]?if_exists}</a></td>
     <td οnclick="redirecAction('${x[0]?if_exists}');"><a>${x[6]?if_exists}</a></td>
     <td οnclick="redirecAction('${x[0]?if_exists}');"><a>${x[7]?if_exists}</a></td>
     <td οnclick="redirecAction('${x[0]?if_exists}');"><a>${x[8]?if_exists}</a></td> 
     <td><a title="编辑" href="toUpdatePage.action?userModel.uid=${x[0]?if_exists}&page.currentPage=${page.currentPage}&page.pageSize=${page.pageSize}">
             <img src="image/btn_edit.png" alt="编辑"></img>
         </a>
         <a title="删除" href="deluser.action?userModel.delid=${x[0]?if_exists}&page.currentPage=${page.currentPage}&page.pageSize=${page.pageSize}" onClick="if(!confirm('你确定删除这条记录吗?'))return false">
         <img src="image/btn_delete.png" alt="删除"></img>
         </a></td> 
  </tr>
  </#list>
  <div><input class="submit" type="submit" value="显示全部用户"/>
  <input class="submit" type="button" value="删除所选" onClick="deluser(${page.currentPage},${page.startRow},${page.pageSize});"/></div>
  </tbody>
</table>
</form>

 

     2)、首 页、上一页、下一页、尾页的智能显示,有效防止currentPage=0、currentPage>pageSize的情况。

            

<a>第${(page?if_exists).currentPage?if_exists}页/共${(page?if_exists).totalPages?if_exists}页
 总行数:${(page?if_exists).totalRows?if_exists} 每页显示的行数:${(page?if_exists).pageSize?if_exists} </a>     
      <#if page.currentPage!=1>
      <a href="towidget.action?page.currentPage=1&page.pageSize=${page.pageSize}">首页</a>     
      </#if>
      <#if (page.currentPage>1)>     
      <a href="towidget.action?page.currentPage=${page.currentPage-1}&page.pageSize=${page.pageSize}">上一页</a>
      </#if>
      <#if (page.totalPages>page.currentPage)>
      <a href="towidget.action?page.currentPage=${page.currentPage+1}&page.pageSize=${page.pageSize}">下一页</a>
     </#if>
     <#if page.currentPage!=page.totalPages>     
      <a href="towidget.action?page.currentPage=${page.totalPages}&page.pageSize=${page.pageSize}">尾页</a>
      </#if>

 

     3)、删除或修改后能定位到当前页或上一页。

        a)、UserServerImpl.java

           

//翻页或修改或删除
	public Page widget(Page page,String hql){		
		int totalRows=userDao.getRows(hql);
		int currentPage=page.getCurrentPage();
		int pageSize=page.getPageSize();
		page=new Page(totalRows,currentPage,pageSize);
		return page;
	}

 

       b)、UserAction.java

public String deluser() throws Exception {
		//在查询出来的页面中删除后返回原界面或上一页			
    	userService.deluser(userModel);//删除
    	
    	ActionContext ctx = ActionContext.getContext(); 
        Map m=ctx.getSession();   
		String keyword=(String) m.get("search_keyword");
		String cat=(String) m.get("search_cat");
		
		String hql_1="select u.id,u.name,u.password,u.sex,u.email,u.question,u.answer,u.regdate,s.shiname ";
		String hql_2="from User as u left join u.shi as s";
		String hql_3=userService.Searchuser(keyword,cat);		
		String hql_4="  order by u.regdate desc";
		String hql_5="";
		String hql_6="";
		if(hql_3==null){
			hql_5=hql_1+hql_2+hql_4;
			hql_6="select count(*) "+hql_2;
		}
		else{
			hql_5=hql_1+hql_2+" "+hql_3+hql_4;
			hql_6="select count(*) "+hql_2+" "+hql_3;
		}
		
		page=userService.widget(page,hql_6);

		userList=new ArrayList();
		userList=userService.getTheUserList(page.getPageSize(),page.getStartRow(),hql_5);
		m.put("gettheexcel",userList);//为了导出数据
		return SUCCESS;
	}

 

    同理修改一样

    

     4)、查询后能正常翻页。

public String search() throws Exception {	
    	String hql_1="select u.id,u.name,u.password,u.sex,u.email,u.question,u.answer,u.regdate,s.shiname ";
		String hql_2="from User as u left join u.shi as s";
		String hql_3=userService.Searchuser(userModel.getKeyword(),userModel.getCat());
		String hql_4="  order by u.regdate desc";
		String hql_5="";
		String hql_6="";
		if(hql_3==null){
			hql_5=hql_1+hql_2+hql_4;
			hql_6="select count(*) "+hql_2;
		}
		else{
			hql_5=hql_1+hql_2+" "+hql_3+hql_4;
			hql_6="select count(*) "+hql_2+" "+hql_3;
		}
		page=userService.getuserlist(hql_6,page.getPageSize());
		userList=new ArrayList();
		userList=userService.getTheUserList(page.getPageSize(),page.getStartRow(),hql_5);
		
		ActionContext ctx = ActionContext.getContext(); 
        Map m=ctx.getSession();   
		m.put("search_keyword",userModel.getKeyword());
		m.put("search_cat",userModel.getCat());	
		m.put("gettheexcel",userList);//为了导出数据
		return SUCCESS;
	}        

          通过设置session完成。

     5)、pageSize(总页数)为20、50、100页等的情况。

            a)、userlist.html

             

<form id="from3" name="from3" action="changpagesize.action" method="post">
    <div><a>一页显示:</a>
	 <select name="page.pageSize">
	   <option selected value="20">20</option>
	   <option value="50">50</option>
	   <option value="50">50</option>
       <option value="500">500</option>
       <option value="1500">1500</option>
       <option value="2000">2000</option>
       <option value="5000">5000</option> 
	 </select> <a>条</a><input class="submit" type="submit" value="GO"/>
	 <span><a title="导出Excel" href="excel.action"><img src="image/excel.jpg" alt="导出Excel"></a></span>
	 </div>
 </form>      

      b)、UserAction

    

//改变pageSize
	public String changpagesize() throws Exception {		
		System.out.println("page.getPageSize="+page.getPageSize());		
		ActionContext ctx = ActionContext.getContext(); 
        Map m=ctx.getSession();  
		String keyword=(String) m.get("search_keyword");
		String cat=(String) m.get("search_cat");
		
		String hql_1="select u.id,u.name,u.password,u.sex,u.email,u.question,u.answer,u.regdate,s.shiname ";
		String hql_2="from User as u left join u.shi as s";
		String hql_3=userService.Searchuser(keyword,cat);		
		String hql_4="";
		String hql_5="";
		if(hql_3==null){
			hql_4=hql_1+hql_2;
			hql_5="select count(*) "+hql_2;
		}
		else{
			hql_4=hql_1+hql_2+" "+hql_3;
			hql_5="select count(*) "+hql_2+" "+hql_3;
		}
		
		page=userService.getuserlist(hql_5,page.getPageSize());
		userList=new ArrayList();
		userList=userService.getTheUserList(page.getPageSize(),page.getStartRow(),hql_4);
		m.put("gettheexcel",userList);
		return SUCCESS;
	}

  

     6)、仿javaEye的分页码显示(参考)。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值