论坛首页 Java企业应用论坛

造了个轮子^_^,firefly应用程序框架,性能大幅超越spring3MVC和Struts2,含测试报告

浏览 18288 次
精华帖 (1) :: 良好帖 (7) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-01-05  
Norther 写道
hypercube1024 写道
Norther 写道
请问童鞋你里面有什么特殊的算法,神奇的Magic处理让你的这个库变的飞快,让大家开开眼。


到没有什么神奇的魔法了,就是类的层次结构比较简单,然后缓存了一些反射之后的对象


那就是因为功能简单,模块少,所以速度快了,如果spring功能也这么简单,未必不如你的快呢?对吧。


^_^ 那就不知道了,看看Spring的类的层次结构就够喝一壶的了,我这个最多两到三层,其实Spring的话80%的情况也就用到20%的功能,我觉得把这20%的功能做好就行了。
0 请登录后投票
   发表时间:2011-01-05  
软件都是从简单到复杂发展起来的,那么多的层次结构,也是为了可扩展性考虑
0 请登录后投票
   发表时间:2011-01-05   最后修改:2011-01-05
oznyang 写道
软件都是从简单到复杂发展起来的,那么多的层次结构,也是为了可扩展性考虑

  是的,主要还是要有个度,太复杂了就 过犹不及 了,一个jar包好几MB,大部分功能都用不上

0 请登录后投票
   发表时间:2011-01-05  
一个jar包好几MB 这个还是好的 你没见 十几MB的么
0 请登录后投票
   发表时间:2011-01-05   最后修改:2011-01-05
呵呵,lz有洁癖,不过别看人家个头大,那是经过积累沉淀和考验的,再说现在动辄上t的硬盘,无所谓啦,也不会影响启动速度,加上用maven来管理jar的话,还算能接受,离题了,不过还是赞lz,写出来也算是对自己的提高,所谓开源不是为了让多少人用,关键是有这种精神
0 请登录后投票
   发表时间:2011-01-05   最后修改:2011-01-05
和我的JdonMVC有点相似,楼主加油,共同进步。

我的返回视图不是用注解,而是显式编程,实现一个渲染接口
这样就new Html,new Text,new Json,new JavaScript,new Atom,new Xml.
我的开发坐标是RESTful + DCI + DDD + CQRS

JdonMVC默认是用Jdon作为领域管理层,所以没有IOC。

代码示例:
@Path("/user/{userId}")
@GET
public Represent user(Long userId) {
       User user = userQueryService.getUser(userId);
       return new Html("/editUser.ctl", "user", user);
}


文件上传
@POST
@Path("/singleupload")
public Represent upload(FormFile file) {
      return new Text("你上传了单个文件,文件名是:"+file.getFileName());
}
        
@POST
@Path("/mutiupload")
public Represent upload(List<FormFile> files) {
         return new Text("你上传了多个文件,文件数量是:"+files.size());
}
0 请登录后投票
   发表时间:2011-01-05  
oojdon 写道
和我的JdonMVC有点相似,楼主加油,共同进步。

我的返回视图不是用注解,而是显式编程,实现一个渲染接口
这样就new Html,new Text,new Json,new JavaScript,new Atom,new Xml.
我的开发坐标是RESTful + DCI + DDD + CQRS

JdonMVC默认是用Jdon作为领域管理层,所以没有IOC。

代码示例:
@Path("/user/{userId}")
@GET
public Represent user(Long userId) {
       User user = userQueryService.getUser(userId);
       return new Html("/editUser.ctl", "user", user);
}


文件上传
@POST
@Path("/singleupload")
public Represent upload(FormFile file) {
      return new Text("你上传了单个文件,文件名是:"+file.getFileName());
}
        
@POST
@Path("/mutiupload")
public Represent upload(List<FormFile> files) {
         return new Text("你上传了多个文件,文件数量是:"+files.size());
}



靠 你咋和我的思路一样呢?? 你看看我这写的
package info.moogens.mvc.web;

import info.moogens.mvc.web.exception.ViewNotFound;
import info.moogens.mvc.web.exception.ViewRenderFailed;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public abstract class View {

	public static final String contentType_JSON = "application/json";
//	public static final String contentType_XML = "text/xml";
	public static final String contentType_XML = "application/xml";
	public static final String contentType_HTML = "text/html";

	protected String contentType;

	public String getContentType() {
		return contentType;
	}

	protected void sendResponseContentType(HttpServletRequest request,
			HttpServletResponse response) {
				
		if (info.moogens.mvc.tools.Toolkit.notEmpty(contentType)) {
			response.setContentType(contentType + ";charset="
					+ request.getAttribute("currentCharset"));
			
//			response.setCharacterEncoding((String)request.getAttribute("currentCharset"));
		}
	}

	/**
	 * 渲染视图,此方法由HttpRequestMaster调用,开发者不应手动调用
	 * 
	 * 成功渲染必须返回null,否则继续返回视图对象
	 * 
	 * @param master
	 * @return View
	 * @throws ViewNotFound
	 * @throws ViewRenderFailed
	 */
	public abstract View make(WebResourceMaster master)
			throws ViewNotFound, ViewRenderFailed;

}
package info.moogens.mvc.web.view;

import info.moogens.mvc.tools.Toolkit;
import info.moogens.mvc.web.View;
import info.moogens.mvc.web.exception.ViewRenderFailed;

public final class JsonView extends RawView {
		
	public JsonView(Object data) {
		this.data = data ;
		this.contentType = View.contentType_JSON ;
	}
	
	/**
	 * 在此方法中调用 JSON解析器 来解析 this.data
	 */
	protected void renderData() throws ViewRenderFailed {
		// TODO 调用代码
		this.data = Toolkit.toJson(this.data);
	}
	
}
package info.moogens.mvc.web.view;

import info.moogens.mvc.web.View;

public abstract class TemplateView extends View{
	
	protected String template = null ;
	
	public String getTemplate() {
		return template;
	}
}
package info.moogens.mvc.web.view;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;

import info.moogens.mvc.web.View;
import info.moogens.mvc.web.WebResourceMaster;
import info.moogens.mvc.web.exception.ViewNotFound;
import info.moogens.mvc.web.exception.ViewRenderFailed;

public class JspHtmlView extends TemplateView {
	
	protected JspHtmlView(){
		this.contentType = View.contentType_HTML ;
	}
	
	/**
	 * template 文件名称 如果以 / 开始 则直接取 /下的JSP文件,否则调用 master.getViewBaseDir() 下的模版文件
	 * 
	 * @param template
	 */
	public JspHtmlView(String template) {
		this.contentType = View.contentType_HTML ;
		this.template = info.moogens.mvc.tools.Toolkit.notEmpty(template) ? template.trim() : null ;
	}

	@Override
	public View make(WebResourceMaster master) throws ViewNotFound, ViewRenderFailed {
				
		if (template != null){
			
			// 响应信息未发出时才能渲染 JSP视图
			if (master.getResponse().isCommitted()){ 
				return new RawView("response had committed before render view: " + template);
			}
			
			String templatePath = template.startsWith("/") ? template :	master.getRequestMaster().getViewBaseDir() + template ;			
			RequestDispatcher rd = master.getContext().getRequestDispatcher(templatePath);
			
			if (rd == null) throw new ViewNotFound(template);
			
			try {
				rd.forward(master.getRequest(), master.getResponse());	
			} catch (ServletException e) {
				throw new ViewRenderFailed(template,e.getMessage());
			} catch (IOException e) {
				throw new ViewNotFound(template);
			} finally {
				templatePath = null ;
				rd = null ;
			}
		}
		return null;
	}
	
}
package info.moogens.mvc.web.view;

import java.io.IOException;

import javax.servlet.http.HttpServletResponse;

import info.moogens.mvc.web.View;
import info.moogens.mvc.web.WebResourceMaster;
import info.moogens.mvc.web.exception.ViewNotFound;
import info.moogens.mvc.web.exception.ViewRenderFailed;

public final class RedirectView extends View {
	
	private String url ;
	private int delay ;
	
	/**
	 * 使用HTML重定向,站外地址必须使用 [http://域名/资源id] 的形式,支持自定义重定向时间
	 * @param url
	 * @param timeout
	 */
	public RedirectView(String url,int delay){
		this.url = info.moogens.mvc.tools.Toolkit.notEmpty(url) ? url.trim() : null ;
		this.delay = delay < 0 ? 0 : delay ;
	}
	
	/**
	 * 使用内部重定向
	 * @param url
	 */
	public RedirectView(String url){
		this.url = info.moogens.mvc.tools.Toolkit.notEmpty(url) ? url.trim() : null ;
		this.delay = -1 ;
	}
	
	private static String getTemplate(String url,int delay){
		return String.format("<html><head><meta http-equiv=\"refresh\" content=\"%d;URL=%s\" /></head></html>", delay,url);
//		return "<html><head><meta http-equiv=\"refresh\" content=\"" + delay + ";URL=" + url + "\" /></head></html>";
	}
	
	@Override
	public View make(WebResourceMaster master) throws ViewNotFound, ViewRenderFailed {
		
		if (this.url != null){
			HttpServletResponse response = master.getResponse();
			if (this.delay < 0 && !response.isCommitted()){				
				try {
					response.sendRedirect(this.url);
					return null ;
				} catch (IOException e) {					
					this.delay = 0 ;// 使用HTML重定向
				}				
			}else
				this.delay = 0 ;// 使用HTML重定向
			
			return new RawView(RedirectView.getTemplate(url, this.delay));
		}		
		return null;
	}

}

0 请登录后投票
   发表时间:2011-01-05  
oojdon 写道
你咋和我的思路一样呢?? 你看看我这写的

呵呵,都想到一块去了,web框架我现在更倾向于事件模型,然后到达后台的DCI场景,再到领域模型。
0 请登录后投票
   发表时间:2011-01-05   最后修改:2011-01-05
据我观察,你的controller是单实例模式,存在与struts1一样的线程不安全,不能脱离容器测试等问题。
缺少根据表单属性生成对象这个常用功能。

0 请登录后投票
   发表时间:2011-01-05  
yangguo 写道
据我观察,你的controller是单实例模式,存在与struts1一样的线程不安全,不能脱离容器测试等问题。
缺少根据表单属性生成对象这个常用功能。


这个功能现在的版本是有的,只不过例子里面贴不下了。。。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics