初识 JSP、Servlet 与 Java Bean:Tomcat 的配置和几个基本的 Hello World

文章目录

因为这一周的 Java 实验需要做一个和 Servlet 有关的东西,就简单接触了一下 Servlet 和 JSP,当然还有它们对应的 Java Web 服务器 Tomcat。既然是“初识”,那这篇文章主要写的肯定是在配置以及写 Hello World 的时候碰到的一些麻烦和解决方案了,都是比较初级的东西Orz

配置

首先当然是下载安装 Tomcat,地址在这里,以下部分提到的 %Tomcat_Home% 代表 Tomcat 的安装目录

设置环境变量

为了能进行后面的一些操作,需要把 servlet-api.jarjsp-api.jar 两个 jar 文件放进 Java 的环境变量 CLASSPATH 里,它们应该在 %Tomcat_Home%/lib 下,注意编辑环境变量的时候不要把之前的覆盖了,也不要只写到 lib 目录,要具体到 jar 文件

自定义 Web 根目录

Tomcat 默认的网址 http://localhost:8080 映射到的本地目录是 %Tomcat_Home%/webapps/ROOT,为了方便测试我需要把这个默认 Web 根目录改到其他地方,这个的更改还是比较简单的,只要到 %Tomcat_Home%/conf/server.xml 里把 <Host> 项里的 appBase 属性的值改成自定义的那个目录就行了:

<Host name="localhost" appBase="D:\Repositories\NaiveProjects\Java\servlet\HelloWorld" unpackWARs="true" autoDeploy="true"> ... </Host>  

这里需要注意的是这个配置文件是在软件启动的时候加载的,所以要重启 Tomcat 服务才能生效,这里有个比较坑的地方就是它的服务并不是随着控制程序的关闭而停止的(都不好意思说被这个坑了一会[捂脸]),所以要在控制程序的 General 项里点击停止再启动:

tomcat-properties

或者也可以用 %Tomcat_Home%/bin 下提供的 shutdown.batstartup.bat 两个批处理脚本来关闭和启动,总之不要以为关了软件再开会有什么影响[再捂脸]

另外一点是 Windows 下的路径格式不要打错,否则如果路径加载不成功的话 Tomcat 服务就不能成功启动了

重启服务完成后应该就改好了默认目录了,但是网址的根目录还是会默认映射到所提供的目录下的 ROOT 文件夹里,所以为了不需要创建这个不必要的文件夹,还要再改一下配置文件,在 <Host> 项内增加一个 <Context> 项,并且将 path 值设为空, docBase 值设为自定义目录路径:

<Host name="localhost" appBase="D:\Repositories\NaiveProjects\Java\servlet\HelloWorld" unpackWARs="true" autoDeploy="true">  
<Context path="" docBase="D:\Repositories\NaiveProjects\Java\servlet\HelloWorld" reloadable="true"></Context>  
...
</Host>  

这个操作当然是从 Stack Overflow 上复制粘贴的啦(逃

同样重启一下服务即可,接下来可以准备开始写 Hello World 测试了,搞配置都搞了这么久真是劲啊(

Hello, World!

以下所提到的 %ROOTDIR%,如果进行了更改 Web 根目录的操作就是指更改后的目录,否则默认是在 %Tomcat_Home%/webapps/ROOT/

Hello, JSP!

尝试写一个简单的 JSP页面,在 %ROOTDIR% 下新建一个 index.jsp,然后写入以下内容:

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">
    <title>JSP TEST</title>
</head>

<body>  
    <h1><% out.println("Hello, JSP!"); %></h1>
</body>  
</html>  

这个时候在浏览器访问 http://localhost:8080 或者 http://localhost:8080/index.jsp 的话可以看到一个一级标题大小的 Hello, JSP! ,这个测试应该不会碰到什么问题:

hello-jsp

Hello, Servlet!

接下来尝试写一个简单的 Servlet 程序,同样在 %ROOTDIR% 下,文件名为 testServlet.java,注意代码里面 import 了servlet 类,如果没有成功把前面提到的两个 jar 包的路径加入环境变量 CLASSPATH 里的话编译是不能通过的:

import java.io.*;  
import javax.servlet.*;  
import javax.servlet.http.*;

public class testServlet extends HttpServlet {  
    protected void doGet(
        HttpServletRequest req,
        HttpServletResponse res
    ) throws ServletException, IOException {
        PrintWriter out = res.getWriter();
        out.println("<title>Servlet Test</title>");
        out.println("<h1>Hello, Servlet!</h1>");
        out.flush();
    }
}

直接编译不用运行,生成的 testServlet.class 需要移动到 %ROOTDIR%/WEB-INF/classes,新建不存在的文件夹并注意大小写

然后在 %ROOTDIR%/WEB-INF 下新建一个 web.xml 文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app>  
    <servlet>
        <servlet-name>servlet</servlet-name>
        <servlet-class>testServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servlet</servlet-name>
        <url-pattern>/helloServlet</url-pattern>
    </servlet-mapping>
</web-app>  

应该还是比较容易看懂的,就是把 test 这个类命名为 servlet,并且映射到 /helloServlet 这个 URL 上,重启 Tomcat 服务,然后在浏览器访问 http://localhost:8080/testServlet 就可以看到一个一级标题大小的 Hello, Servlet! 了:

hello-servlet

整个过程要注意的主要还是不要把文件放错目录,这个时候的目录结构应该是这个样子的:

$ tree
ROOT_DIR/  
├── index.jsp
├── [testServlet.java]
└── WEB-INF/
    ├── classes/
    │   ├── [testServlet.java]
    │   └── testServlet.class
    └── web.xml
Hello, JavaBean!

最后写一个 JavaBean 的 Hello World,如果怕和前面的搞混的话可以把整个 %ROOTDIR% 下的文件清空或者移动到别的地方去

%ROOTDIR% 下新建 testBean.java,内容如下:

package tb;

public class testBean {  
    private String name = null;

    public testBean(String name) {
        this.name = name;
    }

    public void set(String name) {
        this.name = name;
    }
    public String get() {
        return name;
    }
}

有一点要特别提一下,就是 Java Bean 按照规范是要提供无参构造函数、getter 和 setter 的,并且 getter 和 setter 的命名方式是 get/set 加变量名,也就是说按照这个规范的话其实应该写 setName()getName() 两个函数,然后构造函数去掉参数,但是为了遵循能偷懒就偷懒的原则这里就不改了

编译后的文件同样也要放到 %ROOTDIR%/WEB-INF/classes 里,并且因为有 package tb; 这一行,需要在 classes 下新建 tb 文件夹再放入编译后的 testBean.class 然后在 %ROOTDIR% 下新建一个 testBean.jsp 文件:

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">
    <title>Java Bean Test</title>
</head>

<body>  
    <%@ page import = "tb.testBean" %>

    <h3>
        <% testBean name = new testBean("Naive"); %>
        The Name Is: <%= name.get() %>

        <%
            out.println("<hr>Setting Another Name<hr>");
            name.set("Excited!");
        %>
        The Name Is: <%= name.get() %>
    </h3>
</html>  

输出应该是:

hello-java-bean

最后整理一个各个 Hello World 的 URL 和对应的源文件:

URL Related Source Code Files
locahost:8080/index.jsp /index.jsp
locahost:8080/testBean.jsp /testBean.jsp
/WEB-INF/classes/tb/testBean.java
locahost:8080/helloServlet /WEB-INF/web.xml
/WEB-INF/classes/testServlet.java

到这里整个对 Servlet 和 JSP 的初识就结束了,JSP 这种写法很像一开始学 PHP 的时候的前后端混写的样子= =所以感觉现在写起来有点……奇怪,我觉得可能这次实验做完就要卸载 Tomcat 了(逃

系列文章地址

这些 Java Web 相关的内容是 Java 课的最后一次实验做的,因为觉得多少有一些总结的意义,就稍微整理了一下并分成三篇博客文章发布:

  1. 初识 JSP、Servlet 与 Java Bean:Tomcat 的配置和几个基本的 Hello World
  2. 初识 JDBC 与 JSTL:配合 MySQL 实现一个简易留言板
  3. 再探 JSP、Servlet 与 Java Bean:用 MVC 模式实现一个简易留言板