java网络---再论URL & URI
关于URL 和URI的关系,在本系列的第二篇:java网络---基本web概念 中已经简述了。
这里重复一点,就是URI包含URL,或者说URI是父类,URL就是子类的概念。
本篇再来详述这2个概念。
一:URL
java/net/URL.java
public final class URL implements Serializable {
private static final long serialVersionUID = -7627629688361524110L;
private static URLStreamHandlerFactory streamHandlerFactory;
/** Cache of protocols to their handlers */
private static final Hashtable<String, URLStreamHandler> streamHandlers
= new Hashtable<String, URLStreamHandler>();
private String protocol;
private String authority;
private String host;
private int port = -1;
private String file;
private String ref;
一个URL就是长的这样样子:http://home.cnblogs.com/u/deman/
所以我们可以使用String简单的描述一个URL。
但考虑URL为一个类可能更有用一些。
这个对象包括,模式,主机名,端口,路径,标识符(ref)。看看上面的源码,就是这些东西!
看看虚拟机支持那些协议,可以编写如下测试程序:
public class ProtocolTester implements IOperator {
@Override
public void start() {
testProtocol("http://www.adc.org");
testProtocol("https://www.amazon.com");
testProtocol("ftp://metalab.unc.edu");
testProtocol("telent://dibner.poly.edu/");
testProtocol("mailto:joyfulmath@163.com");
testProtocol("file:///etc/passwd");
testProtocol("gopher://gopher.anc.org.za");
testProtocol("ladp://ldap.itd.umich.edu");
testProtocol("jar:http://ldap.itd.umich.edu.jar");
testProtocol("nfs://utopia.poly.edu");
testProtocol("jdbc:mysql:/utopia.poly.edu");
}
private void testProtocol(String url) {
try {
URL u = new URL(url);
TraceLog.i(u.getProtocol()+" is supported");
} catch (MalformedURLException e) {
// e.printStackTrace();
// TraceLog.w(e.getMessage());
String protocol = url.substring(0,url.indexOf(':'));
TraceLog.w(protocol+ " is not supported");
}
}
URL组成:
URL有五部分组成,
模式,也称为协议
授权机构
路径
片段标示符,ref
查询字符串
给点URL http://www.ibiblio.org/javafaq/books/jnp/index.html?isbn=1565229#toc
模式 http
授权机构 www.ibiblio.org
路径 javafaq/books/jnp/index.html
片段标示符,ref toc
查询字符串 isbn=1565229
授权机构可以进一步分为:用户信息,主机,端口。
anmin@www.baidu.com:8080
public class UrlValueTester implements ITestOperator {
@Override
public void startTest() {
try {
URL u = new URL("http://tieba.baidu.com/f/fdir?fd=%E7%A7%91%E5%AD%A6%E6%8A%80%E6%9C%AF&ie=utf-8&sd=%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%BD%AF%E4%BB%B6");
method(u);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
public void method(URL u) throws InvocationTargetException, IllegalAccessException {
Class cls = u.getClass();
Method[] methods = cls.getDeclaredMethods();
for(Method m:methods)
{
try{
if(m.getName().contains("get"))
{
TraceLog.i(m.getName());
TraceLog.i(":"+m.invoke(u));
}
}catch (Exception e)
{
TraceLog.w(m.getName());
}
}
}
通过反射,获取所有get方法,然后依次获取各个属性。
二:URLEncoder & URLDecoder
URL使用如下字符:
大写字母
小写字母
数字0-9
标点-_.!~*'
字符/ & ? @ # ; $ + = % 用于特殊目的。
其他的内容都需要编码,URL默认不进行编码
public class EncoderTester implements ITestOperator{
public static final String DEFAULT_ENCODE = "UTF-8";
@Override
public void startTest() {
try {
String str = URLEncoder.encode("This is a + base string 我 吃 饭",DEFAULT_ENCODE);
TraceLog.i(str);
str = URLDecoder.decode(str, DEFAULT_ENCODE);
TraceLog.i(str);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
12-28 16:47:20.915 23343-23433/com.joyfulmath.sample.javanetwork I/EncoderTester: startTest: This+is+a+%2B+base+string+%E6%88%91+%E5%90%83+%E9%A5%AD [at (EncoderTester.java:20)]
12-28 16:47:20.916 23343-23433/com.joyfulmath.sample.javanetwork I/EncoderTester: startTest: This is a + base string 我 吃 饭 [at (EncoderTester.java:22)]
如上,空格会编码成+,所以 非给定的字符,都需要编码!
而特殊符号,则需要看情况,确定是否编码!
三.URI
URI是纯字符串的内容,是URL的相对内容。
URI格式分为三部分:
scheme:sheeme-part:fragment
URI top = new URI("http://www.example.com/");
URI relative = new URI("image/logo.png");
URI resolved = top.resolve(relative);
output:
http://www.example.com/image/logo.png"
URI可以做绝对路径和相对路径的转化,但是URL必须是绝对路径。
java网络---再论URL & URI的更多相关文章
- Java网络编程之URL和URI
Java网络编程之URL与URI 一.URL与URI简介 URI = Universal Resource Identifier 统一资源标志符 URL = Universal Resource Lo ...
- java网络编程2-URL和URI
//创建url可以指定请求的url协议,但不同的jvm支持的协议可能不相同(大部分支持http.file.https) //构造只判断字符串中的协议支不支持,而不判断url的正确性 URL url=n ...
- 161125、Java网络编程之统一资源定位符URL
统一资源定位符URL(Uniform Resource Locator)是www客户机访问Internet时用来标识资源的名字和地址.超文本链路由统一资源定位符URL维持.URL的格式是: <M ...
- Java - 网络编程完全总结
本文主要是自己在网络编程方面的学习总结,先主要介绍计算机网络方面的相关内容,包括计算机网络基础,OSI参考模型,TCP/IP协议簇,常见的网络协议等等,在此基础上,介绍Java中的网络编程. 一.概述 ...
- 【转载】Java 网络编程
本文主要是自己在网络编程方面的学习总结,先主要介绍计算机网络方面的相关内容,包括计算机网络基础,OSI参考模型,TCP/IP协议簇,常见的网络协议等等,在此基础上,介绍Java中的网络编程. 一. ...
- Java网络和代理
Java网络和代理 1)简介 在当今的网络环境中,特别是企业网络环境中,应用程序开发人员必须像系统管理员一样频繁地处理代理.在某些情况下,应用程序应该使用系统默认设置,在其他情况下,我们希望能够非常严 ...
- 【Java】 Java网络编程总结
一.网络编程三要素: IP地址:每个设备在网络中的唯一标识. 端口号:每个程序在设备上的唯一标识. 协议:为计算机网络中进行数据交换而建立的规则或约定的集合. UDP: 面向无连接,数据不安全,速度 ...
- java 网络编程基础 1
关于协议: 应用层网络协议包括:http,ftp,telnet,..... 传送层网络协议:使用socket封装的TCP,或UDP 端口: 用于网络通讯时传输数据时区分当前网络连接是与本机中的哪个应用 ...
- 开源的49款Java 网络爬虫软件
参考地址 搜索引擎 Nutch Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. Nutch的创始人是Doug Cutting, ...
随机推荐
- [python]pip常用命令(转载)
用阿里云服务器,使用pip安装第三方库的时候卡的要死.所以我就想pip能不能安装本地的包. 找到了这篇博客: http://me.iblogc.com/2015/01/01/pip%E5%B8%B8% ...
- 2 Servlet基础
作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 1. 从浏览器访问Servlet的流程 刚才发现,这里的图片不能正常显示,所以我给个链接,大家可以下载下来看从浏 ...
- 设计模式之Interator模式(1)
interator是java容器遍历的一种手段,当然遍历容易你可以使用普通的for(;;)或者for(Object o : new Arraylist<Object>()),都是可以的. ...
- UWP开发入门(十四)—— UserControl中Adaptive UI的小技巧
本篇我们通过绘制一个非常简单的UserControl控件,来分享一下对Adaptive UI的理解及一些图形绘制的技巧. 现在流行的APP都少不了精致的用户头像,首先假设我们需要绘制如下的图形作为默认 ...
- python下的orm基本操作(1)--Mysql下的CRUD简单操作(含源码DEMO)
最近逐渐打算将工作的环境转移到ubuntu下,突然发现对于我来说,这ubuntu对于我这种上上网,收收邮件,写写博客,写写程序的时实在是太合适了,除了刚接触的时候会不怎么完全适应命令行及各种权限管理, ...
- ChartDirector应用笔记(三)
前言 继上篇文章(Simple bar chart)推出之后,本篇文章继续ChartDirector的使用.在这篇Blog中,博主实现的是soft lighting bar.soft lighting ...
- nodejs+express+jade给我baby做个小相册
去年年底迎来了my little star.从此人生多了一个最重要的牵挂.生了宝宝全家人都太忙了.最近宝宝稍微大点了,终于有空可以研究下技术了.这是14年第一帖.废话不多了.开始吧 1.安装NTVS ...
- ActiveReports 报表应用教程 (9)---交互式报表之动态排序
在 ActiveReports 中除了提供对数据源进行排序的功能之外,还提供了最终用户排序功能,最终用户可以对报表进行区域内排序和整个数据源排序,结合数据钻取.过滤等功能可以让用户更方便地分析报表数据 ...
- [moka同学笔记]yii2.0小物件的简单使用(第二种方法)
1.在widgets/TestWidget.php中 <?php /** * Created by PhpStorm. * User: moka同学 * Date: 2016/08/05 * T ...
- Scala on Visual Studio Code
Download and install Scala Download a scala installation package from here. Then install it. Linux s ...