2 Star 1 Fork 1

panmingguang / cocook-maven

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

cocook 集成 MVC boot 启动,servlet规范COC && 直连 RPC

cocook 升级 2.0,对项目进行重构优化 ##新版功能:

boot启动方式, 内置tomcat, Undertow, 优化性能

添加自定义协议 protocol包, 查看protocol.md

新增 内置 自定义协议流 具体查看例子

Map<String,Object> map = Multimap.createMap("uid", (Object)1)
			.set("name", "潘明光123123")
			.set("sex", (char)'H')
			.set("short", (short)2)
			.set("double", 2.34)
			.set("float", 2.34F)
			.set("long", System.currentTimeMillis())
			.set("time", new Timestamp(System.currentTimeMillis()))
			.set("data", new Date())
			.set("bool", true)
			.set("bytes", new byte[]{1,2,3});
			
	Message msg = serialize(map);
	System.out.println(deserialize(msg.toBytes()));
	
	List<Map<String, Object>> list= Arrays.asList(map, map,map, map);
	Message msg2 = serialize(list);
	System.out.println(deserializeToList(msg2.toBytes()));  //测试性能 大概达到 fastjson 的2~3倍

###undertow 使用阿里云 4核8G 测试性能, 大约1W4, 默认jvm, 无优化

public class BS_API_MAIN {
	public static void main(String[] args) throws ServletException {
		new UndertowStart(BS_API_MAIN.class).init(args)
		.addCocookServlet()
		//.addServlet(statViewServlet).addFilter(webStatFilter)
		.addlistener(WebEmbedListener.class)
		.start();
	}
}

新增 内置 NIO, AIO Server, 主要用于 内部 直连RPC, 接口拷贝 znet 设计

public static void main(String[] args) throws Exception {
	AioServer server = new AioServer(8080);
	MessageAdaptorServer adaptorServer= new MessageAdaptorServer();
	adaptorServer.setReadWritebufferSize(10*1024);
	adaptorServer.registerHandler("test", new MessageHandler() {
		@Override
		public void handleMessage(HttpMessage msg, Session sess) throws IOException {
			msg.setStatus("200");
			msg.setBody("hello");
			sess.write(msg);
		}
	});
	server.setIoAdaptor(adaptorServer);
	
	server.start();
}

AIO内置server hello word 测试性能, 使用阿里云 4核8G 测试性能, 大约6W 此内网测试 http 协议, 真正使用方式 为rpc长连接, 并非用于httpserver 服务器, 内网长连接方式 QPS 50~100W左右

直接web.xml使用介绍: web.xml 配置

<servlet>
		<!-- 定义Servlet名称 -->
		<servlet-name>cocookServlet</servlet-name>
		<!-- Servlet具体实现类 -->
		<servlet-class>tom.cocook.handler.CocookServlet</servlet-class>
		<!-- 初始化上下文对象 -->
		<init-param>
			<!-- 参数名称 -->
			<param-name>SystemConfigLocation</param-name>
			<!-- 加载配置文件 -->
			<param-value>/WEB-INF/config/app.properties</param-value>
		</init-param>
		<!-- 设置启动的优先级 -->
		<load-on-startup>1</load-on-startup>
</servlet>

app.properties 中 用三项项必须配置, 其他参照 git上传的文件

	#dataSource 配置文件路径, 文件路径只支持 WebRoot路径, 不支持class路径, 未实现
	DBConfigLocation = /WEB-INF/config/DBConfig.properties
	
	#扫描包 必须填写
	scanPackage = tom.test
	
	#handler 必须填写  cocook提供两种模式DefaultNameHandler(类似springCoC模式), DefaultAnnotationHandler(@path url自定义模式)
	handler = tom.cocook.handler.DefaultNameHandler,tom.cocook.handler.DefaultAnnotationHandler
	
	#可省略-----编码  默认 UTF-8
	#encoding=UTF-8
	
	#可省略-----page目录  默认 /WEB-INF/page 
	#pageContext =/WEB-INF/page
	
	#可省略默认.htm-----page后缀  
	#pageSuffix =.htm
	
	
	#可省略-----log4j配置文件路径 
	#log4jConfigLocation = /WEB-INF/config/log4j.properties
	
	#可省略默认velocity -----视图配置 支持 velocity, freemarker,jsp
	#viewType = velocity
	#viewConfigLocation = /WEB-INF/config/velocity.properties

代码示例: DemoController ---> xxxController extends ControllerModel --> 遵循COC

@Controller
public class DemoController extends ControllerModel{
	@Resource(DemoService.class)
	DemoService demoService;

@Override
public boolean before(RequestContext resContext, Map<String, String> map) {
	resContext.setAttribute("cxtpath", resContext.getRequest().getContextPath());
	return super.before(resContext, map);
}

@Path("/flt/{user}")
public String test1(HttpServletRequest req, Map<String, String> map, String user) {
	req.setAttribute("user", user);
	HashMap<String, Object> lmap = new HashMap<String, Object>();
	ArrayList<String> list = new ArrayList<String>();
	lmap.put("name", "panmg");
	lmap.put("list", list);
	req.setAttribute("mapL", lmap);
	return "freemarker";
}

@InputstreamOutput(ContentType.Image)
@Path("/image")
public Object image(HttpServletResponse res, Map<String, String> map) {
	res.setContentType("image/jpg");
	RandomNumImage randomNumImage = RandomNumImage.getInstance();
	return randomNumImage.getImage();
}

@Path("/json/{user}")
@JSONOutput
public Object json(HttpServletRequest req, UserD userD, String user, Map<String, String> map) throws JSONException {
	System.out.println(userD);
	System.out.println(user);
	System.out.println(map);
	
	List<?> list = DBUtil.getList("select * from aa");
	list =  (List<?>) JSONUtil.deserialize(JSONUtil.serialize(list)); //反序列化
	
	System.out.println(list);
	return list;   //序列化 
}


@Path("/vm/{user}")
@JSONOutput
public String test(HttpServletRequest req, UserD userD, String user, Map<String, String> map) {
	
//		System.out.println("list<map>=="+DBUtil.getList("select * from aa"));
//		System.out.println("map=="+DBUtil.getMap("select * from aa where name=?", "panmg1"));
//		System.out.println(DBUtil.getList("select * from aa where name=?", String.class, "panmg1"));
//		System.out.println(DBUtil.getString("select value from aa where name=?", "panmg1"));
//		System.out.println(DBUtil.getInt("select value from aa where name=?", "a"));
//		
//		/* getBeans() 没加, 已取消次方法, 返回多个bean的集合*/
//		
//		
//		// 返回自增id,没有返回成功的条数
//		//System.out.println(DBUtil.insert("insert into aa values(?,?)", "wangjun2", "27"));
//		// 返回 成功插入的 条数
//		//System.out.println(DBUtil.exec("insert into aa values(?,?)", "ppp,","tttt"));
//		
//		HashMap<String, Object> aa = new HashMap<String, Object>();
//		aa.put("name","panmg222");
//		aa.put("value","panmg222");
//		//参数为 实体[支持map和bean], 表名
//		//System.out.println(DBUtil.insertDB(aa, "aa"));
//		System.out.println(DBUtil.updateDB(aa, "aa", "name='panmg'"));
//		
//		AA aa1 = new AA();
//		aa1.setName("panmg333");
//		aa1.setValue("panmg33");
//		//System.out.println(DBUtil.insertDB(aa1, "aa"));
//		System.out.println(DBUtil.updateDB(aa1, "aa", "name='panmg12'"));
	
	req.setAttribute("user", user);
	HashMap<String, Object> lmap = new HashMap<String, Object>();
	ArrayList<String> list = new ArrayList<String>();
	list.add("常州");
	list.add("苗侨");
	lmap.put("name", "panmg");
	lmap.put("list", list);
	req.setAttribute("map", lmap);
	return "velocity";
}

}

拦截器示例: DemoInterceptor extends AbstractInterceptor

// 设置handler 绑定, 全局绑定,默认绑定DefaultNameHandler.class
@Interceptor(handler={DefaultNameHandler.class}) //,DefaultAnnotationHandler.class 
public class Demointerceptor extends AbstractInterceptor{

		@Override
		public boolean before(Serializable actionInvocation) {
			System.out.println("------before 拦截器执行  begin");
			ActionInvocation invocation = (ActionInvocation)actionInvocation;
			System.out.println("params====="+ invocation.getParaMap());
		System.out.println("url   ====="+invocation.getMethodUrl());;
		System.out.println("urlmethod=="+invocation.getHandlerInfo().getMethods().get(invocation.getMethodUrl()));
		System.out.println("contor====="+invocation.getHandlerInfo().getController());
		System.out.println("urlpams===="+invocation.getHandlerInfo().getUrlParams());
		System.out.println("------before 拦截器执行  end ");
		return true;
	}
} 

空文件

简介

自用servlet 框架, DBUtil高效开发, boot启动, NIO, AIO实现 http协议格式 rpc 展开 收起
Java
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/panmingguang2004/cocook-maven.git
git@gitee.com:panmingguang2004/cocook-maven.git
panmingguang2004
cocook-maven
cocook-maven
master

搜索帮助