1.基础
1.1 概念和作用
- Servlet是按Servlet规范编写的Java类
- 由Sun公司定义,具体细节由Servlet容器实现
- 用于处理Web应用中的HTTP请求,如:提交数据、会话跟踪、读取和设置HTTP头信息等
1.2 结构体系
- Servlet对象、ServletConfig对象定义了Servlet的基本方法,并封装了Servlet的相关配置信息
- GenericServlet对象为Servlet接口和ServletConfig接口提供了部分实现,但没有对HTTP请求处理进行实现
- HttpServlet是GenericServlet的子类,该对象为HTTP请求提供了具体的操作方法
- 以上均可通过源码了解到
- 在开发中,通常我们编写的Servlet对象都继承于HttpServlet,所说的Servlet就是指HttpServlet对象

1.3 技术特点
- Servlet对象在Servlet容器启动时被初始化,初次被请求时,Servlet容器将其实例化,并储存于内存中
- 若存在多个请求,Servlet不会再被实例化
- 每一个请求是一个线程,而不是进程
- 开发Servlet程序
2.1 构建Maven项目
- 创建一个普通(不用模板)的Maven项目,删掉里面的src目录
- 在pom.xml文件中添加依赖,具体参照Maven中内容6.7
- 在项目中建立Moudel,这个空的工程就是Maven主工程
关于Maven父子工程的理解
- 子项目可以直接使用父项目中的jar包
父项目中有:
<modules><module>servlet-01</module></modules>
子项目中有:
<parent> <artifactId>javaweb-02-Maven</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent>
2.2 Maven环境优化并配置服务器
- 修改web.xml为最新的(复制Tomcat中的)
- 将Maven的结构搭建完整(在main中添加java和resource文件夹)
- 配置Tomcat
2.3 创建并配置Servlet
- 步骤
- 编写一个类,继承HttpServlet类,并重写该类中的方法
- 把开发好的Java类部署到web服务器中
- 具体操作步骤参照Maven文章中第8节
- 为什么需要映射
- 我们写的Servlet是JAVA程序,但是要通过浏览器访问
- 而浏览器需要连接web服务器
- 所以我们需要在web服务中注册所写的Servlet,还要给它一个浏览器能够访问的路径
3.Servlet原理
4.Mapping问题
4.1 一个Servlet可以指定一个映射路径
<!--声明Servlet对象-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.luo.servlet.HelloServlet</servlet-class>
</servlet>
<!--映射Servlet-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
4.2 一个Servlet可以指定多个映射路径
- 以下代码表示通过/hello或/hello2或/hello3或/hello4或/hello5发起请求,都会进入com.luo.servlet.HelloServlet类中,从而有相同的响应
<servlet> <servlet-name>hello</servlet-name> <servlet-class>com.luo.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello3</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello4</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello5</url-pattern> </servlet-mapping>
4.3 一个Servlet可以指定通用映射路径
- 以下代码表示通过/hello或/hello/任意字符发起请求 均有相同的响应
<servlet> <servlet-name>hello</servlet-name> <servlet-class>com.luo.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
4.4 默认请求路径
- 此方法可以干掉默认显示的index.jsp页面(非常不推荐使用)
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
4.5 指定一些后缀或者前缀等等….
- 映射路径设置中,前面不能加项目映射的路径,比如/h/.fuma不合法
- 但h/*.fuma路径合法
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.fuma</url-pattern> </servlet-mapping>
4.6 优先级问题
- 指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
- 以下代码中用/hello发起请求,会进入com.luo.servlet.HelloServlet类中,同其他地址发起请求则进入com.luo.servlet.ErrorServlet类(自己编写),得到404响应。
```xml
hello com.luo.servlet.HelloServlet hello /hello
