1 Java Web
本文将从最基础的HTTP协议开始讲起,介绍如何徒手搭建Web应用,内容如果比较多的话,后面会分成多篇逐步介绍。
2 HTTP协议
Web应用被称之为B/S架构,与其对应的的是C/S架构。这里面的B是Browser(浏览器),C是Client(客户端),S是Server(服务器)。客户端需要直接安装在访问终端上,不同访问终端(主要指不同的操作系统)需要提供不同的安装包,这增加了软件投产成本,换言之也就是软件可移植性差。B/S架构则相对简单,只要访问终端安装了浏览器就可以使用。现在的体系架构下,浏览器已经是操作系统的标配组件,所以不需要应用开发商额外做什么适配工作。这就是为什么我们认为B/S架构的应用可移植性比C/S架构强的原因。
B/S架构下,B和S之间的通信是通过HTTP协议进行的。HTTP协议是网络协议的标准组成部分,底层基于TCP协议实现。HTTP协议通俗理解有点类似于我们的日常对话,你问我答的形式。由B端发起询问,S端给出答案,回答的内容则是标准的字节流。浏览器在获取到字节流数据后,则根据协议的相关定义开始进行解析。其或者将内容渲染成一个HTML的页面,或者将其转换成一个文件,或者执行一段脚本……
HTTP协议不像平时我们使用的软件那样看得见摸得着,它是互联网的底层协议,虽然在互联网的世界里无处不在,但却像空气一样无法感知。为了直观了解HTTP协议,我们需要使用一些辅助的工具来帮助我们看到它。抓包工具就是我们所需要的辅助工具,比如WireShark。下图是访问www.sina.com.cn的时候的HTTP请求的截图:
请求www.sian.com.cn
www.sian.com.cn的响应
上面两张图中的Hypertext Transfer Protocol就是我们常说的HTTP协议,直译过来是超文本传输协议的意思。称其为超文本的原因,大概是制定该协议的人觉得这个协议能做的事情远远不止仅是文本传输那么简单。
Hypertext Transfer Protocol下面,也就是我们俗称的HTTP报文头了。比如Host指明了访问的服务器的域名、User-Agent给出了浏览器的相关信息、Accept给出了浏览器可以解析的文件格式清单(要求服务器必须按照当中的某一种格式返回)……
GET / HTTP/1.1这一行中给出了HTTP协议的方法,方法其实也可以简单翻译成动作。GET的意思是取,还有POST是提交……HTTP协议支持的方法有如下,一般用的最多的就是GET和POST了。下表给出了HTTP协议定义的所有方法:
方法 | 工作 |
---|---|
GET | 获取指定资源 |
POST | 提交指定资源 |
HEAD | 返回信息只有报文头 |
PUT | 替换指定资源 |
DELETE | 删除指定资源 |
CONNECT | 建立链接 |
OPTIONS | 设置参数 |
TRACE | 环回测试 |
PATH | 修改资源信息 |
GET后面紧跟的/是相对路径,/表示根路径,一般的Web应用会配置欢迎页面,比如index.html、index.jsp……如果GET给出的路径是/,则会返回/index.html或者/index.jsp的内容。
HTTP/1.1则是HTTP协议的版本号了,表示使用1.1版本的HTTP协议。
3 Servlet
对于Web应用的服务端来说,主要就是需要解析浏览器提交过来的HTTP协议内容,并生成对应的HTTP响应。
Servlet则是Web应用处理上述过程的标准。它将HTTP协议的请求抽象成ServletRequest,HTTP响应则抽象成ServletResponse对象。
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}
上面这段代码是Servlet接口的定义,其中的service
方法是处理HTTP请求的核心方法。方法的参数中ServletRequest
是HTTP的请求,ServletResponse
是HTTP的响应。Servlet的功能就是根据ServletRequest
的信息,生成对应的ServletResponse
。
public interface ServletRequest {
public Object getAttribute(String name);
public String getParameter(String name);
public BufferedReader getReader() throws IOException;
public String getLocalName();
public String getLocalAddr();
public int getLocalPort();
public ServletContext getServletContext();
}
ServletRequest中有很多方法,上面截取了部分方法,主要是想说明ServletRequest对象可以获取到HTTP协议中传输的所有内容。
public interface ServletResponse {
public String getCharacterEncoding();
public String getContentType();
public ServletOutputStream getOutputStream() throws IOException;
public PrintWriter getWriter() throws IOException;
}
上面这段是ServletResponse的部分方法,不做赘述。值得注意的是,ServletRequest中有一个getReader
方法,而ServletResponse中有一个getWriter
方法。因为Request是客户端提交的请求,服务器需要去读它,而Response是服务器端给出的响应,服务器需要去写它。
4 后续
下面需要简单介绍下一个Web工程的目录结构,而后就可以开始徒手构建一个简单的Web应用了,等下篇再继续。
5 结论
HTTP协议是基础,抓包工具可以多用用。^_^