- 浏览: 116792 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
czqjay:
news/index/{pageNum}/{author} { ...
来谈谈REST、RBAC下的URL权限控制 -
csumck:
这也有一个在线时序图工具 http://echoma.git ...
推荐一个不错的在线“画”时序图的软件(通过文字生成图片) -
cpop:
...
如何将自己的jar包Release到Maven中央仓库中 -
yangzai911:
如果 accept-language中有值,那么也是默认取第一 ...
Play framework 国际化 -
wangyong8861850:
[color=darkred][/color][size=x- ...
EWeb4J 1.9.1 新版本发布 基于Servlet/JDBC的轻量级web开发框架
eweb4j是一个简单、轻量的JavaWeb开发框架。涵盖MVC、ORM、IOC。
超轻量、面向接口,扩展灵活。
可先使用本框架快速开发,然后方便的转换成SSH。只需修改部分代码,无需修改业务逻辑代码。
MVC、IOC、ORM自由选择开闭,灵活与其他框架集成。
特性:
Component组件支持
MVC
IOC
ORM
各种Util工具类
简单就是美。使用文档已经编写齐全,在下载包里有,PDF格式。
纯开源、纯分享,不喜勿喷,还望各位大大多多支持。
下载地址:http://code.google.com/p/eweb4j/downloads/list
启动配置文件
新版本1.b.7更新:
(1) Controller支持以下约定:
action方法不填写注解RequestMapping的时候,默认以方法名为url-mapping值。
action 方法返回类型为void的时候框架不做任何跳转处理。
缺省返回值忽略大小写。例如ajax。
类名如果以“Controller”,“Control”,“Action”结尾的话,可以不用添加@Controller注解,框架也能识别为控制器。
(2)mvc中,为了改进性能,将Class.forName(ActionBeanName),改为缓存方式调用。这样省去了lookup的过程,效能会提升。当系统需要应对高并发的时候,很有效。
(3)废除了formBean的配置,框架自动识别pojo参数,并且支持无限嵌套pojo属性。无需任何配置。
(4)将MVC的@Result(location="")属性改为@Result(value="")
(5)将ORM的BaseDAO.getOne(Integer id)之类的Integer改为Number
(6)让MVC Controller 的属性的 setter 方法 和 getter 方法 无法映射到url。前提是这些方法没有使用@RequestMapping注解
(7)修复 MVC Controller 实例属性与action方法@RequestMapping("xxx/{id}")中的“{}”变量的绑定。
(8)当MVC Controller 实例属性绑定的UrlParam的值为null时,不将参数值注入到该属性。
(9)添加Json支持,MVC的@Result(type="json"),被注解的方法,返回值会被JsonConverter.convert(re),接着被写入到响应流。
(10)所有的注解都被加上@Inherited,允许类、public方法上的注解被子类继承。
(11)框架使用的反射工具类范围调整至涵盖父类。原先取得某个类的属性,是不能获取到它的父类的属性的(同理,方法也是),现在父类的也会被获取,主要考虑到MVC的Controller、ORM的
POJO等对象需要使用继承来复用代码。
(12)修复MVC的Controller无法实例化的时候框架报致命错误导致程序中断,现在为跳过该类,将其认为非控制器,且继续处理下一个类。
(13)修复MVC的Controller属性绑定到UrlParam过程中,pojo属性互相调用导致的循环递归异常。
(14)ORM的CascadeDAO @One 关系中的级联更新操作,对新更新的关联对象如果在数据库中找不到记录就不被更新的规则修改为当关联对象为null或者其主键值为null的时候不级联更新。例如
更新某个菜单的父菜单为空这种情况。
(16)重新调整了MVC的Validator有关的注解。去掉了冗余。举个实例:
这是修改之前的写法:
@Validator({"int","required","length"})
@ValField(index={0,1,2},field={"id","name","name"},value={"id必须为数字","name必填","name长度4-6位"})
@ValParam(index={2,2},name={"minLength","maxLength"},value={"4","6"})
public void doActoin(){}
这是修改之后的写法:
@Validator({"int","required","length"})
@ValField({"id","name"})
@ValMess(validator={0,1,2},field={0,1,1},value={"id必须为数字","name必填","name长度4-6位"})
@ValParamName("minLength","maxLength")
@ValParam(valMess={2,2},name={0,1},value={"4","6"})
public void doActoin(){}
可以看到,原来的ValField对要验证的field会产生冗余,例如上例中的“name”,修改后是将这些field写到另外一个@ValField注解中,然后在@ValMess中进行引用,注意那些数字引用表表
示的是数组下标。
同样道理,对于@ValParam来说也是这样,为了去掉冗余。
备注:说去掉冗余是不严谨的说法,实际上应该是将语言文字的冗余转化为数字的冗余,后者相对而言是降低了冗余。思路也更清晰。
(17)IOC增加@Ioc注解,只能用在Action类属性上,且需要setter方法才能注入。具体用法:
@Controller
class TestAction{
@Ioc("这里填写在IOC配置文件里的BeanID,不填的话默认是简单类名TestDAO")
private TestService testService;
public void setTestService(TestService testService){
this.testService = testService;
}
}
(18)添加 DAOFactory.getSelectDAO().selectCount(Class<?> clazz,String condition,Object... args);用来查询表的记录数。给定where条件,允许有?占位符。
(19)修复了当被扫描的包里含有.svn或者其他非.class文件的时候,框架启动失败的一个bug
(20)改善了MVC.Action的ParamUtil进行URL参数绑定到Aciton属性的时候,如果是属性为pojo,例如:
private Pet pet;
那么绑定参数的时候,优先找到 pet.name绑定到pet里面的name属性。
如果找不到pet.name 参数,则找name参数绑定。如果还找不到,就不进行任何绑定。
可以看到跟属性名字“pet”有关,可以理解为参数的一个scope,这样解决了不同pojo但相同属性名字的参数绑定。
url:/testPojoParamAndUrlParam?name=thisName&pet.name=xiaohei&master.name=weiwei
支持深层次。例如:
url:/testPojoParamAndUrlParam?name=thisName&pet.master.name=masterName&pet.name=petName
(21)MVC Action URL变量支持多个。例如:
@RequestMapping("test/{cate}/{name}/edit")
public void testParamArg(){
}
要注意不要无任何间隔的连续写两个变量,例如:"test/{cate}{name}/edit"这是不合法的。"test/{cate}at{name}/edit"这是合法的。
(22)ORM 持久化类属性 添加了@Ignore 注解,表示该属性不映射到表字段中。
上些实例代码,其中包括快要发布的Simportal新版本。
最新的Simportal版本还在开发当中。贴上部分代码:
最近比较忙,实习中,不过最新版本一直在开发中,争取2012年之前发布一个1.b.8版本.
超轻量、面向接口,扩展灵活。
可先使用本框架快速开发,然后方便的转换成SSH。只需修改部分代码,无需修改业务逻辑代码。
MVC、IOC、ORM自由选择开闭,灵活与其他框架集成。
特性:
Component组件支持
- DWZ组件
- 分页组件
- ……
MVC
- 约定由于配置,可零配置。
- 两种配置方式(xml,注解)供您选择
- 更加灵活方便的url mapping
- 两种参数绑定方式(类属性、方法参数)供您选择
- RESTful
- Json渲染
- URL拦截器
- action验证器
- ……
IOC
- 基本数据类型注入
- 无限制嵌套Pojo注入
- setter方法注入和构造方法注入
ORM
- 约定由于配置,可零配置。
- 两种配置方式(xml、注解),供您选择
- 简单的DAOFactory,提供InsertDAO、DeleteDAO、UpdateDAO、SelectDAO、DivPageDAO、SearchDAO、CascadeDAO接口。
- 支持表关系、级联操作
- 事务模板
- JdbcTemplate
- 支持多个数据源
- 无缓存,无懒加载,主动级联操作,纯粹的ORM
- ……
各种Util工具类
- BeanXMLUtil,一个pojo序列化和反序列化到xml的工具类,基于注解
- FileUtil,一个文件操作工具类
- JsonConverter,JSON转换工具类
- ReflectUtil,一个反射工具类,能获取setter、getter,使反射获取方法,属性更简易,支持父类的反射
- ……
简单就是美。使用文档已经编写齐全,在下载包里有,PDF格式。
纯开源、纯分享,不喜勿喷,还望各位大大多多支持。
下载地址:http://code.google.com/p/eweb4j/downloads/list
启动配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean xmlBean="com.cfuture08.eweb4j.config.bean.ConfigBean"> <debug>0</debug> <ioc xmlBean="com.cfuture08.eweb4j.config.bean.ConfigIOC"> <open>1</open> <debug>true</debug> <logFile>logs/ioc.log</logFile> <logMaxSize>5</logMaxSize> <iocXmlFiles xmlBean="com.cfuture08.eweb4j.config.bean.IOCXmlFiles"> <path>ioc.xml</path> </iocXmlFiles> </ioc> <orm xmlBean="com.cfuture08.eweb4j.config.bean.ConfigORM"> <open>1</open> <debug>true</debug> <logFile>logs/orm.log</logFile> <logMaxSize>5</logMaxSize> <dataSource>com.mchange.v2.c3p0.ComboPooledDataSource</dataSource> <scanPojoPackage xmlBean="com.cfuture08.eweb4j.config.bean.ScanPojoPackage"> <path>.</path> </scanPojoPackage> <ormXmlFiles xmlBean="com.cfuture08.eweb4j.config.bean.ORMXmlFiles"> <path></path> </ormXmlFiles> <dbInfoXmlFiles xmlBean="com.cfuture08.eweb4j.config.bean.DBInfoXmlFiles"> <path>mysql_con_info.xml</path> </dbInfoXmlFiles> </orm> <mvc xmlBean="com.cfuture08.eweb4j.config.bean.ConfigMVC"> <open>true</open> <debug>true</debug> <logFile>logs/mvc.log</logFile> <logMaxSize>5</logMaxSize> <scanActionPackage xmlBean="com.cfuture08.eweb4j.config.bean.ScanActionPackage"> <path>.</path> </scanActionPackage> <actionXmlFiles xmlBean="com.cfuture08.eweb4j.config.bean.ActionXmlFile"> <path></path> </actionXmlFiles> <interXmlFiles xmlBean="com.cfuture08.eweb4j.config.bean.InterXmlFile"> <path>interceptor.xml</path> </interXmlFiles> </mvc> </bean> </beans>
新版本1.b.7更新:
(1) Controller支持以下约定:
action方法不填写注解RequestMapping的时候,默认以方法名为url-mapping值。
action 方法返回类型为void的时候框架不做任何跳转处理。
缺省返回值忽略大小写。例如ajax。
类名如果以“Controller”,“Control”,“Action”结尾的话,可以不用添加@Controller注解,框架也能识别为控制器。
(2)mvc中,为了改进性能,将Class.forName(ActionBeanName),改为缓存方式调用。这样省去了lookup的过程,效能会提升。当系统需要应对高并发的时候,很有效。
(3)废除了formBean的配置,框架自动识别pojo参数,并且支持无限嵌套pojo属性。无需任何配置。
(4)将MVC的@Result(location="")属性改为@Result(value="")
(5)将ORM的BaseDAO.getOne(Integer id)之类的Integer改为Number
(6)让MVC Controller 的属性的 setter 方法 和 getter 方法 无法映射到url。前提是这些方法没有使用@RequestMapping注解
(7)修复 MVC Controller 实例属性与action方法@RequestMapping("xxx/{id}")中的“{}”变量的绑定。
(8)当MVC Controller 实例属性绑定的UrlParam的值为null时,不将参数值注入到该属性。
(9)添加Json支持,MVC的@Result(type="json"),被注解的方法,返回值会被JsonConverter.convert(re),接着被写入到响应流。
(10)所有的注解都被加上@Inherited,允许类、public方法上的注解被子类继承。
(11)框架使用的反射工具类范围调整至涵盖父类。原先取得某个类的属性,是不能获取到它的父类的属性的(同理,方法也是),现在父类的也会被获取,主要考虑到MVC的Controller、ORM的
POJO等对象需要使用继承来复用代码。
(12)修复MVC的Controller无法实例化的时候框架报致命错误导致程序中断,现在为跳过该类,将其认为非控制器,且继续处理下一个类。
(13)修复MVC的Controller属性绑定到UrlParam过程中,pojo属性互相调用导致的循环递归异常。
(14)ORM的CascadeDAO @One 关系中的级联更新操作,对新更新的关联对象如果在数据库中找不到记录就不被更新的规则修改为当关联对象为null或者其主键值为null的时候不级联更新。例如
更新某个菜单的父菜单为空这种情况。
(16)重新调整了MVC的Validator有关的注解。去掉了冗余。举个实例:
这是修改之前的写法:
@Validator({"int","required","length"})
@ValField(index={0,1,2},field={"id","name","name"},value={"id必须为数字","name必填","name长度4-6位"})
@ValParam(index={2,2},name={"minLength","maxLength"},value={"4","6"})
public void doActoin(){}
这是修改之后的写法:
@Validator({"int","required","length"})
@ValField({"id","name"})
@ValMess(validator={0,1,2},field={0,1,1},value={"id必须为数字","name必填","name长度4-6位"})
@ValParamName("minLength","maxLength")
@ValParam(valMess={2,2},name={0,1},value={"4","6"})
public void doActoin(){}
可以看到,原来的ValField对要验证的field会产生冗余,例如上例中的“name”,修改后是将这些field写到另外一个@ValField注解中,然后在@ValMess中进行引用,注意那些数字引用表表
示的是数组下标。
同样道理,对于@ValParam来说也是这样,为了去掉冗余。
备注:说去掉冗余是不严谨的说法,实际上应该是将语言文字的冗余转化为数字的冗余,后者相对而言是降低了冗余。思路也更清晰。
(17)IOC增加@Ioc注解,只能用在Action类属性上,且需要setter方法才能注入。具体用法:
@Controller
class TestAction{
@Ioc("这里填写在IOC配置文件里的BeanID,不填的话默认是简单类名TestDAO")
private TestService testService;
public void setTestService(TestService testService){
this.testService = testService;
}
}
(18)添加 DAOFactory.getSelectDAO().selectCount(Class<?> clazz,String condition,Object... args);用来查询表的记录数。给定where条件,允许有?占位符。
(19)修复了当被扫描的包里含有.svn或者其他非.class文件的时候,框架启动失败的一个bug
(20)改善了MVC.Action的ParamUtil进行URL参数绑定到Aciton属性的时候,如果是属性为pojo,例如:
private Pet pet;
那么绑定参数的时候,优先找到 pet.name绑定到pet里面的name属性。
如果找不到pet.name 参数,则找name参数绑定。如果还找不到,就不进行任何绑定。
可以看到跟属性名字“pet”有关,可以理解为参数的一个scope,这样解决了不同pojo但相同属性名字的参数绑定。
url:/testPojoParamAndUrlParam?name=thisName&pet.name=xiaohei&master.name=weiwei
支持深层次。例如:
url:/testPojoParamAndUrlParam?name=thisName&pet.master.name=masterName&pet.name=petName
(21)MVC Action URL变量支持多个。例如:
@RequestMapping("test/{cate}/{name}/edit")
public void testParamArg(){
}
要注意不要无任何间隔的连续写两个变量,例如:"test/{cate}{name}/edit"这是不合法的。"test/{cate}at{name}/edit"这是合法的。
(22)ORM 持久化类属性 添加了@Ignore 注解,表示该属性不映射到表字段中。
上些实例代码,其中包括快要发布的Simportal新版本。
package com.cfuture08.eweb4j.component.dwz.menu.domain.model; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import com.cfuture08.eweb4j.orm.config.annotation.Column; import com.cfuture08.eweb4j.orm.config.annotation.Id; import com.cfuture08.eweb4j.orm.config.annotation.Many; import com.cfuture08.eweb4j.orm.config.annotation.One; import com.cfuture08.eweb4j.orm.config.annotation.Table; /** * DWZ中左边树形结构菜单模型 * * @author weiwei * */ @Table("t_TreeMenu") public class TreeMenu implements Serializable { private static final long serialVersionUID = 5264149396283615258L; @Id @Column("id") private Long treeMenuId = 0L; private String name;// 菜单名 private String target = "navTab";// navTab或dialog private String rel;// navTabId private String reloadFlag = "1";// 是否自动刷新 private String href;// 跳转路径 private int rank;// 排序 @One(column = "pid") private TreeMenu parent;// 父亲菜单 @One(column = "navMenuId") private NavMenu navMenu = new NavMenu();// 所在的导航菜单 @Many(target = TreeMenu.class, column = "pid") private List<TreeMenu> children = new ArrayList<TreeMenu>();// 孩子菜单们 public Long getTreeMenuId() { return treeMenuId; } public void setTreeMenuId(Long treeMenuId) { this.treeMenuId = treeMenuId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public TreeMenu getParent() { return parent; } public void setParent(TreeMenu parent) { this.parent = parent; } public int getRank() { return rank; } public void setRank(int rank) { this.rank = rank; } public String getTarget() { return target; } public void setTarget(String target) { this.target = target; } public String getRel() { return rel; } public void setRel(String rel) { this.rel = rel; } public String getReloadFlag() { return this.reloadFlag; } public void setReloadFlag(String reloadFlag) { this.reloadFlag = reloadFlag; } public String getHref() { return href; } public void setHref(String href) { this.href = href; } public NavMenu getNavMenu() { return navMenu; } public void setNavMenu(NavMenu navMenu) { this.navMenu = navMenu; } public List<TreeMenu> getChildren() { return children; } public void setChildren(List<TreeMenu> children) { this.children = children; } public String toString() { Long pid = parent == null ? 0L : parent.treeMenuId; return "{\"treeMenuId\":\"" + treeMenuId + "\",\"navMenuId\":\"" + navMenu.getNavMenuId() + "\",\"pid\":\"" + pid + "\",\"name\":\"" + name + "\",\"href\":\"" + href + "\"}"; } }
package com.lurencun.ewebdemo; import java.io.PrintWriter; import com.cfuture08.eweb4j.mvc.annotation.Param; import com.cfuture08.eweb4j.mvc.annotation.RequestMapping; import com.cfuture08.eweb4j.orm.dao.factory.DAOFactory; public class HelloAction { //默认方法名为访问url public void helloWorld(PrintWriter out) { out.print("Hello World !"); } @RequestMapping("hello") public void doHello(PrintWriter out){ out.print("doHello"); } @RequestMapping(value="articles/{id}",method="GET") public void restful(PrintWriter out,@Param("id")int id){ out.print("id->"+id); } public String defaultForward(){ return "test.jsp"; } public String forward(){ return "forward:test.jsp"; } public String redirect(){ return "redirect:test.jsp"; } /** * url: "/test?name=ooo&pojo.name=xxx&pojo.age=2" * */ public void bindParam(String name,@Param("pojo") Pojo pojo){ Long id = (Long) DAOFactory.getInsertDAO().insert(pojo); pojo.setId(id); DAOFactory.getCascadeDAO().update(pojo, "xxx","ooo"); } public void testDAO(){ } }
最新的Simportal版本还在开发当中。贴上部分代码:
package com.cfuture08.eweb4j.component.dwz.menu.action.treeMenu; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import com.cfuture08.eweb4j.component.dwz.DWZ; import com.cfuture08.eweb4j.component.dwz.menu.constant.CommonCons; import com.cfuture08.eweb4j.component.dwz.menu.constant.TreeMenuCons; import com.cfuture08.eweb4j.component.dwz.menu.domain.model.TreeMenu; import com.cfuture08.eweb4j.component.dwz.menu.domain.service.TreeMenuService; import com.cfuture08.eweb4j.ioc.annotation.Ioc; import com.cfuture08.eweb4j.mvc.annotation.Controller; import com.cfuture08.eweb4j.mvc.annotation.RequestMapping; import com.cfuture08.eweb4j.mvc.annotation.Singleton; /** * 抽象类BaseAction * * @author weiwei * */ @Controller @Singleton @RequestMapping(TreeMenuCons.MODULE_PATH) public abstract class BaseAction { @Ioc(TreeMenuCons.IOC_SERVICE_BEAN_ID) protected TreeMenuService service = null; @Ioc(CommonCons.IOC_DWZ_BEAN_ID) protected DWZ dwz = null; protected HttpServletRequest request; protected PrintWriter out; protected TreeMenu treeMenu; protected Long[] ids; protected Long id = 0L; protected String keyword = ""; protected Long treeMenuId = 0L; protected Long navMenuId = 0L; protected int pageNum = 1; protected int numPerPage = 20; //setter and getter }
package com.cfuture08.eweb4j.component.dwz.menu.action.treeMenu; import com.cfuture08.eweb4j.component.dwz.menu.constant.TreeMenuCons; import com.cfuture08.eweb4j.mvc.annotation.Param; import com.cfuture08.eweb4j.mvc.annotation.RequestMapping; import com.cfuture08.eweb4j.mvc.annotation.ValField; import com.cfuture08.eweb4j.mvc.annotation.ValMess; import com.cfuture08.eweb4j.mvc.annotation.Validator; public class AddAction extends BaseAction { @RequestMapping(value = "/new", method = "GET|POST") public String doNew() { request.setAttribute("model", TreeMenuCons.MODEL_NAME); return "add.jsp"; } @RequestMapping(value = "/", method = "POST", showValErr = "dwzJson") @Validator({ "int", "required" }) @ValField({ "rank", "navMenus.dwz_navMenu2.navMenuId" }) @ValMess(validator = { 0, 1 }, field = { 0, 1 }, value = { "排序项只能输入数字", "导航菜单不能为空" }) public void doAdd(@Param("navMenus.dwz_navMenu2.navMenuId") Long navMenuId, @Param(value = TreeMenuCons.MODEL_NAME + ".dwz_treeMenu2.treeMenuId", init = "0") Long pid) { try { service.addWithCascade(treeMenu, navMenuId, pid); out.print(TreeMenuCons.DWZ_SUCCESS_JSON_CLOSE_CURRENT); } catch (Exception e) { out.print(dwz.getFailedJson(e.getMessage())); } } }
package com.cfuture08.eweb4j.component.dwz.menu.domain.service; import java.util.ArrayList; import java.util.List; import com.cfuture08.eweb4j.component.DivPageComp; import com.cfuture08.eweb4j.component.dwz.menu.constant.CommonCons; import com.cfuture08.eweb4j.component.dwz.menu.constant.TreeMenuCons; import com.cfuture08.eweb4j.component.dwz.menu.domain.dao.NavMenuDAO; import com.cfuture08.eweb4j.component.dwz.menu.domain.dao.TreeMenuDAO; import com.cfuture08.eweb4j.component.dwz.menu.domain.model.NavMenu; import com.cfuture08.eweb4j.component.dwz.menu.domain.model.TreeMenu; import com.cfuture08.eweb4j.component.dwz.menu.exception.CannotBeParentMenuException; import com.cfuture08.eweb4j.component.dwz.menu.exception.CannotFindNavMenuException; import com.cfuture08.eweb4j.component.dwz.menu.exception.CannotFindParentMenuException; import com.cfuture08.eweb4j.component.dwz.menu.exception.DuplicateMenuNameException; import com.cfuture08.eweb4j.component.dwz.menu.exception.MenuDataAccessException; import com.cfuture08.eweb4j.component.dwz.menu.exception.MenuNotFoundException; import com.cfuture08.eweb4j.component.dwz.view.EditPage; import com.cfuture08.eweb4j.component.dwz.view.ListPage; import com.cfuture08.eweb4j.component.dwz.view.SearchForm; public class TreeMenuServiceImpl implements TreeMenuService { private SearchForm searchForm = new SearchForm(TreeMenuCons.MODEL_NAME + "/search", ""); private NavMenuDAO navMenuDAO = null; private TreeMenuDAO treeMenuDAO = null; // IOC注入 public void setNavMenuDAO(NavMenuDAO navMenuDAO) { if (this.navMenuDAO == null) this.navMenuDAO = navMenuDAO; } // IOC注入 public void setTreeMenuDAO(TreeMenuDAO treeMenuDAO) { if (this.treeMenuDAO == null) this.treeMenuDAO = treeMenuDAO; } @Override public ListPage getPageWithCascade(int pageNum, int numPerPage) throws MenuDataAccessException { List<TreeMenu> list = treeMenuDAO.getPageWithCascade(pageNum, numPerPage); DivPageComp dpc = new DivPageComp(pageNum, numPerPage, this.treeMenuDAO.countAll(), CommonCons.DIV_PAGE_BTN_MAX_SHOW); return new ListPage(TreeMenuCons.MODEL_NAME, searchForm, list, dpc); } @Override public ListPage getSearchResult(String keyword, int pageNum, int numPerPage) throws MenuDataAccessException { if (keyword == null || keyword.length() == 0) { searchForm.setKeyword(""); return getPageWithCascade(pageNum, numPerPage); } List<TreeMenu> list = treeMenuDAO.getSearchResult(keyword, pageNum, numPerPage); DivPageComp dpc = new DivPageComp(pageNum, numPerPage, this.treeMenuDAO.countSearch(keyword), CommonCons.DIV_PAGE_BTN_MAX_SHOW); searchForm.setKeyword(keyword); return new ListPage(TreeMenuCons.MODEL_NAME, searchForm, list, dpc); } @Override public ListPage getParentsPage(Long navMenuId, Long treeMenuId, int pageNum, int numPerPage) throws MenuDataAccessException, CannotFindNavMenuException { return getParentsSearchResult(navMenuId, treeMenuId, "", pageNum, numPerPage); } @Override public ListPage getParentsSearchResult(Long navMenuId, Long treeMenuId, String keyword, int pageNum, int numPerPage) throws MenuDataAccessException, CannotFindNavMenuException { if (navMenuId == null || navMenuId <= 0) throw new CannotFindNavMenuException(); NavMenu navMenu = this.navMenuDAO.getOne(navMenuId); if (navMenu == null) throw new CannotFindNavMenuException(); if (keyword == null) keyword = ""; List<TreeMenu> pojos = this.treeMenuDAO.getParentSearchResult(pageNum, numPerPage, keyword, navMenuId, treeMenuId); if (pojos == null) pojos = new ArrayList<TreeMenu>(); TreeMenu tm = new TreeMenu(); tm.setTreeMenuId(0L); tm.setName("主菜单-没有父节点"); tm.setNavMenu(navMenu); pojos.add(tm); long allCount = this.treeMenuDAO.countParentSearchResult(keyword, navMenuId, treeMenuId); DivPageComp dpc = new DivPageComp(pageNum, numPerPage, allCount, CommonCons.DIV_PAGE_BTN_MAX_SHOW); searchForm.setAction(TreeMenuCons.MODEL_NAME + "/" + navMenuId + "/lookupSearch"); searchForm.setKeyword(keyword); return new ListPage(TreeMenuCons.MODEL_NAME, searchForm, pojos, dpc); } @Override public String getParentsFormatJson(Long navMenuId, Long treeMenuId) throws MenuDataAccessException, CannotFindNavMenuException { if (navMenuId == null || navMenuId <= 0) throw new CannotFindNavMenuException(); NavMenu navMenu = this.navMenuDAO.getOne(navMenuId); if (navMenu == null) throw new CannotFindNavMenuException(); List<TreeMenu> pojos = this.treeMenuDAO .getParent(navMenuId, treeMenuId); if (pojos == null) pojos = new ArrayList<TreeMenu>(); TreeMenu tm = new TreeMenu(); tm.setTreeMenuId(0L); tm.setName("主菜单-没有父节点"); tm.setNavMenu(navMenu); pojos.add(tm); return pojos.toString(); } @Override public void batchRemove(Long[] ids) throws MenuDataAccessException, MenuNotFoundException { TreeMenu treeMenu = null; for (Long id : ids) { treeMenu = treeMenuDAO.getOne(id); if (treeMenu == null) throw new MenuNotFoundException(); treeMenuDAO.deleteOne(id); } } @Override public void removeOne(Long id) throws MenuDataAccessException, MenuNotFoundException { TreeMenu treeMenu = treeMenuDAO.getOne(id); if (treeMenu == null) throw new MenuNotFoundException(); treeMenuDAO.deleteOne(id); } @Override public void addWithCascade(TreeMenu treeMenu, Long navMenuId, Long pid) throws MenuDataAccessException, CannotFindNavMenuException, CannotFindParentMenuException, CannotBeParentMenuException, DuplicateMenuNameException { TreeMenu tmp_TreeMenu = this.treeMenuDAO.getOneByName(treeMenu .getName()); if (tmp_TreeMenu != null) throw new DuplicateMenuNameException(); if (navMenuId == null || navMenuId <= 0) throw new CannotFindNavMenuException(); NavMenu navMenu = this.navMenuDAO.getOne(navMenuId); if (navMenu == null) throw new CannotFindNavMenuException(); if (pid > 0) { TreeMenu parent = this.treeMenuDAO.getOne(pid); if (parent == null) throw new CannotFindParentMenuException(); if (pid.equals(treeMenu.getTreeMenuId())) throw new CannotBeParentMenuException(); treeMenu.setParent(parent); } else { treeMenu.setParent(new TreeMenu()); } treeMenu.setNavMenu(navMenu); String reloadFlag = treeMenu.getReloadFlag(); treeMenu.setReloadFlag("on".equals(reloadFlag) ? "1" : "0"); this.treeMenuDAO.create(treeMenu); } @Override public EditPage<TreeMenu> getEditPage(Long id) throws MenuDataAccessException, MenuNotFoundException { TreeMenu treeMenu = this.treeMenuDAO.getOne(id); if (treeMenu == null) throw new MenuNotFoundException(); String reloadFlag = treeMenu.getReloadFlag(); treeMenu.setReloadFlag("1".equals(reloadFlag) ? "checked" : ""); EditPage<TreeMenu> editPage = new EditPage<TreeMenu>( TreeMenuCons.MODEL_NAME, TreeMenuCons.MODEL_NAME + "/" + id, treeMenu); return editPage; } @Override public void updateWithCascade(TreeMenu treeMenu, Long navMenuId, Long pid) throws MenuDataAccessException, MenuNotFoundException, CannotFindNavMenuException, CannotFindParentMenuException, CannotBeParentMenuException, DuplicateMenuNameException { Long id = treeMenu.getTreeMenuId(); if (id == null || id <= 0) throw new MenuNotFoundException(); TreeMenu tmp_TreeMenu = this.treeMenuDAO.getOne(treeMenu .getTreeMenuId()); if (tmp_TreeMenu == null) throw new MenuNotFoundException(); tmp_TreeMenu = this.treeMenuDAO.getOneByName(treeMenu.getName()); if (tmp_TreeMenu != null && !tmp_TreeMenu.getTreeMenuId().equals( treeMenu.getTreeMenuId())) throw new DuplicateMenuNameException(); if (navMenuId == null || navMenuId <= 0) throw new CannotFindNavMenuException(); NavMenu navMenu = this.navMenuDAO.getOne(navMenuId); if (navMenu == null) throw new CannotFindNavMenuException(); if (pid > 0) { TreeMenu parent = this.treeMenuDAO.getOne(pid); if (parent == null) throw new CannotFindParentMenuException(); if (pid.equals(treeMenu.getTreeMenuId())) throw new CannotBeParentMenuException(); treeMenu.setParent(parent); }else { treeMenu.setParent(new TreeMenu()); } treeMenu.setNavMenu(navMenu); String reloadFlag = treeMenu.getReloadFlag(); treeMenu.setReloadFlag("on".equals(reloadFlag) ? "1" : "0"); this.treeMenuDAO.update(treeMenu); } @Override public List<TreeMenu> getTopParent(Long navMenuId) throws CannotFindNavMenuException, MenuDataAccessException { if (navMenuId == null || navMenuId <= 0) throw new CannotFindNavMenuException(); NavMenu navMenu = this.navMenuDAO.getOne(navMenuId); if (navMenu == null) throw new CannotFindNavMenuException(); return this.treeMenuDAO.getTopParentOrderByRankASC(navMenuId); } @Override public List<TreeMenu> getChildren(Long pid) throws CannotFindParentMenuException, MenuDataAccessException { if (pid == null || pid <= 0) throw new CannotFindParentMenuException(); TreeMenu parent = this.treeMenuDAO.getOne(pid); if (parent == null) throw new CannotFindParentMenuException(); return this.treeMenuDAO.getChildrenOrderByRankASC(pid); } }
package com.cfuture08.eweb4j.component.dwz.menu.domain.dao; import java.util.List; import com.cfuture08.eweb4j.component.dwz.menu.domain.model.TreeMenu; import com.cfuture08.eweb4j.component.dwz.menu.exception.MenuDataAccessException; import com.cfuture08.eweb4j.orm.dao.DAOException; import com.cfuture08.eweb4j.orm.dao.base.BaseDAO; import com.cfuture08.eweb4j.orm.dao.base.BaseDAOImpl; import com.cfuture08.eweb4j.orm.dao.factory.DAOFactory; import com.cfuture08.eweb4j.orm.sql.constant.OrderType; public class TreeMenuDAOImpl implements TreeMenuDAO { private BaseDAO<TreeMenu> dao = new BaseDAOImpl<TreeMenu>(TreeMenu.class); @Override public List<TreeMenu> getPageWithCascade(int pageNum, int numPerPage) throws MenuDataAccessException { List<TreeMenu> list = null; try { list = dao.getPage(pageNum, numPerPage); if (list != null) DAOFactory.getCascadeDAO().select( list.toArray(new TreeMenu[] {}), "parent", "navMenu"); } catch (DAOException e) { throw new MenuDataAccessException(e.getMessage()); } return list; } @Override public long countAll() throws MenuDataAccessException { long count = 0; try { count = dao.countAll(); } catch (DAOException e) { throw new MenuDataAccessException(e.getMessage()); } return count; } @Override public long countSearch(String keyword) throws MenuDataAccessException { long count = 0; try { String condition = "name like '%" + keyword + "%'"; count = DAOFactory.getSelectDAO().selectCount(TreeMenu.class, condition); } catch (DAOException e) { throw new MenuDataAccessException(e.getMessage()); } return count; } @Override public List<TreeMenu> getSearchResult(String keyword, int pageNum, int numPerPage) throws MenuDataAccessException { List<TreeMenu> list = null; try { String[] fields = new String[] { "name" }; list = dao.searchByKeywordAndPaging(fields, keyword, pageNum, numPerPage, 0); if (list != null) DAOFactory.getCascadeDAO().select( list.toArray(new TreeMenu[] {}), "parent", "navMenu"); } catch (DAOException e) { throw new MenuDataAccessException(e.getMessage()); } return list; } @Override public TreeMenu getOne(Long id) throws MenuDataAccessException { TreeMenu treeMenu = null; try { treeMenu = dao.getOne(id); if (treeMenu != null) DAOFactory.getCascadeDAO() .select(treeMenu, "navMenu", "parent"); } catch (DAOException e) { throw new MenuDataAccessException(e.getMessage()); } return treeMenu; } @Override public void update(TreeMenu treeMenu) throws MenuDataAccessException { try { DAOFactory.getUpdateDAO().update(treeMenu); DAOFactory.getCascadeDAO().update(treeMenu, "parent", "navMenu"); } catch (DAOException e) { throw new MenuDataAccessException(e.getMessage()); } } @Override public void create(TreeMenu treeMenu) throws MenuDataAccessException { try { Long treeMenuId = Long.parseLong("" + DAOFactory.getInsertDAO().insert(treeMenu)); treeMenu.setTreeMenuId(treeMenuId); DAOFactory.getCascadeDAO().update(treeMenu, "parent", "navMenu"); } catch (DAOException e) { throw new MenuDataAccessException(e.getMessage()); } } @Override public List<TreeMenu> getParent(Long navMenuId, Long treeMenuId) throws MenuDataAccessException { List<TreeMenu> pojos = null; try { String condition = "id <> ? and navMenuId = ? "; pojos = DAOFactory.getSelectDAO().selectWhere(TreeMenu.class, condition, treeMenuId, navMenuId); if (pojos != null) DAOFactory.getCascadeDAO().select( pojos.toArray(new TreeMenu[] {}), "parent", "navMenu"); } catch (DAOException e) { throw new MenuDataAccessException(e.getMessage()); } return pojos; } @Override public List<TreeMenu> getParentSearchResult(int pageNum, int numPerPage, String keyword, Long navMenuId, Long treeMenuId) throws MenuDataAccessException { List<TreeMenu> pojos = null; try { String condition = "id <> ? and navMenuId = ? and name like ? "; Object[] args = new Object[] { treeMenuId, navMenuId, "%" + keyword + "%" }; pojos = DAOFactory.getDivPageDAO().divPageByWhere(TreeMenu.class, pageNum, numPerPage, condition, args); if (pojos != null) DAOFactory.getCascadeDAO().select( pojos.toArray(new TreeMenu[] {}), "parent", "navMenu"); } catch (DAOException e) { throw new MenuDataAccessException(e.getMessage()); } return pojos; } @Override public long countParentSearchResult(String keyword, Long navMenuId, Long treeMenuId) throws MenuDataAccessException { long count = 0; try { String condition = "id <> '" + treeMenuId + "' and navMenuId = '" + navMenuId + "' and name like '%" + keyword + "%'"; count = DAOFactory.getSelectDAO().selectCount(TreeMenu.class, condition); } catch (DAOException e) { throw new MenuDataAccessException(e.getMessage()); } return count; } @Override public void deleteOne(Long id) throws MenuDataAccessException { try { dao.delete(new Long[] { id }); } catch (DAOException e) { throw new MenuDataAccessException(e.getMessage()); } } @Override public TreeMenu getOneByName(String name) throws MenuDataAccessException { TreeMenu treeMenu = null; try { treeMenu = DAOFactory.getSelectDAO().selectOne(TreeMenu.class, new String[] { "name" }, new String[] { name }); } catch (DAOException e) { throw new MenuDataAccessException(e.getMessage()); } return treeMenu; } @Override public List<TreeMenu> getTopParentOrderByRankASC(Long navMenuId) throws MenuDataAccessException { List<TreeMenu> pojos = null; try { String[] fields = new String[] { "pid", "navMenuId" }; String[] values = new String[] { "0", String.valueOf(navMenuId) }; pojos = DAOFactory.getSearchDAO().searchByExact(TreeMenu.class, fields, values, "rank", OrderType.ASC_ORDER, false); } catch (DAOException e) { throw new MenuDataAccessException(e.getMessage()); } return pojos; } @Override public List<TreeMenu> getChildrenOrderByRankASC(Long pid) throws MenuDataAccessException { List<TreeMenu> pojos = null; try { String[] fields = new String[] { "pid" }; String[] values = new String[] { String.valueOf(pid) }; pojos = DAOFactory.getSearchDAO().searchByExact(TreeMenu.class, fields, values, "rank", OrderType.ASC_ORDER, false); } catch (DAOException e) { throw new MenuDataAccessException(e.getMessage()); } return pojos; } }
评论
2 楼
laiweiweihi
2011-11-16
kelepingzi 写道
最近在忙什么,没看见更新了。
最近比较忙,实习中,不过最新版本一直在开发中,争取2012年之前发布一个1.b.8版本.
1 楼
kelepingzi
2011-11-16
最近在忙什么,没看见更新了。
发表评论
-
EWeb4J 1.9.1 新版本发布 基于Servlet/JDBC的轻量级web开发框架
2012-11-28 22:08 2846EWeb4J 是一个基于 Servlet/Jdbc 构建的轻量 ... -
EWeb4J-SolidBase 发布新版本
2012-07-08 12:41 2150SolidBase项目是采用 DWZ + EWeb4J 开发的 ... -
EWeb4J 框架迁移到 GitHub
2012-07-05 10:02 1894EWeb4J 框架: https://github.com/ ... -
发布一个EWeb4J-1.9的Demo
2012-07-04 16:38 26EWeb4J-1.9框架发布在即,在此之前,发布一个小Demo ... -
EWeb4J-1.9-文件上传下载和生成建表脚本
2012-06-09 12:11 2310毕业了。高兴一下,哈。 一直以来,eweb4j framew ... -
SolidBase 二次开发 GIS 截图
2012-05-07 16:12 1933有位大哥哥使用 EWeb4J 的项目 SolidBase 作为 ... -
EWeb4J 国际化支持出炉啦(有源码看)
2012-05-06 15:31 2076很荣幸也很开心地公布,EWeb4J 支持国际化了。并且有着它独 ... -
Play framework 国际化
2012-05-03 20:04 4335Play的国际化操作还是非常简单的。大概分为四步: 1. ... -
eweb4j在线演示程序更新
2012-04-25 09:25 2113访问地址:SolidBase 增加菜单显示权限 ... -
EWeb4J-1.9-继续改善ActiveRecord支持【级联】操作
2012-04-17 20:58 1493老习惯:约定优于配置 ... -
EWeb4J-1.9-控制器更新
2012-04-13 16:56 1446主要增加以下更新: 验证器 声明式事务 7个默认Acti ... -
eweb4j-1.9-支持ActiveRecord模式
2012-04-06 20:46 1622@Entity @Table(name="t_ ... -
(不断更新)EWeb4J-1.9-SNAPSHOT最近进程
2012-03-28 23:33 1818经过奋战,终于有个稳定点的SNAPSHOT版本咯。 较之上个 ... -
eweb4j演示项目-SolidBase增加对菜单显隐的权限控制
2012-03-28 14:41 1918昨晚捣鼓到两点多才弄好,今天整理了下,大概把菜单权限控制做好了 ... -
(下篇)单例POJO实现CRUD+分页+搜索Demo
2012-03-23 23:14 2本篇程序特点: POJO式的控制器,无需继承、无需实 ... -
体验快速开发2:单例POJO实现CRUD+分页+搜索Demo
2012-03-23 22:54 29程序特点: POJO式的控制器,无需继承、无需实现接 ... -
体验快速开发:只有一个控制类实现的CRUD+分页+搜索Demo
2012-03-22 22:17 182╮(╯▽╰)╭,本来不想谈什么快速开发的,但是最近老是有人拿什 ... -
如何将自己的jar包Release到Maven中央仓库中
2012-03-20 17:17 4450PS:真正要发布到Maven中央库中是首先需要到https:/ ... -
EWeb4J-1.8.6 发布,同时带来一个演示项目
2012-03-08 17:44 2997距离上次1.7的发布已经过去5个月了。首先值得高兴的是EW ... -
eweb4j加进到Maven中央仓库啦,先发个快照版
2012-02-25 23:54 1706挺开心的。 先是注册好了 eweb4j.org。 然后是sv ...
相关推荐
- **changelog**:记录eweb4j框架的版本变更历史,包括新功能、修复的bug和性能优化等,对于跟踪框架的发展和升级非常有用。 - **license**:包含框架的授权协议,确保开发者在使用eweb4j时遵循正确的法律条款。 ...
**eweb4j框架详解** `eweb4j`是一个基于Java开发的轻量级Web应用框架,旨在简化Web应用程序的开发过程,提高开发效率。它集成了许多实用功能,如MVC模式、数据访问、安全管理等,为开发者提供了一个高效、易用的...
EWeb4J是一款专为快速构建企业级Web应用而设计的开源框架。它提供了一种声明式的编程模型,允许开发者通过简单的XML配置文件来定义页面布局、数据绑定逻辑等,极大地简化了Web应用的开发过程。EWeb4J支持多种数据库...
EWeb编辑器2.80版本包含大量的预设模板,涵盖多种网站类型,如企业官网、博客、电商等,用户可快速套用模板,进行个性化调整,快速搭建网站框架。 4. **图片和媒体管理**: 内置的图片和多媒体管理功能,让用户...
EWeb4J ? = EWeb4J 是一个基于 Servlet/Jdbc 构建的轻量级 Java Web 开发框架。它可以代替 SSH 来开发一个完整的 Web 应用程序。 它专注于 少侵入、少配置、松耦合、RESTful架构风格的 Web 应用程序开发。 EWeb4J ...
资源分类:Python库 所属语言:Python 资源全名:eweb-0.0.3.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
程序小巧主要为文章发布系统,可以为你组建一个信息发布网站. 升级功能: 1.使用EWEB编辑器,升级后请到 eweb/admin_login.asp 修改编辑器后台密码 默认密码为admin 2.图片列表选择问题 3.优化搜索 4.管理员分级,...
7. **版本控制**: - 在进行此类更改时,务必使用版本控制系统(如Git)来跟踪文件的变更,以便在出现问题时可以轻松回滚。 8. **安全考虑**: - 更改文件扩展名和内容时,需注意安全风险,如SQL注入。确保对用户...
Rockwell 1756-Eweb模块
B. 文件/目录的删除、移动、重命名 C. 新建目录 D. 多文件的上载 E. 文本型文件(.php, .html, .txt 等)的编辑 F. 图片及 falsh 文件的即时浏览 G. 文件下载 新增功能: H.多媒体编缉文件(绑定...
1756-EWEB
《eWeb Editor客户端:在线文本编辑器的深度解析与应用》 eWeb Editor是一款功能强大的在线文本编辑器,尤其在Web开发领域中被广泛应用。它以其便捷的操作界面和丰富的编辑功能,为网络编程人员提供了极大的便利。...
作为一个现代的在线编辑器,EWeb可能集成了版本控制系统,如Git。这样,你可以追踪代码更改,回滚到之前的版本,或者与团队成员协作。实例可能包括如何使用EWeb进行版本控制操作的指南。 七、实际应用示例 实例可能...
7. **模板与预设**:eweb内置多种预设模板,用户可以根据需要选择合适的网页布局,快速搭建网页框架。 8. **代码保存与预览**:编辑完成后,用户可以选择保存HTML代码,或者直接预览网页效果,确保内容符合预期。 ...
3. **EWEB**:EWEB是罗克韦尔的Web服务器软件,它可以将PLC的数据发布到Web服务器,使得用户通过标准的Web浏览器就可以查看和控制PLC状态,这对于远程监控和故障排查非常有用。 4. **PLC编程**:通常使用罗克韦尔的...
1. **Model(模型)**:负责处理业务逻辑和数据管理。在Web应用中,模型通常与数据库交互,获取和存储数据。模型层的改变不会直接影响到视图和控制器,但会影响它们之间的数据交换。 2. **View(视图)**:展示数据...
ASP常用的后台编辑器,带图片上传功能 调用方法如下例子: ...iframe ID="eWebEditor1" src="../eWebEditor/ewebeditor.htm?id=nr frameborder="0" scrolling="no" width="700" HEIGHT="440"></iframe>
在线编辑HTML,使用户方便使用编码在线编辑HTML,使用户方便使用编码
### RG-S5750V2-L系列交换机RGOS11.4(1)B74P7版本WEB管理手册知识点梳理 #### 一、文档概述与版权声明 - **文档版本**: V1.0 - **归档日期**: 2022-11-07 - **版权信息**: 版权所有 © 2022 锐捷网络。文档及其声明...
eWeb editor编辑器文件,说明,使用方法:将解压后的editor文件夹拷贝到项目根目录下,在需要的页面中加入以下内容: 办事内容:</font></td> <iframe id="eWebEditor1" src="../../editor/...