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

Freemarker分页实践
本文分享了使用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" onclick="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" onclick="unselectall()" value="${x[0]?if_exists}"/>${x_index +1+page.startRow}</a></td>
     <td onclick="redirecAction('${x[0]?if_exists}');"><a>${x[1]?if_exists}</a></td>
     <td onclick="redirecAction('${x[0]?if_exists}');"><a>${x[2]?if_exists}</a></td>
     <td onclick="redirecAction('${x[0]?if_exists}');"><a>${x[3]?if_exists}</a></td>
     <td onclick="redirecAction('${x[0]?if_exists}');"><a>${x[4]?if_exists}</a></td>
     <td onclick="redirecAction('${x[0]?if_exists}');"><a>${x[5]?if_exists}</a></td>
     <td onclick="redirecAction('${x[0]?if_exists}');"><a>${x[6]?if_exists}</a></td>
     <td onclick="redirecAction('${x[0]?if_exists}');"><a>${x[7]?if_exists}</a></td>
     <td onclick="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的分页码显示(参考)。

 

 

【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)内容概要:本文介绍了基于蒙特卡洛和拉格朗日方法的电动汽车充电站有序充电调度优化方案,重点在于采用分散式优化策略应对分时电价机制下的充电需求管理。通过构建数学模型,结合不确定性因素如用户充电行为和电网负荷波动,利用蒙特卡洛模拟生成大量场景,并运用拉格朗日松弛法对复杂问题进行分解求解,从而实现全局最优或近似最优的充电调度计划。该方法有效降低了电网峰值负荷压力,提升了充电站运营效率与经济效益,同时兼顾用户充电便利性。 适合人群:具备一定电力系统、优化算法和Matlab编程基础的高校研究生、科研人员及从事智能电网、电动汽车相关领域的工程技术人员。 使用场景及目标:①应用于电动汽车充电站的日常运营管理,优化充电负荷分布;②服务于城市智能交通系统规划,提升电网与交通系统的协同水平;③作为学术研究案例,用于验证分散式优化算法在复杂能源系统中的有效性。 阅读建议:建议读者结合Matlab代码实现部分,深入理解蒙特卡洛模拟与拉格朗日松弛法的具体实施步骤,重点关注场景生成、约束处理与迭代收敛过程,以便在实际项目中灵活应用与改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值