JavaWeb总结(二)
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总结(二)的更多相关文章
- java学习笔记-JavaWeb篇二
JavaWEB篇二 45 HttpSession概述46 HttpSession的生命周期 47 HttpSession常用方法示例48 HttpSessionURL重写 49 HttpSession ...
- JavaWeb(二)cookie与session的应用
前言 前面讲了一堆虚的东西,所以这篇我们来介绍一下cookie和session的应用. 一.使用cookie记住用户名 1.1.思路介绍 1.2.实现代码 1)LoginServlet package ...
- JavaWeb学习 (二十八)————文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- JavaWeb学习 (二十七)————监听器(Listener)在开发中的应用
监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用 一.统计当前在线人数 在JavaWeb应用开发中,有时候我们需要统计当前在线的用户数,此时就可以使用监听 ...
- JavaWeb学习 (二十六)————监听器(Listener)学习(二)
一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...
- JavaWeb学习 (二十五)————监听器(Listener)
一.监听器介绍 1.1.监听器的概念
- JavaWeb学习 (二十四)————Filter(过滤器)常见应用
一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import ja ...
- JavaWeb学习 (二十一)————基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
- JavaWeb学习 (二十)————JavaWeb的两种开发模式
一.JSP+JavaBean开发模式 1.1.jsp+javabean开发模式架构 jsp+javabean开发模式的架构图如下图(图1-1)所示
- ECLIPSE/JAVAWEB (二)三大框架之Hibernate框架 持续更新中...
(一)发展历史 在Struts框架中使用jdbc连接来读写数据库,我们最常见的就是打开数据库连接.使用复杂的sql语句进行读写.关闭连接,获得的数据又需要转换或封装后往外传,这是一个非常繁琐的过程. ...
随机推荐
- 只能在堆上生成的对象 VS. 只能在栈上生成的对象
1. 只能在堆上 即禁止在栈上生成.如何实现? 当对象建立在栈上面时,是由编译器分配内存空间的,调用构造函数来构造栈对象.如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存. 所以,只需 ...
- 解析苹果的官方例子LazyTableImages实现图片懒加载原理
解析苹果的官方例子LazyTableImages实现图片懒加载原理 首先在官网下载源码: https://developer.apple.com/library/ios/navigation/#sec ...
- MySql报2006error错误的解决方法(数据过大)
最近迁移项目中发现,转移数据库出现的几个问题,其中之一就是 2006 error,解决过程如下: 首先贴出报错结果 [Msg] Finished - Unsuccessfully 出现这个结果,首先检 ...
- idea+maven+spring+cxf创建webservice应用(二)生成客户端程序
idea+maven+spring+cxf创建webservice应用(二)生成客户端程序,以上一篇为基础"idea+maven+spring+cxf创建webservice应用" ...
- codeforces 348D Turtles
codeforces 348D Turtles 题意 题解 代码 #include<bits/stdc++.h> using namespace std; #define fi first ...
- Winform启动时隐藏不显示
我最终用了这个方法:1.MainForm的构造方法中添加: public MainForm() { InitializeComponent(); this.ShowInTaskbar = false; ...
- Mina使用总结(三)MinaClient
简单的Mina客户端代码MinaSimpleClient.java: package com.bypay.mina.client; import java.net.InetSocketAddress; ...
- 洛谷 P2764 最小路径覆盖问题【最大流+拆点+路径输出】
题目链接:https://www.luogu.org/problemnew/show/P2764 题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V ...
- const修饰的成员是类成员,还是实例成员?
很抱歉,我以为只有static修饰的成员是类成员,可以通过类名直接访问,然而,const 修饰的成员也属于类成员,直接通过类名访问,不能通过实例变量访问. 做维护久了,深刻的理解,扎实的基础对写出高质 ...
- 【[SDOI2017]数字表格】
求 \[Ans=\prod_{i=1}^N\prod_{j=1}^MFib[(i,j)]\] 连乘的反演,其实并没有什么不一样 我们把套路柿子拿出来 \[F(n)=\sum_{i=1}^N\sum_{ ...