第一章 Web应用程序开发基础

一、HTTP协议工作机制

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它是一种主流B/S架构中应用的通信协议。具有以下特点:
1、无状态
  服务端不会记录客户端每次提交的请求,服务器一旦相应客户端之后,就会结束本次的通信过程。客户端下一次的请求是一个新的 连接,和上一次通信没有任何关系。
2、简单灵活
  HTTP是基于请求(request)和响应(response)的模型
3、支持客户端与服务端
  支持主流的B/S架构的通信以及C/S架构的通信。
  注意:C/S架构可选的协议有多种,例如:TCP/IP,UDP,HTTP
​  而B/S架构通常只支持HTTP协议

HTTP协议的工作原理

  • 四个步骤

  • 工作原理

  (1)连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。( 客户端-----通过socket建立连接-----服务器)
  (2)请求:Web浏览器通过socket向Web服务器提交请求。HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递)。GET命令的格式为:GET 路径/文件名 HTTP/1。其中,文件名指出所访问的文件,HTTP/1.0指出Web浏览器使用的HTTP版本。
  (3)应答:Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。例:假设客户机与www.mycompany.com:8080/mydir/index.html建立了连接,就会发送GET命令:GET /mydir/index.html HTTP/1.0。主机名为www.mycompany.com的Web服务器从它的文档空间中搜索子目录mydir的文件index.html。如果找到该文件,Web服务器把该文件内容传送给相应的Web浏览器。为了告知 Web浏览器传送内容的类型,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开。其中,常用的HTTP头信息如下。
  HTTP 1.0 200 Ok:这是Web服务器应答的第一行,列出服务器正在运行的HTTP版本号和应答代码。代码"200 OK"表示请求完成。
  MIME_Version:1.0:它指示MIME类型的版本。
  content_type:类型:这个头信息非常重要,它指示HTTP体信息的MIME类型。如:content_type:text/html指示传送的数据是HTML文档。
  content_length:长度值:它指示HTTP体信息的长度(以字节为单位)。
  (4)关闭连接 :当应答结束后,Web浏览器与Web服务器必须断开,以保证其他Web浏览器能够与Web服务器建立连接。

客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例

http的特点

1)支持客户/服务器模式。(c/s模式)
2)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3)灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4)无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5)无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

解决http的无状态的问题:cookie和session

  • Cookie

  两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session
  由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。

  Cookie是通过客户端保持状态的解决方案。从定义上来说,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。
  cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。
会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘中的cookie可以在不同浏览器间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式

  Cookie支持跨域名访问,例如将domain属性设置为“.helloweenvsfei.com”,则以“.helloweenvsfei.com”为后缀的所有域名均可以访问该Cookie。跨域名Cookie现在被广泛用在网络中,例如Google、Baidu、Sina等。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。 

生成Cookie对象:

java.util.Date date = new java.util.Date(); 
// 前面一个参数是key,后面一个参数是value值。
Cookie c = new Cookie("lastVisited",date.toString());
// 设定Cookie的有效期,单位为毫秒
c.setMaxAge(60*60*24);
// Cookie的路径与域名: 
c.setPath("/"); 
c.setDomain(".v512.com");
// 发送Cookie对象: 
response.addCookie(c);

读取或设置Cookie:

 1 // 读取Cookie
 2 Cookie [] cookies=request.getCookies(); 
 3 Cookie c = null; 
 4 if(cookies!= null) { 
 5     for(int i=0;i<cookies.length;i++) { 
 6          c = cookies[i]; 
 7          out.println("cookie name:"+c.getName()+"<br>"); 
 8          out.println("cookie value:"+c.getValue()+"<br>"); 
 9      } 
10 } 
11 
12 // 修改Cookie: 
13 Cookie [] cookies=request.getCookies(); 
14 Cookie c = null; 
15 } 
16 
17 //删除Cookie:即把Cookie的失效时间设置为0即可。 
18 c.setMaxAge(0);
19 
20 //Cookie文本信息的大小和数量有限制。以明文保存,没有任何加密措施。 
21 for(int i=0;i<cookies.length;i++) 
22 { 
23          c = cookies[i]; 
24          if(c.getName().equals("lastVisited")) 
25          { 
26              c.setValue("2010-10-1"); 
27              c.setMaxAge(6000); 
28              response.addCookie(c); 
29          } 
30 } 
  • session

   当然还是在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的。在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。

创建或者获取session:

 1 package xdp.gacl.session;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import javax.servlet.http.HttpSession;
 9 
10 public class SessionDemo1 extends HttpServlet {
11 
12     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
13         response.setCharacterEncoding("UTF=8");
14         response.setContentType("text/html;charset=UTF-8");
15         // 使用request对象的getSession()获取session,如果session不存在则创建一个
16         HttpSession session = request.getSession();
17         // 或 HttpSession session = request.getSession(boolean);
18         
19         //将数据存储到session中 session.setAttribute("key", 值对象);
20         session.setAttribute("userId", "100001");
21         
22         // 获取session的Id
23         String sessionId = session.getId();
24         
25         // 获取session值 对象类型 obj = (对象类型)session.getAttribute("key");
26         String name = (String)session.getAttribute("userId");
27         
28         // 删除session 指定属性健:
29         session.removeAttribute("userId");
30 
31         // 判断session是不是新创建的
32         if (session.isNew()) {
33             response.getWriter().print("session创建成功,session的id是:"+sessionId);
34         }else {
35             response.getWriter().print("服务器已经存在该session了,session的id是:"+sessionId);
36         }
37         
38         // 清除所有的session,使当前 session 完全失效:
39         session.invalidate();
40     }
41 
42     public void doPost(HttpServletRequest request, HttpServletResponse response)
43             throws ServletException, IOException {
44         doGet(request, response);
45     }
46 }

session超时周期设置:

1.Tomcat 安装位置 conf/web.xml :

<session-config>
    <!-- 设置消失时长3分钟 -->
    <session-timeout>30</session-timeout>
</session-config>

2. Tomcat 安装位置 conf/server.xml:

<!-- defaultSessionTimeOut="3600"  单位:秒-->
<Context path="/test" docBase="/test"
  defaultSessionTimeOut="3600" isWARExpanded="true"
  isWARValidated="false" isInvokerEnabled="true"
  isWorkDirPersistent="false"/>

3、Java 代码设置:

//单位:秒
HttpSession session = request.getSession();
session.setMaxInactiveInterval(1200);

其他说明:
1. session 过期情况:

(1)、客户端浏览器关闭:
(2)、session 会话过期;
(3)、客户端会话调用了 .invalidate();

2. 浏览器关闭与session是否还在;
  当客户端浏览器关闭后,session 在服务端还是会存在一定时间的,只是当浏览器器再次打开时,就会生成一个新的 session ,浏览器通过生成的 sessionid 属性来 匹配服务端的 session; 那上次的session 虽然还在,但是就访问不到了;
3. <% @ page session="false" %> 是什么情况?:
  这句话的意思是,当前不能使用 session, 但是 页面 session 还是可以创建的;
4. session 在什么时候 被创建:
  在 程序 调用 HttpServletRequest.getSession(true) 时创建;如果 页面没有使用 <%@ page session="false"%> 时,在 jsp 页面编译成 Servlet 时,会自动 加上 HttpSession session = HttpServletRequest.getSession(true);

  • cookie 和session 的区别:

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session,将登陆信息等重要信息存放为SESSION,其他信息如果需要保留,可以放在COOKIE中
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE
4、单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
5.session需要借助cookie才能正常工作。如果客户端完全禁止cookie,session将失效。
6.session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。
7.session调用了 session.invalidate()方法或者前后两次请求超出了session指定的生命周期时间,Session会销毁,否则在用户会话结束后就会关闭了。但若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。保存在硬盘里的,可以长期保存
8.session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器能够知道其中的信息。
9.Session则不会支持跨域名访问。Session仅在他所在的域名内有效。

二、Web应用程序及其优点

应用程序类型

1、C/S类型应用程序:Client客户端/Server服务器
  客户端必须安装专门的一个桌面软件才能使用。
  优点:速度快,安全性高,客户端比较强大
  缺点:每台客户端计算机都要下载安装升级,部署维护困难
  例如:QQ,各种网络游戏
2、B/S类型应用程序:Browser浏览器/Server服务器
  客户端不用安装特定的软件,只要通过浏览器打开就可使用。
  优点:维护容易,只需要维护服务器
  缺点:速度慢,安全性相对较低,客户端较弱
  例如:WebQQ,各大网站,各种网页游戏

什么是Web应用程序?

  Web应用程序是一种可以通过Web访问的应用程序。Web应用程序的一个最大好处就是用户很容易访问应用程序。用户只要有浏览器即可,不需要再安装其他软件。web应用程序举例:淘宝、天猫、新浪、搜狐。web应用程序开发,是目前软件开发领域的三大方向之一。

web应用程序的优缺点:

优点

  • 网络应用程序不需要任何复杂的“展开”过程,你所需要的只是一个适用的浏览器;
  • 网络应用程序通常耗费很少的用户硬盘空间,或者一点都不耗费;
  • 它们不需要更新,因为所有新的特性都在服务器上执行,从而自动传达到用户端;
  • 网络应用程序和服务器端的网络产品都很容易结合,如email功能和搜索功能;
  • 因为它们在网络浏览器窗口中运行,所以大多数情况下它们是通过跨平台使用的 (例如Windows,Mac,Linux等等)

缺点

  • 网络应用程序强调浏览器的适用性。如果浏览器方没有提供特定的功能,或者弃用特定的平台或操作系统版本(导致不适用),就会影响大量用户;
  • 网络应用依靠互联网远程服务器端的应用文件。因此,当连接出问题时,应用将不能正常使用。但是,如果使用HTML5 API,这些应用就可以被下载安装而可离线使用。Google Gears,就是一个好例子;
  • 许多网络应用程序不是开源的,只能依赖第三方提供的服务,因此不能针对用户定制化、个性化,而且大多数情况下用户不能离线使用,因而损失了很多灵活性;
  • 它们完全依赖应用服务商的可及性。如果公司倒闭,服务器停止使用,用户也无法追索以前的资料。对比而看,即使软件制造商倒闭了,传统的安装软件也可以继续运行,尽管不能再更新或有其他用户服务;
  • 相似地,提供方公司对软件和其功能有了更大的控制权。只要他们愿意就能为软件添加新特性,即使用户想等bugs先被解决再更新。跳过较差的软件版本也不可能了。公司可以强加不受欢迎的特性给用户,也可以随意减少带宽来削减开支。当然,公司会尽量地讨用户欢喜——只在有竞争者提供更好的服务与方便的转接性的情况下。否则用户别无选择,只能默默承受;
  • 公司理论上可以检索任何的用户行为。这有可能引起隐私安全问题。

三、Web应用程序的基本结构

一个Web应用程序基本上由以下项目组成:

1.静态资源(HTML,CSS,图片,声音等)
2.Servlet
3.JSP
4.自定义类
5.工具类
6.部署描述文件(web.xml等)、设置信息(Annotation等)

  Web应用程序目录结构必须符合规范。例如,如果一个应用程序的环境路径(Context path)是/HelloServlet,则所有的资源项目必须以/HelloServlet为根目录依规定结构摆放。基本上根目录中的资源可以直接下载,若index.html位于/HelloServlet下,则可以直接以/HelloServlet/index.html来取得。
  Web应用程序存在一个特殊的/WEB-INF子目录,此目录中存在的资源不会被列入应用程序根目录中可直接访问的项。即,客户端(如Browser)不可以直接请求/WEB-INF中的资源(直接在网址上指明访问/WEB-INF),否则就是404 Not Found的错误结果。/WEB-INF中的资源项目有着一定的名称与结构。

(1)/WEB-INF/web.xml 是部署描述文件
(2)/WEB-INF/classes 用来放置应用程序用到的自定义类(.class),必须包括包(package)结构。
(3)/WEB-INF/lib 用来放置应用程序用到的JAR文件。

四、Tomcat Web服务器的安装与配置

1、先下载适应于64为Windows操作系统的Tomcat服务器
  地址:http://tomcat.apache.org/
2、解压tomcat下载压缩包
3、配置Tomcat服务器的运行环境和Java环境。

我是通过写bat批处理文件实现,不需要配置Windows系统的环境变量,只需要简单的写一个bat批处理文件,点击运行后即可启动Tomcat服务器,具体的启动Tomcat服务器.bat的代码如下:

rem tomcat安装bin目录
set path=D:codeapache-tomcatin 
rem JDK安装跟目录
set JAVA_HOME=C:programjavajdk
rem tomcat安装根目录
set CATALINA_HOME=D:codeapache-tomcat
rem tomcat startup.bat文件路径
start D:codeapache-tomcatinstartup.bat

  如果配置正确,在浏览器输入 locahost:8080即可打开Tom猫的欢迎页面。
  现在如果想换掉自己写的欢迎页面,比如想在浏览器打开locahost:8080地址后,打开一个叫做 zhangphil.html文件,那么需要修改apache-tomcatconfweb.xml文件,找到web.xml里面的定义welcome-file-list,原始的定义是这样的:

  通过locahost:8080默认打开的就是welcome-file-list下面定义的文件,Tomcat服务器会自动从上往下寻找列表中的文件,找到就加载。可以在index.html前添加 <welcome-file>welcome.jsp</welcome-file>实现默认的打开自己写的welcome.jsp文件:

    <welcome-file-list>
        <welcome-file>welcome.jsp</welcome-file>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list> 

那welcome.jsp应该放在哪里呢?是在ROOT下面,即apache-tomcatwebappsROOT:

修改好web.xml,把welcome.jsp放到ROOT下面,此时再打开http://localhost:8086/后:

 

五、在eclipse中配置Tomcat、JRE

  • 配置JRE

  1、配置JRE环境,通俗点讲就是添加一个不同版本的jdk:window-->preferences-->java-->installed jre

  2.点击添加按钮

  

  3、选择一个本机正确的jdk路径   name和下面lib加载都是系统自动完成的  选择好路径后  点 finish就ok了

  •  配置tomcat

  1、window-->preferences-->server-->runtime envrionments

  2、选择一个tomcat eclipse版本不同 ,可选择tomcat版本的也不一样  这里选择8.0

2、配置tomcat目录,选择jdk版本

  

  3、name 系统自动生成 选择对应版本的tomcat6.0选择1.6,7.0选择1.7,8.0选择1.8不然容易出问题,点击 finish就ok了

原文地址:https://www.cnblogs.com/BalmyLee/p/10716132.html