Code Monkey home page Code Monkey logo

nettice's Introduction

design
License Built with Maven
基于netty http协议栈的轻量级 MVC 组件

特性

  1. 接收装配请求数据、流程控制和渲染数据
  2. URI 到方法直接映射,以及命名空间

功能

  1. HttpRequest 的流程控制
  2. 像普通方法一样处理 http 请求
  3. 对请求的数据自动装配,支持基本类型ListArrayMap
  4. 提供 Render 方法渲染并写回响应,支持多种 Content-Type
  5. 支持可配置的命名空间

请求分发整体设计

design

Action请求处理

action_process

Usage

1. Maven

<dependency>
  <groupId>com.github.cyfonly</groupId>
  <artifactId>nettice-core</artifactId>
  <version>1.0.0</version>
</dependency>

2. In your project code

.addLast("dispatcher",new ActionDispatcher())

URI 映射和命名空间

使用方法名作为 URI 映射关键字,如果项目中存在同样名字的方法会产生冲突,开发者可以使用 @Namespaces 注解或者在 nettice.xml 配置中添加 namespaces 来修改 URI 映射,以规避此问题。  

例如 com.server.action.DemoAction 提供了 returnTextUseNamespace() 方法,com.server.action.sub.SubDemoAction 也提供了 returnTextUseNamespace() 方法,但两个方法实现不同功能。nettice 组件默认使用方法名进行 URI 映射,那么上述两个 returnTextUseNamespace() 方法会产生冲突,开发者可以使用 @Namespace 注解修改 URI 映射:

package com.server.action;
public class DemoAction extends BaseAction{
  	@Namespace("/nettp/demo/")
  	public Render returnTextUseNamespace(@Read(key="id") Integer id, @Read(key="proj") String proj){
    		//do something
    		return new Render(RenderType.TEXT, "returnTextUseNamespace in [DemoAction]");
  	}
}
package com.server.action.sub;
public class SubDemoAction extends BaseAction{
  	@Namespace("/nettp/subdemo/")
	public Render returnTextUseNamespace(@Read(key="ids") Integer[] ids, @Read(key="names") List<String> names){
		//do something
		return new Render(RenderType.TEXT, "returnTextUseNamespace in [SubDemoAction]");
	}
}

也可以在 nettice.xml 中设置:

<namespaces>
  <namespace name="/nettp/demo/" packages="com.server.action.*"></namespace>
  <namespace name="/nettp/subdemo/" packages="com.server.action.sub"></namespace>
</namespaces>

接收装配请求数据

使用Read注解可以自动装配请求数组,支持不同的类型(基本类型ListArrayMap),可以设置默认值(目前仅支持基本类型设置 defaultValue)。
这个例子演示了从 HttpRequest 中获取基本类型的方法,如果没有值会自动设置默认值:

public Render primTypeTest(@Read(key="id", defaultValue="1" ) Integer id, @Read(key="proj") String proj, @Read(key="author") String author){
	System.out.println("Receive parameters: id=" + id + ",proj=" + proj + ",author=" + author);
	return new Render(RenderType.TEXT, "Received your primTypeTest request.[from primTypeTest]");
}

这个例子演示了从 HttpRequest 中获取 List/Array 类型的方法:

public Render arrayListTypeTest(@Read(key="ids") Integer[] ids, @Read(key="names") List<String> names){
	System.out.println("server output ids:");
	for(int i=0; i<ids.length; i++){
		System.out.println(ids[i]);
	}
		
	System.out.println("server output names:");
	for(String item : names){
		System.out.println(item);
	}
		
	JSONObject obj = new JSONObject();
	obj.put("code", 0);
	obj.put("msg", "Received your Array/List request.[from arrayListTypeTest()]");
		
	return new Render(RenderType.JSON, obj.toJSONString());
}

这个例子演示了从 HttpRequest 中获取 Map 类型的方法(注意,使用 Map 时限定了只能存在一个 Map<String,String> 参数):

public Render mapTypeTest(@Read(key="srcmap") Map<String,String> srcmap){
	System.out.println("server output srcmap:");
	for(String key : srcmap.keySet()){
		System.out.println(key + "=" + srcmap.get(key));
	}
		
	JSONObject obj = new JSONObject();
	obj.put("code", 0);
	obj.put("msg", "Received your Map request.[from mapTypeTest]");
		
	return new Render(RenderType.JSON, obj.toJSONString());
}

渲染数据

处理方法可以通过返回 Render 对象向客户端返回特定格式的数据,一个 Render 对象由枚举类型 RenderTypedata 两部分组成。
nettice 组件会通过 RenderType 来为 Response 设置合适的 Content-Type,开发者也可以扩展 Render 以及相关类来实现更多的类型支持。
例如这是一个返回 JSON 对象的例子,客户端将收到一个 Json 对象:

public Render postPriMap(){
	JSONObject obj = new JSONObject();
	obj.put("code", 0);
	obj.put("msg", "had received your request.");
	
	return new Render(RenderType.JSON, obj.toJSONString());
}

TODO LIST

  1. java bean支持

License

基于 Apache License 2.0 发布。有关详细信息,请参阅 LICENSE

nettice's People

Contributors

cyfonly avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.