精华帖 (1) :: 良好帖 (7) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-05
Norther 写道 hypercube1024 写道 Norther 写道 请问童鞋你里面有什么特殊的算法,神奇的Magic处理让你的这个库变的飞快,让大家开开眼。
到没有什么神奇的魔法了,就是类的层次结构比较简单,然后缓存了一些反射之后的对象 那就是因为功能简单,模块少,所以速度快了,如果spring功能也这么简单,未必不如你的快呢?对吧。 ^_^ 那就不知道了,看看Spring的类的层次结构就够喝一壶的了,我这个最多两到三层,其实Spring的话80%的情况也就用到20%的功能,我觉得把这20%的功能做好就行了。 |
|
返回顶楼 | |
发表时间:2011-01-05
软件都是从简单到复杂发展起来的,那么多的层次结构,也是为了可扩展性考虑
|
|
返回顶楼 | |
发表时间:2011-01-05
最后修改:2011-01-05
oznyang 写道 软件都是从简单到复杂发展起来的,那么多的层次结构,也是为了可扩展性考虑
是的,主要还是要有个度,太复杂了就 过犹不及 了,一个jar包好几MB,大部分功能都用不上 |
|
返回顶楼 | |
发表时间:2011-01-05
一个jar包好几MB 这个还是好的 你没见 十几MB的么
|
|
返回顶楼 | |
发表时间:2011-01-05
最后修改:2011-01-05
呵呵,lz有洁癖,不过别看人家个头大,那是经过积累沉淀和考验的,再说现在动辄上t的硬盘,无所谓啦,也不会影响启动速度,加上用maven来管理jar的话,还算能接受,离题了,不过还是赞lz,写出来也算是对自己的提高,所谓开源不是为了让多少人用,关键是有这种精神
|
|
返回顶楼 | |
发表时间: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()); } |
|
返回顶楼 | |
发表时间: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; } } |
|
返回顶楼 | |
发表时间:2011-01-05
oojdon 写道 你咋和我的思路一样呢?? 你看看我这写的
呵呵,都想到一块去了,web框架我现在更倾向于事件模型,然后到达后台的DCI场景,再到领域模型。 |
|
返回顶楼 | |
发表时间:2011-01-05
最后修改:2011-01-05
据我观察,你的controller是单实例模式,存在与struts1一样的线程不安全,不能脱离容器测试等问题。
缺少根据表单属性生成对象这个常用功能。 |
|
返回顶楼 | |
发表时间:2011-01-05
yangguo 写道 据我观察,你的controller是单实例模式,存在与struts1一样的线程不安全,不能脱离容器测试等问题。
缺少根据表单属性生成对象这个常用功能。 这个功能现在的版本是有的,只不过例子里面贴不下了。。。 |
|
返回顶楼 | |