本文是开发基于jello框架的web应用的入门文章,无需使用其他任何框架即可完成应用构建。
简介:
这个例子是建立一个简单的web应用,叫ProductManage,完成产品管理操作,包含简单的数据库增,删,改,查,即CRUD(新建, 访问,更新,删除)操作。这是一个三层的web应用,通过web控制器Controller访问业务层,业务层调用框架内置的持久层实现业务逻辑。流程顺序从web控制器(ProductController)到业务层(ProductService),然后将结果返回页面。以下是完成这个例子的步骤:
1. 配置jello框架
2. 数据库建表 
3. 继承框架业务支持类Business生成业务类ProductService
4. 继承框架控制器支持类Controller生成控制器类ProductController
5. 建立JSP页面list.jsp和row.jsp用于显示列表和新增修改
6. 运行实例配置jello框架:
新建一个web project,在src目录下建立包com.figcn.simple.biz用于存放业务层代码,建立包com.figcn.simple.web用于存放web控制器代码,在WebRoot下新建文件夹product用于存放JSP页面。
从 http://sourceforge.net/projects/jelloframework  下载jello框架1.6.1包,解压后按UserManual说明将相关类库等文件复制到项目对应目录下。数据库建表:
CREATE TABLE t_product (product_id int NOT NULL, product_name varchar(50) NULL ,product_type varchar(50) NULL, unit_price numeric(18, 2) NULL, add_date datetime NULL)继承框架业务支持类Business生成业务类ProductService:
package com.figcn.simple.biz;import java.util.List;
import com.figcn.jello.biz.Business;
import java.util.Map;import com.figcn.jello.data.Linker;
import com.figcn.jello.data.Model;public class ProductService extends Business { public static ProductService getInstance() {
return new ProductService();
} public List<Map> getList() {
return getTable("t_product");
} public void save(Map map) {
Model row = new Model("t_product");
row.setData(map);
save(row);
} public Map get(String id) {
return getRow("t_product", "product_id", Integer.parseInt(id));
} public void delete(String id) {
delete("t_product", "product_id", Integer.parseInt(id));
}

public Object getRowCount()
{
Linker linker=getLinker();
linker.open();
Object ret=linker.executeScalar("select count(*) from t_product");
linker.close();
return ret;
}}继承框架控制器支持类Controller生成控制器类ProductController:
package com.figcn.simple.web;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;import com.figcn.jello.web.WebUtil;
import com.figcn.jello.web.servlet.ControlTemplate;
import com.figcn.jello.web.servlet.Controller;import com.figcn.simple.biz.ProductService;public class ProductController extends Controller implements ControlTemplate{    public void toList(HttpServletRequest request, HttpServletResponse response) {
        List list=ProductService.getInstance().getList();
        request.setAttribute("list",list);
        forward("list.jsp");    }    public void doDelete(HttpServletRequest request, HttpServletResponse response) {
     String itemid=request.getParameter("itemid");
     ProductService.getInstance().delete(itemid);
        toList(request,response);
        //forward("/product/ProductAction.jo?method=toList");
    }    public void toEdit(HttpServletRequest request, HttpServletResponse response) {
     String itemid=request.getParameter("itemid");
        Map map=ProductService.getInstance().get(itemid);
        request.setAttribute("foredit",map);
        forwardToEdit("row.jsp");
    }    public void toAdd(HttpServletRequest request, HttpServletResponse response) {
        forwardToAdd("row.jsp");
    }    public void doSave(HttpServletRequest request, HttpServletResponse response) {
        Map map=WebUtil.getParameterMap(request);
        ProductService.getInstance().save(map);
        toList(request,response);    }
    
    public void getCount(HttpServletRequest request, HttpServletResponse response)
{
ProductService ps=ProductService.getInstance();
Object count=ps.getRowCount();
StringBuilder sb=new StringBuilder();
sb.append("total rows count is:<br>");
sb.append(count+"<br>");
sb.append("<a href='javascript:history.back(-1);'>back to list</a>");
//show informations or return response to web invoker
print(sb.toString());
}
}建立JSP页面list.jsp和row.jsp用于显示列表和新增修改:
List.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body bgcolor="#ffffff">
<div>
<a href="ProductController.co?method=toAdd">New Product</a>
<a href="ProductController.co?method=getCount">Get Products Count</a>
</div>
<table>
<tr bgcolor=green >
<td>Product ID</td>
<td>Product Name</td>
<td>Type</td>
<td>Price</td>
<td>Added Date</td>
<td>Edit</td>
<td>Delete</td>
</tr>
<c:forEach items="${list}" var="item">
<tr bgcolor=skyblue>
<td>${item.product_id }</td>
<td>${item.product_name }</td>
<td>${item.product_type }</td>
<td>${item.unit_price }</td>
<td>${item.add_date }</td>
<td><a href="ProductController.co?method=toEdit&itemid=${item.product_id}">Edit</a></td>
<td><a href="ProductController.co?method=doDelete&itemid=${item.product_id}">Delete</a></td>
</tr>
</c:forEach></table>
</body>
</html>Row.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib prefix="jello" uri="http://www.figcn.com/jello/taglib" %>
<jello:inc src="../js/jello.js"/>
<jello:inc src="../js/calendar.js"/>
<html>
<body bgcolor="#ffffff">
<form action="ProductController.co?method=doSave" method=post name=frm>
<input name=intkey:product_id type=hidden value="${foredit.product_id }">
<input  name="formtype" type="hidden" value="${formtype}"/>
<table>
<tr>
<td>ID</td>
<td>
<input name="int:product_id" value="${foredit.product_id}" />
</td>
</tr>
<tr>
<td>Name</td>
<td><input name="string:product_name" value="${foredit.product_name}" /></td>
</tr>
<tr>
<td>Type</td>
<td><input name="string:product_type" value="${foredit.product_type}" /></td>
</tr>
<tr>
<td>Price</td>
<td><input name="string:unit_price" value="${foredit.unit_price}" /></td>
</tr>
<tr>
<td>Added Date</td>
<td>
<A onclick="showCalendar('../js/calendar.htm', document.all('date:add_date'));return false;" href="#">
<input name="date:add_date" value="${foredit.add_date}" /></a>format:yyyy-MM-dd
</td>
</tr>
<tr>
<td colspan=2 align=right>
<input type=submit value=Save >
<input type=button value=Back onclick="_back()">
</td>
</tr>
</table>
</form>
</body>
</html>运行实例。
这样一个简单的WEB应用就完成了,是不是比较方便呢?就算不写注释,我想N年后你一样可以很容易地看懂自己写的代码,当然写注释始终是一个良好的习惯。
好了,省下来的研究如何分层、配置XML文档等等的时间可以用来玩一局魔兽世界了。