精华内容
参与话题
问答
  • Web容器

    万次阅读 2016-09-25 10:59:22
    目录 1.Java Web相关概念 ...2.Web容器的作用 主要参考文章: http://www.cnblogs.com/yezhaohui/archive/2013/05/21/3091931.html http://www.cnphp6.com/archives/51094 好记性不如烂笔头,从网上搜罗了一...

    目录

    1.Java Web相关概念

    1.1中间件

    1.2容器 

    2.Web容器的作用


    主要参考文章:

                http://www.cnblogs.com/yezhaohui/archive/2013/05/21/3091931.html
                http://www.cnphp6.com/archives/51094

    好记性不如烂笔头,从网上搜罗了一些个人觉得写的比较好,而且比较重要的Java Web相关概念,汇总如下。

    1.Java Web相关概念

    1.1中间件

    所谓中间件指的是提供系统软件和应用软件之间连接的软件,中间件处在操作系统、网络、数据库等系统软件层之上,应用软件层之下,其作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。这样设计的好处是:将应用程序运行环境与操作系统分离,从而使应用程序开发者不必再考虑诸多的系统通信问题,而直接关注该应用程序的功能实现。我们常说到的容器的概念其实就是中间件的一种。

    J2EE提出的背景:

    1、企业级应用框架的需求:在许多企业级应用中,例如数据库连接、邮件服务、事务处理等都是一些通用企业需求模块,这些模块如果每次在开发中都由开发人员来完成的话,势必将会造成开发周期长和代码可靠性差等问题。于是许多大公司开发了自己的通用模块服务,这些服务性的软件系列统称为中间件。

    2、 为了通用必须要提出规范,不然无法达到通用,在上面的需求基础之上,许多公司都开发了自己的中间件,但其与用户的沟通都各有不同,从而导致用户无法将各个公司不同的中间件组装在一块为自己服务。从而产生瓶颈。于是提出标准的概念。其实J2EE就是基于JAVA技术的一系列标准。

    目前常见的中间件角色:

    Apache的Tomcat、IBM公司的WebSphere、BEA公司的WebLogic、Kingdee公司的Apusic都属于中间件。并且中间件技术已经不局限于应用服务器、数据库服务器。围绕中间件,在商业中间件及信息化市场主要存在微软阵营、Java阵营、开源阵营。 

    1.2容器 

    容器其实就是一种中间件,常见的有:WEB容器(WEB服务器)、EJB容器、应用服务器。

    WEB容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,JSP容器和SERVLET容器。使JSP,SERVLET直接跟容器中的环境变量接口交互,不必关注其它系统问题。主要由WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。

    EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。

    WEB容器和EJB容器在原理上是大体相同的,更多的区别是被隔离的外界环境。WEB容器更多的是跟基于HTTP的请求打交道。而EJB容器不是。它是更多的跟数据库、其它服务打交道。但他们都是实现了与外界环境的交互,从而减轻应用程序的负担。例如SERVLET不用关心HTTP的细节,直接引用环境变量session,request,response就行、EJB不用关心数据库连接速度、各种事务控制,直接由容器来完成。

    应用服务器:作为服务器执行共享业务应用程序的底层的系统软件。

    支持J2EE的应用服务器:

    WEBSPHERE、WEBLOGIC、JBOSS、ORACLE APPLICATION SERVER、SUN ONE APPLICATION SERVER 等。 

    2.Web容器的作用

    #1,通信支持

    利用容器提供的方法,你可以轻松的让servlet与web服务器进行通信,而不用创建serverSocket去监听某个端口,创建流等,容器知道和web服务器之间的协议,servlet不用去关心web服务器和web代码之间的API,只需要将重点放在业务逻辑上面。

    #2,生命周期管理

    容器控制着servlet的生与死,容器控制servlet的加载,实例化和初始化以及确保servlet能被正常回收,总之不用太多考虑资源管理。

    #3,多线程管理

    容器自动地为每一个servlet请求创建一个java线程,针对客户的请求,如果servlet已经运行完了Http相应的服务方法后,这个线程就可以被kill掉了,但是这并不意味着我们在写servlet的时候不用考虑同步问题了,只是容器帮我们创建和管理多个线程来处理多个请求而已。

    #4,声明方式实现安全

    利用容器,可以使用web.xml部署描述来配置安全性,而不用硬编码在servlet中。

    #5,jsp支持

    容器将jsp代码翻译成java代码。

    Web容器处理请求工作流程

    展开全文
  • web 容器

    千次阅读 2012-08-27 16:02:10
    所谓的服务器,广义上讲有很多的概念,硬件角度上说就是一台高性能的Computer...很多时候人们常把诸如Tomcat、IIS、Weblogic 也称之为web服务器, 这对初学者很容易造成混淆,其实这些只是用于开发、集成、部署和管理W

    所谓的服务器,广义上讲有很多的概念,硬件角度上说就是一台高性能的Computer。我们通常指的服务

    器其实应该是装有能够处理具体请求事务的服务器软件的Computer。比如最常见的www服务器、mail服务

    器、计费服务器、ftp服务器等等。很多时候人们常把诸如Tomcat、IIS、Weblogic 也称之为web服务器,

    这对初学者很容易造成混淆,其实这些只是用于开发、集成、部署和管理Web应用、网络应用和数据库应

    用的应用服务器软件。
         那么web容器有该如何理解呢?通俗的讲web容器就是能够支持发布web程序的软件。
    b/s结构下,以常见的自来水供水系统为例来说,整个web系统好比完整的供水系统,用户只需要有水龙头

    (Broswer),水管相当于计算机网络(network),自来水公司的供水系统(即Server),其中的压力水罐

    就是容器(Container)了。
          Tomcat是Apache-Jarkarta的一个子项目,是一个开放式源码,免费支持JSP和Servlet技术的容器,它同

    时又是一个Web服务器软件.由于很多初学者都是用Tomcat作开发的,所以总体上有一个明确的把握还是有

    必要的。

    servlet容器的主要任务是管理servlet的生命周期。而你说的web容器更准确的说应该叫web服务器,它是来管理和部署web应用的。还有一种服务器叫做应用服务器,它的功能比web服务器要强大的多,因为它可以部署EJB应用,可以实现容器管理的事务,一般的应用服务器有weblogic和websphere等,它们都是商业服务器,功能强大但都是收费的。web容器最典型的就是tomcat了,Tomcat是web容器也是servlet容器。

    展开全文
  • web容器

    2012-08-11 17:54:36
    web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如JAVA中的Tomcat容器,ASP的IIS或PWS都是这样的容器。一个服务器可以多个容器 Tomcat 很受...

    web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如JAVA中的Tomcat容器,ASP的IIS或PWS都是这样的容器。一个服务器可以多个容器


    Tomcat 很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。
      Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
      这里的诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。
    展开全文
  • 从事Java Web编程的朋友都知道,一个web应用的组成必须要有web.xml,因为这个是web应用程序的入口,通常我们会选择一种Web容器来发布我们的Web项目,比如Tomcat、Weblogic等容器服务程序。 这些程序都遵从一个标准...

    从事Java Web编程的朋友都知道,一个web应用的组成必须要有web.xml,因为这个是web应用程序的入口,通常我们会选择一种Web容器来发布我们的Web项目,比如Tomcat、Weblogic等容器服务程序。

    这些程序都遵从一个标准的Web工程标准,他们启动时都会去主动读取指定位置的web.xml文件,web.xml中的各个节点都是既定的标准,Web容器会去按照规则读取配置信息将各种Class加载到jvm中,然后通过ServerSocket创建一个服务器对象监听指定的端口,接收请求并返回请求内容。

    很多从事多年Java Web开发的伙伴都没有了解过这些Web容器,只知道按照标准创建Web工程,然后把工程放到容器里,启动容器就可以访问到工程了,对诸如Tomcat等容器服务程序仅仅停留在使用层面,并且说起这些容器程序往往带有一种朝圣的心态觉得这些容器很神秘。

    其实我们做开发的,除了做好自己的本职工作之外,要对很多东西保持好奇并且要有探究的精神,说白了所有的程序都是从我们平时使用的简单的代码,根据一定的业务逻辑标准写出来的,通过探究逐渐完善我们在程序世界里的世界观,就好比馒头是用面粉做出来的,面条、面包、蛋糕等等都是用面粉做出来的,只是做的方式和手段以及步骤组合不一样,这样一来我们看待任何程序都可以一眼看穿他的基本套路。

    好,说这么多废话,今天的主题是编写一个简单的Web容器,叫他TomDog好了,他的功能很简单,结构也很简单,代码只有4个类,然后有一个文件夹webapps,只要把符合我们定义规范的项目代码放进来,启动TomDog就可以访问到项目代码了。

    先看一下我的TomDog的目录结构:

    再看一下需要在TomDog中运行的web项目的结构,需要运行的项目都放在webapps文件夹中:

    1. 需要运行的项目目录中必须有WEB-INF文件夹
    2. 需要运行的项目目录的WEB-INF文件夹下必须有web.xml,这个文件中包含个该web项目的配置信息
    3. 需要运行的项目目录的WEB-INF文件夹下必须有classes文件夹,这个文件夹下放的就是代码的包路径及class文件

    然后来看一下testDemo1中的web.xml中的内容

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
    	<app-name>testDemo1</app-name>
    	<request>
    		<url>/test1</url>
    		<classpath>com.test.controller.Test1Controller</classpath>
    		<method>test1</method>
    	</request>
    	<request>
    		<url>/test2</url>
    		<classpath>com.test.controller.Test1Controller</classpath>
    		<method>test2</method>
    	</request>
    	<request>
    		<url>/test3</url>
    		<classpath>com.test.controller.Test2Controller</classpath>
    		<method>test3</method>
    	</request>
    	<request>
    		<url>/test4</url>
    		<classpath>com.test.controller.Test2Controller</classpath>
    		<method>test4</method>
    	</request>
    </web-app>

    怎么样?是不是看不懂?看不懂就对了,就是为了让你看不懂!其实这里面配置的意思使用过servlet的应该都能猜个差不多,我为什么不直接用servlet的规则来写是因为我想告诉大家,所有的规则都是我们自己想出来的,我们觉得怎么写方便,规则就怎么定(=^ω^=)。

    当然了现在servlet已经过时了大家都使用springmvc、struts等这种控制层框架,其实熟知这类框架原理的就明白,这些框架只是简化了开发配置,原理还是一样的,你使用springmvc你始终要在web.xml中通过servlet的方式配置一个你springmvc的配置文件,所以这么来看springmvc就是简化了不需要大家手动去一个一个的写servlet和servlet-mapping,而是直接可以通过注解实现请求和请求方法的映射关系。

    好多余的话题不扩展了,现在来解释一下这段配置,app-name中配置的内容叫做项目名,每个request都是一个请求,其中的url是请求的路径,classpath是请求对应的java类,method是该请求执行的方法。

    下面看下这个Test1Controller中的代码:

    public class Test1Controller {
    	
    	public Object test1(){
    		return "HTTP/1.1 200\r\n" +  
                    "Content-Type: text/html\r\n" +  
                    "Content-Length: 50\r\n" +  
                    "Connection: keep-alive\r\n" + 
                    "\r\n" +  
                    "<h1>testDemo1 test1 controller do success</h1>";
    	}
    	
    	public Object test2(){
    		return "HTTP/1.1 200\r\n" +  
                    "Content-Type: text/html\r\n" +  
                    "Content-Length: 50\r\n" + 
                    "Connection: keep-alive\r\n" + 
                    "\r\n" +  
                    "<h1>testDemo1 test2 controller do success</h1>";
    	}
    	
    }

    这里方法很简单,就是直接返回一个html代码,当前其中包含一些header的信息比如状态啦,长度啦之类的。

    那么此时我如果启动TomDog,我给TomDog的默认配置的启动端口是8091,此时我只要在浏览器访问地址如下:

    http://localhost:8091/testDemo1/test1

    我就可以看到浏览器给我的返回结果如下图:

    看到了吧,到这里一个简单的WEB工程标准被我们定义出来了,当然功能很简陋,但是麻雀虽小五脏俱全嘛!

    好吧,热闹看完了,下面稍微讲下TomDog的实现方法,其实很简单,下面是启动的main方法:

    public static void main(String[] args) {
    
    		try {
    			// 初始化項目配置信息
    			initUrl();
    			// 创建一个服务器对象,端口8091
    			ServerSocket serverSocket = new ServerSocket(8091);
    			// 创建一个客户端对象,这里的作用是用作多线程,必经服务器服务的不是一个客户端
    			Socket client = null;
    			boolean flag = true;
    			while (flag) {
    				System.out.println("服务器已启动,等待客户端请求。。。。");
    				// accept是阻塞式方法,对新手来说这里很有可能出错,下面的注意事项我会说到
    				client = serverSocket.accept();
    				// 创建一个线程,每个客户端对应一个线程
    				new Thread(new ResponseThread(client, APPURL)).start();
    			}
    			client.close();
    			serverSocket.close();
    			System.out.println("服务器已关闭。");
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
    	}

    1. 初始化所有项目的请求,启动main方法时会去读取webapps下面的文件夹,并且按照我们的规范读取到web.xml,然后按照规范读取app-name然后读取各个request中的url,将app-name和request中的url拼接成一个字符串作为一个完整请求的url,将这个字符串做为key,classpath+method作为value存入一个全局的Map中。

    2. 通过ServerSocket创建一个服务器对象并监听8091端口,然后通过Socket创建一个客户端对象,如果有请求发来serverSocket.accept()会得到一个Socket客户端请求,此时将该Socket传入我们写好的线程中即可。

    3. 线程中干了什么事情呢?很简单,就是去获取本次请求的url然后去我们初始化的Map中找,找到后根据该Map的value找到这个请求的处理类,将他放到类加载器中通过反射机制执行该请求对应的方法,将方法的返回值通过输出流的方式写出去这样浏览器上就会得到响应。

    看吧是不是很简单?下面我贴一下TomDog四个java类的完整代码出来,仅供参考,不需要深究使用的技术和性能,毕竟我们又不是要真的写一个Tomcat,还是要站在巨人的肩膀上的嘛!

    StartServer.java

    package com.tom.dog;
    
    import java.io.File;
    import java.io.FileFilter;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
    
    public class StartServer {
    
    	// 存放tomdog发布的全部项目的请求url
    	public static Map<String, Map<String, String>> APPURL = new HashMap<>();
    
    	public static void main(String[] args) {
    
    		try {
    			// 初始化項目配置信息
    			initUrl();
    			// 创建一个服务器对象,端口8091
    			ServerSocket serverSocket = new ServerSocket(8091);
    			// 创建一个客户端对象,这里的作用是用作多线程,必经服务器服务的不是一个客户端
    			Socket client = null;
    			boolean flag = true;
    			while (flag) {
    				System.out.println("服务器已启动,等待客户端请求。。。。");
    				// accept是阻塞式方法,对新手来说这里很有可能出错,下面的注意事项我会说到
    				client = serverSocket.accept();
    				// 创建一个线程,每个客户端对应一个线程
    				new Thread(new ResponseThread(client, APPURL)).start();
    			}
    			client.close();
    			serverSocket.close();
    			System.out.println("服务器已关闭。");
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
    	}
    
    	private static void initUrl() throws ParserConfigurationException, SAXException, IOException {
    		// 成员变量没有数据时才走
    		if (APPURL.size() != 0) {
    			return;
    		}
    
    		// 读取TomDog下的全部项目
    		File dir = new File(Configer.WEBAPPS);
    		if (!dir.exists()) {
    			dir.mkdirs();
    		}
    		// 获取webapps下的全部项目
    		File[] dirfiles = dir.listFiles(new FileFilter() {
    
    			public boolean accept(File file) {
    				return file.isDirectory();
    			}
    		});
    
    		// 沒有任何項目直接return
    		if (dirfiles == null) {
    			return;
    		}
    
    		// 循环项目获取项目根目录下的web.xml配置信息
    		for (File file : dirfiles) {
    			File webinfo = new File(file.getPath() + "\\" + Configer.WEBINF + "\\" + Configer.WEBXML);
    			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    			DocumentBuilder builder = factory.newDocumentBuilder();
    			Document doc = builder.parse(webinfo);
    			// 获取项目名称
    			String appNameStr = doc.getElementsByTagName(Configer.APPNAME).item(0).getFirstChild().getNodeValue();
    			APPURL.put(appNameStr, new HashMap<String, String>());
    			// 获取该项目的请求,类似servlet
    			NodeList nl = doc.getElementsByTagName(Configer.REQUEST);
    			// 封装项目和相对应的请求
    			for (int i = 0; i < nl.getLength(); i++) {
    				String urlStr = doc.getElementsByTagName(Configer.URL).item(i).getFirstChild().getNodeValue();
    				String classpathStr = doc.getElementsByTagName(Configer.CLASSPATH).item(i).getFirstChild().getNodeValue();
    				String methodStr = doc.getElementsByTagName(Configer.METHOD).item(i).getFirstChild().getNodeValue();
    				APPURL.get(appNameStr).put("/" + appNameStr + urlStr, classpathStr + "." + methodStr);
    			}
    		}
    	}
    }
    

    ResponseThread.java

    package com.tom.dog;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.net.Socket;
    import java.util.HashMap;
    import java.util.Map;
    
    public class ResponseThread implements Runnable {
    
    	private Socket client;
    
    	public static Map<String, Map<String, String>> APPURL = new HashMap<>();
    
    	public ResponseThread(Socket client, Map<String, Map<String, String>> appUrl) {
    		this.client = client;
    		this.APPURL = appUrl;
    	}
    
    	@Override
    	public void run() {
    		// run不需要自己去执行,好像是线程器去执行了来着,可以去看api
    		try {
    			Object invoke = getResult();
    			client.getOutputStream().write(invoke.toString().getBytes());
    			client.getOutputStream().flush();
    			System.out.println("请求已响应完毕");
    		} catch (Exception e) {
    			System.out.println("error");
    		}
    
    	}
    
    	private Object getResult() throws IOException, InstantiationException, IllegalAccessException,
    			NoSuchMethodException, InvocationTargetException {
    		BufferedReader in = null;
    		String br = null;
    		in = new BufferedReader(new InputStreamReader(client.getInputStream()));
    		br = in.readLine();
    		String url = getUrl(br);
    		String appName = getAppName(url);
    		String classpath = APPURL.get(appName).get(url);
    		String classStr = classpath.substring(0, classpath.lastIndexOf("."));
    		String methodStr = classpath.substring(classpath.lastIndexOf(".") + 1, classpath.length());
    		String className = classStr.substring(classStr.lastIndexOf(".") + 1, classStr.length());
    		String myPath = (Configer.WEBAPPS + url.replace("/", "\\").replace("\\" + methodStr, "") + "\\" + Configer.WEBINF + "\\" + Configer.CLASSES + "\\"
    				+ classStr.replace(".", "\\")).replace("\\" + className, "") + "\\" + className + Configer.CLASSPOSTFIX;
    		MyClassLoader myClassLoader = new MyClassLoader();
    		Class<?> cls = myClassLoader.findClass(myPath + "|" + classStr);
    		Object newInstance = cls.newInstance();
    		Method method = cls.getMethod(methodStr);
    		Object invoke = method.invoke(newInstance, null);
    		return invoke;
    	}
    	
    	private String getUrl(String allUrl) {
    		String[] urls = allUrl.split(" ");
    		String url = urls[1];
    		if (url.indexOf("?") == -1) {
    			return url;
    		}
    		String[] u = url.split("?");
    		return u[0];
    	}
    
    	private String getAppName(String url) {
    		String[] p = url.split("/");
    		return p[1];
    	}
    }

    MyClassLoader.java

    package com.tom.dog;
    
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class MyClassLoader extends ClassLoader {
    	
    	@Override
    	protected Class<?> findClass(String myPath) {
    		String[] split = myPath.split("\\|");
    		byte[] cLassBytes = null;
    		Path path = null;
    		try {
    			path = Paths.get(split[0]);
    			cLassBytes = Files.readAllBytes(path);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		Class<?> clazz = defineClass(split[1], cLassBytes, 0, cLassBytes.length);
    		return clazz;
    	}
    	
    }

    Configer.java

    package com.tom.dog;
    
    public class Configer {
    
    	// 发布项目的存放路径
    	public static String WEBAPPS = System.getProperty("user.dir") + "\\webapps";
    
    	// 发布项目的初始化文件
    	public static String WEBXML = "web.xml";
    
    	// 初始化文件中代表当前应用名称配置的节点
    	public static String APPNAME = "app-name";
    
    	// 初始化文件中代表请求配置的节点
    	public static String REQUEST = "request";
    
    	// 初始化文件中代表请求url配置的节点
    	public static String URL = "url";
    
    	// 初始化文件中代表请求url对应处理类配置的节点
    	public static String CLASSPATH = "classpath";
    
    	// 初始化文件中代表请求url对应处理类处理方法配置的节点
    	public static String METHOD = "method";
    	
    	// 项目class包文件夹所属的文件夹名称
    	public static String CLASSES = "classes";
    	
    	// 项目文件的classes文件夹和web.xml的位置
    	public static String WEBINF = "WEB-INF";
    	
    	// 项目文件的class的后缀
    	public static String CLASSPOSTFIX = ".class";
    }
    

    Ok,以上就是TomDog的全部代码实现啦~~

    展开全文
  • web服务器、Web中间件和Web容器的区别

    万次阅读 多人点赞 2018-11-25 20:36:21
    我们经常会被Web服务器、Web容器和Web中间件这三个概念搞混。因为我们常见的很多网站要么是由IIS搭建,要么是由Apache、Tomcat、Ngnix搭建。所以,我们会把他们都叫成是Web服务器,因为他们都提供了Web服务,可以让...
  • Web容器(一):Web容器简介

    千次阅读 2019-06-30 12:12:36
    Jetty》-开篇词 | Java程序员如何快速成长 + 01_Web容器学习路径 Web容器 Web技术的发展史 早期的Web应用主要用于浏览新闻等静态页面,HTTP服务器(比如Apache、Nginx)向浏览器返回静态HTML,浏览器负责解析HTML,...
  • Web容器Web服务器及常见的Web容器有哪些?  一、引言  首先来理解一下简单的一个请求发送到响应的过程。 首先,客户端,通常是浏览器或者一些应用发送请求到你的服务器地址,比如访问你的Url或者其他的东西。而...
  • web容器tomcat容器

    2019-01-05 20:22:16
    如果web服务器应用得到一个指向servlet的请求(而不是其他请求,如请求一个普通的静态HTML),此时服务器不是把这个请求交给servlet本身,而是交给部署该servlet的容器,要由容器调用servlet的方法,如doPost()或...
  • Web容器原理】web容器设计(1)

    千次阅读 2016-07-07 10:24:46
    开发一个web容器涉及很多不同方面不同层面的技术,例如通信层的知识,程序语言层面的知识等等,且一个可用的web容器是一个比较庞大的系统,要说清楚需要很长的篇幅,本文旨在介绍如何设计一个web容器,只探讨实现的...
  • Servlet容器与Web容器

    千次阅读 多人点赞 2017-02-04 15:01:33
    web容器更准确的说应该叫web服务器,它是来管理和部署 web应用的。还有一种服务器叫做应用服务器,它的功能比web服务器要强大的多,因为它可以部署EJB应用,可以实现容器管理的事务,一般的应用服务器 有weblogic和...
  • Spring容器 SpringMVC容器 web容器的关系

    千次阅读 多人点赞 2019-05-29 17:21:43
    说到spring和springmvc,其实有很多工作好多年的人也分不清他们有什么区别,如果你问他项目里用的什么MVC技术,他会说我们用的spring和mybatis,或者spring和hibernate。 在潜意识里会认为springmvc就是spring,...
  • servlet容器,web容器,spring容器,springmvc容器的区别

    千次阅读 多人点赞 2019-05-03 21:42:40
    web容器中有servlet容器,spring项目部署后存在spring容器和springmvc容器。其中spring控制service层和dao层的bean对象。springmvc容器控制controller层bean对象。servlet容器控制servlet对象。项目启动是,首先 ...
  • web容器的会话机制

    千次阅读 2015-08-30 11:29:52
    基本所有web应用开发的朋友都很熟悉session会话这个概念,在某个特定时间内,我们说可以在一个会话中存储某些状态,需要的时候又可以把状态取出来,这整个过程的时间空间可以抽象成“会话”这个概念。尽管你对...
  • servlet容器,负责管理servlet生命周期。... 应用服务器,其功能远远大于web容器,因为它可以部署EJB应用,可以实现容器管理的事务,一般的应用服务器有weblogic和websphere等,它们都是商业服务器,功能强
  • 如何设计一个web容器

    万次阅读 多人点赞 2016-02-14 10:20:45
    开发一个web容器涉及很多不同方面不同层面的技术,例如通信层的知识,程序语言层面的知识等等,且一个可用的web容器是一个比较庞大的系统,要说清楚需要很长的篇幅,本文旨在介绍如何设计一个web容器,只探讨实现的...
  • 问题2:web容器创建多个线程时,每个线程都会有独立的代码A副本吗,创建独立的实例,工作区间吗? 问题3:这部分是否与其他框架有关?,例如依赖注入/控制反转容器 对这部分我理解不清,有理解错的地方帮忙指正下,...
  • web容器和servlet容器

    千次阅读 2013-01-05 11:14:22
    1. web容器好比 电视机 servlet容器好比 VCD 没有VCD你可以看电视,对吧,但是有了VCD没有电视机,你从哪看起?:) 没有servlet容器,你也可以用web容器直接访问静态页面,比如安装一个apache等,但是如果要显示...
  • web容器启动spring容器

    2016-10-15 13:11:30
    spring容器是如何在web应用中得到应用的,web容器又是如何以及何时启动spring容器的呢?web.xml中配置 <!---①从类路径下加载spring配置文件-> <param-name>contextConfigLocation clas
  • web容器 & Servlet容器

    2009-04-12 20:31:00
    实际上容器就是一个服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如java中的Tomcat容器,ASP的IIS或PWS都是这样的容器,一个服务器...在J2EE规范中,相应的有WEB Contai
  • web容器解析

    千次阅读 2019-03-10 12:53:04
    web容器和web服务器的区别和联系 一、简述web服务器功能。 web服务器主要作用是处理客户请求,并作出响应。当浏览器发送一个HTTP请求到web服务器,web服务器解析请求,在内部做处理,返回一个HTTP响应给浏览器,...
  • Servlet容器和Web容器

    千次阅读 2015-09-01 13:53:54
    Web容器,负责管理和部署Web应用,其本身可能具备Servlet容器组件;如果没有,一般能将第三方Servlet容器作为组件整合进Web容器。 1.Web容器好比电视机,Servlet容器好比VCD。 没有Servlet容器,你也可以用Web容器...
  • java web项目中集成Jetty作为web容器

    万次阅读 2014-09-15 02:06:20
    1、准备好一个非常简单点的web项目(maven项目) 2、准备好maven环境,并配置pom文件,关于jetty内容如下:    org.eclipse.jetty  jetty-server  9.1.4.v20140401      org.eclipse.jetty ...
  • servlet容器和web容器

    2015-10-16 08:42:56
    1. web容器好比 电视机 servlet容器好比 VCD 没有VCD你可以看电视,对吧,但是有了VCD没有电视机,你从哪看起?:) 没有servlet容器,你也可以用web容器直接访问静态页面,比如安装一个apache等,但是如果要显示jsp...
  • Web服务器使用一个单独的模版装载和运行Servlet,这个专门用于Servlet管理的单独模块称为Servlet容器,或称为Web容器。 浏览器向Web服务器发送请求。如果请求的目标是HTML文件,Web服务器可以直接处理。如果请求的...
  • 当项目要运行在多种应用服务器上,由于不同的服务器有某些不同的特性,就需要根据不同的应用服务器做不同的处理   Liferay里面提供了一个方法来判断不同的应用服务器,类ServerDetector就是用来判断当前应用...

空空如也

1 2 3 4 5 ... 20
收藏数 43,106
精华内容 17,242
关键字:

web容器