您的位置:首页 > 编程语言 > Java开发

JavaWeb开发入门(二)

2016-07-06 08:30 387 查看

web应用程序

web应用程序指供浏览器访问的程序,通常也简称为web应用。

web应用:例如有a.html 、b.html…..多个web资源,这多个web资源用于对外提供邮件服务,此时应把这多个web资源放在一个目录中,以组成一个web应用(或web应用程序)。

一个web应用由多个静态web资源和动态web资源组成,如

html、css、js文件

jsp文件、java程序、支持jar包

配置文件



组成web应用的这些文件通常我们会使用一个目录组织,这个目录称之为web应用所在目录

Tomcat服务器虚拟目录的映射方式

web应用开发好后,若想供外界访问,需要把web应用所在目录交给web服务器管理,这个过程称之为虚似目录的映射。那么在Tomcat服务器中,如何进行虚拟目录的映射呢?总共有如下的几种方式:

虚拟目录的映射方式一:在server.xml文件的host元素中配置

找到server.xml文件的host元素,如下:

<Host name="localhost"  appBase="webapps"
unpackWARs="true" autoDeploy="true">

<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->

<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />

</Host>


<Host></Host>
这对标签加上
<Context path="/JavaWebApp" docBase="c:\mail" />
,即可将在c盘下的mail这个JavaWeb应用映射到JavaWebApp这个虚拟目录上,JavaWebApp这个虚拟目录是由Tomcat服务器管理的,JavaWebApp是一个硬盘上不存在的目录,是我们自己随便写的一个目录,也就是虚拟的一个目录,所以称之为”虚拟目录”,代码如下:

<Host name="localhost"  appBase="webapps"
unpackWARs="true" autoDeploy="true">

<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->

<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />

<Context path="/JavaWebApp" docBase="c:\mail" />

</Host>


其中,Context表示上下文,代表的就是一个JavaWeb应用,Context元素有两个属性:

path:用来配置虚拟目录,必须以”/”开头。

docBase:配置此虚拟目录对应着硬盘上的Web应用所在目录。

使用浏览器访问”/JavaWebApp”这个虚拟目录下的1.html这个web资源,访问结果如下:



1.html可以正常访问,这说明我们已经成功地将在c盘下的mail这个JavaWeb应用映射到JavaWebApp这个虚拟目录上了,访问”/JavaWebApp/1.html”就相当于访问”c:\mail\1.html”。

注意:在Tomcat6之后中,不再建议在server.xml文件中使用配置context元素的方式来添加虚拟目录的映射,因为每次修改server.xml文件后,Tomcat服务器就必须要重新启动后才能重新加载server.xml文件。在Tomcat服务器的文档
http://localhost:8080/docs/config/context.html#Defining_a_context
中有这样的说明:

It is NOT recommended to place
<Context>
elements directly in the server.xml file
. This is because it makes modifying the Context configuration more invasive since the main conf/server.xml file cannot be reloaded without restarting Tomcat.

借助有道翻译为:

不建议直接在server.xml文件中放置
<Context>
元素。这是因为修改Context配置会带来更多的攻击性,因为若不重启Tomcat,主要的conf/server.xml文件不能被重新加载。

除了第一句话,翻译的真是狗屁不通。

虚拟目录的映射方式二:让tomcat服务器自动映射

tomcat服务器会自动管理webapps目录下的所有web应用,并把它映射成虚拟目录。换句话说,tomcat服务器webapps目录中的web应用,外界可以直接访问。

例如:把c盘下的mail这个JavaWeb应用直接copy到tomcat服务器webapps目录中,如下图所示:



此时Tomcat服务器就会自动为mail这个JavaWeb应用映射成一个同名的虚拟目录”/mail”,然后就可以使用浏览器访问这个JavaWeb应用的资源了,如下图所示:



虚拟目录的映射方式三

参考Tomcat服务器文档:



我们主要关注下面这几句话:

In the $CATALINA_BASE/conf/context.xml file: the Context element information will be loaded by all web applications.

解释:$CATALINA_BASE指的就是tomcat服务器根目录。以上这句话的意思是说——在conf/context.xml文件中,Context元素信息被所有的web应用加载。即Context元素的配置信息会被所有web应用程序所共享。这不是我们所要的!!!

In the $CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default file: the Context element information will be loaded by all web applications of that host.

解释:[enginename]指的是Tomcat服务器使用的引擎名称,Tomcat使用的引擎是Catalina;[hostname]指的是主机名。以上这句话的意思是说——在conf/Catalina/localhost/context.xml.default文件(没有就新建)中,Context元素信息将被这台主机上的所有web应用加载。同理,这也不是我们所想要的!!!

In individual files (with a “.xml” extension) in the $CATALINA_BASE/conf/[enginename]/[hostname]/ directory. The context path and version will be derived from the base name of the file (the file name less the .xml extension). This file will always take precedence over any context.xml file packaged in the web application’s META-INF directory.

解释:在tomcat服务器的/conf/Catalina/localhost目录下添加一个以xml作为扩展名的文件,xml文件的名字可以任意取,比如下面的aa.xml,注意这一句话”The context path and version will be derived from the base name of the file“,这一句话的意思翻译过来就是”context元素的path属性源自于这个xml文件的名字”,上面提到过,Context元素的path属性是用来配置虚拟目录的名称的,所以虚拟目录的名称就是这个xml文件的名称。



在aa.xml文件中添加Context元素映射JavaWeb应用,代码如下:

<Context docBase="c:\mail" />


注意:在Context元素中并没有指明path属性来设置虚拟目录的名称,那么”c:\mail”映射的虚拟目录名称是神马呢,就是当前正在编辑的这个xml文件的名称aa。



使用这种方式映射虚拟目录的最大好处是修改了配置文件后不用重启Tomcat服务器,比如再复制一份aa.xml文件并重名为bb.xml文件。



此时有多条context path映射到JavaWeb应用。



注意:

在tomcat服务器的/conf/Catalina/localhost目录下添加的xml文件的名字还可以是这样的,如“aa#bb#cc.xml”:



这时,可通过多级目录来访问,如:



在tomcat服务器的/conf/Catalina/localhost目录下添加的xml文件的名字还可以是这样的,如“ROOT.xml”:



此时默认的web应用就是c:\mail。当创建“ROOT.xml”文件后,需要重启tomcat服务器,因为要覆盖掉原来的默认web应用。需要重启tomcat服务器,就可这样访问了:



除了这种方法之外,还可在server.xml文件中配置:

<Context path="" docBase="C:\mail" />


只不过每次修改server.xml文件后,Tomcat服务器就必须要重新启动后才能重新加载server.xml文件。

WEB应用的组成结构

开发web应用时,不同类型的文件有严格的存放规则,否则不仅可能会使web应用无法访问,还会导致web服务器启动报错。



web应用中,web.xml文件是其中最重要的一个文件,它用于对web应用中的web资源进行配置。

WebRoot
→Web应用所在目录,一般情况下虚拟目录要配置到此文件夹当中,不是很明白这句话的意思。

WEB-INF
→此文件夹必须位于WebRoot文件夹里面,而且必须以这样的形式去命名,字母都要大写。

web.xml
→配置文件,有格式要求,此文件必须以这样的形式去命名,并且必须放置到WEB-INF文件夹中。

web.xml文件

通过web.xml文件,可以将web应用中的:

某个web资源配置为网站首页。

将servlet程序映射到某个url地址上。

……

但凡涉及到对web资源进行配置,都需要通过web.xml文件。

web.xml的格式可以直接从Tomcat中参考得到:找到Tomcat目录下的webapps\ROOT\WEB-INF这个目录下的web.xml文件,把这个文件拷贝到我们新建的WEB-INF文件夹中,并修改这个web.xml文件,把里面的注释删除掉,只留下如下所示的代码即可:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">

<!-- 通过web.xml文件配置网站首页为1.html -->
<welcome-file-list>
<welcome-file>1.html</welcome-file>
</welcome-file-list>

</web-app>


Tomcat服务器配置虚似主机

配置虚拟主机

配置虚似主机就是配置一个网站。

Tomcat服务器配置一个虚拟主机(网站),需要修改conf文件夹下的server.xml这个配置文件,使用Host元素进行配置,打开server.xml,可以看到Tomcat服务器自带的一个名称为localhost的虚拟主机(网站)。

<Host name="localhost"  appBase="webapps"
unpackWARs="true" autoDeploy="true">

<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->

<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />

</Host>


平时我们将开发好的JavaWeb应用放到webapps文件夹下,然后就可以使用
http://localhost:端口号/JavaWebAppName
的方式去访问了,其实访问的就是name是”localhost”的那台虚拟主机(Host),这台虚拟主机管理webapps文件夹下的所有web应用。

例如:
http://localhost:8080/mail/1.html
,这个URL地址访问的就是名称是localhost的那台虚拟主机下的mail这个应用里面的1.htm这个web资源。

我们可以使用如下的方式配置一个虚拟主机,例如:

<Host name="www.sina.com.cn" appBase="C:\sian">
<Context path="/mail" docBase="c:\sina\mail" />
</Host>


这里我们新配置一个虚拟主机,虚拟主机的name是”www.sina.com.cn”,虚拟主机”www.sina.com.cn”现在管理着sina文件夹下的所有web应用,平时我们在互联网上使用域名”www.baidu.com”访问百度的网站时,其实就是在访问一个名称是”www.baidu.com”的虚拟主机,所以当我们要访问name是”www.sina.com.cn”的这个虚拟主机时,就可以使用”域名(www.sina.com.cn)”去访问,注意一下appBase=”C:\sian”,这里的sina文件夹代表的不是一个项目的根目录,而是一个存放了一个或者多个JavaWeb应用的文件夹,如下图所示:



这就好像是Tomcat服务器的webapps文件夹一样,里面存放了很多的JavaWeb应用。



windows系统中注册域名

配置的主机(网站)要想通过域名被外部访问,必须在DNS服务器或windows系统中注册访问网站时使用的域名,找到”C:\Windows\System32\drivers\etc“目录下的hosts文件,如下图所示:



编辑这个文件,将新添加的网站的域名和IP地址绑定在一起,这样我们就可以在浏览器中使用www.sina.com.cn这个域名去访问name是www.sina.com.cn那个虚拟主机里面管理的那些web应用了。

# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
127.0.0.1       localhost
127.0.0.1       www.sina.com.cn


将设置的网站的域名www.sina.com.cn和本机的IP地址绑定在一起。

使用浏览器通过域名”www.sina.com.cn”访问”www.sina.com.cn”这个虚拟主机下的mail这个web应用下的1.html这个web资源。将Tomcat服务器的默认端口号8080修改为80,然后通过此端口去访问mail这个web应用下的1.html这个web资源。



一台主机还可配置多个网站。首先在conf/server.xml中添加如下代码:

<Host name="www.sina.com.cn"  appBase="c:\sina">
<Context path="/mail" docBase="c:\sina\mail" />
</Host>

<Host name="www.google.com"  appBase="c:\google">
<Context path="" docBase="c:\google\mail" /> <!-- 缺省虚拟主机 -->
</Host>


接着编辑
C:\Windows\System32\drivers\etc
目录下的文件
hosts


# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
127.0.0.1       localhost
127.0.0.1       www.sina.com.cn
127.0.0.1 www.google.com


并将
1.html
的web资源设置为c:\google\mail下mail这个web应用的首页,怎么设置,可以查看上面的笔记,在此不赘述了。

最后通过浏览器去访问mail这个web应用下的1.html这个web资源。



浏览器与服务器交互的过程

图演示web资源的访问过程



打包JavaWeb应用

在Java中,使用”jar”命令来将JavaWeb应用打包成一个war包,jar命令的用法如下:



例:将C:\google目录下news这个JavaWeb应用打包成war包。



执行完之后,就可以得到一个
news.war
文件,平时开发完JavaWeb应用后,一般都会将JavaWeb应用打包成一个war包,然后将这个war包放到Tomcat服务器的webapps目录下,当Tomcat服务器启动时,就会自动将webapps目录下的war包解压。

比如现在将
news.war
放到Tomcat服务器的webapps目录下。



Tomcat服务器启动后会自动”Deploying web application”,将
news.war
这个war文件解压缩,如下图所示:



context元素常用属性

属性描述
docBase指定web应用程序的文档基目录或者WAR文件的路径。可以指定目录的或WAR文件的绝对路径名,也可以指定相对于Host元素的appBase目录的路径名。该属性是必须的
path指定web应用程序的上下文路径。在一个特定的虚拟主机中,所有的上下文路径都必须是唯一的。如果指定一个上下文路径为空字符串(“”),则定义了这个虚拟主机的默认web应用程序,负责处理所有的没有分配给其他web应用程序的请求
reloadable如果设置为true,Tomcat服务器在运行时,会监视WEB-INF/classes和WEB-INF/lib目录下类的改变,如果发现有类被更新,Tomcat服务器将自动重新加载该web应用程序。这个特性在应用程序的开发阶段非常有用,但是它需要额外的运行时开销,所以在产品发布时不建议使用。该属性的默认值是false
unpackWAR如果为true,Tomcat在运行web应用程序前将展开所有压缩的web应用程序。默认值是true
提示:可查看tomcat关于context元素的文档。

context元素的reloadable属性

配置context元素的reloadable属性为true,会让tomcat自动加载更新后的web应用。代码形式如下:

<Host name="www.google.com"  appBase="c:\google">
<Context path="" docBase="c:\google\mail" reloadable="true" />
</Host>


如果
reloadable="true"
,会让tomcat自动加载更新后的web应用,意思是web应用里面的java程序更改之后,不需要重新发布,服务器会自动加载。在实际开发中,建议不要配置,配置之后有一个弊病,即服务器只要发现程序改动,就会加载,web应用程序一旦很大,服务器不停地加载,就会很容易导致内存溢出,包括一些莫名其妙的问题发生。若web应用比较小,则建议配置。

注意:如上配置context元素的reloadable属性为true,只是指定的web应用会被自动加载

若在conf/context.xml里面配置,配置形式如下:

<Context reloadable="true">

<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

</Context>


意味着服务器里所有的web应用都会自动加载,意思是将来服务器里面的所有web应用改动java程序,都不需要重新发布,由服务器自动加载。这称之为全局性的配置

Tomcat体系架构



Tomcat服务器的启动是基于一个server.xml文件的,Tomcat启动的时候首先会启动一个Server,Server里面就会启动Service,Service里面就会启动多个”Connector(连接器)”,每一个连接器都在等待客户机的连接,当有用户使用浏览器去访问服务器上面的web资源时,首先是连接到Connector(连接器),Connector(连接器)是不处理用户的请求的,而是将用户的请求交给一个Engine(引擎)去处理,Engine(引擎)接收到请求后就会解析用户想要访问的Host,然后将请求交给相应的Host,Host收到请求后就会解析出用户想要访问这个Host下面的哪一个Web应用,一个web应用对应一个Context。

以上Tomcat体系架构图是根据server.xml文件画出来的。

Tomcat服务器的管理平台

Tomcat服务器的管理平台用来管理Tomcat服务器下的所有web应用。

那么如何进入Tomcat服务器的管理平台呢?

我们先启动Tomcat服务器,向浏览器敲入URL地址
http://localhost:8080
,进入如下界面。



点击
Manager App
,会弹出如下对话框。



要求我们输入用户名和密码,那么用户名和密码从哪儿去找呢?很显然我们应该去tomcat服务器配置文件conf里面去找,可以发现在conf文件夹中找到
tomcat-users.xml
文件,有关键内容如下:

<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<!--
<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="<must-be-changed>" roles="tomcat"/>
<user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
<user username="role1" password="<must-be-changed>" roles="role1"/>
-->
</tomcat-users>


打开以上注释,并修改为:

<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">

<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>

</tomcat-users>


很显然可得到一个用户,用户名为tomcat,密码为tomcat。修改完
tomcat-users.xml
文件,必须重启tomcat服务器,然后去登录Tomcat Manager Application。



点击确定,会出现如下错误界面:



为什么访问时被拒绝呢?是因为登录的用户权限不够大,所以应该创建一个管理员的角色,并为tomcat用户设置一个管理员的角色。修改
tomcat-users.xml
文件为:

<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">

<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="tomcat,manager-gui"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>

</tomcat-users>


注意:rolename=”
manager-gui


此时重启tomcat服务器,然后去登录Tomcat Manager Application。点击
Manager App
直接进入tomcat服务器管理平台。



Tomcat服务器管理平台的简单使用:

若在webapps目录下新建一个web应用,比如aa文件夹。



此时刷新Tomcat服务器管理平台,会看到aa这个web应用。



将打包成war的web应用部署到服务器上:



WEB开发的前景

说到这个地方,很多人就没劲了,为什么呢?搞半天就是做网站哟,没点意思。所以这里特意讲下web开发的前景,免得有些人像菜鸟一样,以为自己很懂,其实啥都不懂,说些傻话。要讲web开发前景,首先要强调一点,你学JavaWeb,开发的是程序,别人通过浏览器,访问的是你写的程序,程序为用户完成服务后,再把结果通过http响应写到浏览器中显示,思想不要停留在90年代,以为通过浏览器看到的都是网页。要注意,将来网站都是用来提供服务的,像你们思想中的网页,只是网站提供的一种服务而已。

再者,要讲web开发前景,就不得不提软件开发的两种架构之争了,一种是c/s架构,一种是b/s架构。

软件开发的两种架构:

c/s架构。



b/s架构。



何为b/s架构呢?(浏览器/服务器架构)就是指数据和程序都在服务器端,客户端通过浏览器访问程序并获取数据。这种架构的最大好处就是服务器端程序一旦修改,所有客户端访问的都是最新的程序,开发人员只管维护服务器就行了,不用管客户端维护的事。这种架构的最大缺点就是,由于客户端都是使用浏览器来访问服务器程序的,数据最终显示在浏览器中,浏览器有多强,数据就能显示成什么样式,数据的显示样式最终由浏览器决定。由于这种特性,所以b/s架构很少用来开发一些对显示有特殊要求的程序,例如游戏,现在的浏览器很难做到把数据显示成一个人,拿着一把刀,到处找人PK,并且还不卡。

何为c/s架构呢?就是指程序运行在客户机上,数据在服务器上。这种架构有一个很大的毛病,就是程序一旦修改,需要更新所有的客户机程序,客户机多,维护的工作量相当恐怖。这种架构的优点是:由于数据的计算在客户机上,服务器的压力小,并且由于数据的显示也由程序员自己编写gui程序完成,显示不受限制。所以c/s架构适合用于开发像游戏这样的程序。

但是,随着网络带宽的不断提升,云计算概念的提出,浏览器只要足够强大,c/s架构立马就会被淘汰,不仅c/s架构会被淘汰,软件最终都会消失、操作系统都可以没有,最终将会是b/s架构的天下,也就是浏览器+搜索引擎的天下。所有现在桌面软件提供的功能,最后都由网站提供,也就是说,将来打开电脑就是一个浏览器,想要什么服务,通过搜索引擎一找,就可以在网上找到相应的服务,用就是了。所以web开发人员是现在最流行的岗位。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: