`
ansjsun
  • 浏览: 203110 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

机遇Nutz 的一个通用action.实现了增加删除修改查询

    博客分类:
  • J2EE
阅读更多
前几天看了Nutz的框架写的真不错.方便..既有springMVC的优雅.也有Hibernate的简洁


但是在查询的时候.没有封装类似springside的页面查询.于是闲着趁礼拜六日自己写了个通用的action..写的时候一直很迷茫.我是不是又回到jsp时代了..暂且作为一个分支吧...
具体的可行性..待定.希望大家给点意见


首先是个通用的action 他返回的是json格式..

下面是使用的简介

查询说明:

/superjson/list/Person?page.pageNo=1&Cnd_AND_age_GT=20&Cnd_AND_name_LIKE=ansj

这个意思就是.查找Person对象.pageNo=1:从第一页   Cnd_AND_age_GT=20 年龄大于20 Cnd_OR_name_LIKE=ansj 或者名字like ansj

目前支持EQ, GT, LT, GTE, LTE, N, LIKE, NLIKE, IS, ISN, IN, NIN , ASC, DESC ;


查询单一对象
/superjson/findOne/Person?Cnd_AND_id_EQ=1

这个意思就是.查找Person对象.   Cnd_AND_id_EQ=1 id=1的对象.可以有其他条件但是只

返回第一个对象


保存
/superjson/save/Person/person?person.name=ansj&person.age=20

这个意思就是插入Person对象.person对象的参数前缀是ansj. 这样就构造一个person对象并且保存


更新
/superjson/update/Person/person?person.name=ansj&person.age=20&person.id=1

这个意思就是更新Person对象.person对象的参数前缀是ansj. 这样就构造一个person对象并且更新


删除
/superjson/delete/Person/person?Cnd_AND_id_EQ=1*Cnd_OR_name_LIKE=ansj

删除一批对象.这个条件是id=1 或者name like ansj





package com.enilu.shop.controller;

import java.lang.reflect.InvocationTargetException;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.nutz.dao.Condition;
import org.nutz.ioc.annotation.InjectName;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.json.JsonFormat;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;

import com.enilu.shop.util.InjectByClass;
import com.enilu.shop.util.Page;
import com.enilu.shop.util.PageSqlUtil;

/**
 * 通用的JSON返回JSON的字符串格式
 * @author ansj
 * @mail ansj-sun@163.com
 */
@IocBean
@InjectName
public class SuperJSONAction extends BaseAction {

	static final String BEANPATH = "com.enilu.shop.bean.";

	/**
	 * 通用的查找action 构建网址必须按照此格式/superjson/list/类名?page.pageSize=10...
	 * 注意.pageNo=0的时候就是查询全部
	 * 
	 * @param className
	 *            要查询的对象名
	 * @param page
	 *            查询的也没信息
	 * @return json
	 * @throws ClassNotFoundException
	 *             传入的类名称不正确
	 * @throws InterruptedException
	 */
	@SuppressWarnings("unchecked")
	@At("/superjson/list/*")
	@Ok("json")
	public Object list(String className, @Param("::page.") Page page,
			HttpServletRequest request) throws ClassNotFoundException,
			InterruptedException {

		Condition condition = PageSqlUtil.getCnd(request);

		Class c = Class.forName(BEANPATH + className);

		List list = this.basicDao.searchByPage(c, condition, page.getPageNo(),
				page.getPageSize());

		int allCount = basicDao.searchCount(c);

		page.setResult(list);

		page.setTotalCount(allCount);

		return page;
	}
	
	
	/**
	 * 通用的查找action 构建网址必须按照此格式/superjson/list/类名?page.pageSize=10...
	 * 注意.pageNo=0的时候就是查询全部
	 * 
	 * @param className
	 *            要查询的对象名
	 * @param page
	 *            查询的也没信息
	 * @return json
	 * @throws ClassNotFoundException
	 *             传入的类名称不正确
	 * @throws InterruptedException
	 */
	@SuppressWarnings("unchecked")
	@At("/superjson/findOne/*")
	@Ok("json")
	public Object findOne(String className, HttpServletRequest request) throws ClassNotFoundException,
			InterruptedException {
		
		StringBuilder sb = new StringBuilder() ;

		Condition condition = PageSqlUtil.getCnd(request);

		Class c = Class.forName(BEANPATH + className);

		List list = this.basicDao.search(c, condition);

		if(list.size()>0){
			return list.get(0) ;
		}
		return "ERROR" ;
	}

	/**
	 * 保存
	 *  网址参数例子:/superjson/save/类名/对象名?对象名.参数=值
	 * @return 成功或者失败
	 * @throws ClassNotFoundException
	 * @throws InvocationTargetException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 */
	@SuppressWarnings("unchecked")
	@At("/superjson/save/?/?/*")
	@Ok("json")
	public String save(String className, String objName,
			HttpServletRequest request) throws ClassNotFoundException,
			InstantiationException, IllegalAccessException,
			InvocationTargetException {
		Class c = Class.forName(BEANPATH + className);
		Object obj = InjectByClass.getObject(c, objName, request);
		this.basicDao.save(obj);
		return "SUCCESS";
	}
	
	
	/**
	 * 保存
	 *  网址参数例子:/superjson/update/类名/对象名?对象名.参数=值
	 * @return 成功或者失败
	 * @throws ClassNotFoundException
	 * @throws InvocationTargetException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 */
	@SuppressWarnings("unchecked")
	@At("/superjson/update/?/?/*")
	@Ok("json")
	public String update(String className, String objName,
			HttpServletRequest request) throws ClassNotFoundException,
			InstantiationException, IllegalAccessException,
			InvocationTargetException {
		Class c = Class.forName(BEANPATH + className);
		Object obj = InjectByClass.getObject(c, objName, request);
		this.basicDao.update(obj);
		return "SUCCESS";
	}
	
	/**
	 * 删除
	 *  网址参数例子:/superjson/delete/类名?对象名.参数=值
	 * @return 成功或者失败
	 * @throws ClassNotFoundException
	 * @throws InvocationTargetException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 */
	@SuppressWarnings("unchecked")
	@At("/superjson/delete/*")
	@Ok("json")
	public String delete(String className, HttpServletRequest request) throws ClassNotFoundException,
			InterruptedException {

		Condition condition = PageSqlUtil.getCnd(request);

		Class c = Class.forName(BEANPATH + className);

		List list = this.basicDao.search(c, condition);
		
		basicDao.deleteAll(list) ;

		return "SUCCESS";
	}
	
}




他依赖一下两个工具类..和apache的jar包..beanUtil..当然不想用jar包就把beanUtil实现一下我是美意见的..我比较懒就用她的jar了


package com.enilu.shop.util;

import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
import org.nutz.dao.Cnd;
import org.nutz.dao.Condition;
import org.nutz.dao.util.cri.SimpleCriteria;

public class PageSqlUtil {

	/**
	 * Cnd_OR_KEY_OP Cnd_DESC_KEY Cnd_ASC_KEY
	 * 
	 * @param request
	 *            网页发送过来的request
	 * @return Cnd
	 */
	@SuppressWarnings("unchecked")
	public static Condition getCnd(HttpServletRequest request) {
		Map<String, Object> map = request.getParameterMap();
		Iterator<Entry<String, Object>> it = map.entrySet().iterator();
		Entry<String, Object> entity = null;
		String key = null;
		QuerySub querySub = new QuerySub();
		String[] strs = null;
		while (it.hasNext()) {
			entity = it.next();
			key = entity.getKey();
			strs = key.split("_");
			if ("Cnd".equals(strs[0])) {
				querySub.add(strs, entity.getValue());
			}
		}

		return querySub.getCondition();
	}

	/**
	 * 查询串拼接 Cnd_OR_KEY_OP
	 * 
	 * @author Ansj
	 */
	static class QuerySub {

		StringBuilder sb = new StringBuilder(" where 1=1 ");
		StringBuilder orderSb = new StringBuilder();

		SimpleCriteria sc = new SimpleCriteria();

		// Cnd_OR_KEY_OP
		public void add(String[] strs, Object obj) {
			MatchType mt = MatchType.valueOf(strs[strs.length-1]);
			Object value = null ;
			String op = null ;
			switch (mt) {
			case EQ:
				op = "="  ;
				break;
			case N:
				op = "<>" ;
				break;
			case IN:
				op = "IN" ;
				value = obj ;
				break ;
			case NIN:
				op = "NOT IN" ;
				value = obj ;
				break ;
			case GT:
				op = ">"  ;
				break;
			case LT:
				op = "<" ;
				break;
			case GTE:
				op = ">="  ;
				break;
			case LTE:
				op = "<=" ;
				break;
			case LIKE:
				op = "LIKE" ;
			case NLIKE:
				op = "NOT LIKEs" ;
			case IS:
				op = "IS"  ;
				break;
			case ISN:
				op = "IS NOT" ;
				break;
			case ASC:
				sc.getOrderBy().asc(strs[2]) ;
				break;
			case DESC:
				sc.getOrderBy().desc(strs[2]) ;
				break;
			}
			
			if(value==null){
				value = ((Object[])obj)[0] ;
				if(StringUtils.isBlank(value.toString())){
					return ;
				}
			}
			
			if(op!=null){
				if("AND".equalsIgnoreCase(strs[1])){
					sc.where().and(Cnd.exp(strs[2], op, value)) ;
				}else if("OR".equalsIgnoreCase(strs[1])){
					sc.where().or(Cnd.exp(strs[2], op, value)) ;
				}
			}
		}

		public SimpleCriteria getCondition() {
			return sc ;
		}

	}

	/**
	 * 比较类型 N开头表示not 默认的比较或者like对于字符串都是忽略大小写的
	 * 
	 */
	enum MatchType {
		EQ, GT, LT, GTE, LTE, N, LIKE, NLIKE, IS, ISN, IN, NIN , ASC, DESC ;
	}

}


package com.enilu.shop.util;

import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BeanUtils;


public class InjectByClass {
	
	@SuppressWarnings("unchecked")
	public static Object getObject(Class c , String objName , HttpServletRequest request) throws InstantiationException, IllegalAccessException, InvocationTargetException{
		Object obj = c.newInstance() ;
		objName = objName+".";
		Map<String, Object> map = request.getParameterMap();
		Iterator<Entry<String, Object>> it = map.entrySet().iterator();
		Entry<String, Object> entity = null;
		String key = null;
		String[] strs = null;
		while (it.hasNext()) {
			entity = it.next();
			key = entity.getKey();
			if(key.startsWith(objName)){
				strs = key.split("\\.") ;
				BeanUtils.setProperty(obj, strs[1], entity.getValue()) ;
			}
		}
		return obj ;
	}
	

}




分享到:
评论
3 楼 ansjsun 2012-01-04  
lingsql 写道
看了,楼主有没有看nutz的dao,又重新自己写了一个,真是费劲啊。

我的重点是action不是 dao
2 楼 lingsql 2012-01-04  
看了,楼主有没有看nutz的dao,又重新自己写了一个,真是费劲啊。
1 楼 j9dai 2011-12-19  
好像条件的值都成了字符串型,最后拼出的条件都是col op 'value'。所以类似oracle date字段会报错

相关推荐

    nutz-1.r.60.jar

    nutz-1.r.60.jar

    nutz-1.r.62.zip

    Nutz是一个功能强大的Java开发框架,它以高效、简洁、灵活为设计原则,旨在简化Java开发者的工作流程。Nutz-1.r.62是该框架的一个版本,它包含了一系列优化和改进,使得开发者在构建应用程序时能更加得心应手。 在...

    nutz-1.r.61.r2.jar包

    标题中的"nutz-1.r.61.r2.jar"是一个特定版本的Nutz框架的Java库文件。Nutz是一个开源的Java框架,它旨在简化Web开发,提供一系列实用工具和强大的支持,使得开发者能够更高效地进行业务逻辑处理。这个版本号"1.r.61...

    nutz-1.r.62.jar

    nutz-1.r.62.jar 的jar包 可以解决中文乱码,设置字符编码等等

    nutz-1.r.61-发布包

    Nutz 是一个全面的Java开发框架,旨在提供高效、稳定且易于使用的工具和服务。"nutz-1.r.61-发布包"是Nutz框架的一个版本更新,具体为1.r.61版本。这个发布包包含了该版本的文档、源代码、编译后的类库以及相关的...

    nutz-1.r.58

    Nutz是一个轻量级、高性能的Java开源框架,它的核心目标是简化开发,提高效率。"nutz-1.r.58"是一个特定版本的Nutz框架发布包,包含了该框架的各种组件和文档,便于开发者在项目中使用和学习。 在提供的文件列表中...

    nutz-1.b.43-jdk6.jar

    nutz-1.b.43-jdk5.jar 资源包

    nutz-1.b.48-manual.pdf 文档

    Nutz框架可以在WEB-INF/lib下仅使用一个nutz.jar来运行一个Web应用,前提是开发者自行添加必要的jar包,如连接池和数据库驱动等。对于那些希望尝试新东西、愿意成为NutzCommitters的开发者,Nutz提供了相应的指南和...

    nutz-1.r.57的JDK1.5编译

    Nutz是一个轻量级、高性能的Java开发框架,它的核心组件包括了ORM、AOP、MVC等,为开发者提供了一套完整的开发工具集。在Java开发领域,JDK版本的选择至关重要,因为不同版本的JDK可能会影响到代码的兼容性和性能。...

    nutz-1.b.52.zip

    如果一个 Web 应用,你在 WEB-INF/lib 下只 需要放置一个 nutz.jar 就够了 当然你要使用连接池,数据库驱动等功能,还需要自行添置 jar 包。 -------------Nutz 为谁而设计? 如果你觉得 Hibernate 控制比较繁琐,...

    nutz-1.b.43-jdk5.jar

    nutz-1.b.43-jdk5.jar 资源包

    nutz-1.b.49.r2.zip

    Nutz是对于Java程序员来说,除SSH之外的另一个选择。当然,它是开源的,并且是完全免费的。同时也是商业友好的(Licensed under the Apache License, Version 2.0)。

    nutz-1.a.25_jdoc.zip

    Nutz 是一个全面而强大的Java开发框架,由国内开发者团队创建,旨在简化企业级Web应用的开发过程。Nutz 框架集成了许多功能,包括MVC、ORM、DAO、JSON、AJAX、安全控制等,为Java程序员提供了一站式的解决方案。...

    nutz-1.b.49-manual.pdf

    综上所述,Nutz框架是一个为Java Web开发而生的轻量级框架,它的设计考虑到了传统Java Web开发中的一些痛点,力求在保持运行时效率的前提下,通过简化配置和提供方便快捷的开发方式,提高开发者的生产力。...

    Nutz-1.b.38

    同传统的 SSH 相比,它具备如下特点:轻 -- ...这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 需要放置一个 nutz.jar 就够了当然你要使用其它的连接池,数据库驱动,打印PDF支持等功能,还需要自行添置 jar 包

    nutz-1.r.65.zip

    nutzboot1.65版jar包...............................................................................................希望对你有用

    使用Nutz[1.b.38]对数据库表的CRUD操作

    在IT行业中,数据库管理是核心任务之一,而高效地对数据库表进行CRUD(Create、Read、Update、Delete)...总之,Nutz是一个强大且灵活的工具,对于Java开发者来说,它能够简化数据库操作,使你更专注于业务逻辑的实现。

    在Nutz[1.b.38]中使用视图对关联数据表的操作

    Nutz 是一个轻量级的Java框架,它提供了丰富的功能来支持数据库操作,包括视图的使用。视图在数据库设计中扮演着重要角色,允许开发者以简化的方式查询多个相关表的数据,而无需每次都进行复杂的联接操作。这篇博客...

Global site tag (gtag.js) - Google Analytics