当前位置: 代码迷 >> Web前端 >> (不断更新)EWeb4J-1.9-SNAPSHOT前不久进程
  详细解决方案

(不断更新)EWeb4J-1.9-SNAPSHOT前不久进程

热度:800   发布时间:2012-06-26 10:04:13.0
(不断更新)EWeb4J-1.9-SNAPSHOT最近进程
经过奋战,终于有个稳定点的SNAPSHOT版本咯。

较之上个版本1.8.6,本版本1.9-SNAPSHOT有以下几个更新点:

 
  •   SolidBase 添加菜单显隐权限控制,包括导航菜单(href=xxx.jsp或xxx.html)的控制
  •  
  •   SolidBase 对导航菜单(href=xxx.jsp或xxx.html)的处理修改,原先为直接服务端跳转到main/veiw下的xxx.jsp或者xxx.html,现在改为将xxx.jsp/xxx.html整个字符串设置到request.setAttribute("switchEnvPath", "xxx.jsp"),然后统一跳转到main/view/switchEnv.jsp,然后在switchEnv.jsp的内容为:
  • <%@ page contentType="text/html; charset=utf-8" language="java" pageEncoding="utf-8"%>
    <div class="accordion" fillSpace="sideBar">
    <jsp:include page="/${switchEnvPath}"></jsp:include>
    </div>
    

    这样目标xxx.jsp/xxx.html页面是从WebContent中开始寻找并且被包含进来。并且因为这里已经包裹了这段代码:
    <div class="accordion" fillSpace="sideBar">	
    </div>
    

    因此在xxx.jsp/xxx.html中已经不再需要包裹上面这段代码了。

     
  •   SolidBase的菜单显示增加了session缓存,这样不需要每次都查询数据库,不过带来的问题是菜单的修改不能马上见效,若登陆账号是超能力用户或者没有任何角色信息的话,则不会缓存,否则需要重新登录才能看到最新的菜单修改(包括菜单显隐的权限分配修改) 

  • eweb4j 框架更新了比较多。详细看看下面列表
     
  •   几个DAO增加对Map的支持,使用map可以不需要写model类
  •  
  •   MVC增加7个默认action,约定视图和URI-Mapping,例如 DemoControl
  • HTTP MethodURIClass.MethodParams
    GET/demoDemoControl.index
    POST/demoDemoControl.create
    PUT/demo/{id}DemoControl.updateid={id}
    DELETE/demo/{id}DemoControl.destroyid={id}
    GET/demo/{id}DemoControl.showid={id}
    GET/demo/{id}/editDemoControl.editid={id}
    GET/demo/newDemoControl.editNewid={id}

     
  •   控制器属性若提供getter方法,则会作为http响应视图渲染的一个数据模型。类似Struts2的ModelDriven但不需要继承来获得。
  •  
  •   除了使用属性getter方法作为视图模型数据外,还可以在Action方法参数里声明一个没有任何注解的Map model,它可以作为视图模型数据,往里面放数据就相当于request.setAttribute一样的效果。
  •  
  •   修改uri格式:xxx@POST => xxx#POST, 即符号 '@' 改成 '#'
  •  
  •   改善Action跳转:return "action:xxx",之前是使用response.sendRedirect来实现的,但是这样的方式使得HTTP请求只能是GET方式的,如果要重定向到一个HTTP方法为POST或者PUT或者DELETE话,显然这样是无法满足需求的。于是,对 return "action:xxx"的处理方式改成:
  •   return "action:xxx@PUT?name=weiwei&age=5";
      //符号@只能出现一次,框架不再采用response.sendRedirect的方式来处理,而是构建一个    
      form表单:
    
      <form id="form_id" action="xxx" method="post">
        <input type="hidden" name="_method" value="PUT" />
        <input name="name" value="weiwei" />
        <input name="age" value="5" />
        <input type="submit" />
      </form>
    

    <script>document.getElementById('form_id').submit();</script>
    

      然后使用response.getWriter().print打印上面这段内容,从而实现模拟客户端的请求,这样就支持GET之外的请求了,还可以带参数。

      PS:如果指定的Action依然是GET的,则会采用redirect的方式执行,而不是表单的形式

     
  •   Action方法名支持新的约定格式:doUri1BindParam1AndParam2JoinUri2AtPostOrGetOrPutOrDelete
  •   关键词:do, Bind, Join, And, At, Or
      其中每个的意义是:
      do:一直到Bind或者At为止的单词都会被解析为 URI
      Bind:一直到At或者末尾为止的单词都会被解析为URI中的变量部分/{param1}/{param2}(多个arg用And连接)
      Join:一定要跟在Bind之后,例如 doHelloBindNameJoinWorldAtGet = /hello/{name}/world GET
      At:一直到末尾为止的单词都会被解析为Http Method(多个method用 Or 连接)

      For Example1:
    
      public void doRemoveBindIdAtDelete(int id){}
    
      解析后:
      uri => remove/{id}
      http => DELETE
      访问例子:
      DELETE /remove/3  
    
      For Example2:
    
      private String name;
      public void setName(String name){this.name = name}
    
      public void doHelloBindNameAtGet(){}
    
      解析后:
      uri => hello/{name}
      http => GET
      访问例子:
      DELETE /hello/weiwei  
    
    For Example3:
    public class PetsControl{
      public String doBindIdJoinEditAtGet(int id){
          return "fmt:pets/view/edit.html";
      }
    }
    解析后:
      uri => pets/{id}/edit 
      http => GET
    访问例子:
      GET /pets/3/edit
    


     
  •   Action增加对FreeMarker模板的支持。
  • 例子一
    public String doHelloAtPost(@QueryParam("user") final User user, Map model) {
    	List<User> list = new ArrayList<User>();
    	list.add(user);
    	list.add(new User());
    	model.put("pojos", list);
    
    	return "fmt:pet/view/fmt-list.html";
    }
    

    fmt-list.html
    <#list pojos as user>
        <p>${user.name}-${user.age}</p>
    </#list>
    

    例子二
    public String doTestAtGet() {
    	return "action:pet/hello@POST?user.name=微微&user.age=23";
    }
    
    @Result(name = { "success" }, type = { "fmt" }, value = { "index.html" })
    public String doIndexAtGet(Map model) {
    	model.put("message", "Hello FreeMarker!");
    	return "success";
    }
    

    index.html
    <h1>${message}</h1>
    

  • 将CascadeDAO的 "select *" 修改为 "select xxx,xxx,xxx"
  • MVC.Action增加XML的视图响应。@Produces(MimeType.XML)
  • MVC.Action增加对FreeMarker模板的支持
  • 各个模块改善日志功能,提供多日志配置。控制台打印开关等。
  • 各个模块的sacnPackage增加绝对路径,必须以"AP:"开头。主要用于测试
  • DAO增加分页,DAOFactory.getDAO(Pet.class).selectAll().query(1, 5);
  • MVC.Action增加ActiveRecord支持。
  • @Entity
    @Table(name="t_pet")
    public class Pet extends Model{
        public final static Pet instance = new Pet();
        private String name;
        private int age;
        public Pet(){}
        public Pet(String name, int age){
            this.name = name;
            this.age = age;
        }
        //setter and getter
    }
    
    //使用
    new Pet("xiaohei", 5).create();//insert
    new Pet("xiaohei", 5).save();//当没有ID值的时候是insert
    Pet pet = new Pet("xiaobai",4);
    pet.create();//insert这时候pet.id已经被注入了
    pet.setName("test");
    pet.save();//这时候因为pet.id有值,所以是update
    
    pet = new Pet();
    pet.setId(2);
    pet.load();//这个时候会通过id值去查询数据库,并将数据注入到pet实例中。
    
    List<Pet> pets = Pet.instance.findAll();
    /* 分页 */
    List<Pet> page = Pet.instance.find().fetch(10);
    page = Pet.instance.find().fetch(2, 5);
    /* 条件查询 */
    List<Pet> pets = Pet.instance.find("byName", "xiaohei").fetch();
    pets = Pet.instance.find("byNameAndAge", "xiaohei", 5).fietch();
    pets = Pet.instance.find("name = ?", "xiaohei").fetch();
    Pet p = Pet.instance.find("name = ?", "xiaohei").first();
    p = Pet.instance.findById(3);
    p = Pet.instance.find("byNameAndAge", "xiaohei", 5).first();
    /* 删除 */
    Pet.instance.delete("byName", "xiaohei");
    Pet.instance.deleteAll();
    /* 计算 */
    long rows = Pet.instance.count();/* select count(*) */
    rows = Pet.instance.count("byName", "xiaohei");/* count(*) ... where name='xoapjeo' */
    

      [*]  待续
      相关解决方案