1. Servlet介绍
Sun提供的一种动态web资源开发技术,本质上就是一段java
小程序。
可以将Servlet
加入到Servlet
容器中运行。
tomcat
既是web
容器也是Servlet
容器。
1.1 如何创建Servlet
先写一个类,实现sun公司定义的Servlet
接口:
package java_web.Servlet;//这里是我自己定义的包,后面用到
import java.io.*;
import javax.servlet.*; //servlet-api.jar中的包
//GenericServlet类已经帮我们实现了Servlet的接口,只需继承并编写service即可
public class HelloServlet extends GenericServlet{
public void service(ServletRequest req, ServletResponse res) {
res.getWriter().write("hello Servlet");
}
}
上面是参照javaee api
文档写的一个简单Servlet
,然后在同目录下运行指令:
javac HelloServlet.java
会报错,找不到那些关于Servlet
的包,因为我们一般使用的是JavaSE
,缺少这些必要的package
,而tomcat
实际上是自带有的,所以我们可以通过命令设置临时的classpath
,以便编译:
set classpath=%classpath%;%CATALINA_HOME%\lib\servlet-api.jar;
再运行javac HelloServlet.java
,这时就应该可以成功了,不过我们需要的是一个文件夹package
而不是单独的class
文件,所以应该使用指令:
javac -d . HelloServlet.java
会在当前目录下生成一个包含了HelloServlet.class
的package
,名为java_web
。
接下来,将该整个包文件放到Tomcat中:
tomcat\webapps\news\WEB-INF\classes\java_web
news是一个web应用,需要将刚创建的整个包文件java_web放到该应用的classes中。
还需要配置WEB-INF
中的web.xml
(可以参考conf
中的web.xml
):
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>java_web.Servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/servlet/first</url-pattern>
</servlet-mapping>
</web-app>
这样就通过URL映射到了相应的类文件。
在浏览器地址栏中访问localhost/news/servlet/first
,即可看到刚才创建的servlet
文件效果。
1.2 使用IDEA创建Servlet项目
点击
File
→new
→project
:选择
Java Enterprise
,并在右边配置好版本和路径,点击Next
,再勾选Create project from template
(或者在上一步勾选Web Application
):点击
Next
,选择项目的名称和目录,设置服务器为tomcat
:点击
finish
后,项目创建完毕,用默认的配置直接启动Tomcat
运行该项目,会生成out
文件夹及其内部结构,并自动打开浏览器跳转到index.jsp
。src
目录存放的是一些待编译的java
文件,web
目录存放的是网页的web资源。out
目录存放的是编译输出文件,其中web_war_exploded
的名称意为,项目名称为web
的应用资源经过打包的war
文件展开后的结构。
为什么会出现这个呢?其实当我们启动项目,IDEA会自动生成这样的
war
文件,部署运行在Tomcat
服务器上,只是为了方便所以开启了exploded
模式,展开显示给开发者,可以在Project Structure
中修改为war
模式。因此,某个module
有了artifacts
就可以部署到应用服务器中了。官方对
artifacts
的解释:An artifact is an assembly of your project assets that you put together to test, deploy or distribute your software solution or its part. Examples are a collection of compiled Java classes or a Java application packaged in a Java archive, a Web application as a directory structure or a Web application archive, etc.
artifact
是一个项目里资源的整合,比如说一些Java
类文件,web
资源等,我们可以对它们进行测试、部署或发布。整个过程看似顺理成章,但是别忘了,我们是用IDEA生成的项目默认配置启动的,虽然运行成功,我们却不知其所以然。下面对它的一些相关配置进行解释。
1.3 项目相关配置
首先要明确,我们有两块需要配置:Project Structure
和 Run/Debug Configurations
,前者指的是刚创建的这个web项目的结构相关配置,后者指的是我们运行这个项目所用的相关配置,即Tomcat
服务器的配置。
关于Project Struture
:
上面的文章已经对项目配置信息解释得很清楚了,相信认真看完之后,都能明白如何配置。需要强调的是,别对目录结构有疑惑,web
资源原封不动输出,src
编译输出到WEB-INF
,种种设计是为了让我们能够更方便地开发web
项目。
关于Run/Debug Configurations
:
理解了上面文章里的项目配置后,关于Run/Debug Configurations
的Tomcat
设置,也不在话下,需要注意的是,记得在Deployment
选项中给Tomcat
添加资源路径,也就是将url
与web应用的资源包进行映射,此处显示的应用资源包就是out
→ artifacts
→ web_war_exploded
目录。
1.4 Servlet
的调用过程
服务器处理请求的过程:
- 分析出当前请求的是哪台虚拟主机:
- 查看请求头中的
Host
,分析访问的是哪台主机。 - 如果没有该属性,则访问缺省虚拟主机。
- 查看请求头中的
- 分析访问的是虚拟主机中哪个web应用;
- 分析要访问的是这个web应用中的哪个资源(静态资源直接获取);
- 查看
web.xml
文件,是否有对应的虚拟路径,有则使用该路径对应的资源(如Servlet
)做响应。
Servlet生命周期:
Servlet在第一次被访问到的时候,服务器会创建出Servlet对象,并立即调用init方法做初始化操作,创建出来的对象会一直驻留在内存中,之后对这个Servlet的访问