web服务器的配置 我的JavaWeb之路29

极速动力2年前帮助271

本系列文章旨在记录和总结自己在Java web开发之路上的知识点、经验、问题和思考,原来已经分享在我的CSDN博客,现在分享在头条,希望能帮助更多码农和想成为码农的人。版权声明:本文为CSDN博主「普通的码农」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。原文链接:https://bloG.csdn.net/liyongyan1202/article/details/95486537

目录介绍构建动态Web工程布署描述符web.xml布署描述符中配置布署描述符中整合IoC容器验证总结介绍

下篇文章提及MVC依赖于IoC容器来世成、配置管理处理恳求的各个步骤中须要使用的具体组件Bean,所以,要使用MVC,就必须首先配置好IoC容器。

我们也早已晓得MVC的核心就是后端控制器,它其实是一个,须要进行配置便于由容器(例如)来加载并管理。

这么怎样配置让容器加载呢?之前我们是使用注解@来进行配置的,那是由于是由我们开发的,而如今不是我们开发的,毕竟不能在其源码中加上注解,因而只能使用布署描述符web.xml了。

不过,MVC也提供了一种基于Java来配置的方法实际底层是基于API中的动态注册的插口。

构建动态Web工程

首先,在中构建动态Web工程,参考这篇文章。

我先给出我们最终的工程结构:

其实,我们还须要配置并添加相关的JAR包(参考这篇文章);

下载框架(参考这篇文章);

并将框架相关的JAR包添加到web工程(参考这篇文章):

通常情况下,你会发觉自己如何又在做重复劳动,构建工程、配置、下载并配置库。

没错!所以人们又发明了工具来去除那些重复劳动,例如Maven、Boot等,前面再讨论,你只有经历过,就会认为有必要

布署描述符web.xml

之后,我们须要为我们的Web应用编撰布署描述符web.xml(也可以在构建web工程时手动生成),之后在web.xml中配置了,也是一个而已。

同样,我先给出完整的web.xml:



	
	
		org.springframework.web.context.ContextLoaderListener
	
	
		contextConfigLocation
		/WEB-INF/root-context.xml
	
	
	
		appA
		org.springframework.web.servlet.DispatcherServlet
		
			contextConfigLocation
			/WEB-INF/appA-context.xml
		
		1
	
	
		appA
		/appA/*
	
	
	
		appB
		org.springframework.web.servlet.DispatcherServlet
		
			contextConfigLocation
			/WEB-INF/appB-context.xml
		
		1
	
	
		appB
		/appB/*
	

(注:头条的代码块功能可能不是太友好,你们在联通端凑合着看!)

可以看见,web.xml跟之前学过的IoC容器的基于XML的配置元数据很像,屁话,都是依循XML规范嘛!

不过这儿的根标记是,而IoC容器的基于XML的配置元数据的根标记是,可见,起个好听的名子是放之四海而皆准的原则。

命名空间是JavaEE的。关于布署描述符我们之后再详尽讨论,我们先关注的配置。

你们可能会发觉,web.xml中这个词组出现好多次,它的本义按照百度翻译是:

n.(事情发生的)背景,环境,来龙去脉;上下文;语境;

通常来说,一项技术或一个概念都有一个,例如有,IoC有等等。

在前面的web.xml中,不仅标记上面的是指范畴的,剩下的其实都是指范畴的。

布署描述符中配置

布署描述符中配置与配置普通的没哪些区别,主要使用和这两个标记:

指定该的名子,必须是惟一的,我这指定的是appA,其实希望这个是处理appA这个应用的恳求,也就是说你还可以再申明一个,其名子可能称作appB,拿来处理appB这个应用的恳求。:指定的具体类型,才晓得从那个类的字节文件去加载啊。其实这儿就必须是MVC中的了。:指定要配置映射的那个,使用其名子。:恳求的url映射模式,可以有转义,例如星号*。

嗯,配置很简单,一目了然,只要是属于应用appA即URL是/appA/*模式的恳求,容器都会交给名子是appA的实例来处理。

同理,假如再配置一个应用appB的,也是类似,我就配置了两个独立处理appA和appB这两个web应用的恳求。

配置好了,接出来就该把IoC容器(实际上就是类似的类)整合进来了。

布署描述符中整合IoC容器

配置好以后,就应当整合IoC容器了。

整合这个词听上去有点太大了,当然就是要生成一个实现插口(更底层的是插口)的具体类的实例而已,该实例会读取配置元数据并生成和管理Bean。

不过,在Web应用(布署到容器中运行)中,框架为我们提供的是t插口。

之前应用(可以独立布署并运行的),其实可以在应用的运行入口main方式中生成一个IoC容器;

而Web应用是由容器加载并执行的,其实就应当在容器加载Web应用的时侯生成IoC容器了。

不过MVC不须要我们显式的像应用那样生成IoC容器,我们只须要指定配置元数据的位置即可,其实也提供了显式的基于Java的形式。

我们首先来瞧瞧MVC中的IoC容器的层次问题。

IoC容器的层次

可能会有也应当是如此一种场景:我们肯定尽量把相关的多个应用布署到同一个容器中,这样,多个应用可以共享各个层次(模型层、控制器层、视视口)个别代码,而其他组件可能是不一样的。

于是,每位应用须要配置自己的非共享的控制层、视视口以及业务模型组件;而这些共享的业务模型组件只须要配置一次,每位应用就都可以使用。

为此,每位应用都须要一个独立的IoC容器(我们把它称作IoC)来配置和管理自己的组件,还须要一个整个容器级别的IoC容器(我们把它称作RootIoC)来配置和管理所有应用共享的组件。

很自然的,假如一个在自己的IoC容器中没有找到须要的组件,这么它就应当去RootIoC容器找须要的组件;假如找到了,就不须要再去RootIoC容器找了。

也就是说,一个应当指向两个IoC容器,例如前面的web.xml中就配置了两个,每位都指向了一个自己的IoC容器以及全局的RootIoC容器:

配置IoC容器

自己的IoC容器其实是配置在自己上面了,于是只须要在标记下添加一个子标记:

:这是参数名子,这儿就必须是n,意味着是IoC容器的配置文件的位置,其实这是MVC的的实现所规定的;

:这是参数的值,其实就是IoC配置文件的位置了,一般都是置于WEB-INF目录下的。不过,这儿可以填写多个位置以加载多个IoC配置文件,以冒号分开即可。

这个标记似乎跟配置IoC容器没有关系,主要是拿来表示是否在容器启动时就加载该,非零即表示启动时就加载且按照数值大小有次序。

实际上,可以完全不配置IoC容器,或则

标记的内容为空。

我们的web.xml中appA和appB都配置了自己的IoC容器。

配置RootIoC容器

RootIoC容器的配置要稍为麻烦一点,首先要配置一个窃听器(属于规范):

标记:指定窃听器类,其值为MVC为我们提供的org..web..r从名子即可看出使用来加载IoC容器的。

之后要配置RootIoC容器的配置元数据的位置:

IoC容器的配置元数据

如今,我们要为IoC容器提供配置元数据,我们在web.xml中配置了三个IoC容器,所以须要提供三份配置元数据,默认是使用基于XML的形式。

先来看root-.xml:



	
	

可以看见,上面开启了组件扫描,故采用的是基于注解的Bean生成和手动装配,而RootIoC容器扫描的范围是mon这个包。

appA-.xml和appB-.xml也类似,不过appA应用的IoC容器扫描的范围是test.appa这个包,appB应用的是test.appb这个包。

验证

接出来,须要编撰appA和appB的应用代码来验证我们的配置是否有效,整个工程的结构上面早已给出,这儿采用的是MVC基于注解的,前面再详尽讨论。

appA应用

.java:

package test.appa;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@RequestMapping("/hello")
@Controller
public class HelloController {
	
	@Autowired
	private HelloService service;
	@GetMapping("/doSomething")
	@ResponseBody
	public String doSomething() {
		service.doSomething();
		return "OK";
	}
}

我们重点关注几个注解:

为此,结合控制器上的注解URL,该所处理的恳求完整的URL应当是/hello/;

因为该控制器所在包将由appA应用的所配置的IoC容器扫描,而该处理的是URL为/appA/*恳求,故该所处理的恳求完整的URL应当是/appA/hello/;

最后,整个-mvc-test应用的恳求URL是/-mvc-test,故该所处理的恳求完整的URL应当是/-mvc-test/appA/hello/;

再加上布署的主机名和端口(默认是8080),假定我用本机的浏览访问,故该所处理的恳求完整的URL应当是:8080/-mvc-test/appA/hello/。

实际应用中,控制器可能会注入多个,可能会定义多个,这都不是难事了。我们这只是定义了一个。

.java:

package test.appa;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.context.WebApplicationContext;
import test.common.CommonService;
@Service
public class HelloService {
	
	@Autowired
	private WebApplicationContext context;
	
	@Autowired
	private CommonService common;
	public void doSomething() {
		System.out.println("HelloService doSomething...");
		System.out.println(context);
		common.doSomething();
	}
}

这个类关于注解的方面就是IoC的手动装配和组件扫描生成Bean,值的关注的是我们注入的两个Bean比较特殊。

appB应用

与appA应用的代码类似,不再赘言。

.java:

package test.appb;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@RequestMapping("/world")
@Controller
public class WorldController {
	
	@Autowired
	private WorldService service;
	
	@GetMapping("/doSomething")
	@ResponseBody
	public String doSomething() {
		service.doSomething();
		return "OK";
	}
}

.java:

package test.appb;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.context.WebApplicationContext;
import test.common.CommonService;
@Service
public class WorldService {
	
	@Autowired
	private WebApplicationContext context;
	
	@Autowired
	private CommonService common;
	public void doSomething() {
		System.out.println("WorldService doSomething...");
		System.out.println(context);
		common.doSomething();
	}
}

公共组件

.java:

package test.common;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.context.WebApplicationContext;
@Service
public class CommonService {
	
	@Autowired
	private WebApplicationContext context;
	public void doSomething() {
		System.out.println("CommonService doSomething...");
		System.out.println(context);
	}
}

运行结果

在中配置并运行(可以参考这篇文章),视图中并未出现任何异常,说明:

如今运行浏览器,访问appA应用的:8080/-mvc-test/appA/hello/,视图出现日志

HelloService doSomething...
WebApplicationContext for namespace 'appA-servlet', started on Tue Jul 23 11:37:22 CST 2019, parent: Root WebApplicationContext
CommonService doSomething...
Root WebApplicationContext, started on Tue Jul 23 11:37:19 CST 2019

再访问appB应用的:8080/-mvc-test/appB/world/,视图出现日志:

WorldService doSomething...
WebApplicationContext for namespace 'appB-servlet', started on Tue Jul 23 11:37:21 CST 2019, parent: Root WebApplicationContext
CommonService doSomething...
Root WebApplicationContext, started on Tue Jul 23 11:37:19 CST 2019

很显著,两个应用都可以正常访问。appA应用和appB应用都有自己的IoC容器,但它们都有一个共同的父容器RootIoC容器。RootIoC容器中的Bean也可以供appA应用和appB应用使用。

总结

相关文章

运维工程师须要把握什么服务器维护技能?

服务器硬件作为急速动力的基础平台,是基础构架中最为核心的设备。一旦服务器出现故障都会影响业务的正常举办。为此,服务器的运维管理对于企业整个IT运维管理来说尤为关键。 怎样做好服务器的硬件维护、掌握什么...

新版OpenShift空间申请使用教程:安装WP、域名绑定等

空间是RedHat的平台即服务的云估算平台(PaaS),自创立以来就为你们提供免费空间服务,深深受国外外用户的欢迎。其实全世界的免费云空间商从2010年开始就如雪后莴笋般地出现,而且真正才能从激烈的竞...

网络常识 | 服务器知识(一)

Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP合同、HTML文档格式及URL。与顾客端的网路浏览器配合。由于Web服务器主要支持的合同就是HTTP,所以一般情况下HTTP服务器和...

dServer人工智能服务器

产品描述 人工智能赋能各行各业,想要做好人工智能研究,离不开作为底层支撑的服务器。当前市场上的人工智能服务器大多指出硬件配置,然而人工智能作为一门新兴技术,假如欠缺训练数据以及技术支持、使用培训等服务...

阿里云服务器ECS让利价钱表

阿里云服务器租用费用价钱表,阿里云服务器配置2核2G、2核4G、2核8G、2核16G、4核4G、4核8G、4核16G、4核32G、8核8G、8核16G、8核32G、8核64G详尽报价,阿里云百科分享网...

国外免费代理服务器如何使用(美国代理服务器ip免费)

1、国外免费代理服务器如何使用 对于须要访问美国网站或则进行一些特殊活动的用户来说,使用美国免费代理服务器是一个十分有效的方式。下边就来简单介绍一下怎样使用美国免费代理服务器。 1.找到可用的代理服务...