小菜毛毛技术分享

与大家共同成长

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

#

最近使用发现了个问题,在下面的介绍使用maven建立web工程的时候有个选项: -DarchetypeArtifactId=maven-archetype-webapp,假如你把这其中的大写A不小心成了小写,则在pom.xml中,生成的将是jar包,而不再是war包了。这两天看了看ant和maven,感觉受益不小,以前总以为自己会ant和maven呢,老认为不用很学习的ant和mvn也有这么大的学问阿,把我的心得写写: maven:   创建一个web-app工程:   mvn archetype:create -DgroupID=[类-包的名字] -DartifactID=[应用的名称] -DrarchetypeArtifactID=maven-archetype-webapp 请注意,上面的语句是不正确的,如果这样写了就会出下面的错误: BUILD ERROR  Error creating from archetype [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] Error creating from archetype Embedded error: Artifact ID must be specified when creating a new project from an archetype. [INFO] ------------------------------------------------------------------------ [INFO] For more information, run Maven with the -e switch [INFO] ------------------------------------------------------------------------ 这是新手很容易犯的错误!改正方法是把上面的“ID”改为“Id”,这样就可以正确的建立一个工程了!给定两个简单模型: Application: mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=app |-- pom.xml `-- src     |-- main     |   `-- java     |       `-- ce     |           `-- demo     |               `-- mvn     |                   `-- App.java     `-- test         `-- java             `-- ce                 `-- demo                     `-- mvn                         `-- AppTest.java web-app: mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=webapp-DarchetypeArtifactId=maven-archetype-webapp |-- pom.xml `-- src     `-- main         `-- webapp             |-- index.jsp             |-- WEB-INF                 `-- web.xml
使用如下命令可以建立一个Struts2 Starter应用程序
mvn archetype:create
-DgroupId=tutorial
    -DartifactId=tutorial
    -DarchetypeGroupId=org.apache.struts \
    -DarchetypeArtifactId=struts2-archetype-starter \
    -DarchetypeVersion=2.0.5-SNAPSHOT
-DremoteRepositories=http://people.apache.org/repo/m2-snapshot-repository
 
参数含义:
 
参数 含义
groupId 当前应用程序隶属的Group的ID,通常是公司所有应用程序的根目录,例如:com.jpleasure
artifactId  当前应用程序的ID
package 代码生成时使用的根包的名字,如果没有给出,默认使用archetypeGroupId
archetypeGroupId 原型(archetype)的Group ID,因为我们这里使用的是Struts2的原型,所以这里总是org.apache.struts
archetypeArtifactId  原型(archetype)ID
archetypeVersion  原型(archetype)版本
remoteRepositories  包含原型(archetype)的远程资源库的列表,如果部署在标准的maven资源库或者本地,这不需要标记本项

 
一些相关的Maven命令(注意要再项目目录中运行)
构建
mvn install
创建IntelliJ IDEA项目文件
mvn idea:idea
创建Eclipse项目文件
 mvn eclipse:eclipse
运行测试
mvn test
清除
mvn clean
打包
mvn package
获得需要的JAR文件
mvn initialize
使用Jetty运行
mvn jetty:run 在使用此命令之前,需要在xml配置文件中作如下改动:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  <modelVersion>4.0.0</span-->modelVersion>  
  <groupId>com.mycompany.webapp</span-->groupId>  
  <artifactId>myweb</span-->artifactId>  
  <packaging>war</span-->packaging>  
  <version>1.0-SNAPSHOT</span-->version>  
  <name>myweb Maven Webapp</span-->name>  
  <url>http://maven.apache.org</span-->url>  
  <dependencies>  
    <dependency>  
      <groupId>junit</span-->groupId>  
      <artifactId>junit</span-->artifactId>  
      <version>3.8.1<!--</span-->version>  
      <scope>test<!--</span-->scope>  
    </span-->dependency>  
  </span-->dependencies>  
  <build>  
    <finalName>myweb</span-->finalName> 
    <!-- 添加以下6行插件配置代码 -->

    <plugins>  
      <plugin>  
        <groupId>org.mortbay.jetty</groupId>  
        <artifactId>maven-jetty-plugin</artifactId>  
      </plugin>  
    </plugins> 
    <!-- 添加以上6行插件配置代码 -->
  </build>  
</project> 
请注意,在./src/main/目录下面见一个java文件夹,以存放bean,这需要手动来建立:
mkdir $webapp/src/main/java

Maven2较maven1有较大的变化,这里推荐使用maven2并不仅仅因为它是高的版本. 其中变化较大的是在它建立的项目中,只有一个pom.xm配置文件.这里是我的一个工程的配置文件拷贝 attachment/200710/pom.xml.... 你会发现其中的代码如下   <project>
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.last999</groupId>
        <artifactId>bbs</artifactId>
        <packaging>war</packaging>
        <version>1.3</version>
        <name>bbs</name>
        <url>last999.com</url>
        <description>mybbs</description>

        <dependencies>
        <!-- Junit -->
        <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.4</version>
           <scope>test</scope>
        </dependency>
.......................
 

项目都是在<project>中设定,加入要添加新的开源框架,你只需要到maven源的老家走一趟,查到你需要的版本:比如我们现在需要使用struts.那么我们只需要添加以下几行:
<dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.0.9</version>
 </dependency>
      如果再需要和spring集成,除了添加spring需要的包外,你只需要添加:
<dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.0.9</version>
        </dependency>
其他一切就 让maven给你自动完成吧!


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zql2002/archive/2008/06/12/2537770.aspx

posted @ 2009-10-27 11:35 小菜毛毛 阅读(1145) | 评论 (0)编辑 收藏

每隔一段时间,就会收到些类似的消息:
怎么学好软件开发? 我已经学完了A,我接下来该学B还是C?

其实这样的问题,真的是一言难复。如何学习,是一个很复杂的话题,尤其是眼下业内的技术名词日新月异,乱花迷人眼,使得新人更加看不清。所以才激发了我关于“技术族谱”的设想,本意就是想通过一个机制来理顺知识之间的关系,分享每个人的学习经验,新人借鉴老人的学习路径,从而减少走弯路的现象。

记得2007年的时候,一次团队内部开总结会,我在白板上随手画过一个开发相关知识的结构图,当时还有团队成员拿相机拍下来,现在想想,也许对某些人有一定的指导意义,于是今天整理了一下发出来,如下图所示:


一些相关的解释:

学校里的课程没用吗?
答:肯定有用。
计算机专业的经典理论课,意义非凡:计算机组成原理、计算机体系结构、操作系统、编译原理、数据结构。操作系统中的内存管理算法、进程调度算法、并发控制算法,都是非常经典的,你会在很多其它地方发现这些算法的应用或者变体。编译原理有助于我们理解编程语言是如何工作的,如何用范式来表达复杂的语法,编译原理中的状态机相关知识,也是开发者手中的强大武器。数据结构就更不用说了,List,Map,Tree,是编程中广泛使用的。

快餐式软件开发培训的问题何在?
一个典型的快餐式培训班,先教java语言,然后教SSH,然后给个千篇一律的虚拟项目做一下,最后号称培养出来一批“WEB开发”程序员。我觉得,如果之前没有任何基础,仅靠这样的培训,那么出来真的只能做非常程式化的工作。我一直提倡稳扎稳打,从下向上学起这样的方式,缺点是不如容易出效果。所以从两个方向入手,一边学基础,一边学应用,互相印证,也是不错的学习路径。

软件开发的门槛在提高吗?
我觉得是的,当然,我说的不包括hello world这样的示例程序的开发。虽然现在程序语言比十年前强大很多,工具要好用很多,但要想写出一个有点意义的软件,需要了解的知识多了很多,需要配置的环境复杂了很多。看看有多少初学者被java的ClassPath所困扰,您就明白我说的意思了。

开发不仅仅是学一门语言!
开发的本质是用程序控制计算机做一件事。基本上,任何有价值的程序都有内政和外交。内政就是程序的处理流程、数据加工算法、并发控制。外交就是网络通信、IO、数据库访问,以及通过各种协议和其它系统进行交互。很多知识,尤其是外交相关的知识,仅仅学习一门语言是不够的。

误区:很多人花大量精力关注最上层,比如:新的框架、新的工具、各种处理问题的技巧等等。但偏偏这一部分的变化最快,您在这上面投入的精力保值能力最差。技术有很强的相似性,比如,如果您真正掌握了javascript,那么掌握Ext或者JQuery只是熟悉对方的编程习惯和API而已,没必要为了这些新名词而疲于奔命。

一家之言,欢迎拍砖或者交流。

----

答问:

sun_blackh 发表于2009年9月30日 8:18:27
不好。不知道各种通信协议在什么地方。为什么要把tcp/ip单独拿出来?质量意识显得很突兀,和整体没有关系。虽然它很重要。什么是框架?它应该在哪里?我想LZ没有仔细推敲过。

答:
知识体系中,越是向上,则越是偏向应用层的东西。“各类协议”,只是一个泛指,协议太多了,在一个人的知识结构中,只学习跟自己工作和兴趣需要的即可,比如,如果你做网管,可以关心SNMP,JMX;如果你做WEB开发,可以关心SOAP,AJAX;如果你做SP,可以关注各类短信网关的协议等等。TCP/IP之所以要单拿出来,那绝对是有道理的,TCP/IP是一个协议栈,我觉得只要你想做网络方面的开发,那是必须要学习的,TCP/IP已经是一种不可替代的标准了。
“框架”和刚才对“各类协议”的解释是一样的,并不特指哪种框架,而是一个统称,是根据需要去学习的,比如:SSH,比如:JQUERY,比如:EXT,比如:Reason等等。
 质量意识你觉得突兀吗?我觉得它就应该贯穿软件开发的方方面面,它并不是一项具体的技术,但却要时时刻刻挂在心中。

chgaowei 发表于2009年10月2日 星期五 11:08:53  IP:举报
这个模型很不错。我想在补充几个: 1、领域知识。 2、软件工程。 3、算法,数据库,网络基础应该放在下面。 4、质量意识换成软件工程。
答:
您补充的挺好,领域知识,或者说业务知识,的确很重要。
关于“软件工程”,如果代替“质量意识”,这个我觉得值得商榷,因为我觉得软件工程并不能代表高质量软件的全部,你觉得呢。
算法,我个人的意见认为,并不能作为一个底层的东西,对于多数人来说,应该算是可选项,对于某些特殊软件开发,比如视频编解码、搜索引擎等等,可能算法是必须的基础,可能连数学都要算上。
而 网络 和 数据库,按我的原意,应该是程序语言、数据库、网络作为三个并列的知识领域,为了图的紧凑型,所以把数据库和网络竖起来了,但我觉得数据库和网络并不是构成软件开发的必要基础,可以选修。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jinxfei/archive/2009/09/27/4602449.aspx

posted @ 2009-10-07 21:22 小菜毛毛 阅读(635) | 评论 (0)编辑 收藏

前几天看到卢亮的 Larbin 一种高效的搜索引擎爬虫工具 一文提到 Nutch,很是感兴趣,但一直没有时间进行测试研究。趁着假期,先测试一下看看。用搜索引擎查找了一下,发现中文技术社区对 Larbin 的关注要远远大于 Nutch 。只有一年多前何东在他的竹笋炒肉中对 Nutch 进行了一下介绍

Nutch vs Lucene
Lucene 不是完整的应用程序,而是一个用于实现全文检索的软件库。
Nutch 是一个应用程序,可以以 Lucene 为基础实现搜索引擎应用。

Nutch vs GRUB
GRUB 是一个分布式搜索引擎(参考)。用户只能得到客户端工具(只有客户端是开源的),其目的在于利用用户的资源建立集中式的搜索引擎。
Nutch 是开源的,可以建立自己内部网的搜索引擎,也可以针对整个网络建立搜索引擎。自由(Free)而免费(Free)。

Nutch vs Larbin
"Larbin只是一个爬虫,也就是说larbin只抓取网页,至于如何parse的事情则由用户自己完成。另外,如何存储到数据库以及建立索引的事情 larbin也不提供。[引自这里
Nutch 则还可以存储到数据库并建立索引。
Nutch Architecture.png
[引自这里

Nutch 的早期版本不支持中文搜索,而最新的版本(2004-Aug-04 发布了 0.5)已经做了很大的改进。相对先前的 0.4 版本,有 20 多项的改进,结构上也更具备扩展性。0.5 版经过测试,对中文搜索支持的也很好。

下面是我的测试过程。

前提条件(这里Linux 为例,如果是 Windows 参见手册):

  • Java 1.4.x 。因为我的系统上安装的Oracle 10g 已经有 Java 了。设定环境变量:NUTCH_JAVA_HOME 。
    [root@fc3 ~]# export NUTCH_JAVA_HOME=/u01/app/oracle/product/10.1.0/db_1/jdk/jre
        
  • Tomcat 4.x 。从这里下载。
  • 足够的磁盘空间。我预留了 4G 的空间。

首先下载最新的稳定版:

[root@fc3 ~]# wget http://www.nutch.org/release/nutch-0.5.tar.gz

解压缩:

[root@fc3 ~]# tar -zxvf nutch-0.5.tar.gz
......
[root@fc3 ~]# mv nutch-0.5 nutch

测试一下 nutch 命令:

[root@fc3 nutch]# bin/nutch
Usage: nutch COMMAND
where COMMAND is one of:
crawl             one-step crawler for intranets
admin             database administration, including creation
inject            inject new urls into the database
generate          generate new segments to fetch
fetchlist         print the fetchlist of a segment
fetch             fetch a segment's pages
dump              dump a segment's pages
index             run the indexer on a segment's fetcher output
merge             merge several segment indexes
dedup             remove duplicates from a set of segment indexes
updatedb          update database from a segment's fetcher output
mergesegs         merge multiple segments into a single segment
readdb            examine arbitrary fields of the database
analyze           adjust database link-analysis scoring
server            run a search server
or
CLASSNAME         run the class named CLASSNAME
Most commands print help when invoked w/o parameters.
[root@fc3 nutch]#

Nutch 的爬虫有两种方式

  • 爬行企业内部网(Intranet crawling)。针对少数网站进行。用 crawl 命令。
  • 爬行整个互联网。 使用低层的 inject, generate, fetchupdatedb 命令。具有更强的可控制性。

以本站(http://www.dbanotes.net)为例,先进行一下针对企业内部网的测试。

在 nutch 目录中创建一个包含该网站顶级网址的文件 urls ,包含如下内容:
http://www.dbanotes.net/

然后编辑conf/crawl-urlfilter.txt 文件,设定过滤信息,我这里只修改了MY.DOMAIN.NAME:

# accept hosts in MY.DOMAIN.NAME
+^http://([a-z0-9]*\.)*dbanotes.net/

运行如下命令开始抓取分析网站内容:

[root@fc3 nutch]# bin/nutch crawl urls -dir crawl.demo -depth 2 -threads 4 >& crawl.log

depth 参数指爬行的深度,这里处于测试的目的,选择深度为 2 ;
threads 参数指定并发的进程 这是设定为 4 ;

在该命令运行的过程中,可以从 crawl.log 中查看 nutch 的行为以及过程:

......
050102 200336 loading file:/u01/nutch/conf/nutch-site.xml
050102 200336 crawl started in: crawl.demo
050102 200336 rootUrlFile = urls
050102 200336 threads = 4
050102 200336 depth = 2
050102 200336 Created webdb at crawl.demo/db
......
050102 200336 loading file:/u01/nutch/conf/nutch-site.xml
050102 200336 crawl started in: crawl.demo
050102 200336 rootUrlFile = urls
050102 200336 threads = 4
050102 200336 depth = 2
050102 200336 Created webdb at crawl.demo/db
050102 200336 Starting URL processing
050102 200336 Using URL filter: net.nutch.net.RegexURLFilter
......
050102 200337 Plugins: looking in: /u01/nutch/plugins
050102 200337 parsing: /u01/nutch/plugins/parse-html/plugin.xml
050102 200337 parsing: /u01/nutch/plugins/parse-pdf/plugin.xml
050102 200337 parsing: /u01/nutch/plugins/parse-ext/plugin.xml
050102 200337 parsing: /u01/nutch/plugins/parse-msword/plugin.xml
050102 200337 parsing: /u01/nutch/plugins/query-site/plugin.xml
050102 200337 parsing: /u01/nutch/plugins/protocol-http/plugin.xml
050102 200337 parsing: /u01/nutch/plugins/creativecommons/plugin.xml
050102 200337 parsing: /u01/nutch/plugins/language-identifier/plugin.xml
050102 200337 parsing: /u01/nutch/plugins/query-basic/plugin.xml
050102 200337 logging at INFO
050102 200337 fetching http://www.dbanotes.net/
050102 200337 http.proxy.host = null
050102 200337 http.proxy.port = 8080
050102 200337 http.timeout = 10000
050102 200337 http.content.limit = 65536
050102 200337 http.agent = NutchCVS/0.05 (Nutch; http://www.nutch.org/docs/en/bot.html; n
utch-agent@lists.sourceforge.net)
050102 200337 fetcher.server.delay = 1000
050102 200337 http.max.delays = 100
050102 200338 http://www.dbanotes.net/: setting encoding to GB18030
050102 200338 CC: found http://creativecommons.org/licenses/by-nc-sa/2.0/ in rdf of http:
//www.dbanotes.net/
050102 200338 CC: found text in http://www.dbanotes.net/
050102 200338 status: 1 pages, 0 errors, 12445 bytes, 1067 ms
050102 200338 status: 0.9372071 pages/s, 91.12142 kb/s, 12445.0 bytes/page
050102 200339 Updating crawl.demo/db
050102 200339 Updating for crawl.demo/segments/20050102200336
050102 200339 Finishing update
64,1           7%
050102 200337 parsing: /u01/nutch/plugins/query-basic/plugin.xml
050102 200337 logging at INFO
050102 200337 fetching http://www.dbanotes.net/
050102 200337 http.proxy.host = null
050102 200337 http.proxy.port = 8080
050102 200337 http.timeout = 10000
050102 200337 http.content.limit = 65536
050102 200337 http.agent = NutchCVS/0.05 (Nutch; http://www.nutch.org/docs/en/bot.html;
nutch-agent@lists.sourceforge.net)
050102 200337 fetcher.server.delay = 1000
050102 200337 http.max.delays = 100
......

之后配置 Tomcat (我的 tomcat 安装在 /opt/Tomcat) ,

[root@fc3 nutch]# rm -rf /opt/Tomcat/webapps/ROOT*
[root@fc3 nutch]# cp nutch*.war /opt/Tomcat/webapps/ROOT.war
[root@fc3 webapps]# cd /opt/Tomcat/webapps/
[root@fc3 webapps]# jar xvf ROOT.war
[root@fc3 webapps]# ../bin/catalina.sh start

浏览器中输入 http://localhost:8080 查看结果(远程查看需要将 localhost 换成相应的IP):

nutch web search interface.png

搜索测试:

nutch web search result.png

可以看到,Nutch 亦提供快照功能。下面进行中文搜索测试:

nutch web Chinese search result.png

注意结果中的那个“评分详解”,是个很有意思的功能(Nutch 具有一个链接分析模块),通过这些数据可以进一步理解该算法。

考虑到带宽的限制,暂时不对整个Web爬行的方式进行了测试了。值得一提的是,在测试的过程中,nutch 的爬行速度还是不错的(相对我的糟糕带宽)。

Nutch 目前还不支持 PDF(开发中,不够完善) 与 图片 等对象的搜索。中文分词技术还不够好,通过“评分详解”可看出,对中文,比如“数据库管理员”,是分成单独的字进行处理的。但作为一个开源搜索引擎软件,功能是可圈可点的。毕竟,主要开发者 Doug Cutting 就是开发 Lucene 的大牛

参考信息

posted @ 2009-09-24 12:58 小菜毛毛 阅读(465) | 评论 (0)编辑 收藏

posted @ 2009-09-24 12:54 小菜毛毛 阅读(405) | 评论 (0)编辑 收藏

想做一个搜索引擎,最近浏览了许多社区,发现Lucene和Nutch用的很多,而这两个我总感觉难以区分概念,于是在查了些资料。下面是Lucene和Nutch创始人Doug Cutting 的访谈摘录:

 Lucene其实是一个提供全文文本搜索的函数库,它不是一个应用软件。它提供很多API函数让你可以运用到各种实际应用程序中。现在,它已经成为Apache的一个项目并被广泛应用着。这里列出一些已经使用Lucene的系统。

Nutch是一个建立在Lucene核心之上的Web搜索的实现,它是一个真正的应用程序。也就是说,你可以直接下载下来拿过来用。它在Lucene的基础上加了网络爬虫和一些和Web相关的东东。其目的就是想从一个简单的站内索引和搜索推广到全球网络的搜索上,就像Google和Yahoo一样。当然,和那些巨人竞争,你得动一些脑筋,想一些办法。我们已经测试过100M的网页,并且它的设计用在超过1B的网页上应该没有问题。当然,让它运行在一台机器上,搜索一些服务器,也运行的很好。

   总的来说,我认为LUCENE会应用在本地服务器的网站内部搜索,而Nutch则扩展到整个网络、Internet的检索。当然LUCENE加上爬虫程序等就会成为Nutch,这样理解应该没错吧


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rokii/archive/2008/03/01/2137450.aspx

posted @ 2009-09-24 12:53 小菜毛毛 阅读(362) | 评论 (0)编辑 收藏

浅析HTTP协议

HTTP协议是什么?

简单来说,就是一个基于应用层的通信规范:双方要进行通信,大家都要遵守一个规范,这个规范就是HTTP协议。

HTTP协议能做什么?

很多人首先一定会想到:浏览网页。没错,浏览网页是HTTP的主要应用,但是这并不代表HTTP就只能应用于网页的浏览。HTTP是一种协议,只要通信的双方都遵守这个协议,HTTP就能有用武之地。比如咱们常用的QQ,迅雷这些软件,都会使用HTTP协议(还包括其他的协议)。

HTTP协议如何工作?

大家都知道一般的通信流程:首先客户端发送一个请求(request)给服务器,服务器在接收到这个请求后将生成一个响应(response)返回给客户端。

在这个通信的过程中HTTP协议在以下4个方面做了规定:

1.         RequestResponse的格式

Request格式:

HTTP请求行
(请求)头
空行
可选的消息体

注:请求行和标题必须以<CR><LF> 作为结尾(也就是,回车然后换行)。空行内必须只有<CR><LF>而无其他空格。在HTTP/1.1 协议中,所有的请求头,除Host外,都是可选的。

 

实例:

GET / HTTP/1.1

Host: gpcuster.cnblogs.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-us,en;q=0.5

Accept-Encoding: gzip,deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive

If-Modified-Since: Mon, 25 May 2009 03:19:18 GMT

Response格式:

HTTP状态行
(应答)头
空行
可选的消息体

 

实例:

HTTP/1.1 200 OK

Cache-Control: private, max-age=30

Content-Type: text/html; charset=utf-8

Content-Encoding: gzip

Expires: Mon, 25 May 2009 03:20:33 GMT

Last-Modified: Mon, 25 May 2009 03:20:03 GMT

Vary: Accept-Encoding

Server: Microsoft-IIS/7.0

X-AspNet-Version: 2.0.50727

X-Powered-By: ASP.NET

Date: Mon, 25 May 2009 03:20:02 GMT

Content-Length: 12173

 

­消息体的内容(略)

 

       详细的信息请参考:RFC 2616

       关于HTTP headers的简要介绍,请查看:Quick reference to HTTP headers

2.         建立连接的方式

HTTP支持2中建立连接的方式:非持久连接和持久连接(HTTP1.1默认的连接方式为持久连接)

1)         非持久连接

让我们查看一下非持久连接情况下从服务器到客户传送一个Web页面的步骤。假设该贝面由1个基本HTML文件和10个JPEG图像构成,而且所有这些对象都存放在同一台服务器主机中。再假设该基本HTML文件的URL为:gpcuster.cnblogs.com/index.html。

下面是具体步骡:

1.HTTP客户初始化一个与服务器主机gpcuster.cnblogs.com中的HTTP服务器的TCP连接。HTTP服务器使用默认端口号80监听来自HTTP客户的连接建立请求。

2.HTTP客户经由与TCP连接相关联的本地套接字发出—个HTTP请求消息。这个消息中包含路径名/somepath/index.html。

3.HTTP服务器经由与TCP连接相关联的本地套接字接收这个请求消息,再从服务器主机的内存或硬盘中取出对象/somepath/index.html,经由同一个套接字发出包含该对象的响应消息。

4.HTTP服务器告知TCP关闭这个TCP连接(不过TCP要到客户收到刚才这个响应消息之后才会真正终止这个连接)。

5.HTTP客户经由同一个套接字接收这个响应消息。TCP连接随后终止。该消息标明所封装的对象是一个HTML文件。客户从中取出这个文件,加以分析后发现其中有10个JPEG对象的引用。

6.给每一个引用到的JPEG对象重复步骡1-4。

上述步骤之所以称为使用非持久连接,原因是每次服务器发出一个对象后,相应的TCP连接就被关闭,也就是说每个连接都没有持续到可用于传送其他对象。每个TCP连接只用于传输一个请求消息和一个响应消息。就上述例子而言,用户每请求一次那个web页面,就产生11个TCP连接。

2)         持久连接

非持久连接有些缺点。首先,客户得为每个待请求的对象建立并维护一个新的连接。对于每个这样的连接,TCP得在客户端和服务器端分配TCP缓冲区,并维持TCP变量。对于有可能同时为来自数百个不同客户的请求提供服务的web服务器来说,这会严重增加其负担。其次,如前所述,每个对象都有2RTT的响应延长——一个RTT用于建立TCP连接,另—个RTT用于请求和接收对象。最后,每个对象都遭受TCP缓启动,因为每个TCP连接都起始于缓启动阶段。不过并行TCP连接的使用能够部分减轻RTT延迟和缓启动延迟的影响。

在持久连接情况下,服务器在发出响应后让TCP连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。整个Web页面(上例中为包含一个基本HTMLL文件和10个图像的页面)自不用说可以通过单个持久TCP连接发送:甚至存放在同一个服务器中的多个web页面也可以通过单个持久TCP连接发送。通常,HTTP服务器在某个连接闲置一段特定时间后关闭它,而这段时间通常是可以配置的。持久连接分为不带流水线(without pipelining)和带流水线(with pipelining)两个版本。如果是不带流水线的版本,那么客户只在收到前一个请求的响应后才发出新的请求。这种情况下,web页面所引用的每个对象(上例中的10个图像)都经历1RTT的延迟,用于请求和接收该对象。与非持久连接2RTT的延迟相比,不带流水线的持久连接已有所改善,不过带流水线的持久连接还能进一步降低响应延迟。不带流水线版本的另一个缺点是,服务器送出一个对象后开始等待下一个请求,而这个新请求却不能马上到达。这段时间服务器资源便闲置了。

HTTP/1.1的默认模式使用带流水线的持久连接。这种情况下,HTTP客户每碰到一个引用就立即发出一个请求,因而HTTP客户可以一个接一个紧挨着发出各个引用对象的请求。服务器收到这些请求后,也可以一个接一个紧挨着发出各个对象。如果所有的请求和响应都是紧挨着发送的,那么所有引用到的对象一共只经历1RTT的延迟(而不是像不带流水线的版本那样,每个引用到的对象都各有1RTT的延迟)。另外,带流水线的持久连接中服务器空等请求的时间比较少。与非持久连接相比,持久连接(不论是否带流水线)除降低了1RTT的响应延迟外,缓启动延迟也比较小。其原因在于既然各个对象使用同一个TCP连接,服务器发出第一个对象后就不必再以一开始的缓慢速率发送后续对象。相反,服务器可以按照第一个对象发送完毕时的速率开始发送下一个对象。

3.         缓存的机制

HTTP/1.1中缓存的目的是为了在很多情况下减少发送请求,同时在许多情况下可以不需要发送完整响应。前者减少了网络回路的数量;HTTP利用一个“过期(expiration)”机制来为此目的。后者减少了网络应用的带宽;HTTP用“验证(validation)”机制来为此目的。

HTTP定义了3种缓存机制:

l Freshness allows a response to be used without re-checking it on the origin server, and can be controlled by both the server and the client. For example, the Expires response header gives a date when the document becomes stale, and the Cache-Control: max-age directive tells the cache how many seconds the response is fresh for.

l Validation can be used to check whether a cached response is still good after it becomes stale. For example, if the response has a Last-Modified header, a cache can make a conditional request using the If-Modified-Since header to see if it has changed.

l Invalidation is usually a side effect of another request that passes through the cache. For example, if URL associated with a cached response subsequently gets a POST, PUT or DELETE request, the cached response will be invalidated.

关于web缓存方面的内容可以参考:Caching Tutorial for Web Authors and Webmasters英文版)(中文版

4.         响应授权激发机制

这些机制能被用于服务器激发客户端请求并且使客户端授权。

详细的信息请参考:RFC 2617: HTTP Authentication: Basic and Digest Access

5.        基于HTTP的应用

1 HTTP代理

原理

index_img3

分类

  1. 透明代理
  2. 非透明代理
  3. 反向代理

index_img4

index_img5

2 多线程下载

    1. 下载工具开启多个发出HTTP请求的线程
    2. 每个http请求只请求资源文件的一部分:Content-Range: bytes 20000-40000/47000
    3. 合并每个线程下载的文件

3 HTTPS传输协议原理

两种基本的加解密算法类型

对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES等

index_img6

非对称加密:密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等

index_img7

HTTPS通信过程

index_img8

优点

    1. 客户端产生的密钥只有客户端和服务器端能得到
    2. 加密的数据只有客户端和服务器端才能得到明文
    3. 客户端到服务端的通信是安全的

 

4 开发web程序时常用的Request Methods

HEAD

(Head方法)要求响应与相应的GET请求的响应一样,但是没有的响应体(response body)。这用来获得响应头(response header)中的元数据信息(meta-infomation)有(很)帮助,(因为)它不需要传输所有的内容。

TRACE

(Trace方法告诉服务器端)返回收到的请求。客户端可以(通过此方法)察看在请求过程中中间服务器添加或者改变哪些内容。

OPTIONS

返回服务器(在指定URL上)支持的HTTP方法。通过请求“*”而不是指定的资源,这个方法可以用来检查网络服务器的功能。

CONNECT

将请求的连接转换成透明的TCP/IP通道,通常用来简化通过非加密的HTTP代理的SSL-加密通讯(HTTPS)。

5 用户与服务器的交互

    1. 身份认证
    2. cookie
    3. 带条件的GET

6 基于Socket编程编写遵循HTTP的程序

 

 

后记:

这篇文章只是对HTTP协议做了一个大概介绍,很多细节都有遗漏,请有兴趣的朋友阅读RFC 2616

学习HTTP协议的好书:

1.O'Reilly - HTTP Pocket Reference:这是一本比较简短的介绍HTTP协议的书,可以作为入门读物

2.O'Reilly - HTTP The Definitive Guide:这是一本宝典级别的书,因为它包含的内容实在多,可以作为全面学习的HTTP协议的首选读物

3.Sams - HTTP Developers Handbook:这是比HTTP The Definitive Guide稍微比HTTP The Definitive Guide简单。不过从我的感觉,这本书比HTTP The Definitive Guide要好,因为它篇幅比较少,介绍的是HTTP精髓,我认为这本书应该是web程序员的首选读物

posted @ 2009-09-19 12:27 小菜毛毛 阅读(342) | 评论 (0)编辑 收藏

     摘要: 轻松为应用程序构建搜索和索引功能 ...  阅读全文
posted @ 2009-09-17 19:45 小菜毛毛 阅读(335) | 评论 (0)编辑 收藏

Web开发有用的技术书籍

关键字: lucene ajax jquery html css

在Web项目的开发过程中,可能对你很有帮助的基本书籍推荐,不要小看基础!

    • JFreechat:Web开发中设计到统计曲线,报表显示的,用他吧,不过感觉他的API有点繁杂。
    • Java设计模式:设计模式在我们的开发中无处不在,学习他的思路可以说非常重要!
    • Javascript权威指南:由于Ajax的出现,Javascript变得越来越重要,是Web开发中的利器!
    • Lunece:Web开发中全文检索的必备
    • JNI:在Web开发中,不可避免的有时会调用dll,Java调用Dll的根本思想在于JNI,举个例子:
    Java代码 复制代码
    1. //编写JAVA文件,其中测试类为DllTest,代码如下:   
    2. public class DllTest    
    3. {   
    4. public static void main(String[] args)   
    5. {   
    6.   test a=new test();   
    7.   a.HelloWorld();   
    8.   System.out.println(a.cToJava());   
    9. }   
    10. }   
    11. //编写JNI代码,其中类名为test,如下:   
    12. public class test {   
    13.   static    
    14.   {   
    15.     System.loadLibrary("MyNative");   
    16.   }   
    17.      
    18.   //以下函数只做申明,在C中实现   
    19.   public native static void HelloWorld();   
    20.   public native static String cToJava();   
    21.   
    22. }   
    23. //使用javac得到class文件,然后使用javah命令得到.h文件   
    24. //编写C++代码,MyNative如下:   
    25. 使用win32 Dynamic-link Library新建一个新空工程,新建一个c++文件,命名为MyNative.cpp,代码如下:   
    26. #include <stdio.h>   
    27. #include "test.h"  
    28. JNIEXPORT void JNICALL Java_test_HelloWorld   
    29.   (JNIEnv *env, jclass jobject)   
    30. {   
    31.     printf("hello world!\n");   
    32. }   
    33. JNIEXPORT jstring JNICALL Java_test_cToJava   
    34.   (JNIEnv *env, jclass obj)   
    35. {   
    36.     jstring jstr;   
    37.     char str[]="Hello World!\n";   
    38.     jstr=env->NewStringUTF(str);   
    39.     return jstr;   
    40. }   
    41. 函数申明要和test.h中的函数申明保持一致,否则就出错,使用rebuild all命令,得到MyNative.dll文件,拷贝到test.java同一目录下。   
    42. 运行DllTest类,就得到结果,这里我们就实现用c++来实现具体函数功能的方法,当然这是最简单的JNI应用了。  
     
    posted @ 2009-09-04 12:51 小菜毛毛 阅读(1014) | 评论 (0)编辑 收藏

    常用建站参考网站大本营

    关键字: css div 建站

    在我个人开发网站的过程中,经常会参考一些网站,我不擅长美工,所以一般页面都喜欢直接拿来用,再自己修饰一下,以下一些网站是我经常访问的,共享给大家:

    1. 站酷(http://www.zcool.com.cn/ ):拥有丰富的网站资源与模板,很棒
    2. 51js和blueidea(http://bbs.51js.comhttp://www.blueidea.com ) :主要看一些js高手们探讨的帖子。
    3. JQuery官网(http://jquery.com ):不用说了
    4. http://www.freecsstemplates.org/ :很多老外上传的免费模板,有些付费的看看效果图也不错,然后自己动手写,非常有参考价值

    不知道大家有没有补充的,在建站的过程中,有没有经常参考的网站呢?欢迎讨论!

     

    网友补充:

    1. CSS资源和学习网站(http://www.52css.com/
    2. http://www.w3school.com.cn/
    posted @ 2009-09-04 12:49 小菜毛毛 阅读(187) | 评论 (0)编辑 收藏

    JAVA 书籍比较全的网站 http://ajava.org/book/
    posted @ 2009-09-02 16:20 小菜毛毛 阅读(370) | 评论 (0)编辑 收藏

    仅列出标题
    共17页: First 上一页 9 10 11 12 13 14 15 16 17 下一页