Web服务器的缺陷

Web服务器是被设计用来向客户端提供HTTP服务的,它只能向客户端提供静态网页内容。静态页面是原封不动的待在Web服务器目录中,服务器找到静态网页,并把它原样传回到客户端。每个客户端看到的页面都是一样的。

- 只能向客户端提供静态网页内容;

- 增加一个辅助应用生成动态页面;

在服务器端进行注册,根据参数查找并运行

Web服务器与辅助应用协同创建动态页面

服务器端网页编程

建动态服务器端内容的过程

- CGI技术

- 微软的ASP和ASP.NET技术

- 基于Java的Servlet/JSP技术

最早的解决方案CGI

CGI即通用网关接口(Common Gateway Interface),是最早用于创建动态服务器内容的一种技术,使用CGI,Web服务器可以将客户端的请求传递给一个外部程序,这个外部程序可以执行、创建内容,并且将响应传递给客户端;

最大优点是它可以用Shell、Perl、C、PHP、Python等编写;

CGI程序在Web服务器上的部署图

CGI的缺陷

在CGI运行时,每次请求就打开一个CGI进程,严重消耗服务器资源。极大地限制了一个服务器可以支持的并发 CGI用户数量;如果CGI对此处理不好,经常会使Web服务器崩掉。

CGI处理一个请求示意图

CGI处理多个请求示意图

Java解决方案

Sevrlet以及Web容器,被设计用来解决CGI问题,为Web开发者创建一个健壮的服务器端环境。Servlet与Web容器在Web服务器上的部署图如下图所示:

Java解决方案

- Web容器

Web容器主要是用于给处于容器中的应用程序组件(Servlet、JSP)提供一个环境,使Servlet、JSP直接跟容器中的环境变量交互。这样,我们就可以把注意力放在用Servlet实现业务逻辑上,而不必关注其它系统问题。

  - Web容器负责管理和运行Servlet

  - 容器对Servlet支持包括

    - 通信支持

    - 生命周期管理

    - 多线程支持

    - JSP支持

    - 处理安全性

  - Servlet概述

    Servlet是一个在Web服务器端或者应用服务器端运行的Java程序,主要用户在服务器端产生动态内容。

import javax.servlet.http.*;

public class HelloWorld extends HttpServlet {

    public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{

        response.setContentType("text/html");

        PrintWriter out = response.getWriter();

        out.println("<html>");

        out.println("<head>");

        out.println("<title>Hello World!</title>");

        out.println("</head>");

        out.println("<body>");

        out.println("<h1>Hello World!</h1>");

        out.println("</body>");

        out.println("</html>");

    }

}

显示结果为

  根据以上代码,可以发现

    - Servlet是常规的Java代码。代码中用了一些新的API,但是不涉及新的语法。

    - Servlet代码中有我们不熟悉的重要语句。Servlet不属于J2SE,它属于单独的规范。

    - Servlet对标准类(HttpServlet)进行了扩展。

    - Servlet没有main()方法。

  - Servlet主要任务

    - 读取客户端发送的显式和隐式数据;

    - 生成结果;

    - 向客户端发送显式数据(即文档)和隐式数据(HTTP响应数据);

  - Servlet与Web容器配合处理请求

    与CGI类似,Servlet允许一个请求被一个程序处理,并且使用同样的程序产生动态的响应。此外,Servlet特别定义了一个有效的生命的周期,使得用单个进程管理所有请求成为可能。它消除了CGI的多进程缺陷,允许多个主进程在多个Servlet和多个请求之间共享资源;

Servlet处理一个请求示意图

Servlet处理多个请求示意图

Web服务器应用软件(例如Apache)得到一个指向Servlet的请求时,服务器不是把这个请求交给Servlet本身,而是交给部署该Servlet的容器。容器将创建一个ServletRequest对象和一个ServletResponse对象,用户请求的参数封装在request对象中,然后传递给Servlet。Servlet将响应结果写到了ServletResponse对象中,交给容器再传回给用户。

HTTP请求和响应在网络中的传递

  - 客户端向Web服务器发起一个HTTP请求。

  - HTTP请求被Web服务器接受,如果请求的是静态页面,则由Web服务器负责处理。如果请求的是Java Web组件(Servlet或者JSP),则移交给Web容器。Web容器可以在主机的同一个进程、不同的进程或其他的Web服务主机的进程中启动。

  - Web容器根据Servlet的配置文件确定调用的具体Servlet类,并把request对象、response对象传给它。

  - Servlet通过request对象知道客户端的使用者是谁,客户的请求信息是什么和其他的一些信息。Servlet处理完请求后把要返回的信息放入response对象返回到客户端。

  - 一旦Servlet完成了请求的处理,Web容器就会刷新response,把控制权返回给web服务器。

Java Web应用程序的组成

  - 配置文件

  - 静态文件和JSP

  - 类文件和包

Java Web应用程序组成目录结构

- /WEB-INF和web.xml

Servlet规范中定义了一个称为部署描述器的配置文件,这个配置文件用于Web应用程序的一些相关配置信息。

相关jar包放置在/WEB-INF下面的lib包里面

创建一个Servlet,就需要在web.xml中配置相关信息

web.xml中的Servlet配置信息

- Web容器Tomcat介绍

  - 源自于Apache软件基金会Jakarta项目

  - 满足Servlet和JSP规范要求

  - 能独立成为一个Web服务器

  - 也是Servlet与JSP的容器

  - Tomcat目录结构介绍

目录

功能描述

bin

启动脚本和关闭服务器的脚本文件

common/classes

服务器及所有的应用都能公用的类文件

common/lib

服务器及所有的应用都能公用的jar文件

shared/lib

所有的应用都能公用的jar文件

conf

存放配置文件,如server.xml

logs

日志文件

server

包含三个子目录:classes、lib、webapps

server/classes

存放Tomcat服务器所需的类

server/lib

存放Tomcat服务器所需的各种jar包

server/webapps

存放Tomcat自带的两个Web应用:admin和manager

webapps

应用程序部署目录

webapps/root

默认的部署目录

webapps/tomcat-docs

Tomcat文档,包括Servlet和JSP API文档

work

由JSP生成的Servlet的存放目录

- 发布WEB应用

  - 将应用目录打成war包

  - 部署

    - 在Tomcat目录中部署方法

    - 在Tomcat目录外部署方法

  - 配置server.xml文件

元素名

属性

解释

server

port

指Tomcat监听shutdown的端口,默认为8080

shutdown

终止服务器时,指定向端口发送的命令字符串

service

name

指定service的名字

Connector

port

指定TCP/IP端口号,默认为8080

minProcessors

服务器启动时创建的处理请求的线程数

maxProcessors

最大可以处理请求的线程数,默认为200

enableLookups

如果为true,则支持域名解析,可以把IP解析为主机。默认为true

redirectPort

指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号

acceptCount

指定在监听端口号队列的最大客户数,默认为10,如果队列已满,客服请求将拒绝

Engine

defaultHost

指定缺省的处理请求的主机名,它至少与其中一个host元素的name属性值一样的

Context

docBase

Web应用程序的路径或者WAR文件存放的路径

path

表示此Web应用程序的url的前缀,这样请求的url为http://localhost:8080/path

reloadable

如果为true,则Tomcat会自动检测应用程序的/WEB-INF/lib和/WEB-INF/classes文件的改动,而不需重新启动

host

name

指定主机名

appBase

应用程序基本目录,即存放应用的目录

unpackWARs

如果为true,则Tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序

Logger

className

指定logger使用的类名,此类必须实现,org.apache.catalina.Logger接口

prefix

指定log文件的前缀

suffix

指定log文件的后缀

Timestamp

如果为true,则log文件名要加入时间

Realm

className

指定Realm使用的类名

  - 配置web.xml文件

JavaWeb总结(二)的更多相关文章

  1. java学习笔记-JavaWeb篇二

    JavaWEB篇二 45 HttpSession概述46 HttpSession的生命周期 47 HttpSession常用方法示例48 HttpSessionURL重写 49 HttpSession ...

  2. JavaWeb(二)cookie与session的应用

    前言 前面讲了一堆虚的东西,所以这篇我们来介绍一下cookie和session的应用. 一.使用cookie记住用户名 1.1.思路介绍 1.2.实现代码 1)LoginServlet package ...

  3. JavaWeb学习 (二十八)————文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  4. JavaWeb学习 (二十七)————监听器(Listener)在开发中的应用

    监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用 一.统计当前在线人数 在JavaWeb应用开发中,有时候我们需要统计当前在线的用户数,此时就可以使用监听 ...

  5. JavaWeb学习 (二十六)————监听器(Listener)学习(二)

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...

  6. JavaWeb学习 (二十五)————监听器(Listener)

    一.监听器介绍 1.1.监听器的概念

  7. JavaWeb学习 (二十四)————Filter(过滤器)常见应用

    一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import ja ...

  8. JavaWeb学习 (二十一)————基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  9. JavaWeb学习 (二十)————JavaWeb的两种开发模式

    一.JSP+JavaBean开发模式 1.1.jsp+javabean开发模式架构 jsp+javabean开发模式的架构图如下图(图1-1)所示

  10. ECLIPSE/JAVAWEB (二)三大框架之Hibernate框架 持续更新中...

    (一)发展历史 在Struts框架中使用jdbc连接来读写数据库,我们最常见的就是打开数据库连接.使用复杂的sql语句进行读写.关闭连接,获得的数据又需要转换或封装后往外传,这是一个非常繁琐的过程. ...

随机推荐

  1. 使用 Versions for mac 进行版本控制

    刚开始折腾 xcode 5.1 自己的svn版本控制,应该很好用,但是用不好,搞了半天也没法把工程传到svn服务器上去. 在 xcode 5.1 Soure Control 中弄 点击 Check O ...

  2. centos安装epel源后,使用报错(Error: Cannot retrieve repository metadata (repomd.xml) for repository: epel. Please verify its path and try again)

    报错如下: Error: Cannot retrieve repository metadata (repomd.xml) for repository: epel. Please verify it ...

  3. Inside Amazon's Kafkaesque "Performance Improvement Plans"

    Amazon CEO and brilliant prick Jeff Bezos seems to have lost his magic touch lately. Investors, empl ...

  4. NoSQL数据库---NoSQL数据库的分类

    NoSQL数据库的分类 个人理解一下文档型数据库: 就是键值对数据库的升级,允许键值之间嵌套键值,比如JSON格式的数据.效率比key_value的数据库更高. [更多参考]http://www.cn ...

  5. VRSProcess(一)

    1.freopen( "CONOUT$","w",stdout);在操作系统中,命令行控制台(即键盘或者显示器)被视为一个文件,既然是文件,那么就有“文件名”. ...

  6. REDIS线上问题

    这周终于解决了Redis访问经常超时的问题,终于可以踏实睡觉了.从上周就开始纠结在这个问题上,可以用寝食难安来形容,感觉这个问题就像个定时炸弹一样,虽然根据手搜的访问量,极少的Timeout Erro ...

  7. 【笔记】关于TCP三次握手和四次挥手的理解

    1. 三次握手: 服务器一定处于Listen状态,否则客户端发过来的连接会被拒绝.注:服务器和客户端的角色是相对的. 客户端发送第一次握手(客户端发送连接请求(SYNC包)到服务器)之后由Closed ...

  8. isa class superclass metaclass

    http://www.cnblogs.com/feng9exe/p/7232915.html Note: 其实这里的难点就在于对 和 的区分. .class 当 target 是 Instance 则 ...

  9. 【openjudge】【字符串】P6374文字排版

    [描述] 给一段英文短文,单词之间以空格分隔(每个单词包括其前后紧邻的标点符号).请将短文重新排版,要求如下: 每行不超过80个字符:每个单词居于同一行上:在同一行的单词之间以一个空格分隔:行首和行尾 ...

  10. bitMap算法实现以及ckHash函数类,将字符串映射成数字,同时可以将数字映射成字符串

    ckHash函数类,将字符串映射成数字,同时可以将数字映射成字符串 说明 1.所谓的BitMap就是用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitMap使用了bit位来 ...