zoukankan      html  css  js  c++  java
  • 第一章 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了

  • 相关阅读:
    linux设备驱动归纳总结(三):7.异步通知fasync【转】
    linux设备驱动归纳总结(三):6.poll和sellct【转】
    linux设备驱动归纳总结(三):5.阻塞型IO实现【转】
    【转】14.5.6 禁止和激活中断线
    【转】ubuntu连接android设备(附最简单方法)
    【转】Everything中文绿色版在Win7/8用不了?
    【转】使用dos2unix批量转换文件
    【转】Android开发工具--android-studio-bundle-141.2288178
    【转】Win8/8.1/Win7小技巧:揪出C盘空间占用的真凶
    【转】文件同步软件FreeFileSync
  • 原文地址:https://www.cnblogs.com/BalmyLee/p/10716132.html
Copyright © 2011-2022 走看看