Servlet基础
什么是 Servlet
Servlet 是一个接口规范,其规定了 web 服务器在接收到请求时应该怎么做处理,Servlet 不管具体实现,由各类 web 服务器负责实现,目前最流行的服务器软件为 Tomcat
第一个 servlet 程序
创建 servlet 项目
idea 下
servlet 简单程序
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
//@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {//servlet类需要继承HttpServlet类
private String message;
public void init() {
message = "Hello World!";
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
// Hello
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>" + message + "</h1>");
out.println("</body></html>");
}
public void destroy() {
}
}
init()方法:init()方法仅在服务器装载 Servlet 时才由服务器执行一次
Service 方法:每次客户端请求服务器的时候,就会调用 Service 方法
destroy 方法:仅在服务器移除 Servlet 时才由服务器执行一次
Service 方法和 doGet,doPost 方法
- 当类中有 service 方法时,只会执行 service 方法,不会执行 doPost 和 doGet
- 当类中没有 service 方法时,servlet 会按照 jsp 传来的请求类型,执行 doGet 还是 doPost
servlet 继承体系
ServletConfig 类
作用
- 在 servlet 被加载的 init 方法时,获得初始化参数
- 获取 Servlet 程序别名
- 获取 servletContext
web.xml
在 Servlet 的配置文件 web.xml 中,可以使用一个或多个
<servlet>
<servlet-name>ServletConfigDemo1</servlet-name>
<servlet-class>gacl.servlet.study.ServletConfigDemo1</servlet-class> <!--配置ServletConfigDemo1的初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>gacl</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
通过 ServletConfig 获取初始化信息
getInitParameter(参数名);
config.getServletName();获取Servlet程序的别名
每个 Servlet 只能获取自己的 ServletConfig 类
ServletContext
ServletContext 官方叫 servlet 上下文。服务器会为每一个工程创建一个对象,这个对象就是 ServletContext 对象。这个对象全局唯一,而且工程内部的所有 servlet 都共享这个对象。所以叫全局应用程序共享对象。
作用
是一个域对象
可以读取全局配置参数
可以搜索当前工程目录下面的资源文件
可以获取当前工程名字(了解)
servletContext 是一个域对象
servletContext 存储数据特点,
全局共享,里面的数据所有动态资源都可以写入和获取
服务器启动的时候创建,服务器关闭的时候销毁,因为这是全局应用程序对象,全局共享对象。
读取全局配置参数
xml 配置文件
<!-- 全局配置参数,因为不属于任何一个servlet,但是所有的servlet都可以通过servletContext读取这个数据 -->
<context-param>
<param-name>param1</param-name>
<param-value>value1</param-value>
</context-param>
<context-param>
<param-name>param2</param-name>
<param-value>value2</param-value>
</context-param>
方法
域对象
作用
保存数据,获取数据,共享数据.
Servlet 三大域对象
对象名称 | 对象的类型 |
---|---|
request | HttpServletRequest |
session | HttpSession |
application | ServletContext |
request
生命周期:
- 创建:客户端向服务器发送一次请求,服务器就会创建 request 对象.
- 销毁:服务器对这次请求作出响应后就会销毁 request 对象.
- 有效:仅在当前请求中有效。
作用:
① 获取表单提交参数: request.getParameter()
//从login.jsp中获取用户名和密码
String username = request.getParameter(“username”);
String password = request.getParameter(“password”);
String imageText = request.getParameter(“imageText”);
② 传值到表单: request.setAttribute()
if(user == null) {
//用户名和密码不匹配
request.setAttribute(“msg”, “用户名和密码不匹配!”);
return “/jsp/login.jsp”;
}
session
生命周期:
- 创建:服务器端第一次调用 getSession();(保存在服务器内存中)
- 销毁:
- 1.非正常关闭服务器(正常关闭 session 会序列化,再次启动服务器 session 会被反序列化);
- 2.session 过期了默认 30 分钟.
- 3.手动调用 session.invalidate();
- 注意:关闭浏览器再次访问会找不到 session 的会话 id 而不是 session 被销毁了。
有效:用户打开浏览器会话开始,直到关闭浏览器会话才会结束。一次会话期间只会创建一个 session 对象。
作用:
① 读取生成的验证码信息:
// 图片的验证码
String imageMsg = (String) request.getSession().getAttribute(“imageMsg”);
② 用户保持登录状态:
//登录成功 保存用户登录状态
request.getSession().setAttribute(“user”, user);
③ 购物车物品保存:
//将 cart 放入 session 中
request.getSession().setAttribute(“cart”, cart);
application
生命周期:
- 创建:服务器启动的时候,服务器为每个 WEB 应用创建一个属于该 web 项目的对象 ServletContext 类.
- 销毁:服务器关闭或者项目从服务器中移除的时候.
- 有效:此信息在整个服务器上被保留。
区别
- request: 每一次请求都是一个新的 request 对象,如果在 web 组件之间需要共享同一个请求中的数据,只能使用请求转发.
- session: 每一次会话都是一个新的 session 对象,如果如果需要在一次会话中的多个请求之间需要共享数据,只能使用 session.
- application: 应用对象,Tomcat 启动到关闭,表示一个应用,在一个应用中有且只有一个 application 对象,作用于整个 Web 应用,可以实现多次会话之间的数据共享.