`
isiqi
  • 浏览: 15946298 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

java 网络编程【9】 URL(统一资源定位符)

 
阅读更多

【1】URL的基本组成:协议,主机名,端口号,资源名。

例如:http://www.it315.org:8080/index.html

【2】 相对URL:例如:“/a.html” 、“./a.html”、“../../a.html”、“a.html”。

绝对URL:即网页路径使用包含顶级域名在内的完整的URL。
如:www.xxx.com/page1/index.html是一个绝对路径,其中/page1/index.html则为相对路径,由浏览器自动在该链接前加上www.xxx.com。


总体上,Google在排名时并不在意URL使用的是相对路径还是绝对路径。

动态URL: 目前很多网站都有数据库驱动生成的URL,即动态URL,往往表现为在URL中出现"?"、"="、"%",以及"&"、"$"等字符。动态URL极不利于搜索引擎抓取网页,严重影响网站排名,通常是通过技术解决方案将动态URL转化成静态的URL形式,如:
将http://www.xxx.com/messages.php?id=2&type=5 转化为http://www.xxx.com/messages/2/5/ 下文将会专门提到动态URL的解决方案。


导航结构
网站导航是对引导用户访问网站的的栏目、菜单、在线帮助、布局结构等形式的统称。其主要功能在于引导用户方便地访问网站内容,是评价网站专业度、可用度的重要指标。同时对搜索引擎也产生诸多提示作用。概括地讲,网站在导航方面应注意以下几点:


1、主导航醒目清晰
主导航一般体现为一级目录,通过它们用户和蜘蛛程序都可以层层深入访问到网站所有重要内容。因此主栏目必须在网站首页第一屏的醒目位置体现,并最好采用文本链接而不是图片。


2、"面包屑型(Breadcrumbs)"路径
所谓"面包屑"是比喻用户通过主导航到目标网页的访问过程中的路径提示,使用户了解所处网站中的位置而不至于迷失"方向",并方便回到上级页面和起点。路径中的每个栏目最好添加链接。


如下: 网信设计: 网信日志 > 技术资讯 > 网络营销


即使没有详细的路径来源,也至少应该在每个子页面提示回首页的链接,包括页面的LOGO作链接。
3、首页突出重要内容
除了主栏目,还应该将次级目录中的重要内容以链接的方式在首页或其它子页中多次呈现,以突出重点。搜索引擎会对这种一站内多次出现的链接给予充分重视,对网页级别(PageRank)提高有很大帮助,这也是每个网站首页的网页级别一般高于其它页面级别的重要因素,因为每个子页都对首页进行了链接。


4、使用网站地图
网站地图(Site Map)是辅助导航的手段,最初是为用户设计,以方便用户快捷到达目标页。良好的网站地图设计常常以网站拓扑结构体现复杂的目录关系,具有静态、直观、扁平、简单的特点。多采用文本链接,不用或少用修饰性图片,以加快页面加载速度。以上特点符合搜索引擎友好的要求,因此网站地图在SEO中也有重要的意义。尤其对于那些采用图片导航和动态技术生成的网页,通过在网站地图中进行文本链接,可在一定程度上弥补蜘蛛程序无法识别图片和动态网页造成的页面不可见的风险。


需要注意,网站地图也要突出重点,尽量给出主干性内容及链接,而不是所有细枝末节。一页内不适宜放太多链接。Google明确提出"如果网站地图上的链接超过大约 100 个,则最好将网站地图拆成多个网页"。


以下蓝色部分:http://blog.sina.com.cn/s/blog_899b8f000100vkpv.html


绝对路径指的是包含域名的完整网址;


相对路径指的是不包含域名的、被链接页面相对于当前页面的相对网址。
假设:页面A的URL是http://www.wanbuyu.com/pageA.html,而B页面的URL是:http://www.wanbuyu.com/pageB.html。那么A链向B的代码可以使用<a href="../pageB.html">这就是相对路径,它的完整路径应该是<a href="http://www.wanbuyu.com/pageB.html">.浏览器地址栏中都是显示的完整URL,这是绝对路径。SEO使用绝对路径或者相对路径各有优缺点,是不能一概而论的。


一、绝对路径的优缺点分析
绝对路径URL优点是:
1、 如果有人抄袭、采集你的网站内容,抄袭者比较懒,连页面里面的链接一起原封不动超过去,绝对路径链接还会指向你的网站,增加网站外链及权重。
2、 网站有RSS输出时,内容会被一些Feed聚合网站抓取显示。同样,页面里指向原网站的链接会被保留。
3、 有助于预防和解决网址规范化问题。假设站长希望被收录的URL是带www的版本,由于技术原因不能
从wanbuyu.com做301转向到www.wanbuyu.com,所有页面中的链接使用绝对路径。
绝对路径缺点是:
1、 除非链接是动态插入的,不然不好在测试服务器上进行测试。因为里面的链接将直接指向真正域名的URL,而不是测
试服务器上的URL。
2、 除非链接是动态插入的,不然移动页面将比较困难。因为页面位置发生变化,其他页面连向本页面的链接却可能无法
跟着变化,还指向原来的已经硬编码的绝对路径。
3、 代码比较多。链接数量大时,多出来的字符可能使HTML文件变大不少。


二、相对路径优缺点分析
相对路径优点是:
1、移动内容比较容易,不用更新其他页面上的链接。
2、在测试服务器上进行测试也比较容易。
3、节省代码。
相对路径缺点是:
1、页面移动位置,里面的链接可能也需要改动。
2、被抄袭和采集网站没有任何益处。不过很多采集软件其实是可以自动鉴别绝对路径和相对路径的,所以使用绝对路径有助于自己的链接也被抄到采集网站上,
只在某些情况下是有效的。
3、搜索引擎解析URL时可能出错,不能正确读取页面上的链接URL。
如果不能做301转向,因而产生了严重的网址规范化问题时,使用绝对路径有助于解决网址规范化问题。如果文章被大连转载、抄袭,
使用绝对路径可以带来一些外部链接。除此之外,使用相对路径比较简单。在正常情况下,相对路径不会对网站有什么副作用,绝对路径也不会有什么特殊好处。
搜索引擎错误解析相对路径URL的可能性是非常低的。
通过以上的比较分析发现,二者在URL中的使用条件不一样,在正确解析URL的前提下,绝对路径和相对路径本身对排名没有任何影响。




【3】URL编码规则:

(1)将空格转换为加号(+)
(2)对0-9,a-z,A-Z之间的字符保持不变
(3)对于所有其他的字符,用这个字符的当前字符集编码在内存中的十六进制格式表示,并在每个字节前加上一个百分号(%)。
如字符“+”用%2B表示,字符“=”用%3D表示,字符“&”用%26表示,每个中文字符在内存中占两个字节,字符“中”用%D6%D0表示,
字符“国”用%B9%FA表示调对于空格也可以直接使用其十六进制编码方式,即用%20表示,而不是将它转换成加号(+)


说明:
如果确信URL串的特殊字符没有引起使用上的岐义或冲突你也可以对这些字符不进行编码,而是直接传递给服务器。
例如,http://www.it315.org/dealregister.html?name=中国&password=123


如果URL串中的特殊字符可能会产生岐义或冲突,则必须对这些特殊字符进行URL编码。

例如,服务器会将不编码的“中+国”当作“中 国”处理。
还例如,当name参数值为“中&国”时,如果不对其中的“&”编码,


URL字符串将有如下形式:http://www.it315.org/dealregister.html?name=中&国&password=123,应编码为:http://www.it315.org/dealregister.html?name=中%26国&password=123

http://www.it315.org/example/index.html#section2可改写成http://www.it315.org/example%2Findex.html%23section2



【4】URL类


java.net
类 URL

java.lang.Object
  继承者 java.net.URL
所有已实现的接口:
Serializable

public final class URL
extends Object
implements Serializable

URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。有关 URL 的类型和格式的更多信息,可从以下位置找到:

http://www.socs.uts.edu.au/MosaicDocs-old/url-primer.html

通常,URL 可分成几个部分。上面的 URL 示例指示使用的协议为 http (超文本传输协议)并且该信息驻留在一台名为 www.socs.uts.edu.au 的主机上。主机上的信息名称为/MosaicDocs-old/url-primer.html主机上此名称的准确含义取决于协议和主机。该信息一般存储在文件中,但可以随时生成。该 URL 的这一部分称为路径 部分。

URL 可选择指定一个“端口”,它是用于建立到远程主机 TCP 连接的端口号。如果未指定该端口号,则使用协议默认的端口。例如,http 协议的默认端口为80。还可以指定一个备用端口,如下所示:

     http://www.socs.uts.edu.au:80/MosaicDocs-old/url-primer.html
 

URL 的语法由此文档定义:RFC2396:Uniform Resource Identifiers (URI):Generic Syntax;在此文件中对其内容又进行了修正:RFC2732:Format for Literal IPv6 Addresses in URLs。字面值 IPv6 地址格式还支持 scope_id。scope_id 的语法和用法在此处进行了描述。

URL 后面可能还跟有一个“片段”,也称为“引用”。该片段由井字符 "#" 指示,后面跟有更多的字符。例如,

     http://java.sun.com/index.html#chapter1
 

从技术角度来讲,URL 并不需要包含此片段。但是,使用此片段的目的在于表明,在获取到指定的资源后,应用程序需要使用文档中附加有chapter1 标记的部分。标记的含义特定于资源。

应用程序也可以指定一个“相对 URL”,它只包含到达相对于另一个 URL 的资源的足够信息。HTML 页面中经常使用相对 URL。例如,假设 URL 的内容是:

     http://java.sun.com/index.html
 
其中包含的相对 URL:
     FAQ.html
 
为以下形式的缩写:
     http://java.sun.com/FAQ.html
 

相对 URL 不需要指定 URL 的所有组成部分。如果缺少协议、主机名称或端口号,这些值将从完整指定的 URL 中继承。但是,必须指定文件部分。可选的片段部分不继承。

URL 类自身并不根据 RFC2396 中定义的转义机制编码或解码任何 URL 部分。由调用方对任何需要在调用 URL 前进行转义的字段进行编码,并对从 URL 返回的任何经过转义的字段进行解码。进一步而言,由于 URL 不懂 URL 转义,所以它不会识别同一 URL 的对等编码和解码形式。例如,对于这两个 URL:

    http://foo.com/hello world/ 和 http://foo.com/hello%20world
将被视为互不相等。

注意,URI 类在某些特定情况下对其组成字段执行转义。建议使用URI 管理 URL 的编码和解码,并使用toURI()URI.toURL() 实现这两个类之间的转换。

也可以使用 URLEncoderURLDecoder 类,但是只适用于 HTML 形式的编码,它与 RFC2396 中定义的编码机制不同。



构造方法摘要
URL(Stringspec)
根据 String 表示形式创建 URL 对象。
URL(Stringprotocol,Stringhost, intport,Stringfile)
根据指定 protocolhostport 号和 file 创建 URL 对象。
URL(Stringprotocol,Stringhost, intport,Stringfile, URLStreamHandlerhandler)
根据指定的 protocolhostport 号、filehandler 创建URL 对象。
URL(Stringprotocol,Stringhost,Stringfile)
根据指定的 protocol 名称、host 名称和 file 名称创建 URL。
URL(URLcontext,Stringspec)
通过在指定的上下文中对给定的 spec 进行解析创建 URL。
URL(URLcontext,Stringspec,URLStreamHandlerhandler)
通过在指定的上下文中用指定的处理程序对给定的 spec 进行解析来创建 URL。


2、获取URL对象的属性
  getDefaultPort(): 返回默认的端口号。
  getFile(): 获得URL指定资源的完整文件名。
  getHost(): 返回主机名。
  getPath(): 返回指定资源的文件目录和文件名。
  getPort(): 返回端口号,默认为-1。
  getProtocol(): 返回表示URL中协议的字符串对象。
  getRef(): 返回URL中的HTML文档标记,即#号标记。
  getUserInfo: 返回用户信息。
  toString: 返回完整的URL字符串。


二、Internet寻址
  java.net包可以用32位int形式来操作32位的IP地址(即Internet主机地址)。类InetAddress实际上是可以把Internet地址换算成代表该地址的对象。Java就是靠这个类来显示Internet地址已经相关信息的。
  InetAddress有以下常用方法:
  getAddress(): 返回IP地址的字节形式。
  getAllByName(): 返回指定主机名的IP地址。
  getbyAddress(): 返回指定字节数组的IP地址形式。
  getByName(): 返回指定主机名的IP地址对象。
  getHostAddress(): 返回主机地址的字符串形式。
  getLocalHost(): 返回当前主机名。
  hastCode(): 返回InetAddress对象的哈希码。
  toString: 返回地址转换成的字符串。
  InetAddress类没有提供返回构造函数,所以不能用new()方法来创建它的对象,而只可以调用静态方法getLocalHost()、getByName()、getByAddress()等来生成InetAddress类的实质。



有代码才有真相:


哒哒


本机地址字符串:192.168.1.13
本机主机名:topcheer-wangdm
本机主机名:topcheer-wangdm/192.168.1.13
哈希码:-1062731507
字符形式:[B@f9f9d8
地址字符串:topcheer-wangdm/192.168.1.13


有两种方法可以用来访问Internet。一是利用URL类的openStream()方法;二是使用openConnection()方法创建一个URLConnection类的对象。
  其中,方法openStream()与指定的URL建立连接并返回InputStream类的对象,以从这一连接中读取数据。

打印结果:
<!doctype html><html><head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"><title>百度一下,你就知道 </title><style>html{overflow-y:auto}body{font:12px arial;text-align:center;background:#fff}body,p,form,ul,li{margin:0;padding:0;list-style:none}body,form,#fm{position:relative}td{text-align:left}img{border:0}a{color:#00c}a:active{color:#f60}#u{color:#999;padding:4px 10px 5px 0;text-align:right}#u a{margin:0 5px}#u .reg{margin:0}#m{width:680px;margin:0 auto;}#nv a,#nv b,.btn,#lk{font-size:14px}#fm{padding-left:90px;text-align:left}input{border:0;padding:0}#nv{height:19px;font-size:16px;margin:0 0 4px;text-align:left;text-indent:117px}.s_ipt_wr{width:418px;height:30px;display:inline-block;margin-right:5px;background:url(http://s1.bdstatic.com/r/www/img/i-1.0.0.png) no-repeat -304px 0;border:1px solid #b6b6b6;border-color:#9a9a9a #cdcdcd #cdcdcd #9a9a9a;vertical-align:top}.s_ipt{width:405px;height:22px;font:16px/22px arial;margin:5px 0 0 7px;background:#fff;outline:none;-webkit-appearance:none}.s_btn{width:95px;height:32px;padding-top:2px\9;font-size:14px;background:#ddd url(http://s1.bdstatic.com/r/www/img/i-1.0.0.png);cursor:pointer}.s_btn_h{background-position:-100px 0}.s_btn_wr{width:97px;height:34px;display:inline-block;background:url(http://s1.bdstatic.com/r/www/img/i-1.0.0.png) no-repeat -202px 0;*position:relative;z-index:0;vertical-align:top}#lg img{vertical-align:top;margin-bottom:3px}#lk{margin:33px 0}#lk span{font:14px "宋体"}#lm{height:60px}#lh{margin:16px 0 5px;word-spacing:3px}.tools{position:absolute;top:-4px;*top:10px;right:-13px;}#mHolder{width:62px;position:relative;z-index:296;display:none}#mCon{height:18px;line-height:18px;position:absolute;cursor:pointer;padding:0 18px 0 0;background:url(http://s1.bdstatic.com/r/www/img/bg-1.0.0.gif) no-repeat right -134px;background-position:right -136px\9}#mCon span{color:#00c;cursor:default;display:block}#mCon .hw{text-decoration:underline;cursor:pointer}#mMenu a{width:100%;height:100%;display:block;line-height:22px;text-indent:6px;text-decoration:none;filter:none\9}#mMenu,#user ul{box-shadow:1px 1px 2px #ccc;-moz-box-shadow:1px 1px 2px #ccc;-webkit-box-shadow:1px 1px 2px #ccc;filter: progid:DXImageTransform.Microsoft.Shadow(Strength=2, Direction=135, Color="#cccccc")\9;}#mMenu{width:56px;border:1px solid #9b9b9b;list-style:none;position:absolute;right:7px;top:28px;display:none;background:#fff}#mMenu a:hover{background:#ebebeb}#mMenu .ln{height:1px;background:#ebebeb;overflow:hidden;font-size:1px;line-height:1px;margin-top:-1px}#cp,#cp a{color:#77c}#seth{display:none;behavior:url(#default#homepage)}#setf{display:none}#sekj{margin-left:14px;}</style>
<script type="text/javascript">function h(obj){obj.style.behavior='url(#default#homepage)';var a = obj.setHomePage('http://www.baidu.com/');}</script></head>


<body><div id="u"><a href="http://www.baidu.com/gaoji/preferences.html" name="tj_setting">搜索设置</a>|<a href="https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F" name="tj_login">登录</a><a href="https://passport.baidu.com/v2/?reg&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F" target="_blank" name="tj_reg" class="reg">注册</a></div>
<div id="m"><p id="lg"><img src="http://www.baidu.com/img/baidu_sylogo1.gif" width="270" height="129" usemap="#mp"><map name="mp"><area shape="rect" coords="40,25,230,95" href="http://hi.baidu.com/baidu/" target="_blank" title="点此进入 百度的空间" ></map></p><p id="nv"><a href="http://news.baidu.com">新&nbsp;闻</a> <b>网&nbsp;页</b> <a href="http://tieba.baidu.com">贴&nbsp;吧</a> <a href="http://zhidao.baidu.com">知&nbsp;道</a> <a href="http://mp3.baidu.com">MP3</a> <a href="http://image.baidu.com">图&nbsp;片</a> <a href="http://video.baidu.com">视&nbsp;频</a> <a href="http://map.baidu.com">地&nbsp;图</a></p><div id="fm"><form name="f" action="/s"><span class="s_ipt_wr"><input type="text" name="wd" id="kw" maxlength="100" class="s_ipt"></span><input type="hidden" name="rsv_bp" value="0"><input type="hidden" name="rsv_spt" value="3"><span class="s_btn_wr"><input type="submit" value="百度一下" id="su" class="s_btn" onmousedown="this.className='s_btn s_btn_h'" onmouseout="this.className='s_btn'"></span></form><span class="tools"><span id="mHolder"><div id="mCon"><span>输入法</span></div></span></span><ul id="mMenu"><li><a href="#" name="ime_hw">手写</a></li><li><a href="#" name="ime_py">拼音</a></li><li class="ln"></li><li><a href="#" name="ime_cl">关闭</a></li></ul></div>
<p id="lk"><a href="http://hi.baidu.com">空间</a> <a href="http://baike.baidu.com">百科</a> <a href="http://www.hao123.com">hao123</a><span> | <a href="/more/">更多&gt;&gt;</a></span></p><p id="lm"></p><p><a id="seth" onClick="h(this)" href="http://utility.baidu.com/traf/click.php?id=215&url=http://www.baidu.com" onmousedown="return ns_c({'fm':'behs','tab':'homepage','pos':0})">把百度设为主页</a><a id="setf" onClick="fa(this)" href="javascript:void(0)" onmousedown="return ns_c({'fm':'behs','tab':'favorites','pos':0})">把百度加入收藏夹</a></span></p>
<p id="lh"><a href="http://e.baidu.com/?refer=888">加入百度推广</a> | <a href="http://top.baidu.com">搜索风云榜</a> | <a href="http://home.baidu.com">关于百度</a> | <a href="http://ir.baidu.com">About Baidu</a></p><p id="cp">&copy;2012 Baidu <a href="/duty/">使用百度前必读</a> <a href="http://www.miibeian.gov.cn" target="_blank">京ICP证030173号</a> <img src="http://gimg.baidu.com/img/gs.gif"></p></div></body>


<script>var bdUser = null;var w=window,d=document,n=navigator,k=d.f.wd,a=d.getElementById("nv").getElementsByTagName("a"),isIE=n.userAgent.indexOf("MSIE")!=-1&&!window.opera;for(var i=0;i<a.length;i++){a[i].onclick=function(){if(k.value.length>0){var o=this,h=o.href,q=encodeURIComponent(k.value);if(h.indexOf("q=")!=-1){o.href=h.replace(/q=[^&\x24]*/,"q="+q)}else{this.href+="?q="+q}}}};(function(){if(/q=([^&]+)/.test(location.search)){k.value=decodeURIComponent(RegExp["\x241"])}})();if(n.cookieEnabled&&!/sug?=0/.test(d.cookie)){d.write('<script src=http://s1.bdstatic.com/r/www/cache/sug/js/bdsug-1.1.js><\/script>')};function addEV(o, e, f){if(w.attachEvent){o.attachEvent("on" + e, f);}else if(w.addEventListener){ o.addEventListener(e, f, false);}}function G(id){return d.getElementById(id);}function ns_c(q){var p = encodeURIComponent(window.document.location.href), sQ = '', sV = '', mu='', img = window["BD_PS_C" + (new Date()).getTime()] = new Image();for (v in q) {sV = q[v];sQ += v + "=" + sV + "&";} mu= "&mu=" + p ;img.src = "http://nsclick.baidu.com/v.gif?pid=201&pj=www&rsv_sid=&" + sQ + "path="+p+"&t="+new Date().getTime();return true;}if(/\bbdime=[12]/.test(d.cookie)){document.write('<script src=http://s1.bdstatic.com/r/www/cache/ime/js/openime-1.0.0.js><\/script>');}(function(){var user = G("user"), userMenu = G("userMenu");if(user && userMenu){user.onmouseover = function(){userMenu.style.display = "block"};user.onmouseout = function(){userMenu.style.display = "none"};}})();(function(){var u = G("u").getElementsByTagName("a"), nv = G("nv").getElementsByTagName("a"), lk = G("lk").getElementsByTagName("a"), un = "";var tj_nv = ["news","tieba","zhidao","mp3","img","video","map"];var tj_lk = ["hi","baike","hao123","more"];un = bdUser == null ? "" : bdUser;function _addTJ(obj){addEV(obj, "mousedown", function(e){var e = e || window.event;var target = e.target || e.srcElement;ns_c({'fm':'behs','tab':target.name||'tj_user','un':encodeURIComponent(un)});});}for(var i = 0; i < u.length; i++){_addTJ(u[i]);}for(var i = 0; i < nv.length; i++){nv[i].name = 'tj_' + tj_nv[i];_addTJ(nv[i]);}for(var i = 0; i < lk.length; i++){lk[i].name = 'tj_' + tj_lk[i];_addTJ(lk[i]);}})();addEV(w,"load",function(){k.focus()});w.onunload=function(){};</script>






</html>


<script type="text/javascript" src="http://s1.bdstatic.com/r/www/cache/hps/js/hps-1.5.js"></script>






<script>
(function(){
return ns_c({'fm':'behs','tab':'refer','refer':document.referrer});
})();
</script>
<!--b5acc4b6ca95b68e-->

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics