{"id":15356624,"url":"https://github.com/adlered/latke-servlet","last_synced_at":"2025-07-28T06:08:37.320Z","repository":{"id":105570417,"uuid":"388307908","full_name":"adlered/latke-servlet","owner":"adlered","description":"A branch based on the last Servlet version of Latke 2.5.8.","archived":false,"fork":false,"pushed_at":"2021-08-28T14:49:52.000Z","size":2294,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-07-21T09:47:13.860Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","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/adlered.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":"2021-07-22T02:48:46.000Z","updated_at":"2021-08-28T14:49:55.000Z","dependencies_parsed_at":null,"dependency_job_id":"e431df39-53f8-4aad-89a0-fcfbd17a31b9","html_url":"https://github.com/adlered/latke-servlet","commit_stats":{"total_commits":6,"total_committers":1,"mean_commits":6.0,"dds":0.0,"last_synced_commit":"693fdeffc40749b3266baf0f26787ed24507be5c"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/adlered/latke-servlet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adlered%2Flatke-servlet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adlered%2Flatke-servlet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adlered%2Flatke-servlet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adlered%2Flatke-servlet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/adlered","download_url":"https://codeload.github.com/adlered/latke-servlet/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adlered%2Flatke-servlet/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267470062,"owners_count":24092352,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-28T02:00:09.689Z","response_time":68,"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":"2024-10-01T12:29:23.292Z","updated_at":"2025-07-28T06:08:37.300Z","avatar_url":"https://github.com/adlered.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align = \"center\"\u003e\n\u003cimg alt=\"Latke\" src=\"https://user-images.githubusercontent.com/873584/52535454-6a60a980-2d89-11e9-9f4c-000bd7e90f9e.png\"\u003e\n\u003cbr\u003e\u003cbr\u003e\n一款以 JSON 为主的 Java Web 框架（Servlet 分支版本）\n\u003c/p\u003e\n\n## 简介\n\n[Latke](https://github.com/b3log/latke)（'lɑ:tkə，土豆饼）是一个简单易用的 Java Web 应用开发框架，包含 MVC、IoC、事件通知、ORM、插件等组件。\n\n在实体模型上使用 JSON 贯穿前后端，使应用开发更加快捷。这是 Latke 不同于其他框架的地方，比较适合小型应用的快速开发。\n\n## 特性\n\n* 注解式、函数式路由\n* 依赖注入\n* 多种数据库 ORM\n* 多语言\n* 内存/Redis 缓存\n* 事件机制\n* 插件机制\n\n## 案例\n\n* [Demo](https://github.com/b3log/latke-demo)：简单的 Latke 应用示例\n* [Solo](https://github.com/b3log/solo)：一款小而美的 Java 开源博客系统，专为程序员设计\n* [Symphony](https://github.com/b3log/symphony)：一款用 Java 实现的现代化社区（论坛/BBS/社交网络/博客）平台\n\n## 使用\n\n### Maven\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.b3log\u003c/groupId\u003e\n    \u003cartifactId\u003elatke-core\u003c/artifactId\u003e\n    \u003cversion\u003e${latke.version}\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### 控制器层用法\n\n**注解声明式路由**\n\n```java\n@RequestProcessing(\"/\")\npublic void index(final RequestContext context) {\n    context.setRenderer(new SimpleFMRenderer(\"index.ftl\"));\n    final Map\u003cString, Object\u003e dataModel = context.getRenderer().getRenderDataModel();\n    dataModel.put(\"greeting\", \"Hello, Latke!\");\n}\n```\n\n**函数式路由**\n\n```java\nDispatcherServlet.post(\"/register\", registerProcessor::register);\nDispatcherServlet.mapping();\n```\n\n**路径变量和查询字符串**\n\n```java\n@RequestProcessing(\"/var/{pathVar}\")\npublic void paraPathVar(final RequestContext context) {\n    final String paraVar = context.param(\"paraVar\");\n    final String pathVar = context.pathVar(\"pathVar\");\n    context.renderJSON(new JSONObject().put(\"paraVar\", paraVar).put(\"pathVar\", pathVar));\n}\n```\n\n**JSON 解析**\n\n```java\nfinal JSONObject requestJSON = context.requestJSON();\n```\n\n**Servlet 封装**\n\n```java\nfinal String remoteAddr = context.remoteAddr();\nfinal String requestURI = context.requestURI();\nfinal Object att = context.attr(\"name\");\nfinal String method = context.method();\ncontext.sendRedirect(\"https://b3log.org\");\nfinal HttpServletRequest request = context.getRequest();\nfinal HttpServletResponse response = context.getResponse();\n```\n\n### 服务层用法\n\n**依赖注入、事务**\n\n```java\n@Service\npublic class UserService {\n\n    private static final Logger LOGGER = Logger.getLogger(UserService.class);\n\n    @Inject\n    private UserRepository userRepository;\n\n    @Transactional\n    public void saveUser(final String name, final int age) {\n        final JSONObject user = new JSONObject();\n        user.put(\"name\", name);\n        user.put(\"age\", age);\n\n        String userId;\n\n        try {\n            userId = userRepository.add(user);\n        } catch (final RepositoryException e) {\n            LOGGER.log(Level.ERROR, \"Saves user failed\", e);\n\n            // 抛出异常后框架将回滚事务\n            throw new IllegalStateException(\"Saves user failed\");\n        }\n\n        LOGGER.log(Level.INFO, \"Saves a user successfully [userId={0}]\", userId);\n    }\n}\n```\n\n### 持久层用法\n\n**构造 ORM**\n\n```java\n@Repository\npublic class UserRepository extends AbstractRepository {\n\n    public UserRepository() {\n        super(\"user\");\n    }\n}\n```\n\n**单表 CRUD**\n\n```java\npublic interface Repository {\n    String add(final JSONObject jsonObject) throws RepositoryException;\n    void update(final String id, final JSONObject jsonObject) throws RepositoryException;\n    void remove(final String id) throws RepositoryException;\n    void remove(final Query query) throws RepositoryException;\n    JSONObject get(final String id) throws RepositoryException;\n    long count(final Query query) throws RepositoryException;\n}\n```\n\n**条件查询**\n\n```java\npublic JSONObject getByName(final String name) throws RepositoryException {\n    return getFirst(new Query().setFilter(new PropertyFilter(\"name\", FilterOperator.EQUAL, name)));\n}\n```\n\n**分页查询**\n\n```java\nnew Query().setPage(1, 50)\n```\n\n**按字段排序**\n\n```java\nnew Query().addSort(\"name\", SortDirection.DESCENDING);\n```\n\n**仅获取需要字段**\n\n```java\nnew Query().select(\"name\", \"age\");\n```\n\n**原生 SQL**\n\n```java\nfinal List\u003cJSONObject\u003e records = select(\"SELECT * FROM `user` WHERE `name` = ?\", name);\n```\n\n## 文档\n\n* [《提问的智慧》精读注解版](https://hacpai.com/article/1536377163156)\n* [为什么又要造一个叫 Latke 的轮子](https://hacpai.com/article/1403847528022)\n* [Latke 快速上手指南](https://hacpai.com/article/1466870492857)\n* [Latke 配置剖析](https://hacpai.com/article/1474087427032)\n\n## 社区\n\n* [讨论区](https://hacpai.com/tag/latke)\n* [报告问题](https://github.com/b3log/latke/issues/new/choose)\n\n## 授权\n\nLatke 使用 [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) 开源协议。\n\n## 鸣谢\n\n* [FreeMarker](https://github.com/apache/freemarker)：使用广泛的 Java 模版引擎\n* [Commons Lang](https://github.com/apache/commons-lang)：Java 语言相关工具库\n* [Commons IO](https://github.com/apache/commons-io)：Java IO 相关工具库\n* [Commons Codec](https://github.com/apache/commons-codec)：Java 编解码库\n* [Javassist](https://github.com/jboss-javassist/javassist)：Java 字节码处理工具库\n* [SLF4j](https://github.com/qos-ch/slf4j)：Java 日志门户\n* [Gin](https://github.com/gin-gonic/gin)：又快又好用的 golang HTTP web 框架\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadlered%2Flatke-servlet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadlered%2Flatke-servlet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadlered%2Flatke-servlet/lists"}