1. 创建 servlet (1)使用xml进行配置 (2)使用anno (注解)进行配置2. servlet 执行原理3. servlet 生命周期4. servlet 体系结构
一.Servlet概述
二。Servlet入门:
public class QuickServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
//对外提供服务
/**
* request: 代表请求
* response: 代表响应
* */
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//向浏览器响应一句话
servletResponse.getWriter().write("<h1>quickServlet!</h1>");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
(3)配置web.xml
配置Servlet网络访问路径
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--
把QuickServlet交给tomcat管理
servlet-name:当前servlet的别名(使用类名即可)
servlet-class:全限定类名
-->
<servlet>
<servlet-name>QuickServlet</servlet-name>
<servlet-class>cn.wsl.QuickServlet</servlet-class>
</servlet>
<!--
给servlet设置一个网络的访问地址(路径)
servlet-name:给指定别名的servlet配置映射
url-pattern:网络访问地址(注意:必须以/开头)
-->
<servlet-mapping>
<servlet-name>QuickServlet</servlet-name>
<url-pattern>/quickServlet</url-pattern>
</servlet-mapping>
</web-app>
(4)部署web项目
三。Servlet相关Api
// 1. servlet对象创建时,调用此方法
public void init(ServletConfig servletConfig);
// 2. 用户访问servlet时,调用此方法
public void service(ServletRequest servletRequest, ServletResponse servletResponse);
// 3. servlet对象销毁时,调用此方法
public void destroy();
* 创建
1)默认情况下
用户第一次访问时,创建servlet,执行init方法
2)修改创建时机
<load-on-startup></load-onstartup>
正数:4-N 【服务器启动时,创建】
注意:Tomcat的web.xml里有1,3 所以推荐4-n
负数(默认值):-1 【用户第一次访问时,创建】
* 运行(提供服务)
用户每次访问时,都执行service方法* 销毁
服务器正常关闭时,销毁servlet,执行destroy方法
public class LifeServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("LifeServlet创建了....");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("LifeServlet的service方法执行了");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("LifeServlet销毁了...");
}
}
(2)配置web.xml
<!--servlet的生命周期-->
<servlet>
<servlet-name>LifeServlet</servlet-name>
<servlet-class>cn.wsl.LifeServlet</servlet-class>
<!--tomcat启动时,创建servlet对象,执行init方法 -->
<load-on-startup>4</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LifeServlet</servlet-name>
<url-pattern>/lifeServlet</url-pattern>
</servlet-mapping>
3.ServletConfig
Tomcat在Servlet对象创建时,执行init()方法,并创建一个ServletConfig 配置对象
-
主要作用:读取web.xml配置文件Servlet中<init-param>信息,实现参数和代码的解耦
public class EncodeServlet implements Servlet {
// 定义全局变量
private ServletConfig servletConfig;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig = servletConfig;
}
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
// 用户访问,执行service方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
// String encode = "GBK";
// 读取配置文件的 init-param 参数
String encode = getServletConfig().getInitParameter("encode");
servletResponse.getWriter().write(encode); // 输出到浏览器
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
配置web.xml
<!--servlet的配置对象-->
<servlet>
<servlet-name>EncodeServlet</servlet-name>
<servlet-class>cn.wsl.EncodeServlet</servlet-class>
<init-param>
<param-name>encode</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>EncodeServlet</servlet-name>
<url-pattern>/encodeServlet</url-pattern>
</servlet-mapping>
四。Servlet体系结构
Servlet 在 Web 应用程序中的位置。
Servlet 执行以下主要任务:
- 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
- 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
- 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
- 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
- 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
通过选中Servlet接口,右键弹出菜单可以查看继承结构
编写普通java类,继承GenericServlet抽象类
public class ServletDemo1 extends GenericServlet {
@Override
public void init() throws ServletException {
System.out.println("ServletDemo1 创建了...");
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
super.getServletConfig(); // 调用父类的配置对象
servletResponse.getWriter().write("ServletDemo1 extends GenericServlet");
}
@Override
public void destroy() {
System.out.println("ServletDemo1 销毁了..");
}
}
配置web.xml
<!--servlet继承genericServlet-->
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>cn.wsl.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<url-pattern>/servletDemo1</url-pattern>
</servlet-mapping>
前端html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<h3>用户登录</h3>
<form action="http://localhost:8080/servlet/servletDemo2" method="get">
<input type="submit" value="提交表单..">
</form>
</body>
</html>
编写普通java类,继承HttpServlet抽象类
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("get....");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("post...");
}
}
配置web.xml
<!--servlet继承httpServlet-->
<servlet>
<servlet-name>ServletDemo2</servlet-name>
<servlet-class>cn.wsl.ServletDemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo2</servlet-name>
<url-pattern>/servletDemo2</url-pattern>
</servlet-mapping>
3.请求状态码问题
五。servlet路径
作用:将一个请求网络地址和servlet类建立一个映射关系
1. 精确匹配(掌握)
/servletDemo3
2. 目录匹配
/aa/*
3. 后缀匹配
*.xxx 例如:*.do
<!--
只要浏览器符合目录匹配规则,都可以访问到这个servlet:
/aa/abc
/aa/asadfasdf
-->
<servlet>
<servlet-name>ServletDemo4</servlet-name>
<servlet-class>cn.wsl.ServletDemo4</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo4</servlet-name>
<url-pattern>/aa/*</url-pattern>
</servlet-mapping>
<!--
只要浏览器符合后缀匹配规则,都可以访问到这个servlet
aa.do
bb.do
xx.do
-->
<servlet>
<servlet-name>ServletDemo5</servlet-name>
<servlet-class>cn.wsl.ServletDemo5</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo5</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
4.相对,绝对路径
访问资源的方式越来越多,请求路径在编写时难免出现混淆
浏览器的地址栏
a标签的href属性
form表单的action属性
js的loation.href属性
ajax请求地址
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>path</title>
</head>
<body>
<h3>测试访问路径:http://localhost:8080/servlet_xml/static/path.html</h3>
<h4>绝对路径</h4>
<!--
在开发时,强烈建议使用绝对路径
完整:协议://域名:端口/项目名/资源名
推荐:/项目名/资源名
-->
<a href="http://localhost:8080/servlet_xml/quickServlet">带http协议的绝对路径:quickServlet</a> <br>
<a href="/servlet_xml/quickServlet">不带http协议的绝对路径:quickServlet</a>
<h4>相对路径路径</h4>
<!--
相对路径语法:
./ 当前目录 注:./可以省略不写
../ 上级目录
-->
<a href="../quickServlet">相对路径:quickServlet</a>
</body>
</html>
六。Servlet 3.0
@WebServlet(urlPatterns = "/abcdemo")
public class webServlet30 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("dopost");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doget");
}
}
//webServlet配置的值的几种形式
// @WebServlet(name = "QuickServlet",urlPatterns = "/quickServlet")
// @WebServlet(urlPatterns = "/quickServlet")
// @WebServlet(value = "/quickServlet")
@WebServlet("/quickServlet") // 注解中有且仅有一个属性,名为value时,属性名可以省略...
public class QuickServlet extends HttpServlet {
}