论坛首页 Java企业应用论坛

Douyu0.6.1 源码分析 之 MVC篇

浏览 10807 次
该帖已经被评为精华帖
作者 正文
   发表时间:2011-08-04  
key232323 写道
强烈关注啊。到时候源码好好分析分析。

另外,zhh2009,能不能在douyu里加个动态语言的classloader啊,这样,就更酷了。

我一直用groovy做web,现在不想回到java里了。。。555



嗯,这个可以考虑下,我记得play框架用groovy实现自己的模板引擎也是用了类似的机制。

不过我暂时没想到除了模板引擎外,在java代码中使用groovy有什么好处。
0 请登录后投票
   发表时间:2011-08-04  

目录名中有空格,在URL或URI中会有问题。

引用

你好,我今天下载了你代码,也按你步骤来进行练习,但是启动Tomcat时报错。
java.net.URISyntaxException: Illegal character in path at index 15: file:/F:/Tomcat 6.0/lib/ 
at java.net.URI$Parser.fail(URI.java:2809) 
at java.net.URI$Parser.checkChars(URI.java:2982) 
at java.net.URI$Parser.parseHierarchical(URI.java:3066) 
at java.net.URI$Parser.parse(URI.java:3014) 
at java.net.URI.<init>(URI.java:578) 
at java.net.URL.toURI(URL.java:918) 
       。。。。 

我想问下douyu是否不支持servlet3.0以下版本,谢谢


douyu是支持servlet3.0以下版本的,tomcat6/7都可以,tomcat4/5我没测过。

你的问题是"file:/F:/Tomcat 6.0/lib/"这个uri错了,不能有空格,
"Tomcat 6.0"中有一个空格。

你可以写个程序试一下:
URL url = new URL("file:/F:/Tomcat 6.0/lib/");
url.toURI();
这行代码就会抛出你的异常了


douyu内部用了一行代码
new File(url.toURI()).getCanonicalPath();
这可能是导致问题的原因。

这应该说是jdk类库的一个缺陷,
//这行代码是允许有空格的 
URL url = new URL("file:/F:/Tomcat 6.0/lib/"); 
//但是把URL转成URI时又不行了 
url.toURI(); //出错 
URI uri = new URI("file:/F:/Tomcat 6.0/lib/"); //出错 

所以通常是不建议在目录中含有空格的。
0 请登录后投票
   发表时间:2011-08-04   最后修改:2011-08-04
ZHH2009 写道

目录名中有空格,在URL或URI中会有问题。

引用

你好,我今天下载了你代码,也按你步骤来进行练习,但是启动Tomcat时报错。
java.net.URISyntaxException: Illegal character in path at index 15: file:/F:/Tomcat 6.0/lib/ 
at java.net.URI$Parser.fail(URI.java:2809) 
at java.net.URI$Parser.checkChars(URI.java:2982) 
at java.net.URI$Parser.parseHierarchical(URI.java:3066) 
at java.net.URI$Parser.parse(URI.java:3014) 
at java.net.URI.<init>(URI.java:578) 
at java.net.URL.toURI(URL.java:918) 
       。。。。 

我想问下douyu是否不支持servlet3.0以下版本,谢谢


douyu是支持servlet3.0以下版本的,tomcat6/7都可以,tomcat4/5我没测过。

你的问题是"file:/F:/Tomcat 6.0/lib/"这个uri错了,不能有空格,
"Tomcat 6.0"中有一个空格。

你可以写个程序试一下:
URL url = new URL("file:/F:/Tomcat 6.0/lib/");
url.toURI();
这行代码就会抛出你的异常了


douyu内部用了一行代码
new File(url.toURI()).getCanonicalPath();
这可能是导致问题的原因。

这应该说是jdk类库的一个缺陷,
//这行代码是允许有空格的 
URL url = new URL("file:/F:/Tomcat 6.0/lib/"); 
//但是把URL转成URI时又不行了 
url.toURI(); //出错 
URI uri = new URI("file:/F:/Tomcat 6.0/lib/"); //出错 

所以通常是不建议在目录中含有空格的。


不但空格,连点都不应该出现在软件安装目录中。
我看到很多程序员安装软件,都是直接下一步,好一点的换个盘符,懒惰的就直接默认目录。然后安装目录中的类似“Apache Tomcat 7.0.11”这样的字符串,根本就不去改,这是非常“非IT技术人员”的做法,这样只能显示这个程序员,要么是异常懒惰,要么是做事不认真,不负责的混日子型。

我自己的软件安装目录,从来不会出现空格或者点这样的字符。





细节决定命运,我招聘程序员的时候,凡是写字类似火星文的,一律减10分;凡是在答卷中使用类似 p1、p2、abc、a1、b2这样的变量命名的,无论答卷答得多正确,哪怕是满分,也一律reject,直接退简历,并且建立黑名单记录该面试者的邮箱,永远不阅读,永远不接受其再次发来的简历。
  • 大小: 18.9 KB
  • 大小: 37.3 KB
  • 大小: 19.2 KB
0 请登录后投票
   发表时间:2011-08-04  
george_space 写道
ZHH2009 写道

目录名中有空格,在URL或URI中会有问题。

引用

你好,我今天下载了你代码,也按你步骤来进行练习,但是启动Tomcat时报错。
java.net.URISyntaxException: Illegal character in path at index 15: file:/F:/Tomcat 6.0/lib/ 
at java.net.URI$Parser.fail(URI.java:2809) 
at java.net.URI$Parser.checkChars(URI.java:2982) 
at java.net.URI$Parser.parseHierarchical(URI.java:3066) 
at java.net.URI$Parser.parse(URI.java:3014) 
at java.net.URI.<init>(URI.java:578) 
at java.net.URL.toURI(URL.java:918) 
       。。。。 

我想问下douyu是否不支持servlet3.0以下版本,谢谢


douyu是支持servlet3.0以下版本的,tomcat6/7都可以,tomcat4/5我没测过。

你的问题是"file:/F:/Tomcat 6.0/lib/"这个uri错了,不能有空格,
"Tomcat 6.0"中有一个空格。

你可以写个程序试一下:
URL url = new URL("file:/F:/Tomcat 6.0/lib/");
url.toURI();
这行代码就会抛出你的异常了


douyu内部用了一行代码
new File(url.toURI()).getCanonicalPath();
这可能是导致问题的原因。

这应该说是jdk类库的一个缺陷,
//这行代码是允许有空格的 
URL url = new URL("file:/F:/Tomcat 6.0/lib/"); 
//但是把URL转成URI时又不行了 
url.toURI(); //出错 
URI uri = new URI("file:/F:/Tomcat 6.0/lib/"); //出错 

所以通常是不建议在目录中含有空格的。


不但空格,连点都不应该出现在软件安装目录中。
我看到很多程序员安装软件,都是直接下一步,好一点的换个盘符,懒惰的就直接默认目录。然后安装目录中的类似“Apache Tomcat 7.0.11”这样的字符串,根本就不去改,这是非常“非IT技术人员”的做法,这样只能显示这个程序员,要么是异常懒惰,要么是做事不认真,不负责的混日子型。

我自己的软件安装目录,从来不会出现空格或者点这样的字符。





细节决定命运,我招聘程序员的时候,凡是写字类似火星文的,一律减10分;凡是在答卷中使用类似 p1、p2、abc、a1、b2这样的变量命名的,无论答卷答得多正确,哪怕是满分,也一律reject,直接退简历,并且建立黑名单记录该面试者的邮箱,永远不阅读,永远不接受其再次发来的简历。



这么说来编写TOMCAT什么的这类程序员最恶心,习惯最差了,设置一个程序的默认安装路径就不能不用空格么?
0 请登录后投票
   发表时间:2011-08-04   最后修改:2011-08-04
elam 写道
george_space 写道
ZHH2009 写道

目录名中有空格,在URL或URI中会有问题。

引用

你好,我今天下载了你代码,也按你步骤来进行练习,但是启动Tomcat时报错。
java.net.URISyntaxException: Illegal character in path at index 15: file:/F:/Tomcat 6.0/lib/ 
at java.net.URI$Parser.fail(URI.java:2809) 
at java.net.URI$Parser.checkChars(URI.java:2982) 
at java.net.URI$Parser.parseHierarchical(URI.java:3066) 
at java.net.URI$Parser.parse(URI.java:3014) 
at java.net.URI.<init>(URI.java:578) 
at java.net.URL.toURI(URL.java:918) 
       。。。。 

我想问下douyu是否不支持servlet3.0以下版本,谢谢


douyu是支持servlet3.0以下版本的,tomcat6/7都可以,tomcat4/5我没测过。

你的问题是"file:/F:/Tomcat 6.0/lib/"这个uri错了,不能有空格,
"Tomcat 6.0"中有一个空格。

你可以写个程序试一下:
URL url = new URL("file:/F:/Tomcat 6.0/lib/");
url.toURI();
这行代码就会抛出你的异常了


douyu内部用了一行代码
new File(url.toURI()).getCanonicalPath();
这可能是导致问题的原因。

这应该说是jdk类库的一个缺陷,
//这行代码是允许有空格的 
URL url = new URL("file:/F:/Tomcat 6.0/lib/"); 
//但是把URL转成URI时又不行了 
url.toURI(); //出错 
URI uri = new URI("file:/F:/Tomcat 6.0/lib/"); //出错 

所以通常是不建议在目录中含有空格的。


不但空格,连点都不应该出现在软件安装目录中。
我看到很多程序员安装软件,都是直接下一步,好一点的换个盘符,懒惰的就直接默认目录。然后安装目录中的类似“Apache Tomcat 7.0.11”这样的字符串,根本就不去改,这是非常“非IT技术人员”的做法,这样只能显示这个程序员,要么是异常懒惰,要么是做事不认真,不负责的混日子型。

我自己的软件安装目录,从来不会出现空格或者点这样的字符。





细节决定命运,我招聘程序员的时候,凡是写字类似火星文的,一律减10分;凡是在答卷中使用类似 p1、p2、abc、a1、b2这样的变量命名的,无论答卷答得多正确,哪怕是满分,也一律reject,直接退简历,并且建立黑名单记录该面试者的邮箱,永远不阅读,永远不接受其再次发来的简历。



这么说来编写TOMCAT什么的这类程序员最恶心,习惯最差了,设置一个程序的默认安装路径就不能不用空格么?

每双一次性筷子,在使用之前都要先掰开,按照你的逻辑,既然每个用户都要掰开一次性筷子才使用,为什么一次性筷子生产企业不直接包装时就把筷子做成分开的呢?

其实原因很简单:连在一起的一次性筷子方便包装。

Apache Tomcat 6.0.11这样的默认程序名也一样,之所以使用这样既带空格,又带点的名字,是为了看名知其意,方便阅读,但是这并不是告诉你就应该这样作为目录名不变,正如同你不应该保持一次性筷子连在一起来吃饭一样。

我自己做软件安装包,默认软件安装目录,是类似这样的:“GeorgeSipClient-Ubuntu-v1-6-8”,虽然名字看起来比较难看,但是能够迎合中国人极其懒惰的习惯,让使用者即使不手动改变安装目录名,也会把软件安装到一个对程序友好的目录中。
0 请登录后投票
   发表时间:2011-08-04   最后修改:2011-08-04
ZHH2009 写道
1.完全脱离servlet容器

我看 Douyu 现在的版本基本上已经实现了与 Servlet 的解耦。 你这里所说的完全脱离容器,应该是提供了除使用ControllerFilter 作为程序执行入口外的另外一种选择吧?
如果是这样的话也有利于对 Controller 的单元测试。

ZHH2009 写道
2.一个内置http server,综合了Tomcat/Jetty/Netty的优点

“综合了Tomcat/Jetty/Netty的优点” 非常值得学习,坐等源码。

引用
3.支持AJP协议

对于大多数 应用服务器来说都有 AJP 协议支持,如 Tomcat 使用 AJP Connector 至 web server处理静态内容等。那么你这里的 ajp 协议是你上面说的内置 http server 所支持吗? 

引用
4.全新的异步模型

这个改进不错,使实现 异步调用更加简单化。


ZHH2009 写道
昨天没来得急回复一些细节问题,现在补上

谢谢回复,大概都明白了。
引用
此时controller.sourceFile等于null,如果没有源文件,那就得不到Context类的,

之前在分析的时候看了一下 Douyu 编译后的 Controller class 文件的源码,好象并没有对其进行任何处理。
如果是这样的话那么如果我使用默认的 javac 直接对 Controller 进行编译然后复制在 classes 目录中,理论上来说应该是能够生成其对应的 Context 吧?  由于我目前还在看javac的源码,所以对于生成 Context 是否必须要依靠Controller源码并不清楚。
_____
刚又看了一下 com.sun.tools.javac.processing.ControllerProcessor 类的代码,其需要解析 Controller 代码的 Symbol 来获取其具体的action方法及参数名(编译Controller前所做),而非通过简单反射机制(编译Controller后才能做)所能做到的。
0 请登录后投票
   发表时间:2011-08-04  
denger 写道
ZHH2009 写道
1.完全脱离servlet容器

我看 Douyu 现在的版本基本上已经实现了与 Servlet 的耦合了。 你这里所说的完全脱离容器,应该是提供了除使用ControllerFilter 作为程序执行入口外的另外一种选择吧?
如果是这样的话也有得于对 Controller 的单元测试。

ZHH2009 写道
2.一个内置http server,综合了Tomcat/Jetty/Netty的优点

“综合了Tomcat/Jetty/Netty的优点” 非常值得学习,坐等源码。

引用
3.支持AJP协议

对于大多数 应用服务器来说都有 AJP 协议支持,如 Tomcat 使用 AJP Connector 至 web server处理静态内容等。那么你这里的 ajp 协议是你上面说的内置 http server 所支持吗? 

引用
4.全新的异步模型

这个改进不错,使实现 异步调用更加简单化。


1.完全脱离servlet容器

ZHH2009这里说的“完全脱离servlet容器”,应该是Douyu下个版本内置Web Server,不需要把Douyu项目放到Tomcat这类容器中了。
0 请登录后投票
   发表时间:2011-08-04  
ZHH2009 写道
key232323 写道
强烈关注啊。到时候源码好好分析分析。

另外,zhh2009,能不能在douyu里加个动态语言的classloader啊,这样,就更酷了。

我一直用groovy做web,现在不想回到java里了。。。555



嗯,这个可以考虑下,我记得play框架用groovy实现自己的模板引擎也是用了类似的机制。

不过我暂时没想到除了模板引擎外,在java代码中使用groovy有什么好处。


这个。。你这个观点,说实话有必要尝试下这些所谓的新的东东了——代码那个简洁啊,光语法糖作为程序员来说——起码我就被这样的“糖衣炮弹”俘虏了。。。

即便你熟悉ruby,我也推荐你不妨看看这位老兄的blog

http://blog.csdn.net/hivon/article/details/4256296
0 请登录后投票
   发表时间:2011-08-04  
douyu第一个版本不是内置了web Server的吗?
0 请登录后投票
   发表时间:2011-08-04  
george_space 写道

每双一次性筷子,在使用之前都要先掰开,按照你的逻辑,既然每个用户都要掰开一次性筷子才使用,为什么一次性筷子生产企业不直接包装时就把筷子做成分开的呢?

其实原因很简单:连在一起的一次性筷子方便包装。

Apache Tomcat 6.0.11这样的默认程序名也一样,之所以使用这样既带空格,又带点的名字,是为了看名知其意,方便阅读,但是这并不是告诉你就应该这样作为目录名不变,正如同你不应该保持一次性筷子连在一起来吃饭一样。

我自己做软件安装包,默认软件安装目录,是类似这样的:“GeorgeSipClient-Ubuntu-v1-6-8”,虽然名字看起来比较难看,但是能够迎合中国人极其懒惰的习惯,让使用者即使不手动改变安装目录名,也会把软件安装到一个对程序友好的目录中。


说的严重点
做产品,如果不能把产品做的像方便筷子一样直观,又不提供详尽的说明书,就是在玩使用者.
另外,这个世界上有不用掰就能用的方便筷子.
生产者忽略消费者的感受造成的失败不胜枚举.
我想指出的是一种从使用者角度考虑的态度.
0 请登录后投票
论坛首页 Java企业应用版

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