0. 前言
上一章[从你的WEB世界路过之--0.初识]中我们对WEB开发中的基本概念进行了说明, 其中提到的服务器端的B/S程序(也叫WEB应用), 作为一个WEB开发人员, 其工作内容就是编写服务器端的WEB应用. 本文就带领大家使用JAVA编写一个简单的WEB应用.
1. Hello J2EE
JAVA可以做很多事情, 根据不同的功能将整个JAVA体系分为3大平台
- J2SE: JAVA基础类库
- J2ME: 安卓开发等
- J2EE: B/S程序开发
其中, J2EE是JAVA为了B/S程序开发而提供的解决方案, 也是我们重点要讲的内容. 下面我们来完成第一个WEB应用.
1.1 JAVA环境
你需要在电脑上安装JAVA环境, 网上资料太多, 这里简单说一下: 下载JDK并解压, 配置环境变量中的JAVA_HOME和PATH, 在命令行输入java -version, 如果出现版本说明JAVA环境安装成功. 这里说一下JAVA_HOME和PATH的作用:
- JAVA_HOME: 很多依赖于JAVA的软件并不知道你的电脑中JAVA被安装在了哪个目录, 因此他们会从环境变量中读取JAVA_HOME的值, 并将其作为JAVA所在目录, 因此如果你的JAVA_HOME配置错了, 这些依赖于JAVA的软件也将无法使用.
- PATH: 在Windows的命令行中执行javac.exe, 需要输入D:/java/bin/javac.exe, 如果只输入javac.exe, 系统是找不到该EXE的. 每次都输入目录显然太麻烦了. 环境变量PATH很好的解决了这个问题, 如果我们在PATH中配置了D:/java/bin/, 输入javac.exe执行时系统会从D:/java/bin/中查找, 如果有EXE就会执行. JDK下的bin目录存放的是JAVA各种EXE, 将其配置到PATH, 就可以在命令行中随意执行下面的EXE了, 再也不用输入目录了.
1.2 开发工具
目前比较流行IDea和Eclipse, 本文是基于Eclipse开发的, Eclipse去官网下载解压即可. 点击进入Eclipse下载页面
1.3 创建项目
按照下面菜单顺序创建一个动态WEB工程: File >> New >> Other >> Web >> Dynamic Web Project
Eclipse会创建一个Web工程 , 工程结构如下:
- src: Java源代码目录, 所有Java相关的源文件都放在src下.
- build: 编译后的Class文件目录, 不需要开发人员处理, 暂时不需要考虑
- WebContent: Java以外的文件可以放在此目录下, 如CSS, JS, HTML等
- WebContent/META-INF: 存放工程的一些信息, 不需要开发人员处理, 暂时不需要考虑
- WebContent/WEB-INF: 此目录下的文件只有通过程序才能访问, 可放置配置文件等, 客户端无法直接访问.
- WebContent/WEB-INF/lib: 放置工程所有依赖的第三方类库(Jar文件)
1.4 Tomcat
当用户访问http://a.com:8080, 由服务器8080端口的WEB应用进行处理. 那如何让WEB应用处理访问8080端口请求呢?
我们想这样一个场景: 一个公司有好多部门, 每个部门处理各自不同的业务. 当有客户来的时候并不知道自己要办理的业务该由哪个部门处理. 每个部门需要派出一个人在公司前台负责接待自己相应的客户, 这样每个部门都会浪费一个人. 后来公司换了一种方案, 招聘了一个前台, 所有部门把他们能做的事情写到一些纸上交由前台, 当有客户来时, 由前台负责接待并在纸上找到对应处理的部门. 当部门增加或减少时只需要在前台的纸上进行修改即可. 随着发展公司部门越来越多, 于是在隔壁的办公楼租了一个办公区, 有些部门在新的办公区, 这时候新办公区也会设立一个独立的前台. 这时公司的结构如下图:
每个部门都属于一个办公区, 每个办公区都有一个前台, 客户只能通过前台才能进入部门办事. 不在办公区的部门是无效的.
1.4.1 WEB容器
在J2EE体系中: 办公区叫做WEB容器, 前台相当于WEB容器所监听的端口. 用户去前台的过程相当于访问服务器的某个端口. 我们创建的项目相当于一个部门(只负责业务处理). 项目如果想被用户访问到需要添加到WEB容器中(相当于在前台的纸上登记自己能做什么), 项目添加到WEB容器中的过程成为部署.
公司相当于一台服务器, 服务器下可以有多个WEB容器(每个容器监听一个端口), 一个WEB容器中可以部署多个项目.
我们介绍一个最常见的WEB容器: Tomcat. 它的作用主要是监听8080端口, 当有用户访问8080端口时, 由Tomcat根据网址找到对应的项目进行处理. 你可以在一个服务器中启动多个Tomcat(监听端口不能重复).
当你访问服务器的WEB程序时你的网址中应该加上要访问的项目名称才可以, http://a.com:8080/项目1/category.
1.4.2 安装Tomcat
Tomcat是依赖于JAVA, 要确保你的JAVA环境已经安装, Tomcat的安装非常简单. 下载后解压即可. 点击进入官网下载
Tomcat解压后内容如上图所示:
- bin: 执行文件目录, 所有Tomcat的可执行文件都在此目录, 包括启动关闭Tomcat的EXE
- conf: 配置文件目录, 所有Tomcat的配置文件都在此目录, 暂时不需要对配置进行修改
- logs: 日志目录, 访问记录/错误日志都输出到此目录中
- webapps: 项目部署目录, 保存所有需要被Tomcat管理的项目, 将WEB应用打包后放入此目录即可.
1.4.3 启动Tomcat
进入Tomcat下的bin目录, 双击执行startup.bat即可启动. Tomcat启动后会监听8080端口(默认8080), 当访问8080端口时由Tomcat进行处理. 在浏览器中访问http://localhost:8080, 出现如下页面代表Tomcat启动成功. 注: localhost代表本机.
上图页面是Tomcat的欢迎页, 由于访问的网址中没有指定项目名称, 因此Tomcat会返回欢迎页至浏览器.
1.4.4 Eclipse配置Tomcat
项目必须部署至Tomcat后才能被用户访问. 如果每次修改后都打包部署至Tomcat才能查看效果会使得开发效率变得非常低下, 因此我们需要在Eclipse配置Tomcat, 这样修改完代码后就可以直接在Eclipse中使用Tomcat运行了.
1) 在Eclipse中配置Tomcat
Window >> Preferences >> Server >> Runtime Environments >> Add >> Apache >> Apache Tomcat v8.5
2) 在Eclipse中创建Tomcat服务器
- 创建完成后, 在Server视图中可以看到新创建的Tomcat服务器
- Server runtime environment中选择1)中配置的Tomcat
- 如果没有Server视图, 通过Windows >> Show View >> Other >> Server >> Servers可以显示视图
1.5 Servlet
上一篇我们说到了, 当用户访问http://a.com:8080/category时, 会由在服务器8080端口的WEB应用进行处理, WEB应用中会有处理/category的程序, 结合上面讲到的我们可以得出结论: 8080端口是由Tomcat监听的, 和WEB应用程序无关. 那我们只需要写一个能够处理/category请求的程序即可.
在JAVA中, 能够在服务器端处理请求的程序叫做Servlet(Server Applet): 服务器端应用程序. Servlet负责处理客户端的请求并将结果返回至客户端.
1.5.1 创建Servlet
在项目src目录下创建存放Servlet的目录. 在目录中新建一个Servlet. 创建方式: New >> Other >> Web >> Servlet. 在创建Servlet窗口中的填写Servlet的名称即可, 一个Servlet就创建好了.
1.5.2 导入Tomcat环境
打开创建好的Servlet, 会发现Servlet中报错. 这是因为Servlet是J2EE提供的, Servlet需要依赖J2EE下的类库, 但我们的项目中并没有J2EE相关的类库, 因此会报错, 我们可以将Tomcat环境导入项目中就可以解决.
Properties >> Java Build Path >> Libraries >> Add Library >> Server Runtime >> 选中1.4.4配置的Tomcat
- Tomcat是按照J2EE标准实现的并依赖于J2EE的, 导入Tomcat环境相当于导入了J2EE类库
- 如果在项目中我们单独引入J2EE类库, 部署至Tomcat时会和Tomcat自带的J2EE类库冲突
1.5.3 Servlet详解
// @WebServlet注解声明了当前类是Servlet
// "/category"声明了当前Servlet只处理"/category"请求
@WebServlet("/category")
public class CategoryServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public CategoryServlet() {
super();
}
// GET请求执行
// HttpServletRequest: 请求对象, Tomcat将本地请求的内容封装至该对象
// HttpServletResponse: 响应对象, Tomcat将本次请求的响应封装至该对象
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 将你想要返回客户端的内容写入response.getWriter()中即可
response.getWriter().append("hello j2ee, hello servlet");
}
// POST请求执行
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
- @WebServlet("/category"): 声明类为Servlet, 并设置Servlet负责处理的请求"/category"
- doGet&doPost: 客户端以GET方式请求将会执行doGet方法, POST请求执行doPost方法.
- HttpServletRequest: J2EE提供的请求对象, Tomcat在收到用户的请求时, 将请求的内容封装至该对象中, 通过该对象可以获取包括客户端IP, 请求方式, 请求URL, 请求参数等客户端提交的信息.
- HttpServletResponse: J2EE提供的响应对象, Tomcat创建请求对象时会同步创建一个响应对象, 将需要返回客户端的内容写入响应对象中即可.
1.5.4 启动Tomcat
运行项目时, 需要在Eclipse中启动Tomcat. 第一次启动前需要在Tomcat中添加要运行的项目. 添加完成后点击Server视图右侧的启动(或调试)按钮即可. 添加项目步骤:
选中Server视图中的Tomcat >> 右键Add and Remove >> 将要运行的项目添加至右侧窗口内
1.5.5 访问Servlet
访问http://localhost:8080/atd681-web-servet/category, 就可以看到你在Servlet中返回给客户端的文字了.
2. J2EE总结
我们已经创建了J2EE项目并编写了Servlet. 项目启动后使用浏览器可以访问. 我们来总结一下项目的创建及运行流程.
- 创建项目, 需要创建动态WEB工程
- 引入Tomcat环境, 项目依赖于J2EE类库, 为了在部署时不和Tomcat环境冲突, 项目引入Tomcat环境
- 创建Servlet, 配置Servlet可处理的请求URL, 并将返回内容写入Response中
- 将项目添加至Tomcat中, Tomcat启动时只会加载已添加的项目
- 启动Tomcat, 启动时Tomcat会解析项目中带有@WebServlet注解的Servlet, 并将其处理的请求URL对应保存.
- 通过URL访问时: 根据localhost找到本机, 根据8080端口找到对应的Tomcat, Tomcat根据访问URL"/category"找到处理该URL的Servlet并调用Servlet的方法处理本地请求, Servlet根据请求的方式(GET或POST)执行相应的方法(doGet或doPost)后将响应内容返回客户端
只有在Servlet中声明了处理的请求后, 请求才能被Servlet执行, 本例中只有请求/category才会被Servlet处理, 如果访问其他的请求需要添加对应的Servlet. 根据以往经验, 新同学刚接触J2EE时容易出现404错误, 大概有以下几个原因:
- 启动Tomcat时没有将项目添加至Tomcat
- Servlet中没有添加@WebServlet
- 访问的URL没有添加项目名称或者URL拼写错误
3. 结语
本文主要是带领刚入门的同学完成J2EE项目的环境搭建及第一个J2EE项目. 虽然现在的框架越来越高级, 但万变不离其宗, 基础非常重要, 学好基础以后会少走很多弯路, 下一篇中会对数据库进行讲解, 欢迎大家关注.