Servlet&JSP 第一章 Web应用程序简介

一、Web应用程序

Web应用程序是由客户端与服务器端两个部分组成的,客户端基本是浏览器,服务器端则是HTTP服务器,浏览器会请求服务器上放置的文件或资源。

二、关于HTML

1、HTML是以标签的方式来定义文件结构。

(1)HTML的标签通常是成对的,有开头标签与结尾标签(少数标签例外),整份HTML文件的定义编写在<html>与</html>标签之间,在文件开始呈现之前,浏览器必须先处理编写在<head>与</head>标签之间的元素,编写在HTML中的<title>与</title>标签之间的内容显示在浏览器窗口上(标题),浏览器若要针对文件内容绘制画面与定义行为,相关的信息定义在<body>标签之中。

(2)HTML标签可以拥有属性,定义该标签的额外信息。

二、URL、URN与URI

(1)URL的主要目的,是以文字方式来说明因特网上的资源如何取得。

URL的主要格式:<协议>:<特定协议部分>

协议指定了以何种方式取得资源,一些协议名的例子有:ftp(文件传输协议)、http(超文本传输协议)、mailto(电子邮件)、file(特定主机文件名)。

协议之后跟随冒号(:),特定协议部分的格式为://用户:<密码>@<主机>:<端口号>/<路径>

例1:资源放置在HTTP服务器上,主机名为openhome.cc,要以HTTP协议取得Gossip目录中index.html文件,端口号8080。

URL为:http://openhome.cc:8080/Gossip/index.html

例2:取得计算机文件系统中C:/workspace下的jdbc.pdf文件。

URL为:file://C:/workspace/jdbc.pdf

(2)URL代表资源的地址信息,URN则代表某个资源独一无二的名称,都是用来标识某个资源。

三、关于HTTP

HTTP是一种通信协议,指架构在TCP/IP之上应用层的一种协议。

1、按不同的联机方式与所使用的网络服务而定,会有不同的通信协议,发送信件时会使SMTP(简单邮件传输协议),传输文件时会使用FTP,下载信件时会使用POP3(邮局协议3),浏览器跟Web服务器之间使用的沟通但是是HTTP。

2、HTTP协议的两个特性

(1)基于请求(Request)/响应(Response)模型:HTTP协是一种基于请求/响应的通信协议,客户端对服务器发出一个取得资源的请求,服务器将要求的资源响应给客户端,每次懂得联机只做一次请求/响应,没有请求就不会有响应;

(2)无状态通信协议:在HTTP协议下,服务器响应客户端之后,就不会记得客户端的信息,更不会维护与客户端有关的状态,因此HTTP又称为无状态。

3、GET请求:就是向服务器取得(GET)指定的资源,在发出GET请求时,必须一并告诉服务器所请求资源的URL,以及一些标头(Header)信息。

(1)HTTP所有的通信数据都是使用“字符”来进行协议交换。

(2)使用GET方式发送请求,浏览器的地址栏上也会出现请求参数信息。

4、POST请求:就是在请求时发送(POST)信息给服务器,对于大量或复杂的信息发送,基本上会采用POST来进行发送,地址栏上不会出现请求信息。

5、请求参数通常是用户发送给服务器的必要信息,这个信息通常是利用窗体来发送的,服务器必须有这些信息才可以进一步针对用户的请求做出正确的响应。请求参数是在URL之后跟随一个问号(?),然后是请求参数名称与请求参数值,中间以等号(=)表示成对关系,若有多个请求参数,则以“&”字符连接。

6、如何选用GET或POST

功能上:

(1)过长的请求参数,或如文件上传这类的大量数据,应用POST请求。

(2)敏感性或有安全性考虑 的请求参数(如信用卡号码、用户名、密码等),不应该使用GET请求来发送。

(3)如果有些页面是根据请求参数来做不同的页面呈现(如论坛的文章发表),希望可以让用户设定标签,以便日后可以直接点击书签浏览,则应使用GET请求,POST请求无法加入浏览器的书签之中。

(4)有些浏览器会依网址来缓存数据,如果网址是相同的URL,则会直接从浏览器缓存中取出数据,而不会真正发送请求至服务器上查询最新的数据,如果不希望服务器状态改变了,而浏览器仍从缓存中取得旧的资料,则可以使用POST请求(使用GET请求也可以避免缓存,例如在网址上附加时间戳,让每次GET请求的网址都不相同)。

非功能上:(是否是等幂操作就是请求的操作是否改变服务器状态,同一个操作重复多次,是否传回同样的结果)

(1)GET请求应该用于等幂操作,GET请求纯粹取得资源,而不改变服务器上的数据或状态,GET请求且使用相同的请求参数重复发送多次,都应该传回相同的结果。

(2)POST请求应该用于非等幂操作,POST请求发送的数据,可能会影响服务器上的数据或状态,例如修改(增、删、更新)数据库的内容,或是在服务器上保存文件,请求若是会改变服务器的状态,则应用POST请求。

四、URL编码

1、保留字符:在URL规范中定义了一些保留字符,例“:”、“/”、“?”、“&”、“=”、“@”、“%”等字符,在URI中都有它的作用,必须在%字符之后以十六进制数值表示方式,来表示该字符的八个位数值。

例1:“:”字符真正存储时的八个位为00111010,用十六进制数值来表示则是3A,所以必须使用%3A来表示“:”。

2、如果想知道某个字符的URL编码是什么,在Java中可以使用java.net.URLEncoder的静态encode()方法来做这个编码的动作(要译码则使用java.net.URLDecoder的静态的decode()方法)

例2:

String str =URLEncoder.encode("http://openhome.cc","ISO-8859-1");
在URI规范中,空格符的编码为%20,而在HTTP编码中空白的编码为+,java.net.URLEncoder的静态encode()方法产生的字符串空格符的编码为+。

3、中文字符:URI规范的URL编码,针对的是字符UTF-8编码的八个位数值。UTF-8编码与ASCII字符的编码部分是兼容的。中文在UTF-8编码下会使用3个字符来表示。

例3:“林”在UTF-8编码下的3个字节,对应至十六进制数值表示为E6、9E、97,所以在URI规范下,“林”表示方式为&E6%9E%97。

例4:在一个BIG5网页中,若窗体使用GET发送“林”这个中文字,“林”的BIG5编码为两个字节,若以十六进制显示,则分别为AA、4C,如果通过窗体发送,由于网页是BIG5编码,则浏览器会自动将“林”编码为“%AA%4C”,服务器端处理请求参数时,就必须指定BIG5编码。

例5:

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class Demo01 {
public static void main(String[] args) {
	try {
		String str1=URLEncoder.encode("林","BIG5");
		String str2=URLEncoder.encode("林","UTF-8");
		String str3=URLEncoder.encode("http://openhome","ISO-8859-1");
		System.out.println("BIG5编码“林:”"+str1);
		System.out.println("UTF-8编码“林”:"+str2);
		System.out.println("URL编码:"+str3);
	} catch (UnsupportedEncodingException e) {

		e.printStackTrace();
	}	
}
}

运行结果:


五、静态网页与动态网页

1、静态网页:请求服务器上的网页时,服务器不对网页文件做任何处理,读取文件之后就直接当作响应传给浏览器。

2、动态网页:在服务器响应之前,可能先依客户端的请求参数、标头或实际服务器上的状态,以程序的方式动态产生响应内容,再传回给用户。

3、动态网页实际上会再经过服务器上的程序处理,再传回实际的响应内容,这类处理动态网页的技术有CGI(通用网关接口)、PHP(超文本预处理器)、ASP(动态服务器页面)、Servlet/JSP。

六、Servlet/JSP与JavaScrip的区别

Servlet/JSP是服务器上的一个技术,客户端通过HTTP协议和网络传送请求给Servlet/JSP,服务器上的Servlet/JSP经过运算处理后再将响应(HTML与JavaScript)传回给客户端,所有一切程序的处理都是在服务器上发生的。

JavaScript执行于客户端浏览器中,可以让你与浏览器沟通,操作浏览器中的网页画面与行为,也可以通过JavaScript来要求浏览器发出请求给服务器。

Servlet/JSP与JavaScript执行与不同的内存地址空间,两者无法做直接的互动,而必须通过网络通过HTTP来进行互动、数据交换或请求、响应。

七、Web容器

Servlet/JSP唯一认得的HTTP服务器。Servlet/JSP容器不仅持有对象,还负责对象的生命周期与相关服务的连接,JSP最终会被容器转译为Servlet并加载执行。

1、请求/响应的基本例子

(1)客户端(大部分情况下是浏览器)对Web服务器发出HTTP请求。

(2)HTTP服务器收到HTTP请求,并将请求转给Web容器处理,Web容器会剖析HTTP请求内容,创建各种对象(如HttpServletRequest、HttpServletResponse、HttpSession等)。

(3)Web容器由请求的URL决定要使用哪个Servlet来处理请求(事先由开发人员来定义)。

(4)Servlet根据请求对象(HttpServletRequest)的信息决定如何处理,通过响应对象(HttpServletResponse)来创建响应。

(5)Web容器与HTTP服务器沟通,Web服务器将响应转换为HTTP响应并传回客户端。

八、MVC模型

模型不会有相关的程序代码;视图负责画面相关逻辑;控制器知道某个操作必须调用哪些模型。

九、Model2模型

控制器取得请求参数、验证请求参数、转发请求给模型、转发请求给画面,这些都使用程序代码实现;模型接受控制器的请求调用,负责处理业务逻辑、负责数据存取逻辑等,这部分还可依应用程序功能,产生多种不同职责的模型对象,模型使用程序代码来实现;视图接受控制器的请求调用,会从模型提取运算后的结果,根据需求呈现画面,在职责分配良好的情况下,基本是可做到不出现程序代码,因此不会发生程序代码与HTML混杂在一起的情况。

Servlet实例1:

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Simple")
public class SimpleServlet extends HttpServlet{
	protected void doGet(HttpServletRequest request,HttpServletResponse response) throws 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();
	}
}
运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值