概念
Servlet 是服务端的组件,运行在 Servlet 容器中,而 Servlet 容器负责 Servlet 和 客户的通信以及调用 Servlet 的方法,Servlet 和客户的通信采用“请求/响应”的模式。
可以完成以下功能:
1、创建并返回基于客户请求的动态 HTML 页面
2、创建可以嵌入到现有 HTML 页面中的部分 HTML 页面
3、与其他服务器资源进行通信
使用
当项目里找不到 Servlet 类时,需要在 Project Structure 中的 Libraries 进行添加 jar 包。
创建类 helloServlet 并实现 Servlet:
在 web.xml 文件里配置和映射 Servlet:
注:必须配置和映射,为了让网页直接访问 Java 类
运行 Tomcat,并访问 localhost:8080/hello:
可以看出 Servlet 所执行的生命周期,如果一直刷新网页则会一直执行 service:
当我们关闭 Tomcat 时:
Servlet 生命周期的方法(以下方法都是由 Servlet 容器负责调用)
1、构造器:只被调用一次,只有第一次请求 Servlet 时,创建 Servlet 的实例,调用构造器。说明 Servlet 是单实例的。
2、init 方法:只被调用一次,在创建好实例后立即被调用,用于初始化当前 Servlet。
3、service 方法:被多次调用,每次请求都会调用 service 方法。实际用于响应请求的。
4、destroy 方法:只被调用一次,在当前 Servlet 所在的 WEB 应用被卸载后调用,用于释放当前 Servlet 所占用的资源。
load-on-startup 参数
1、配置在 servlet 的节点中,如下图
2、指定 Servlet 被创建的时机,如果该数值若为负数,则在第一次请求时被创建,若为 0 或者正数,则在当前 WEB 应用被 Servlet 容器加载时创建实例,且数值越小越早被创建。
关于 servlet-mapping
1、同一个 Servlet 可以被映射到多个 URL 上,即多个 <servlet-mapping> 元素 <servlet-name> 子元素的设置值可以是同一个 Servlet 注册名。
2、在 Servlet 映射到 URL 中也可以使用 * 通配符,但是只能有两种固定的格式:
⑴ “ *.扩展名 ”
⑵ “ /* ”
注:带扩展名的不能带斜杆
Servlet 初始化参数
以节点 <init-param> 配置初始化参数,且该节点位置必须在节点 <load-on-startup> 前面。
获取初始化参数:
1、通过 getInitParamter 获取指定参数名称的参数值
2、通过 getInitParameterNames 获取参数名组成的 Enumeration 对象
ServletContext:
Servlet 引擎为每个 WEB 应用都创建一个对应的 ServletContext 对象,一个 WEB 应用中的所有 Servlet 都共享同一个 ServletContext 对象,所以 ServletContext 对象被称之为 application 对象。
ServletContext 由 ServletConfig 来获取,相当于 WEB 应用的一个大管家,可以从中获取 WEB 应用中的各个方面的信息。
配置当前 WEB 应用的初始化参数:
获取当前 WEB 应用的初始化参数:
用法和 Servlet 获取初始化参数一样。
两者区别在于,Servlet 初始化参数是局部参数,针对某个 Servlet 使用,而 ServletContext 初始化参数是全局的,每个 Servlet 都可以使用。
获取当前 WEB 应用的某个文件的的绝对路径(不是部署前的位置):
返回的路径其实是应用的部署后输出的位置:
获取当前 WEB 应用某个文件对应的输入流:
ServletRequest、ServletResponse:
ServletRequest 封装了请求信息,可以从中获取到任何的请求信息。
ServletResponse 封装了响应信息,如果给用户什么响应,具体可以使用该接口的方法实现。
这两个接口的实现类都是服务器给予实现的,并在服务器调用 service 时传入。
案例:
在 webapp 下新建 login.html,并放置一个 <form> 表单,以 POST 方式提交:
新建 LoginServlet 类,在 service 里面接收参数并打印:
在 web.xml 里添加配置:
其中节点 <url-pattern> 的信息对应的是 form 表单里的 action 值。
重启 Tomcat 服务器,访问以下地址:
分别填写信息:
点击 login:
打印了接收参数的值,通过参数可以在 Java 类里面使用 JDBC 去访问数据库。
如果是以 checkbox 的方式提交参数:
应使用如下来接收多个参数:
如果需要获取更多信息,可以将 servletRequest 转换为子接口 httpServletRequest:
servletResponse:
getWriter():返回 PrintWriter 对象,调用 print 或者 write 方法可以将信息打印到网页上
setContentType():设置响应的内容类型
每次新建 Servlet 都得实现 Servlet 的全部方法,而继承 GenericServlet 可以省略到只剩 service 方法,简便很多。
GenericServlet 是 Servlet 接口和 ServletConfig 接口的实现类,也是一个抽象类。
HttpServlet(实际开发用):
1、继承自 GenericServlet,针对于 HTTP 协议所定制
2、在 service 方法中直接把 ServletRequest 和 ServletResponse 转为 HttpServletRequest 和 HttpServletResponse,可以用来获取请求方式
3、实际开发中,使用时直接继承 HttpServlet 并重载里面的 doGet 或者 doPost 方法:
补充
Servlet 3.0 以上可以通过注解的方式来配置 servlet
表单使用
以上为本人的一些学习笔记,如有出错欢迎指正,陆续更新!!!