这样子算是快速开发么?省代码量么?

自风 发布于 2012/03/22 22:36
阅读 1K+
收藏 0

没有继承,没有实现接口,完全是一个纯粹的POJO,几乎0侵入,无配置。

看看代码: 

  1. package org.eweb4j.crud;  
  2.   
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. import org.eweb4j.mvc.view.DivPageComp;  
  7. import org.eweb4j.orm.dao.DAO;  
  8. import org.eweb4j.orm.dao.DAOFactory;  
  9.   
  10. public class PetControl {  
  11.   
  12.     private DAO dao = DAOFactory.getDAO(Map.class).setTable("t_pet");  
  13.   
  14.     private Map<String, Object> pet;  
  15.     private List<Map<String, Object>> pets;  
  16.     private DivPageComp dpc = null;  
  17.   
  18.     private int id;  
  19.     private String keyword = "";  
  20.     private int pageNum = 1;  
  21.     private int numPerPage = 5;  
  22.   
  23.     public String doIndex() {  
  24.         pets = dao.paging(pageNum, numPerPage).query();  
  25.         Map<String, Object> map = dao.selectStr("count(*) as rows").queryOne();  
  26.         long allCount = (Long) map.get("rows");  
  27.         dpc = new DivPageComp(pageNum, numPerPage, allCount, 10);  
  28.   
  29.         return "success";  
  30.     }  
  31.   
  32.     public String doNew() {  
  33.         return "success";  
  34.     }  
  35.   
  36.     public String doPost() {  
  37.         dao.insert(pet).execute();  
  38.         return "success";  
  39.     }  
  40.   
  41.     public String doPut() {  
  42.         dao.update().set(pet).where().field("id").equal(id).execute();  
  43.         return "success";  
  44.     }  
  45.   
  46.     public String doGet() {  
  47.         pet = dao.selectAll().where().field("id").equal(id).queryOne();  
  48.         return "success";  
  49.     }  
  50.   
  51.     public String doEdit() {  
  52.         this.doGet();  
  53.         return "success";  
  54.     }  
  55.   
  56.     public String doSearch() {  
  57.         pets = dao.selectAll().where().field("name").like(keyword).or("num")  
  58.                 .like(keyword).or("age").like(keyword).or("type").like(keyword)  
  59.                 .query();  
  60.         return "success";  
  61.     }  
  62.   
  63.     public String doDelete() {  
  64.         dao.delete().where().field("id").equal(id).execute();  
  65.         return "success";  
  66.     }  
  67.   
  68.     public Map<String, Object> getPet() {  
  69.         return pet;  
  70.     }  
  71.   
  72.     public void setPet(Map<String, Object> pet) {  
  73.         this.pet = pet;  
  74.     }  
  75.   
  76.     public List<Map<String, Object>> getPets() {  
  77.         return pets;  
  78.     }  
  79.   
  80.     public void setPets(List<Map<String, Object>> pets) {  
  81.         this.pets = pets;  
  82.     }  
  83.   
  84.     public void setId(int id) {  
  85.         this.id = id;  
  86.     }  
  87.   
  88.     public void setKeyword(String keyword) {  
  89.         this.keyword = keyword;  
  90.     }  
  91.   
  92.     public void setPageNum(int pageNum) {  
  93.         this.pageNum = pageNum;  
  94.     }  
  95.   
  96.     public void setNumPerPage(int numPerPage) {  
  97.         this.numPerPage = numPerPage;  
  98.     }  
  99.   
  100.     public DivPageComp getDpc() {  
  101.         return dpc;  
  102.     }  
  103.   
  104. }  


注意:别小看这一个类,里面蕴含了深厚的艺术。下面就列出它的约定: 
 
  •   类名以Control结尾,会被认为是控制器类,它的方法可以处理HTTP请求
  •   类名Control前面的单词会被作为所有action方法uri映射的前部分
  •   以do开头的方法名都会被识别为action方法
  •   有八个默认的Action方法不需要任何配置:

  • 方法名 uri mapping http method 视图处理
    doIndex pet GET forward:pet/view/list.jsp
    doSearch pet/search GET 同上
    doGet pet/{id} GET forward:pet/view/detail.jsp
    doNew pet/new GET forward:pet/view/add.jsp
    doPost pet POST action:pet
    doEdit pet/{id}/edit GET forward:pet/view/edit.jsp
    doPut pet/{id} PUT action:pet
    doDelete pet/{id} DELETE action:pet


    这八个方法只需要返回"success"字符串就行了。 

     
  •   控制器的属性若提供了getter方法,那么就会被作为视图数据模型,在执行服务端跳转的时候,会将这些属性放入request中。

    1. class Control{  
    2.     private String name;  
    3.     public String getName(){  
    4.         return this.name;  
    5.     }  
    6.       
    7.     public String doHelloWorld(){  
    8.         this.name = "Hello World !";  
    9.         return "forward:index.jsp";  
    10.     }  
    11. }  


    提示:执行上面这个Action之后,在index.jsp页面中可以使用EL表达式:${name}来取值。 

     
  •   控制器的属性若提供了setter方法,那么框架就会把HTTP的请求参数的值按照名字绑定到这些属性上去。

    1. class Control{  
    2.     private String name;  
    3.     public String getName(){  
    4.         return this.name;  
    5.     }  
    6.   
    7.     public void setName(String name){  
    8.         this.name = name;  
    9.     }  
    10.       
    11.     public String doHelloWorld(){  
    12.         return this.name;  
    13.     }  
    14. }  

    PS:执行上面这个Action的时候,传递一个name参数,那么就会在页面上打印这个参数值,例如访问 GET /hello-word?name=weiwei, 那么页面上就会打印:weiwei 

    以下是问题补充:

    @自风:我错了,我问问题没有问到点子上,其实我是想问,对于这种所谓的快速开发要怎么理解? 代码生成?约定?继承? (2012/03/23 12:50)
    加载中
    0
    无名人士
    无名人士
    请问,什么是无侵入
    0
    Ken5233
    Ken5233
    约定大于配置
    0
    xoHome
    xoHome
    那要访问进来就必须有一个负责的MVC框架吧,这个用名字约定来做规范 限制比较大呢
    0
    xoHome
    xoHome

    不知道你了解NUTZ框架不? 这个框架通过注解来控制MVC,也非常方便,只需要在主模块上加个注解,然后在入口函数上加个注解@At就OK了 。如果你要做自己的框架的话可以参考下它

    子木007
    子木007
    使用了Nutz的ico, dao模块, 简约、强大、方便!! 但是里面很多命名方式总觉得有点别扭, 很多都是缩写或者简写。
    0
    相由心生
    相由心生
    服务器 带宽
    0
    chazz
    chazz
    直接copy,就粘贴过来了..
    0
    JFinal
    JFinal
    约定优于配置是错误的,只有合理的约定才优于配置,楼主写的这个例子约定过多,对开发者束缚过大,建议看看 JFinal 开发框架,自由度大得多,而且非常简单功能强大,路由设计独具一格,吸收了 rails 的优点去除了它的缺点。另外,楼主贴出来的代码不仅没有零入侵,而且入侵还很严重
    0
    自风
    自风

    引用来自“JFinal”的答案

    约定优于配置是错误的,只有合理的约定才优于配置,楼主写的这个例子约定过多,对开发者束缚过大,建议看看 JFinal 开发框架,自由度大得多,而且非常简单功能强大,路由设计独具一格,吸收了 rails 的优点去除了它的缺点。另外,楼主贴出来的代码不仅没有零入侵,而且入侵还很严重

    1. 这种约定是参考Struts2的restful的。

    2. 什么是合理的约定?

    3. 什么是入侵?

    4. 命名规范的入侵和继承的入侵孰轻孰重?

    0
    z
    ztian001
    感觉不靠谱啊
    0
    相见欢
    相见欢
    每一个框架都一大堆约定,有没有想过,这些其实这些反而会成为一个个壁垒,让开发者望而却步,也让这些框架成为一些自己把玩的小玩意。高度收敛、准确而且是必要的约束才会让框架本身具有简洁美。没研究过JFinal,不知道作者有没有类似的思考。@JFinal
    返回顶部
    顶部