Web应用程序基础知识
Web应用程序是由客户端与服务器端两部分组成。客户端基本是浏览器,服务器端是HTTP服务器,浏览器会请求服务器上放置的文件或资源。
关于HTML
HTML是以标签的方式来定义文件结构,标签通常成对。
当浏览器从服务器取得这份HTML文件之后,就可以按照其中的结构等信息进行画面的绘制。
URL、URN、URI
Uniform Resource Locator/Name/Identifier
URL的主要目的是以文字方式来说明因特网上的资源如何取得。
主要格式为: <协议>:<特定协议部分>
协议指定了以哪种方式取得资源:
- ftp 文件传输协议
- http 超文本传输协议
- mailto 电子邮件
- file 特定主机文件名
特定协议部分的格式:
//<用户>:<密码>@<主机>:<端口号>/<路径>
关于HTTP
HTTP是基于请求/响应的通信协议,架构在TCP/IP之上应用层的一种协议。浏览器和Web服务器之间使用的沟通方式是HTTP。
在HTTP协议之下,服务器响应客户端之后,不会记得客户端的信息,也不会维护与客户端有关的状态,因此HTTP又称无状态的通信协议。
浏览器在使用HTTP发出请求时,有GET、POST、HEAD、PUT、DELETE等请求方法。
GET和POST请求是使用Servelet/JSP时最常接触的两个请求方式。从功能面上如何选择呢?
- GET请求跟随在URL之后的请求参数长度是有限的,过长的请求参数或如文件上传这类的大量数据应该用POST请求。
- GET请求的请求参数会出现在地址栏上,敏感性或有安全性考虑的请求参数(如信用卡号码、用户名、密码等),就不该使用GET请求来发送。
- POST请求的请求参数不会出现在地址栏上,所以无法加入浏览器的书签之中,如果有些页面是根据请求参数来作不同的画面呈现,而你希望可以让用户设定标签,以便日后可以直接点击书签浏览,则应该使用GET请求。
- 如果不希望浏览器的状态改变,仍从缓存中取得旧的资料则可以使用POST请求。
从非功能面来讲,可以按请求是否为等幂操作来决定使用GET还是POST。是否为等幂操作,即请求的操作是否改变服务器状态,同一个操作重复多次是否传回同样的结果。- GET请求应该用于等幂操作。只是纯粹取得资源,并不改变服务器上的数据或状态。
- POST请求应该用于非等幂操作。
有关URL编码
1.保留字符
URI的规范中定义了一些保留字符,如“:”,“/”,“?”,“&”,“=”,“@”,“%”等字符。如果在请求参数上表达URI中的保留字符,必须在%字符之后以十六进制数值表示方式来表示该字符的八个数值。
2.中文字符
URI规范的URL编码,针对的是UTF-8编码的八位数值,中文在UTF-8编码下用三个字节来表示。
“林”这个字在UTF-8编码下的三个字节对应至十六进制数值表示就是E6、9E、97,即“%E6%9E%97”。
浏览器会自动将URI编码显示为中文。
在URI规范上若如以上方式发送请求参数,服务器端处理请求参数时,必须使用UTF-8编码来取得正确的中文。而在HTTP规范下的URL编码并不限使用UTF-8。
动态网页和静态网页
静态网页即请求服务器上的网页时,服务器不对网页文件作任何处理,读取文件之后就直接当作响应传给浏览器。而动态网页(本书)指的是服务器在响应之前,可能先依客户端的请求参数、标头或实际服务器上的状态,以程序的方式动态产生相应内容,再传回给用户。
Servelet/JSP是服务器上的一个技术,客户端通过HTTP协议和网络传送请求给Servelet/JSP,服务器上的Servelet/JSP经过运算处理后再将响应传回给客户端,所有一切程序的处理都是在服务器上发生的。
Servlet/JSP简介
在前面我们说过,JVM是Java程序唯一认识的操作系统,其可执行文件为.class文件。现在学习Servelet/JSP也有个重要的概念:“Web容器是Servlet/JSP唯一认得的HTTP服务器。”
何谓Web容器
容器其实就是一个用Java写的程序,运行于JVM之上,不同类型的容器会负责不同的工作,以Servelet/JSP运行的Web容器也是一个Java写的程序。
在容器的世界中,真正负责请求、响应的是Servlet。
1.客户端对Web服务器发出HTTP请求。
2.HTTP服务器接受到HTTP请求,将请求转由Web容器,Web容器会剖析HTTP请求内容,创建各种对象(HttpServletRequest、HttpServletResponse、HttpSession等)。
3.Web容器由请求的URL决定使用哪个Servlet来处理。
4.Servlet根据请求对象的信息决定如何处理,通过响应对象来创建响应。
5.Web容器与HTTP服务器沟通,Web服务器将响应转换为HTTP响应并传回客户端。
Servlet与JSP的关系
JSP会被Web容器转译为Servlet的“.java”源文件、编译为“.class”文件,然后加载容器之中,所以最后提供服务的还是Servlet实例。
Servlet:
package cc.openhome;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SimpleServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Simple Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>" + new java.util.Date() + "</h1>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
Servlet类必须继承HttpServlet;
输出HTML时,必须通过Java的输入输出功能(从HttpServletResponse取得PrintWriter),并使用Java程序取得服务器上的时间,再用+号运算符串接为字符串进行输出。
还有一个产生同样结果的JSP:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<html>
<head>
<title>SimpleJSP</title>
</head>
<body>
<h1><%= new java.util.Date() %></h1>;
</body>
</html>
JSP的功能角色就是从网页编辑者的角度、方便设计网页画面来解决问题。Servlet主要从事Java程序逻辑的定义,应该避免直接在Servlet中产生画面输出。