第一个JavaWeb应用

1 什么是JavaWeb

SUN公司的Servlet规范对JavaWeb应用做了这样的定义:“JavaWeb 应用由一组Servlet/JSP,HTML文件,和相关的java类,以及其他可以被绑定的资源构成,它可以再各种供应商提供的符合Servlet规范的Servlet容器中运行。”

从中可以看出JavaWeb应用应该包含如下内容:

  • Servlet组件:标准Servlet接口的实现类,运行在服务器端,包含了被Servlet容器的动态调用的程序代码
  • JSP组件:包含Java程序代码的JHTML文档,运行再服务器端,当客户端请求访问JSP文件时,Servlet容器先把它编译成Servlet类,然后动态调用它的程序代码
  • 相关的Java类:与Web应用相关的Java类,如PoJo类
  • 静态文档: 存放在文件系统中,如Html文件,图片文件和声音文件等
  • web.xml:javaweb应用配置文件,采用XML格式,该文件必须再Web应用的WEB-INF子目录下

2 Tomcat简介

tomcat是一个优秀的Servlet容器,Tomcat本身完全由Java语言编写,,是Apache开源软件组织的一个软件项目。

Tomcat作为servlet容器时用户请求示意图
image.png

2.1 Tomcat的安装(windows下)

  1. 先安装JDK(省略)
  2. 解压apache-tomcat-9.0.24.tar.gz文件,比如我将其解压后,其实际的目录为:D:\developers\javadeveloper\SOFT\apache-tomcat-9.0.14
  3. 创建环境变量 CATALINA_HOME, 值为上述Tomcat的安装目录D:\developers\javadeveloper\SOFT\apache-tomcat-9.0.14,然后再path中追加变量 ;%CATALINA_HOME%\bin

2.2 Tomcat的目录结构

image.png

目录 描述
/bin 存放再Windows平台和Linux平台上启动和关闭Tomcat的脚本文件
/conf 存放Tomcat服务器的各种配置文件,其中最重要的配置文件时server.xml
/lib 存放Tomcat服务器及Web应用都可以访问的JAR文件
/log 存放Tomcat的日志文件
/webapps 在Tomcat上发布JavaWeb应用时,默认把Web应用文件放在此目录
/work Tomcat的工作目录,Tomcat在运行时把生成的一些工作文件放在此目录下,比如,在默认情况下,Tomcat把编译的JSP而生成的Servlet类文件放在此目录下

2.3 启动Tomcat并测试Tomcat的安装

如果你的CATALINA_HOME设置成功,那么只需要在控制台输入startup.bat即可开启tomcat服务器。
在浏览器中输入localhost:8080即可访问tomcat主页:
image.png

2.4 运行脚本介绍

事实上不管startup.bat还是shutdown.bat批处理文件,其最终的执行的其实都是catalina.bat脚本,catalina.bat脚本允许输入命令行参数,参数如下表

命令行参数 作用
start 在新的DOS窗口中启动Tomcat服务器
run 在当前DOS窗口中启动Tomcat服务器
debug 在跟踪模式下启动Tomcat服务器
embedded 在嵌入式模式下启动Tomcat服务器
stop 关闭tomcat服务器

2.5 Tomcat的组成结构

我们先看看Tomcat的配置文件server.xml的配置文件的结构:

  1. <Server >
  2. <Service >
  3. <Connector />
  4. <Connector />
  5. <Engine >
  6. <Host >
  7. <context></context>
  8. </Host>
  9. </Engine>
  10. </Service>
  11. </Server>
  1. : 顶层元素,位于整个配置文件的最顶层,可以包含一个或者多个Service元素
  2. : 包含一个元素,以及一个或者多个元素。
  3. : 连接器类元素: 用于代表介于客户与服务服务器之间的通信接口,负责将客户的请求发送给服务器,并将服务器的响应结果返回给客户。
  4. : Service只包含一个Engine元素,处理该Service中所有Connector连接收到的客户请求
  5. : Engine中可以包含多个Host,每个Host定义了一个虚拟主机,它可以包含一个或者多个Web应用
  6. : 每个Context代表了虚拟主机(Host)上的单个Web应用,一个Host可以包含多个Context

各个组件之间的嵌套关系示意图如下
image.png

3 创建第一个JavaWeb应用

JavaWeb应用的目录结构有明确的规定

目录 描述
/WEB-INF 存放Web应用的配置文件web.xml的
/WEB-INF/classes 存放各种.class文件,Servlet类的.class文件也才存放在此目录下
/WEB-INF/lib 存放Web应用所需的jJAR包,比如jdbc的驱动JAR
/WEB-INF/web.xml web应用的配置文件
应用程序根目录 所有的JSP和HTML文件都放在此目录或者自定义的子目录中

文件结构示意图:
myapp
|—>WEB-INF
|—>classes
|—>lib
|—>web.xml
|—>html/jsp..
|—>META-INF

接下来我们创建一个JavaWeb版本的HelloWorld

在Tomcat路径的webapps文件夹下新建myapp文件夹,作为工程的总文件夹

3.1 创建Servlet类

  1. package com.miao;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. public class MessageServlet extends HttpServlet {
  8. @Override
  9. public void service(HttpServletRequest request, HttpServletResponse response)
  10. throws ServletException, IOException{
  11. String msg = request.getParameter("msg");
  12. System.out.println(msg);
  13. }
  14. }

路径为 /webapps/myapp/com/miao/MessageServlet.java
使用如下命令,将MessageServlet.java进行编译并将目标文件放在WEB-INF的classes文件夹下

  1. javac -classpath D:\developers\javadeveloper\SOFT\apache-tomcat-9.0.14\lib\servlet-api.jar -d WEB-INF\classes com\miao\MessageServlet.java

3.2 创建web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
  5. http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  6. version="4.0"
  7. metadata-complete="true">
  8. <servlet>
  9. <servlet-name>message</servlet-name>
  10. <servlet-class>com.miao.MessageServlet</servlet-class>
  11. </servlet>
  12. <servlet-mapping>
  13. <servlet-name>message</servlet-name>
  14. <url-pattern>/message</url-pattern>
  15. </servlet-mapping>
  16. </web-app>

web.xml个元素说明:

子元素 说明
定义Servlet的名字
指定Servlet的完整类名
用于指定一个Servlet的URL映射,一个Servlet可以有多个servlet-mapping
定义Servlet的初始化参数(包括参数名和参数值),在一个元素中可以有多个
指定当Servlet容器启动Web应用时,加载各个Servlet的次序,如果这个值为正数或者零,那么Servlet容器先加载数值最小的Servlet,如果这个值为负数或者不设定,那么Servlet容器将在客户端首次访问这个Servlet时加载它(即延迟加载)
url映射值,可以用通配符 号,但是只能以【.后缀名】或者【/*】的格式来写

在web.xml中注册你的servlet,然后将web.xml放入WEB-INF目录下

启动tomcat, 在浏览器中输入http://localhost:8080/myapp/message?msg=王祖贤
可以在控制台看到如下页面
image.png

4. 发布应用

tomcat的项目管理界面
修改/conf/tomcat-users.xml
父标签中添加如下子元素

  1. <role rolename="manager-gui"/>
  2. <role rolename="manager-script"/>
  3. <user username="root" password="root" roles="manager-gui,manager-script"/>

点击tomcat主页上的Manager App按钮, 输入上述中的username和password就可以进入项目管理界面
image.png

4.1 默认的发布方式

直接将拥有项目结构的项目文件夹放置在/webapps目录下即可,在/webapps下的所有Web应用运行在local host的虚拟机中。

4.2 自定义项目位置方式

4.2.1 方式一

新建 /conf/【enginename】/【hostname】/【contextpath】.xml 文件,并在文件中添加元素

例如我在下图目录下新建了first_servlet.xml文件
image.png
然后在文件中添加元素

  1. <Context path="/first_servlet1"
  2. docBase="D:\developers\javadeveloper\workspace\idea\servlet_test\out\artifacts\web_war_exploded"
  3. reloadable="true"/>

其中【docBase】属性指定了项目的外部位置,【reloadable】属性规定了是否热加载
启动tomcat,在项目管理页面可以发现已经有了刚才定义的项目
image.png
我们可以发现,项目名其实就是【first_servlet.xml】的文件名【first_servlet】,而不是我们在Context元素中的Path元素

4.2.2 方式二

直接在/conf/server.xml中,在localhost的标签中添加方式一中的元素,并将【path】属性改为【/first_servlet2】

  1. <Context path="/first_servlet2"
  2. docBase="D:\developers\javadeveloper\workspace\idea\servlet_test\out\artifacts\web_war_exploded"
  3. reloadable="true"/>

重启tomcat可以在项目管理页面发现多了一个名为【first_servlet2】名称的项目
image.png