论坛首页 Java企业应用论坛

Jmesa系列(三)开始使用JMesa

浏览 16776 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-30  
相关文章:
 jmesa系列之一:什么是Jmesa 
 jmesa系列(二)Jmesa源码的包结构解读

这次目标很简单:实现服务器端分页列表功能。暂时不包括过滤、排序及Ajax。
诸如过滤、排序及Ajax功能会在过程中逐一加上去。
下面以一个简单的商品列表来说明JMesa的使用方法。

从JSP的代码可以看出.开发者不需要在页面上使用任何的JSP Tag来显示表格,只需要简单把products变量Print出来即可.而显示的逻辑基本上是放到Controller了.肯定有同学有疑问,这样的使 用方法远远不及使用JSP Tag方便啊!为什么要这样做?

这里的显示仅仅是做一个API的使用Demo,为了说明我们可以直接使用Jmesa的API,构造出只要你能想得到的形式的表格展现,而不限制于JSP Tag.你想封装成跟EC一样的Jsp Tag是很容易的事.那就是说,ExtreamTable只可以是JSP Tag.而Jmesa是可以提供Jsp Tag还有Jsp Tag以外的东西.在架构上,作者从EC到Jmesa的转变就是值得肯定的.对了,作者在Jmesa中引进了Groovy,目的我想就是可以让开发人员动态地决定表格的显示啦.效果跟JSP Tag一样,并且更方便.

说说我目前在做的一个报表数据显示应用,同一个页面,可以显示不同构的数据列表,支持过滤,排序等.如果使用JSP Tag是很难达到动态显示数据列的目的,而用Jmesa的API转而易举..

本文的目的是让大家对Jmesa有个感性的认识.而他的各个元素,如Limit,CoreContext这些,将会在接下来的时间详细说明.


代码:Java代码仅有一实体类,一个Service,及一个Controller
Product.java
java 代码
 
  1. public class Product {  
  2.     private static int index = 1;  
  3.     private int id;  
  4.     private String name;  
  5.     private int price;  
  6.     private Date createdTime;  
  7.     private String description;  
  8.   
  9.     public Product(String name, int price) {  
  10.         this.id = index ++;  
  11.         this.name = name;  
  12.         this.price = price;  
  13.         this.createdTime = new Date();  
  14.         this.description = name;  
  15.     }  
  16.     //省略Getter setter  
  17. }  
ProductService.java
java 代码
  1. public class ProductService {  
  2.     private static List <product> products;  </product>
  3.   
  4.     static {  
  5.         products = new ArrayList <product>();  </product>
  6.         products.add(new Product("java"10));  
  7.         products.add(new Product("ruby program"50));  
  8.         products.add(new Product("c++ start"30));  
  9.         products.add(new Product("python cookbook"40));  
  10.         products.add(new Product("java in a nut shell"10));  
  11.         products.add(new Product(".net framework"20));  
  12.         products.add(new Product("are you ok?"21));  
  13.         products.add(new Product("are your light on?"10));  
  14.         products.add(new Product("go to hell"14));  
  15.         products.add(new Product("my name is red"16));  
  16.         products.add(new Product("perl cookbook"15));  
  17.         products.add(new Product("groovy in action"20));  
  18.         products.add(new Product("ruby on rails"100));  
  19.     }  
  20.       //分页显示商品
  21.     public List findProduct(int pageNum, int pageSize) {  
  22.         int start = (pageNum - 1) * pageSize;  
  23.         int end = start + pageSize;  
  24.         int count = 0;  
  25.         List <product> ret = new ArrayList <product>();  </product> </product>
  26.        
  27.         for (int i = 0; i < products.size(); i++) {  
  28.             if (i < start)  
  29.                 continue;  
  30.             if (i >= end)  
  31.                 break;  
  32.             ret.add(products.get(i));  
  33.         }  
  34.         return ret;  
  35.     }  
  36.     //获得商品总数
  37.     public int getCountOfProduct() {  
  38.         return products.size();  
  39.     }  
  40. }  
Demo避免使用数据库,在内存中初始化一些实体及实现分页查询功能。
ListProductController .java
java 代码
 
  1. ProductController.java  
  2. public class ListProductController extends AbstractController {  
  3.     private ProductService productService;  
  4.     private int maxRows;  
  5.   
  6.     public void setProductService(ProductService productService) {  
  7.         this.productService = productService;  
  8.     }  
  9.   
  10.     public void setMaxRows(int maxRows) {  
  11.         this.maxRows = maxRows;  
  12.     }  
  13.   
  14.     protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {  
  15.         //step1 创建limit( 包括查询条件,排序,分页信息等)
  16.         WebContext webContext = new HttpServletRequestWebContext(request);  
  17.   
  18.         LimitFactory limitFactory = new LimitFactoryImpl("product", webContext);  
  19.         Limit limit = limitFactory.createLimit();  
  20.   
  21.         int totalRows = productService.getCountOfProduct();  
  22.   
  23.         //classic export style program  
  24.         if (limit.isExportable()) {  
  25.             RowSelect rowSelect = new RowSelectImpl(1, totalRows, totalRows);  
  26.             limit.setRowSelect(rowSelect);  
  27.         } else {  
  28.             RowSelect rowSelect = limitFactory.createRowSelect(maxRows, totalRows);  
  29.             limit.setRowSelect(rowSelect);  
  30.         }  
  31.   
  32.         List items = productService.findProduct(limit.getRowSelect().getPage(), limit.getRowSelect().getMaxRows());  
  33.   
  34.         //step2  创建 CoreContext  
  35.         CoreContextFactory factory = new CoreContextFactoryImpl(webContext);  
  36.         CoreContext coreContext = factory.createCoreContext(items, limit);  
  37.   
  38.         //step3 创建 table  
  39.         HtmlTableFactory tableFactory = new HtmlTableFactory(webContext, coreContext);  
  40.   
  41.         HtmlTable table = tableFactory.createTable("id""name""price""createdTime");  
  42.         table.setCaption("products");  
  43.         table.getTableRenderer().setWidth("600px;");  
  44.   
  45.         ToolbarFactory toolbarFactory = new ToolbarFactoryImpl(table, webContext, coreContext);  
  46.         Toolbar toolbar = toolbarFactory.createToolbar();  
  47.         View view = new HtmlView(table, toolbar, coreContext);  
  48.         Object result = view.render();  
  49.   
  50.         request.setAttribute("products",result);  
  51.         return new ModelAndView("list.jsp");  
  52.     }  
  53.   
  54. }  


list.jsp
java 代码
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>  
  2.   
  3.   
  4.       
  5.     <script type=<span class="string">"text/javascript" src="scripts/jmesa.js"></script>  
  6.     
  7.     <script type=<span class="string">"text/javascript">  
  8.         function onInvokeAction(id) {  
  9.             setExportToLimit(id, '');  
  10.             createHiddenInputFieldsForLimitAndSubmit(id);  
  11.         }  
  12.     </script>  
  13.   
  14.   
  15. Product listing

      
  16. <%  
  17.     out.println(request.getAttribute("products"));  
  18. %>  
  19.       
  20.   
  21.   
省略Spring配置文件及Web.xml
   发表时间:2007-07-18  
把spring的代码也发嘛,我们好看看怎么获取的数据和回显流程.

3q
0 请登录后投票
   发表时间:2007-08-15  
提个问题
如何将所有的提示信息变为中文?
看了下源文件
似乎没有提供语言属性文件?
0 请登录后投票
   发表时间:2007-08-25  
看了一下jmesa的源码,好像有些代码是用着jdk1.5特性的.我们项目都是用1.4的不知道它有没有向下支持的的呢.
0 请登录后投票
   发表时间:2007-09-21  
jmesa导出一定要在controller写这么冗长的代码么??郁闷
0 请登录后投票
   发表时间:2008-06-12  
也不算就很长了,
  WebContext webContext = new HttpServletRequestWebContext(request);  
   
         LimitFactory limitFactory = new LimitFactoryImpl("product", webContext);  
         Limit limit = limitFactory.createLimit();  
   
        int totalRows = productService.getCountOfProduct();  
   
         //classic export style program  
         if (limit.isExportable()) {  
             RowSelect rowSelect = new RowSelectImpl(1, totalRows, totalRows);  
             limit.setRowSelect(rowSelect);  
         } else {  
             RowSelect rowSelect = limitFactory.createRowSelect(maxRows, totalRows);  
             limit.setRowSelect(rowSelect);  
         }  
   
         List items = productService.findProduct(limit.getRowSelect().getPage(), limit.getRowSelect().getMaxRows();

这就是执行的分页查找,之后的是在画表格, 如果在jsp上写,就可以不要。
0 请登录后投票
论坛首页 Java企业应用版

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