{"id":17299774,"url":"https://github.com/threefish/basismvc","last_synced_at":"2025-07-31T07:33:00.294Z","repository":{"id":43606520,"uuid":"67813263","full_name":"threefish/basisMvc","owner":"threefish","description":"basisMvc Web框架，支持 IOC、AOP、ORM、MVC，项目基于servlet与java注解","archived":false,"fork":false,"pushed_at":"2019-04-12T01:14:24.000Z","size":277,"stargazers_count":4,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-06T22:51:13.654Z","etag":null,"topics":["aop","ioc","javaee","mvc","orm","view"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/threefish.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-09-09T16:08:01.000Z","updated_at":"2023-05-18T09:23:48.000Z","dependencies_parsed_at":"2022-09-10T14:40:59.978Z","dependency_job_id":null,"html_url":"https://github.com/threefish/basisMvc","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/threefish/basisMvc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/threefish%2FbasisMvc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/threefish%2FbasisMvc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/threefish%2FbasisMvc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/threefish%2FbasisMvc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/threefish","download_url":"https://codeload.github.com/threefish/basisMvc/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/threefish%2FbasisMvc/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268004257,"owners_count":24179381,"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-31T02:00:08.723Z","response_time":66,"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":["aop","ioc","javaee","mvc","orm","view"],"created_at":"2024-10-15T11:23:40.583Z","updated_at":"2025-07-31T07:32:59.867Z","avatar_url":"https://github.com/threefish.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# **basis  MVC**\n- 基于servlet与java注解的Web MVC 快速开发框架\n- _**basis** 意思： n. 基础；底部；主要成分；基本原则或原理_\n\n## 代码可能不够好，重复造轮子是为了更加充分的了解框架底层实现原理，写这个这是一种尝试，一种突破自我的方式。欢迎提出建议！谢谢！\n\n## 基于Java注解和servlet实现通过注解方式访问的web MVC框架\n\n# 示例项目[basisEdp](https://github.com/threefish/basisEdp \"示例项目\")\n\n###  规范了包名，所以重新创建了项目进行提交分享[点击这里可以查看更早前的更新日志](https://github.com/threefish/WebFrameWork \"更早前的更新日志\")\n\n#### TODO 真实项目的开发  [basisEdp](https://github.com/threefish/basisEdp \"真实项目\")\n\n### 现已实现以下功能\n#### IOC、AOP、ORM、MVC\n#### 集成quartz,beetl\n#### 参数类\n\n    - 实现缓存扫描注解action\n    - 实现参数自动绑定\n    - 参数与javabean自动绑定\n    - 文件上传自动绑定\n\n#### 文件类\n    - 实现文件过滤器\n    - 上传文件格式控制\n    - 上传文件大小限制\n\n#### 基础视图控制器\n    - jsp页面返回\n    - json对象返回\n    - 404、500页面\n    - 文件下载\n\n#### 用户自定义视图模版引擎控制器\n     - 顾名思义，就是可以由开发者自定义的视图模版引擎 （如freemaker，beetl，vm等等）\n\n#### dao功能  简易的orm实现\n    - table-List\u003c对象\u003e\n    - table-对象\n    - table-Map\n    - table-List\u003cMap\u003e\n    - 对象的增删改查\n    - dao事务控制\n\n- @Setup 启动执行任务\n- 绑定durid连接池\n\n\n\n### 规范\n    - WEB-INF下的jsp必须通过action访问\n    - 静态资源文件目录需要配置\n    - 配置文件相关可以查看jar包中的 resources 目录以作规范\n    \n###webxml设置\n```xml\n  \u003c!--basis框架过滤器--\u003e\n    \u003clistener\u003e\n        \u003clistener-class\u003ecom.sgaop.basis.web.ServletInitListener\u003c/listener-class\u003e\n    \u003c/listener\u003e\n    \u003cfilter\u003e\n        \u003cfilter-name\u003ebasisFilter\u003c/filter-name\u003e\n        \u003cfilter-class\u003ecom.sgaop.basis.web.BasisMvcWebFilter\u003c/filter-class\u003e\n    \u003c/filter\u003e\n    \u003cfilter-mapping\u003e\n        \u003cfilter-name\u003ebasisFilter\u003c/filter-name\u003e\n        \u003curl-pattern\u003e/*\u003c/url-pattern\u003e\n        \u003cdispatcher\u003eREQUEST\u003c/dispatcher\u003e\n        \u003c!--内部转发需要设置 FORWARD--\u003e\n        \u003cdispatcher\u003eFORWARD\u003c/dispatcher\u003e\n        \u003cdispatcher\u003eINCLUDE\u003c/dispatcher\u003e\n    \u003c/filter-mapping\u003e\n```\n### 注册数据源和自定义视图就这么简单\n```java\n public void init(ServletContextEvent servletContextEvent) {\n        ViewsRegister.registerView(\"freemarker\", FreeMarkerView.class);\n        ViewsRegister.registerView(\"beetl\", BeetlView.class);\n        //注册数据源1\n        DaosRegister.registerDao(\"daoA\", DaoImpl.class, getDsA());\n        //注册数据源2\n        DaosRegister.registerDao(\"daoB\", DaoImpl.class, getDsB());\n    }\n```\n\n\n### 示例CODE\n```java\npackage com.sample.action;\n\nimport com.sample.entity.Topic;\nimport com.sgaop.basis.annotation.*;\nimport com.sgaop.basis.dao.Dao;\nimport com.sgaop.basis.mvc.AjaxResult;\nimport com.sgaop.basis.trans.TransAop;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.sql.SQLException;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n\n/**\n * Created by IntelliJ IDEA.\n * User: 306955302@qq.com\n * Date: 2016/5/8 0008\n * To change this template use File | Settings | File Templates.\n *\n * @OK(\"rd:testpage.jsp\")//重定向\n * @OK(\"json\")//返回JSON对象\n * @OK(\"fw:testpage.jsp\")//转发\n * @GET//请求方式\n * @Path//默认使用方法名\n * @Control 标识这是一个可访问的webAction\n */\n@IocBean(\"MainAction\")\n@Action(\"/main\")\npublic class MainAction {\n\n    //注入数据源A\n    @Inject(\"daoA\")\n    private Dao daoA;\n\n    //注入数据源B\n    @Inject(\"daoB\")\n    private Dao daoB;\n    \n    //注入配置文件\n    @Inject(\"java:db.jdbcUrl\")\n    private String jdbcUrl;\n\n    @Inject(\"java:db.password\")\n    private int password;\n\n    @Inject(\"java:db.testOnBorrow\")\n    private boolean testOnBorrow;\n\n//    @OK(\"beetl:index\")\n    @GET\n    @Path(\"/index\")\n    @Aop({TransAop.READ_COMMITTED,\"allAop\"})\n    public String index(HttpServletRequest request) throws SQLException {\n        System.out.printf(\"当前访问indx方法{dbPass:%s,password：%d} \\r\\n\", jdbcUrl, password);\n        try {\n            Topic tp = new Topic();\n            tp.setContent(\"我了个艹A\");\n            daoA.insert(Topic.class, tp);\n\n            Topic tp2 = new Topic();\n            tp2.setId(5);\n            tp2.setContent(\"我了个艹a+\");\n\n            daoA.delect(Topic.class,tp2);\n\n            daoA.insert(Topic.class, tp2);\n        } catch (Exception e) {\n            throw e;\n        }\n        return \"beetl:index\";\n    }\n\n    @OK(\"beetl:index2\")\n    @GET\n    @Path(\"/index2\")\n    public void index2(HttpServletRequest request) {\n        System.out.println(\"index2\");\n    }\n\n    @OK(\"jsp:testpage.jsp\")\n    @GET\n    @Path(\"/testindex\")\n    public AjaxResult index(\n            @Parameter(\"id\") int id,\n            @Parameter(\"name\") String name,\n            @Parameter(\"age\") int age,\n            @Parameter(\"doubleNum\") double doubleNum,\n            @Parameter(\"flag\") boolean flag,\n            @Parameter(\"ids\") String[] ids,\n            HttpServletRequest request) {\n        System.out.println(\"----\" + id + \"----\" + name + \"----\" + age);\n        System.out.println(\"mian index\");\n        request.setAttribute(\"test\", \"测试request.setAttribute\");\n        return new AjaxResult(true, \"呵呵呵\", \"json哦\");\n    }\n\n\n    @OK(\"rd:testpage.jsp\")\n    @GET\n    @Path(\"/testpage\")\n    public void testpage() {\n        System.out.println(\"---testpage\");\n    }\n\n\n    @OK(\"freemarker:TestFreeMarker\")\n    @GET\n    @Path(\"/freemarker\")\n    public Map freemarkerTest() {\n        System.out.println(\"---freemarkerTest\");\n        Map data1 = new HashMap();\n        data1.put(\"name\", \"张三\");\n        data1.put(\"age\", 11);\n        return data1;\n    }\n\n    @OK(\"beetl:TestBeetl\")\n    @GET\n    @Path(\"/beetl\")\n    public Map beetlTest() {\n        System.out.println(\"---beetlTest\");\n        Map data1 = new HashMap();\n        data1.put(\"name\", \"张三\");\n        data1.put(\"age\", 11);\n        List\u003cMap\u003e datalist=new ArrayList\u003cMap\u003e();\n        for(int i=1;i\u003c=9;i++){\n            Map temp = new HashMap();\n            temp.put(\"name\", \"张\"+i);\n            temp.put(\"age\", (Math.random() * 100));\n            datalist.add(temp);\n        }\n        data1.put(\"data\", datalist);\n        return data1;\n    }\n\n    @OK(\"beetl:TestBeetl2\")\n    @GET\n    @Path(\"/beetl2\")\n    public User beetl2() {\n        System.out.println(\"---beetlTest2\");\n        User user = new User();\n        user.setAge(18);\n        user.setName(\"李四\");\n        return user;\n    }\n\n    @OK(\"beetl:TestBeetl2\")\n    @GET\n    @Path(\"/beetl3\")\n    public Map beetl3() {\n        System.out.println(\"---beetlTest3\");\n        Map data1 = new HashMap();\n        data1.put(\"name\", \"张三\");\n        data1.put(\"age\", 11);\n        return data1;\n    }\n\n\n    @OK(\"json\")\n    @POST\n    @Path(\"/buildBeanFile\")\n    public AjaxResult buildBeanFile(@Parameter(\"data\u003e\u003e\") User bean, @Parameter(\"docName\") TempFile docName) {\n        System.out.println(new Gson().toJson(bean));\n        try {\n            if (docName != null) {\n                System.out.println(docName.getName());\n                IoTool.writeFile(docName.getInputStream(), \"d:\\\\temp\\\\\" + docName.getName());\n            }\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n        return new AjaxResult(true, \"呵呵呵\", bean);\n    }\n\n    @OK(\"json\")\n    @POST\n    @Path(\"/buildBeanFiles\")\n    public AjaxResult buildBeanFiles(@Parameter(\"data\u003e\u003e\") User bean, @Parameter(\"docName\") TempFile[] docName) {\n        System.out.println(new Gson().toJson(bean));\n        for (TempFile file : docName) {\n            System.out.println(file.getName());\n            System.out.println(file.getContentType());\n        }\n        return new AjaxResult(true, \"批量文件上传\", bean);\n    }\n\n\n    @OK(\"json\")\n    @POST\n    @Path(\"/buildBean\")\n    public AjaxResult buildBean(@Parameter(\"data\u003e\u003e\") User bean) throws SQLException {\n        System.out.println(new Gson().toJson(bean));\n        Connection connection = DBConnPool.getDataSource().getConnection();\n        System.out.println(connection);\n        return new AjaxResult(true, \"呵呵呵\", bean);\n    }\n\n\n    @OK(\"file\")\n    @GET\n    @Path(\"/dowload\")\n    public File dowloadFile() {\n        return new File(\"D:\\\\TEMP\\\\模版说明.docx\");\n    }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthreefish%2Fbasismvc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthreefish%2Fbasismvc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthreefish%2Fbasismvc/lists"}