{"id":37021639,"url":"https://github.com/cyfonly/nettice","last_synced_at":"2026-01-14T02:33:58.969Z","repository":{"id":144589322,"uuid":"66267812","full_name":"cyfonly/nettice","owner":"cyfonly","description":"基于netty http协议栈的轻量级 mvc 组件","archived":false,"fork":false,"pushed_at":"2017-01-11T12:09:21.000Z","size":338,"stargazers_count":89,"open_issues_count":2,"forks_count":32,"subscribers_count":19,"default_branch":"master","last_synced_at":"2025-07-18T13:46:36.770Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://www.cnblogs.com/cyfonly/p/6194683.html","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cyfonly.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2016-08-22T11:43:10.000Z","updated_at":"2025-06-30T06:16:14.000Z","dependencies_parsed_at":null,"dependency_job_id":"d212ce32-be30-41aa-9c28-99612dc3a309","html_url":"https://github.com/cyfonly/nettice","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cyfonly/nettice","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cyfonly%2Fnettice","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cyfonly%2Fnettice/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cyfonly%2Fnettice/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cyfonly%2Fnettice/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cyfonly","download_url":"https://codeload.github.com/cyfonly/nettice/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cyfonly%2Fnettice/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408711,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-14T02:33:58.403Z","updated_at":"2026-01-14T02:33:58.959Z","avatar_url":"https://github.com/cyfonly.png","language":"Java","funding_links":[],"categories":["开发框架"],"sub_categories":["Web框架"],"readme":"![design](https://github.com/cyfonly/nettice/blob/master/pictures/nettice.png \"nettice\")  \n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/cyfonly/nettice/blob/master/LICENSE)  [![Built with Maven](http://maven.apache.org/images/logos/maven-feather.png)](http://search.maven.org/#search%7Cga%7C1%7Ccyfonly)  \n基于netty http协议栈的轻量级 MVC 组件\n  \n# 特性\n1. 接收装配请求数据、流程控制和渲染数据\n2. `URI` 到方法直接映射，以及命名空间\n\n  \n# 功能\n1. 对 `HttpRequest` 的流程控制\n2. 像普通方法一样处理 `http` 请求\n3. 对请求的数据自动装配，支持`基本类型`、`List`、`Array` 和 `Map`\n4. 提供 `Render` 方法渲染并写回响应，支持多种 `Content-Type`\n5. 支持可配置的命名空间\n  \n  \n# 请求分发整体设计\n![design](https://github.com/cyfonly/nettp/blob/master/pictures/design.png \"design.png\")\n  \n  \n# Action请求处理\n![action_process](https://github.com/cyfonly/nettp/blob/master/pictures/action_process.png \"action_process.png\")  \n  \n# Usage  \n#### 1. Maven   \n\n```\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.github.cyfonly\u003c/groupId\u003e\n  \u003cartifactId\u003enettice-core\u003c/artifactId\u003e\n  \u003cversion\u003e1.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n```   \n#### 2. In your project code\n```\n.addLast(\"dispatcher\",new ActionDispatcher())\n```  \n\n# `URI` 映射和命名空间\n使用方法名作为 `URI` 映射关键字，如果项目中存在同样名字的方法会产生冲突，开发者可以使用 `@Namespaces` 注解或者在 `nettice.xml` 配置中添加 `namespaces` 来修改 `URI` 映射，以规避此问题。  \n\n例如 `com.server.action.DemoAction` 提供了 `returnTextUseNamespace()` 方法，`com.server.action.sub.SubDemoAction` 也提供了 `returnTextUseNamespace()` 方法，但两个方法实现不同功能。`nettice` 组件默认使用方法名进行 `URI` 映射，那么上述两个 `returnTextUseNamespace()` 方法会产生冲突，开发者可以使用 `@Namespace` 注解修改 `URI` 映射：  \n```\npackage com.server.action;\npublic class DemoAction extends BaseAction{\n  \t@Namespace(\"/nettp/demo/\")\n  \tpublic Render returnTextUseNamespace(@Read(key=\"id\") Integer id, @Read(key=\"proj\") String proj){\n    \t\t//do something\n    \t\treturn new Render(RenderType.TEXT, \"returnTextUseNamespace in [DemoAction]\");\n  \t}\n}\n``` \n  \n```\npackage com.server.action.sub;\npublic class SubDemoAction extends BaseAction{\n  \t@Namespace(\"/nettp/subdemo/\")\n\tpublic Render returnTextUseNamespace(@Read(key=\"ids\") Integer[] ids, @Read(key=\"names\") List\u003cString\u003e names){\n\t\t//do something\n\t\treturn new Render(RenderType.TEXT, \"returnTextUseNamespace in [SubDemoAction]\");\n\t}\n}\n```\n\n也可以在 `nettice.xml` 中设置:\n```\n\u003cnamespaces\u003e\n  \u003cnamespace name=\"/nettp/demo/\" packages=\"com.server.action.*\"\u003e\u003c/namespace\u003e\n  \u003cnamespace name=\"/nettp/subdemo/\" packages=\"com.server.action.sub\"\u003e\u003c/namespace\u003e\n\u003c/namespaces\u003e\n```\n\n# 接收装配请求数据\n使用Read注解可以自动装配请求数组，支持不同的类型（`基本类型`、`List`、`Array`  和 `Map`），可以设置默认值（**目前仅支持基本类型设置 defaultValue**）。  \n这个例子演示了从 `HttpRequest` 中获取基本类型的方法，如果没有值会自动设置默认值：\n```\npublic Render primTypeTest(@Read(key=\"id\", defaultValue=\"1\" ) Integer id, @Read(key=\"proj\") String proj, @Read(key=\"author\") String author){\n\tSystem.out.println(\"Receive parameters: id=\" + id + \",proj=\" + proj + \",author=\" + author);\n\treturn new Render(RenderType.TEXT, \"Received your primTypeTest request.[from primTypeTest]\");\n}\n```  \n这个例子演示了从 `HttpRequest` 中获取 `List/Array` 类型的方法：\n```\npublic Render arrayListTypeTest(@Read(key=\"ids\") Integer[] ids, @Read(key=\"names\") List\u003cString\u003e names){\n\tSystem.out.println(\"server output ids:\");\n\tfor(int i=0; i\u003cids.length; i++){\n\t\tSystem.out.println(ids[i]);\n\t}\n\t\t\n\tSystem.out.println(\"server output names：\");\n\tfor(String item : names){\n\t\tSystem.out.println(item);\n\t}\n\t\t\n\tJSONObject obj = new JSONObject();\n\tobj.put(\"code\", 0);\n\tobj.put(\"msg\", \"Received your Array/List request.[from arrayListTypeTest()]\");\n\t\t\n\treturn new Render(RenderType.JSON, obj.toJSONString());\n}\n```\n这个例子演示了从 `HttpRequest` 中获取 `Map` 类型的方法（**注意，使用 Map 时限定了只能存在一个 Map\u003cString,String\u003e 参数**）：\n```\npublic Render mapTypeTest(@Read(key=\"srcmap\") Map\u003cString,String\u003e srcmap){\n\tSystem.out.println(\"server output srcmap:\");\n\tfor(String key : srcmap.keySet()){\n\t\tSystem.out.println(key + \"=\" + srcmap.get(key));\n\t}\n\t\t\n\tJSONObject obj = new JSONObject();\n\tobj.put(\"code\", 0);\n\tobj.put(\"msg\", \"Received your Map request.[from mapTypeTest]\");\n\t\t\n\treturn new Render(RenderType.JSON, obj.toJSONString());\n}\n```  \n  \n# 渲染数据\n处理方法可以通过返回 `Render` 对象向客户端返回特定格式的数据，一个 `Render` 对象由枚举类型 `RenderType` 和 `data` 两部分组成。  \n`nettice` 组件会通过 `RenderType` 来为 `Response` 设置合适的 `Content-Type`，开发者也可以扩展 `Render` 以及相关类来实现更多的类型支持。  \n例如这是一个返回 `JSON` 对象的例子，客户端将收到一个 `Json` 对象：\n```\npublic Render postPriMap(){\n\tJSONObject obj = new JSONObject();\n\tobj.put(\"code\", 0);\n\tobj.put(\"msg\", \"had received your request.\");\n\t\n\treturn new Render(RenderType.JSON, obj.toJSONString());\n}\n```  \n  \n# TODO LIST \n1. java bean支持  \n  \n  \n# License\n基于 Apache License 2.0 发布。有关详细信息，请参阅 [LICENSE](https://github.com/cyfonly/nettice/blob/master/LICENSE)。\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcyfonly%2Fnettice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcyfonly%2Fnettice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcyfonly%2Fnettice/lists"}