1 Star 0 Fork 4

心灵 / jleaf

forked from 风里的叶子 / jleaf 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
Apache-2.0

jleaf

极速,简单,解耦的MVC框架,集成MongoDB和JPA,支持restfull

第一个例子:

	//定义Controller,访问地址为: user/index
	@Control
	public class UserController {
	
		public Result index(HttpAction action){
			return new JspResult("index.jsp");
		}
		
		public Result get(HttpAction action){
			User user = userService.get(action.getParam("id"));
			return new JsonResult(user);
		}
		
	}
	
	//定义全局Interceptor
	@GlobalInterceptor(1) //里面的数字表示拦截顺序
	public class BaseInitInterceptor implements Interceptor {

		//action执行前
	    public boolean begin(ActionInvocation ai) {
	        HttpServletRequest request = ActionContext.getRequest();
	        return true;
	    }
	
		//action执行完成后
	    @Override
	    public void end(ActionInvocation ai) {
	        Result result = ai.getResult();//可以拿到结果
	    }
	
	}

注解:

	@Control(value,method,isSingleton) //指定该普通java类为Controller,method访问方式,isSingleton是否单例
	@Method(HttpMethod.POST) //指定该Controller下面的所有方法得post方式才能访问
	@ClearInterceptor({BaseInitInterceptor.class})   //清除指定的全局Interceptor,如果不指定清除哪个,则默认是清除全部
	@Interceptors({MsgInterceptor.class})	//指定该Controller的私有拦截器
	public class UserController {
	
		@Method(HttpMethod.GET) //指定该方法得get方式才能访问,优先级比Controller上的高
		@ClearInterceptor({MsgInterceptor.class}) //同上
		@Interceptors({MyInterceptor.class})//同上
		public Result index(HttpAction actionReq){
			return JspResult("index.jsp");
		}
		
	}
	
	//定义全局Interceptor
	@GlobalInterceptor(value,clear) //标注为全局Interceptor,value表示拦截顺序,越小越优先,clear表示能否被@ClearInterceptors清除
	public class BaseInitInterceptor implements Interceptor {//继承Interceptor

		//action执行前
	    public boolean begin(ActionInvocation ai) {//ai里包装了很多信息
	        HttpServletRequest request = ActionContext.getRequest();
	        return true;//返回是否继续执行下去,如果false,将会从当前Interceptor开始往前执行end方法
	    }
	
		//action执行完成后
	    @Override
	    public void end(ActionInvocation ai) {
	        Result result = ai.getResult();//可以拿到结果
	    }
	
	}

Controller

采用注解@Control方式标示Controller,Controller是一个普通的java类,无需继承什么,启动服务器时能自动扫描到

@Control有两个参数,都不写时默认按类名首字母小写,同时去掉后面的"Controller"或"Action","Control"为Controller的uri,同时

可以指定任何请求方式访问

两个参数分别是@Control(value, method)

value代表Controller的uri, method代表请求的方式,未枚举类:HttpMethod,可以是GET,POST,PUT,DELETE,HEAD,OPTIONS,NONE;

当method为NONE时,表示什么方式都能访问,默认是采用这样

同时也可指定Controller里的某方法的访问方式, 采用 @Method(HttpMethod.GET) 标签

入参 HttpAction

> HttpAction.getParams();//获得Http请求前端传递过来的参数
    
> HttpAction.getSession();//获得session(对此map的操作会同步到对应的session中去)
    
> HttpAction.toObj(?);//方便将请求参数装为对象
	 
> HttpAction.getAnalyzeResult();//拿到Action的解析结果,可得到请求的uri以及HttpMethod和访问后缀

举个使用访问后缀的实例:

在请求的地址上加上后缀 .json,让后台访问json数据, .xml则返回xml数据,其他则跳网页

请求: http://localhost:9090/user/data.json

后台Java代码:

	public Result data(HttpAction actionReq){
		
		Stri ng postfix = actionReq.getAnalyzeResult().getPostfix();
		
		if(".json".equals(postfix)){
			return JsonResult(new User());
		}if(".xml".equals(postfix)){
			return XmlResult(new User());
		}else{
			return JspResult("index.jsp");
		}
	}

对于Controller里方法的返回类型为Result接口类型:

JspResult 返回jsp页面,

ForwardResult 后台forward,可以跳转到jsp或者Controller

IOResult 返回文件或者IO流,

ImageResult 基于IOResult,response的返回类型声明为图片,

JsonResult 返回json数据,

NullResult 什么都不操作,

RediretResult 前端跳转,

StringResult 返回字符窜

上面的****Result皆继承Result类,实现其方法:

public abstract void render(HttpServletRequest req,HttpServletResponse resp) throws Exception,

便能可很方便的扩展其他返回类型,例如VelocityResult,FreemarkerResult,ExcelResult之类的东西

Intercepter 拦截器

拦截器分为全局,类级别,方法级别三种,同时皆需实现Interceptor接口

	@GlobalInterceptor//标上该注解后,将被扫描到,同时作为全局拦截器,拦截所有的用户请求
    public class BaseInitInterceptor implements Interceptor {
		//action执行前
	    public boolean begin(ActionInvocation ai) {//ai里包装了很多信息
	        HttpServletRequest request = ActionContext.getRequest();
	        return true;
	    }
	
		//action执行完成后
	    @Override
	    public void end(ActionInvocation ai) {
	        Result result = ai.getResult();//可以拿到结果
	        
	        //对异常的拦截
	        if(ai.isException()){
    			Throwable t = ai.getThrowable();
	    		Map<String, Object> map = new HashMap<String, Object>();
	    		map.put("msg", t.toString());
	    		ai.setResult(new JsonResult(map));//则将输出的结果由普通字符串转为json格式
	    	}
	    }
	}
	

	//类级别级别的Interceptor:
	@Control
	@Interceptors(ClassInterceptor.class)//添加类级别的拦截器,该Controller下所有方法执行前都会触发类级别的拦截器
	public class UserController {
		
		@Interceptors(MethodInterceptor.class)//添加方法级别的拦截器,同类级别的过滤器是同样道理
		public Result index(HttpAction action) {
			return new JspResult("/index.jsp");
		}
	}

如果想不使用上一层的拦截器,可采用@ClearInterceptor,负责清空上一层次的Intercepter,比如:

	@Control
	@ClearInterceptor
	@Interceptors(ClassInterceptor.class)
	public class UserController {
    
	}

但如果GlobalInterceptor的clear为NOTCLEAR的则不会清除

Junit测试,无需依赖第三方jar包:

	//只需继承JleafJunit
	public class UserControllerTest extends JleafJunit {
	
	    @BeforeClass
	    public static void beforeClass() {
	        JleafJunit.setPath("F:/Java/project/jleaf/jleaf/src/demo/webapp");//设置的web目录
	        
	        //设置启动配置(可不设置,但有时想关闭扫描功能或者改变扫描的包路径,可以通过这个设置)
	        Map<String, String> config = new HashMap<String, String>();
	        config.put("package", "org.demo.*");
	        setBootConfig(config);
	    }
	
	    @Test
	    public void testJson() throws Exception {
	        Result result = this.action("user/json", HttpMethod.GET);
	        Assert.assertNotNull(result);
	    }
	
	    @Test
	    public void testIndex() throws Exception {
	        Result result = this.action("user/index", HttpMethod.GET);
	        Assert.assertNotNull(result);
	    }
	
	}

对restfull的支持

在src目录下建立jleaf.properties,在里面添加: jleaf.defaultActionAnalyzeClass=org.jleaf.web.action.analyze.RestfulHttpActionAnalyze 这样就把解析用户请求的解析实现类改Restful方式的,然后在Controller中的方法命名:

	public UserController{
		
		//http://localhost/user	(get)
		public Result index(HttpAction action) {
			return new StringResult("=>index");
		}
		
		//http://localhost/user/1/edit	(get)
		public Result edit(HttpAction action){
			return new StringResult("=>edit");
		}
		
		//http://localhost/user/new	(get)
		public Result create(HttpAction action){
			return new StringResult("=>create");
		}
	
		//http://localhost/user/1	(get)
	    public Result get(HttpAction action){
	        return new StringResult("=>get:" + action.getParam("id"));
	    }
	
		//http://localhost/user/1	(put)
	    public Result save(HttpAction action){
	        return new StringResult("=>save");
	    }
	
		//http://localhost/user  (post)
	    public Result update(HttpAction action){
	        return new StringResult("=>update");
	    }
	
		//http://localhost/user/1 (delete)
	    public Result delete(HttpAction action){
	        return new StringResult("=>delete");
	    }
	}

自动CRUD的实现

参考demo里的MsgController实现

	//继承CrudController自动实现增删改查
	@Control
	public class MsgController extends CrudController<Msg, MsgServiceImpl, MsgQuery> {
	
	}
	//如果是restfull方式的,则可以将CrudController换为RestfullCrudController
	

数据源的切换(JPA和MongoDB):

一样在jleaf.properties里加上: jleaf.defaultDaoImpl=org.jleaf.db.dao.impl.MongoDBDaoImpl 或者是 jleaf.defaultDaoImpl=org.jleaf.db.dao.impl.JPADaoImpl

结语

很多功能都在开发中,比如DB这块也只是粗略实现,spring等插件的集成,页面显示层打算采用的的Extjs和Touch还没扩展成自已的一套框架,这些都会在日后慢慢加上去

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: You must give any other recipients of the Work or Derivative Works a copy of this License; and You must cause any modified files to carry prominent notices stating that You changed the files; and You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2014 风里的叶子 Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

简介

极速,简单,解耦的MVC框架,集成MongoDB和JPA,支持restfull,前端采用Extjs和Touch,一键代码和页面生成 展开 收起
Apache-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/inzyblog/jleaf.git
git@gitee.com:inzyblog/jleaf.git
inzyblog
jleaf
jleaf
master

搜索帮助