JavaWeb核⼼之Servlet
1.Servlet简介
1.1 什么是Servlet
Servlet 运⾏在服务端的Java⼩程序,是sun公司提供⼀套规范(接⼝),⽤来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API动态的向客户端输出内容。
servlet规范:包含三个技术点
- servlet技术
- filter技术—过滤器
- listener技术—监听器
1.2 Servlet快速入门
1.Http请求 request
请求行: GET /day02_war_exploded/index.html HTTP/1.1
GET: 请求方式[method] GET POST PUT DELETE
POST: 只有在Form表单method=post时候
特点: 参数隐藏, 请求体中
参数大小没有限制, 可以是文件
GET: 直接访问, 超链接, method=get等
特点: 参数是添加在url后面 ? 连接
参数大小有限制
/day02_war_exploded/index.html: 资源地址URI
HTTP/1.1: 协议和版本
请求头: map, 客户端的基本信息
请求体: post请求方式提交的参数
Http响应 response
响应行: HTTP/1.1 200
HTTP/1.1: 协议和版本
200: 状态码 正常 [status]
304: 访问缓存
404: 资源未找到
500: 服务器端代码(java代码)异常
302: 重定向
响应头: map, 服务器端封装的数据
响应体: 服务器响应内容
一个页面[html代码]
一个文件
一些数据…
描述整一个过程
2.Servlet的API(⽣命周期)
2.1 servlet接口中的3个方法
- init(ServletConfig servletConfig)
何时执⾏:servlet对象创建的时候执行,即在第一次访问时执行
ServletConfig : 代表的是该servlet对象的配置信息 - service(ServletRequest servletRequest, ServletResponse servletResponse)
何时执⾏:每次请求都会执⾏
ServletRequest :代表请求,认为ServletRequest 内部封装的是http请求的信息
ServletResponse :代表响应,认为要封装的是响应的信息 - destroy()
何时执⾏:servlet销毁的时候执⾏
2.2 servlet问题
- 问题:对XXXServlet进⾏了10次访问,init(),destory(),service(),doGet(),doPost()⼀共执⾏了多少次?request对象创建⼏个?response创建⼏个?
- 答:1;0;1;get和post共10次;10;10
3.Servlet的配置
3.1 Servlet规范
- 自定义类, 实现Servlet接口
- 着重实现3个方法
- 注册Servlet 应用的web.xml
<servlet>
<servlet-name>自定义名字
<servlet-class>全限定类名
</servlet>
<servlet-mapping>
<servlet-name>上面的名字[自定义名字]
<url-pattern>/地址[自定义地址]
</servlet-mapping>
- 访问: http://localhost:8080/day02_war_exploded/hello
<!-- 1.精确匹配: 只能通过 /hello 访问 -->
<servlet>
<servlet-name>Talon</servlet-name>
<servlet-class>a_servlet01.HelloTalon</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Talon</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<!-- 一个servlet资源可以对应多个url链接地址 -->
<servlet>
<servlet-name>Demo01</servlet-name>
<servlet-class>a_servlet01.HelloDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo01</servlet-name>
<url-pattern>/demo01</url-pattern>
<url-pattern>/DEMO01</url-pattern>
<url-pattern>/hello/demo01</url-pattern>
</servlet-mapping>
<!-- 2.使用通配符匹配(目录匹配) 可以通过 /hello/任意地址 来访问 -->
<servlet>
<servlet-name>Demo02</servlet-name>
<servlet-class>a_servlet01.HelloDemo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo02</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
<!-- 3.后缀匹配 可以通过 任意名字.user 来访问 -->
<servlet>
<servlet-name>Demo03</servlet-name>
<servlet-class>a_servlet01.HelloDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo03</servlet-name>
<url-pattern>*.user</url-pattern>
</servlet-mapping>
3.2 路径
- URL: http://localhost:8080/… 绝对路径
- URI: 以 / 开始的就是绝对路径
URI -> URL 协议://ip:port/URI/应用名/xx资源
3.3 注解取代xml文件
注解: @xx @interface
注解属性: 类型 属性名() [default]
1.属性没有设定默认值时, 必须传参
2.只有当传入的属性只有一个, 并且属性名是value的时候, 属性名可以省略
3.属性类型是数组时, 又只有一个值, 可以不用{}
注解不是可以加在任意位置的, 注解是可以解析的 -> 反射
注解作用: 可以取代xml配置文件
JavaEE 从 3.0 开始支持注解
- init方法来初始化
public class ServletDemo01 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//1.获得当前这个Servlet名字 servlet-name
String servletName = servletConfig.getServletName();
System.out.println(servletName);
//2.获得servlet的初始化参数
String initParameter = servletConfig.getInitParameter("encoding");
System.out.println(initParameter);
//获得所有初始化的名字
Enumeration<String> names = servletConfig.getInitParameterNames();
while (names.hasMoreElements()){
String s = names.nextElement();
String initParameter1 = servletConfig.getInitParameter(s);
System.out.println(initParameter1);
}
//3.获得servletContext对象
ServletContext servletContext = servletConfig.getServletContext();
System.out.println(servletContext);
}
4.ServletContext对象
4.1 什么是ServletContext对象
ServletContext代表是⼀个web应⽤的环境(上下⽂)对象ServletContext对象内部封装是该web应⽤的信息,ServletContext对象⼀个web应⽤只有⼀个。
- 问题:⼀个web应⽤有⼏个servlet对象?---- 多个
ServletContext对象的⽣命周期?
- 创建:该web应⽤被加载(服务器启动或发布web应⽤(前提,服务器启动状态))
- 销毁:web应⽤被卸载(服务器关闭,移除该web应⽤)
4.2 ServletContext的作⽤
- web.xml中配置初始化参数
<!-- 配置全局的初始化参数 -->
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.cj.jdbc.Driver</param-value>
</context-param>
- 通过context对象获得参数
ServletContext application = servletRequest.getServletContext();
//1.获得应用的路径(名字)
String path = application.getContextPath();
System.out.println(path);
//2.获得应用的初始化参数 - web.xml
String configPath = application.getInitParameter("driver");
System.out.println(configPath);
- 获得web应⽤中任何资源的绝对路径(重要 重要 重要)
//3.获得应用中资源的绝对路径 必须掌握
// src/a.txt
String aPath = application.getRealPath("WEB-INF/classes/a.txt");
// web/b.txt
String bPath = application.getRealPath("b.txt");
// web/WEB-INF/c.txt
String cPath = application.getRealPath("WEB-INF/c.txt");
// day02工程/d.txt
System.out.println(aPath);
System.out.println(bPath);
System.out.println(cPath);
3.3 ServletContext是⼀个域对象
- 什么是域对象?什么是域?
⼀个有作⽤范围的对象,可以在范围内共享数据 - ServletContext域对象的作⽤范围
整个web应(所有的web资源都可以随意向ServletContext域中存取数据,数据可以共享)。 - 域对象的通⽤的⽅法
setAtrribute(String name,Object obj);
getAttribute(String name);
removeAttribute(String name);
3.4 案例:通过两个页面来完成点击+1访问量
这个是获取页面
package c_servletContext;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.Date;
@WebServlet("/servletContext/demo02")
public class servletContextDemo02 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
ServletContext context = servletRequest.getServletContext();
context.setAttribute("date",new Date());
Object num = context.getAttribute("read");
if (num== null){
context.setAttribute("read",1);
}else {
Integer n = (Integer)num;
context.setAttribute("read",n+1);
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
这个是响应情况页面
package c_servletContext;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.Date;
@WebServlet(value = "/servletContext/demo03")
public class servletContextDemo03 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
ServletContext context = servletRequest.getServletContext();
Object date = context.getAttribute("date");
System.out.println(date);
System.out.println(context.getAttribute("read"));
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}