文章目录
因为这一周的 Java 实验需要做一个和 Servlet 有关的东西,就简单接触了一下 Servlet 和 JSP,当然还有它们对应的 Java Web 服务器 Tomcat。既然是“初识”,那这篇文章主要写的肯定是在配置以及写 Hello World 的时候碰到的一些麻烦和解决方案了,都是比较初级的东西Orz
配置
首先当然是下载安装 Tomcat,地址在这里,以下部分提到的 %Tomcat_Home%
代表 Tomcat 的安装目录
设置环境变量
为了能进行后面的一些操作,需要把 servlet-api.jar
和 jsp-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_Home%/bin
下提供的 shutdown.bat
和 startup.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, 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!
了:
整个过程要注意的主要还是不要把文件放错目录,这个时候的目录结构应该是这个样子的:
$ 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 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 课的最后一次实验做的,因为觉得多少有一些总结的意义,就稍微整理了一下并分成三篇博客文章发布:
- 初识 JSP、Servlet 与 Java Bean:Tomcat 的配置和几个基本的 Hello World
- 初识 JDBC 与 JSTL:配合 MySQL 实现一个简易留言板
- 再探 JSP、Servlet 与 Java Bean:用 MVC 模式实现一个简易留言板