zoukankan      html  css  js  c++  java
  • Servlet学习总结

    JavaWeb应用程序中所有的请求-响应都是由Servlet来完成的。Servlet是Java Web的核心程序,所有的网址(请求-响应)都交给Servlet来处理。

     

    Servlet在Web应用中被映射成一个URL(Uniform Resource Locator),该URL可以被客户端浏览器请求,当用户向指定URL对象的Servlet发送请求时,该请求被Web服务器接收到,该Web服务器负责处理多线程、网络通信等功能,而Servlet的内容则决定了服务器对客户端的响应内容。

     

    #.常用的Web服务器

        1)Apache

        2)IIS

        3)Tomcat

     

    #.主流的(Java Web)应用服务器(不仅包括web服务...)

        1)Tomcat或者Tomcat+Apache

        2)Resin

        3)JBoss

        4)WebLogic Server

        5)WebSphere

    6)IIS

     

    #.Tomcat的目录结构

        1)lib目录:存放部署Java类库

        2)bin目录:存放与Tomcat运行有关的类、类库和DOS的批处理文件

        3)webapps目录:存放部署的Web应用

        4)work目录:存放临时生成的Servlet源文件和class文件

        5)logs目录:存放Tomcat服务器运行时所产生的日志文件

        6)temp目录:存放临时文件      

       

    #.Servlet是sun公司制订的一种用于扩展web服务器功能的组件规范。

        扩展方式:早期采用CGI(common gateway interface)技术。因采用 cgi程序编写的代码,可移植性差、编程相当复杂。

        现在,采用的是 【容器+组件】的方式来扩展。

        【组件:】符合规范,实现特定功能,并且可以部署在容器上的软件模块

        【容器:】符合规范,为组件提供运行环境,并且管理组件的生命周期

        (将组件实例化,调用其方法、销毁组件的过程)的软件程序;

        采用【容器+组件】这种编程模型的优势:容器负责大量的基础服务

        (包括浏览器与服务器之间的网络通信、多线程、参数传递等等)。而组件只需要处理业务逻辑。另外,组件的运行不依赖于特定的容器

    #.Servlet处理流程

        1)客户端使用浏览器提交对Servlet的调用的Get或者Post请求

        2)服务器接到请求后,如果该Servlet是第一次被调用,实例化这个Servlet

        3)服务器调用该Servlet对象的service()方法

        4)Servlet产生动态的回复内容

        5)服务器发送服务内容给客户端的浏览器

    #.Servlet生命周期:

        1)加载Servlet类

        2)实例化(调用类的构造方法)

        3)初始化(调用该类对象的init()方法)

        4)处理请求(调用该类对象的service()、doGet()或doPost()方法)

        5)销毁对象(调用该类对象的destory()方法)

        注:在整个Servlet生命周期,只创建一个Servlet对象,提供服务,处理请求是以多线程的方式进行的,为了线程安全,一般不要在Servlet类中定义成员变量,避免多个请求共用一个成员变量,而是在方法中定义局部变量。

        Servlet会在服务器启动(如果load-on-startup为1)或第一次请求Servlet时(如果load-on-startup为0)初始化一个Servlet对象,然后用这个Servlet对象去处理所有客户端的请求。服务器关闭时才销毁这个Servlet对象。无论请求多少次Servlet,最多只有一个Servlet实例。多个客户端并发请求Servlet时,服务器会启动多个线程分别执行该Servlet的service()方法。一个Servlet的生命周期如下图所示:

    #.servlet是如何运行的?

        当用户向浏览器地址栏输入:http://ip:port/appname/servlet的url-pattern配置

        1)浏览器使用ip:port(端口号)连接服务器

        2)浏览器将请求数据按照http协议封装成一个数据包(请求数据包)发送给服务器

          请求数据包的内容包含了请求资源路径(/helloweb/sayhello?name=zs),另外,

          在请求数据包中,还会包含浏览器自动生成的一些信息。

        3)服务器创建两个对象:请求对象(Request)和响应对象(Response)

          服务器解析请求数据包,将解析之后的数据存放到请求对象里面,方便

         servlet读取请求数据(因为servlet不用解析请求数据包,否则,需要理解http协议)。

          请求对象是HttpServletRequest接口的一个实现。

          响应对象是HttpServletResponse接口的一个实现,响应对象用于存放servlet处理的结果。

        4)依据请求资源路径找到相应的servlet配置,通过反射创建servlet实例,

          然后调用其service()方法。在调用service()方法时,会将事先创建好的请求对象(request)

          和响应对象(response)作为参数进行传递。在servlet内部,可以通过request获得请求数据,

          或者通过response设置响应数据。

        5)服务器从response中获取数据,按照http协议打成一个数据包(响应数据包),发送给浏览器。

        6)浏览器会解析响应数据包,取出相应的数据,生成相应的页面。 

       

    #.javac-cp servlet-api.jar -d . HelloServlet.java

        # -cp表示告诉java编译器去哪里找需要的class文件

        # -d .表示将编译生成的字节码文件放入当前文件夹下

    #.运行Servlet,

        如果报500错误,一般是程序写错了;

        如果报404错误,访问地址有错;

        如果报405错误,请检查service方法名、方法参数等

       

    #.http(超文本传输协议,hypertexttransport protocal) 是一种应用层协议,定义了浏览器(也可以是其它程序)与web服务器之间通讯的过程与数据的格式。浏览器与服务器之间的连接,只能处理一次请求,然后立即关闭。这种通讯方式,可以让服务器以有限的资源为更多的客户端服务。

       

    #.http协议数据包的结构:

        1)请求数据包的结构

        第一部分:请求行(数据包中的一行内容)

           请求行包括三部分内容:

           !请求方式(get/post)

           !请求资源路径(端口号之后的内容,比如/appname/servlet)

           !协议的类型与版本

        第二部分:若干消息头(由W3C定义的一些有特殊含义的键值对)

           消息头的样式,比如:content-type=text/html;

           服务器和浏览器都会遵守这些消息头的约定。

           消息头一般由服务器或者浏览器自动生成,但也可以通过编程的方式生成

        第三部分:实体内容

           如果请求方式是post方式,请求参数及值会放在这儿。

           如果请求方式是get方式,请求参数与值是包含在请求资源路径里

          

        2)响应数据包的结构:

        第一部分:状态行

           协议的类型与版本

           状态码(状态码是一个数字,不同的数字代表不同的含义,如:

           500:系统错误,即程序代码有错误

           404:找不到资源,访问路径错误

           200:正确)

           状态码的描述

        第二部分:若干消息头

        第三部分:实体内容

           服务器返回给浏览器的处理结果

          

    #get/post请求

        1)哪一些是get请求

        !在浏览器地址栏直接输入一个地址

        !表单默认的提交方式

        !点击链接

        2)哪一些是post请求

        !给表单设置method="post"

        3)get/post方式的区别

        !get方式会将请求参数及参数值放在请求资源路径里面,携带的数据大小有限制,不适合提交大量的数据;post方式会将请求参数及参数值放在实体内容里面,理论上没有限制,适合大量数据的提交

        !安全上讲,post方式相对安全(因为请求参数及值存放在实体内容里面,而get方式会将请求参数及值显示在浏览器地址栏)。但是要注意,post方式并没有将数据加密。

       

    #表单处理,如何获得请求参数值

        1)String request.getParameter(String paraName);

        要注意的问题:如果paraName与实际的请求参数名不一致,则返回null。如果没有输入参数值,则返回“”。

        2)String[] request.getParameterValues(StringparaName);

        用在有多个请求参数名相同的情况下使用。比如:?interest=fishing&interest=cooking

       

    #重定向:

        服务器向浏览器发送一个状态码302及一个消息头location,浏览器收到后,会立即向location所指向的地址发送请求。

        使用:response.sendRedirect(String url);//url是重定向的地址

        特点:重定向的地址是任意的;重定向之后,浏览器地址栏的地址变成了location所指定的地址。

        注意:重定向之前,不能够有out.close()或者out.flush()操作。

        重定向之前,若response对象缓存有数据,则这些数据会被清空。

       

       

    #cookies介绍

        1.服务器可以向客户端写内容

        2.只能是文本内容,而且有大小限制,一般是小于4K

        3.客户端可以阻止服务器写入

        4.只能拿自己webapp写入的东西

        5.Cookie分为两种:

           !属于窗口/子窗口(放在浏览器对应内存中,与浏览器共存亡)

           !属于文本(有生命周期的)

       6.一个Servlet/Jsp设置的cookies能够被同一路径下面或者子路径下面的Servlet/Jsp读到(路径=URL;路径!=真实文件路径)

        7.如何创建cookies?(在服务端创建,存放到客户端)

           Cookie cook = new Cookie(Stringname,String value);

           cook.setMaxAge(30);//存在时间,单位:秒,若不设置,则不保存

        8.如何将cookie添加到客户端?

           response.addCookie(cook);

        9.如何读取客户端的cookie到服务器端?

           Cookie[] cookies = request.getCookies();

        10.在服务器端删除客户端的Cookies?

           Cookie[] cookies = request.getCookies();

           cookies[i].setMaxAge(0);//设置生存期为0,即删除

    #Session介绍

        1.服务器的一块内存(存Key-Value)

        2.和客户端窗口对应(包括其子窗口)

        3.客户端和服务器端有对应的SessionID

        4.客户端向服务器端发送SessionID的两种方式:

           !cookie(内存cookie)

           !rewrite URL

        5.浏览器禁掉cookie,就不能使用session(使用cookie实现的session)

        6.如果想安全的使用session(不论客户端是否禁止cookie),只能使用URL重写方式。

        7.如何得到session

        HttpSession hs = request.getSession(true);

        8.向session添加属性

        hs.setAttribute(String name,Object value);

        9.从session得到某个属性

        String name = hs.getAttribute(String name);

        10.从session删除某个属性

        hs.removeAttribute(String name);

    #CookieVS Session比较

        1.Cookie保存在客户端,Session保存在服务器端,

        安全性:Cookie<Session;

        2.Cookie生命周期是累积的,从创建时开始计时,并且不受主机关机影响;Session生命周期是间隔的,不访问Session连续时间达到设定值时,生命周期才结束,并且主机关机将使Session生命周期结束;

       

        3.Cookie通过网络在客户端与服务器端传输,而Session保存在服务器端不需要传输,但需要在浏览器端保存一个SessionId即可;

       

    #ServletContext用法

        1.存在于服务器端,所有访问服务器的客户端共用

        2.得到ServletContext:this.getServletContext();(this-->Servlet子类)

        3.添加属性:setAttribute(String name,Object obj);

        4.获得属性:(Object)getAttribute(String name);

        5.删除属性:removeAttribute(String name);

        6.生命周期:ServletContext中的属性从创建开始,到服务器关闭而结束,鉴于其长期存在于服务器内存中,一般不会向其中放入太大数据量;

    #.JavaWeb的目录结构

    根据Servlet规范,Web程序有自己特定的结构,部署时必须按照这样的结构部署。

     

    Web应用程序访问过程:

        用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求。服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应。浏览器收到回应,再把回应的内容显示出来。这种请求-响应模式(Request-Response)就是典型的Web应用程序的访问过程。

    请求与响应:

        客户端浏览器发送一个请求,服务器处理一系列操作后做出一个响应,发送给客户端,完成一次Web过程操作。

        客户端浏览器发出的请求被封装成为一个HttpServletRequest对象。所有的信息包括请求的地址,请求的参数,提交的数据,上传的文件,客户端的IP地址甚至客户端操作系统都包含在HttpServletRequest对象中。

        Java Web应用程序中,处理请求并发送响应的过程是一种叫做Servlet的程序来完成的。Servlet是Java Web的核心程序,所有的网址最终都交给Servlet来处理。Servlet并没有main之类的执行方法。当用户访问服务器的时候,Tomcat是通过调用Servlet的某些方法来完成整个处理过程的。浏览器与服务器的交互都是利用HTTP协议完成的。

  • 相关阅读:
    mina中的发送延时
    微服务理论之五:微服务架构 vs. SOA架构
    同步
    JAVA中线程同步的方法(7种)汇总
    http连接管理
    MySQL存储引擎比较
    ZAB与Paxos算法的联系与区别
    syslog之二:syslog协议及rsyslog服务全解析
    微服务理论之六:ESB与SOA的关系
    DBCP连接池原理分析及配置用法
  • 原文地址:https://www.cnblogs.com/heartstage/p/3390458.html
Copyright © 2011-2022 走看看