美文网首页程序员
第五部分 servlet 基础

第五部分 servlet 基础

作者: 孙浩j | 来源:发表于2017-12-26 21:05 被阅读32次

    cs和bs架构

    cs是客户端服务器模式;bs是浏览器服务器模式。它们最主要的区别是cs架构的应用程序需要在用户的计算机上进行安装。如我们常用的word,excel等应用软件和网络游戏属于cs架构;而bs架构的应用程序不需要在用户的计算机上进行安装,只需要有一个浏览器就可以运行bs架构的应用程序。

    小结:CS响应速度快(充分发挥了每个客户端的处理能力),安全性强,一般应用于局域网中,但是开发维护成本高;BS可以实现跨平台,客户端零维护,但是个性化能力低,响应速度较慢。所以有些单位日常办公应用BS,在实际生产中使用CS结构。

    服务器工作原理

            在Java方面,web容器一般是指Servlet容器。Servlet容器就是用来运行你的Servlet和维护它的生命周期的运行环境。Servlet容器会自动加载Servlet


    四大角色三大协议

    第一:浏览器和服务器通过http协议进行传输

    第二:服务器和具体的java代码是通过servlet接口进行传输的

    第三:servlet接口和数据库访问是通过jdbc接口进行传输的

    浏览器-服务器请求响应原理

    当服务器开启,浏览器与服务器链接成功后(服务器其实就是网络变成中的服务器端)

    当浏览器访问的是静态界面时,浏览器将访问请求传给了服务器,服务器会根据后缀先判断出它是一个静态的html,然后通过流的方式,读取这个html页面中的内容,将它内容响应给浏览器,这时候浏览器就显示了静态的html。(html协议)

    当浏览器访问的是一个类的时候,浏览器把请求的类(servlet)和地址后面的参数一起传给服务器,服务器判断出它不是一个静态的html,服务器加载调用这个类后就又把这些参数传给了这个类,服务器只是一个链接浏览器的程序,并不能处理参数,处理参数我们只能在访问的这个类中进行,而当浏览器访问的不是静态的html的时候,服务器根本无法通过类名确定请求的是哪个类,所以我们需要通过配置文件,进行映射关系来确定请求的类。(这个配置文件的编写规则由sun公司约束,服务器运行的时候先默认找的是 url-pattern)通过这样的方法我们就访问到了指定的类,这个类可以将服务器所具有的请求与响应的功能获取到,由此服务器所进行的请求和响应就通过这个类通过输出流动态响应生成HTML界面。我们实现servlet的意义在于servlet接口为我们封装了请求参数和响应参数,增强了复用型。我们编写逻辑的时候就不需要取考虑封装请求和相应参数,我们就可以直接使用了(servlet接口)

    客户端向服务器发送请求并得到回应的过程

    1.启动单独的线程

    2.使用I/O流读取用户请求的二进制流数据

    3.从请求数据中解析参数

    4.处理用户请求

    5.生成响应数据

    6.使用IO流向客户端发送请求数据

    1,2,6由web服务器完成,3,4,5由web服务器调用servlet的_jspService()方法完成,编写jsp页面内的静态内容,jsp脚本都会转换成_jspService方法的执行代码,这些执行代码完成解析参数、处理请求、生成响应等业务功能,而web服务器负责多线程、网络通信等底层功能。web服务器在执行第三步解析到用户的请求参数之后,将需要通过这些请求参数来创建的httpservletrequest、httpservletresponse等对象,作为调用_jspService方法的参数,实际上一个web服务器必须为servletAPI绝大部分接口类提供实现类

    servlet的由来

            (1)之前我们通过servlet动态响应生成HTML界面:html标记+大量的业务处理逻辑;JSP的产生是为了把“html标记”和“大量的业务处理逻辑”给分开,继续留在html页面的“html标记”就形成了静态网页,而“大量的业务处理逻辑”就放到服务器上形成了servlet。

          (2)servlet接口还封装了请求和相应等功能,实现它后使得服务端程序编写更加的便捷了。

    Servlet用途(servlet默认实现了序列化,所以能进行网络上的传输)

    1.读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。

    2.读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。

    3.处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。

    4.发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。

    5.发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。

    Servlet生命周期

    Servlet 生命周期可被定义为从创建直到毁灭的整个过程

    1.实例化(实例化servlet对象)

            当用户调用一个Servlet时,就会创建一个Servlet实例,每一个用户请求都会产生一个新的线程,适当的时候移交给doGet或doPost方法。

    2.初始化 init() 方法(有两个init方法,有参的init调用了无参的init)

    (创建于用户第一次调用对应于该Servlet的URL时(访问网址))

    init()方法简单地创建或加载一些数据,这些数据将被用于Servlet的整个生命周期。

    3.运行  service() 方法是执行实际任务的主要方法

          Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。(每次调用对应的URL都会执行一次)

        每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候拆分成 doGet、doPost 等方法。

    4.销毁(stop服务器)

    在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收

          destory 方法被调用后,servlet 被销毁,但是并没有立即被回收,再次请求时,并没有重新初始化。

    Servlet的特点

    1.实例化初始化销毁都只执行一次

    2.servlet在服务器中是单例的,多线程的

    (多个浏览器访问同个servlet的时候也只会创建初始化一次)

    3.由于是多线程的,所以servlet不要定义成员变量,因为多线程访问同一个变量会产生线程安全问题

    4.默认启动web容器(服务器)后再创建Servlet(所以默认servlet的实例化和初始化都是在第一次访问网页时进行的)

    若想启动web容器(服务器)的时候创建Servlet,更改web.xml 

    <load-on-startup>1</load-on-startup>

    如果为负数则是启动tomcat后再创建Servlet

    如果是非负数则启动tomcat的时候并创建Servlet对象进行初始化,数值不同优先级不同

    注:经常被访问,使用启动web容器创建servlet的方式,这样可以增强用户体验,而不经常使用的启动后再创建,这样可以减少内存的占用


    Tomcat服务器

          Tomcat可以承载servlet的程序(web容器),把web应用程序部署到tomcat服务器上就可以运行,tomcat服务器本可以提供地址(tomcat安装的地址)及其端口(8080),之后在访问web程序的路径即可上网操作。与tomcat类似的服务器还有weblogic(用法与tomcat基本相同,可能有一些配置不同而已)

    启动tomcat:Startup

    停止tomcat:Shutdown

    验证服务器tomcat是否启动成功http://localhost:8080

    常见问题:1.tomcat 的端口号被占用 netstat -aon|findstr "8080"检测是否被占用

    2.服务器只能运行一个!多个运行会报404错误

    3.首先要正确配置好javajdk的环境变量,如果配置环境成功后还会闪退,重新安装tomcat软件


    Tomcat的路径解析

    eclipse中创建servlet和运行Servlet

    1.创建动态网页工程(注意最后一定要勾选web.xml的生成)

    2.在src文件夹下编写java类创建servlet并重写doGet doPost方法

    创建servlet的方式

    (1)实现Servlet

    (2)继承GenericServlet(除了service方法其它方法已实现)

    (3)继承HttpServlet(最常用的)

    3.在web.xml中进行文件的配置(也可用注解部署,都两种不可以同时使用)

             服务器默认会和<servlet-mapping>里的<url-pattern>进行匹配,如果匹配成功后就会根据此servlet的名字映射到另一个跟它具有同样名字的servlet,然后根据这个servlet映射到具体的类,这样就匹配到了具体执行的实现了servlet接口的类

    为什么要采用映射机制?而不是直接访问类名呢?

          1.类名有的时候确实比较长

          2.可以让一个类有多个访问路径

          3.提高了安全性,从另一个servlet映射使得其他人不会知道类名,这不会清楚包含此类的servlet的具体内部构造(最重要)

    web.xml里的这两行表示运行服务器时的欢迎界面,如果执行了index.html就不执行index1了。默认没有欢迎界面,我们可以手动指定欢迎界面


    4启动tomcat服务器,打包部署

    5.运行

    在启动tomcat的时候确保tomcat是处于关闭的状态

    注意访问链接的时候一定要在端口号之后添加上工程名,再填写访问名

    http://localhost:8080/工程名/访问路径名

    当部署完tomcat,相应jar包自动加载

    部署外部servlet工程

    将.war文件放到webapps文件夹下

    WebContent

    工程打成war包的时候根本没有webcontent ,而是把它目录下的内容打成了包

    WEB-INF是一个特殊的文件夹,web容器会包含该文件下的内容,客户端浏览器无法直接访问WEB-INF下的任何内容

    相关文章

      网友评论

        本文标题:第五部分 servlet 基础

        本文链接:https://www.haomeiwen.com/subject/starwxtx.html