论坛首页 编程语言技术论坛

(下篇)单例POJO实现CRUD+分页+搜索Demo

浏览 1945 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-03-23   最后修改:2012-03-23
本篇程序特点:

 
  •   POJO式的控制器,无需继承、无需实现接口
  •  
  •   无属性,可以实现单例,提高性能
  •  
  •   无Servlet API 依赖,测试方便
  •  
  •   约定优于配置
  •  
  •   省代码量
  •  
  •   方法参数绑定HTTP请求参数
  •  
  •   声明即用,运行期注入
  •  
  •   开放配置,不强制约定

  • 对比上一篇体验快速开发:只有一个控制类实现的CRUD+分页+搜索Demo ,本程序主要类似SpringMVC式的控制器风格。上篇主要是类似Struts2的控制器风格。

    上一篇的demo中由于是field的形式,因此一些参数名称可以省略配置,但是要写setter和getter。而本篇demo中,由于是方法参数的形式,因此不需要setter和getter,但是需要配置参数名称(原因是java反射无法获取到方法的参数名,运行期方法的参数名貌似给擦除了。)
    不过本篇demo中有一个最大的好处就是,这种方式可以实现控制器单例,这样不仅仅带来性能的提升,如果搭配field的方式,还可以做做缓存。

    代码:
    package org.eweb4j.crud;
    
    import java.util.Arrays;
    import java.util.Map;
    
    import javax.ws.rs.GET;
    import javax.ws.rs.POST;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.QueryParam;
    
    import org.eweb4j.mvc.action.QueryParams;
    import org.eweb4j.mvc.action.annotation.Singleton;
    import org.eweb4j.mvc.view.DivPageComp;
    import org.eweb4j.orm.dao.DAO;
    import org.eweb4j.orm.dao.DAOFactory;
    
    @Singleton
    public class PetControl {
    
    	private static DAO dao = DAOFactory.getDAO(Map.class).setTable("t_pet");
    
    	@POST
    	public User doHello(@QueryParam("user") final User user) {
    		return user;
    	}
    
    	@GET
    	public String doTest() {
    		return "action:pet/hello@POST?user.name=微微&user.age=23";
    	}
    
    	public String doIndex(Map<String, Object> model, QueryParams params) {
    		int p = params.toInt("pageNum");
    		p = p <= 0 ? 1 : p;
    		int n = params.toInt("numPerPage");
    		n = n <= 0 ? 5 : n;
    
    		model.put("pets", dao.clear().paging(p, n).query());
    
    		Map<String, Object> map = dao.clear().selectStr("count(*) as rows")
    				.queryOne();
    		long count = (Long) map.get("rows");
    
    		model.put("dpc", new DivPageComp(p, n, count, 10));
    
    		return "success";
    	}
    
    	public String doSearch(Map<String, Object> model, @QueryParam("keyword") String keyword) {
    		model.put("pets",
    				dao.clear().selectAll().where().field("name").like(keyword)
    						.or("num").like(keyword).or("age").like(keyword)
    						.or("type").like(keyword).query());
    
    		return "success";
    	}
    
    	public String doGet(@PathParam("id") int id, Map<String, Object> model) {
    		model.put("pet", dao.clear().selectAll().where().field("id").equal(id)
    				.queryOne());
    		return "success";
    	}
    
    	public String doNew(Map<String, Object> model) {
    		model.put("types", Arrays.asList("狗", "猫"));
    		return "success";
    	}
    
    	public String doPost(@QueryParam("pet") Map<String, Object> pet) {
    		dao.clear().insert(pet).execute();
    		return "success";
    	}
    
    	public String doEdit(@PathParam("id") int id, Map<String, Object> model) {
    		this.doGet(id, model);
    		model.put("types", Arrays.asList("狗", "猫"));
    		return "success";
    	}
    
    	public String doPut(@PathParam("id") int id,
    			@QueryParam("pet") Map<String, Object> pet) {
    		dao.clear().update().set(pet).where().field("id").equal(id).execute();
    		return "success";
    	}
    
    	public String doDelete(@PathParam("id") int id) {
    		dao.clear().delete().where().field("id").equal(id).execute();
    		return "success";
    	}
    
    }
    


     
  •   代码中可以看到一个Map<String,Object> model 参数,这个参数如果没有@QueryParam注解标注的话,是可以作为一个ModelAndView来使用的:
  •     model.put("name", "value");
        这样其实相当于
        request.setAttribute("name", "value");

     
  •   如果想获取Servlet的一些Context,声明即用即可。也可以声明一个Context,该Context封装了request、response等等的一些内容

  •  
  •   还是得说下,上述例子有八个默认的action方法,约定好方法名字,处理HTTP的method,以及跳转的路径,都已经约定好了。: ) 当然,如果你需要更改,直接修改就是了,框架不会强制约定的。

  •  
  •   项目主页:http://code.google.com/p/eweb4j/
  •  
  •   源码:http://code.google.com/p/eweb4j/source/browse/

  •    发表时间:2012-03-23  
    不知这种不需要继承和实现接口的方式符不符合时下的群众口味呢?
    0 请登录后投票
    论坛首页 编程语言技术版

    跳转论坛:
    Global site tag (gtag.js) - Google Analytics