Servlet是一个基于Java技术的Web组件,用于处理Web请求,生成动态内容,运行于服务器端,由Servlet容器创建并调用
创建Servler
-
继承HttpServler对象
-
重写doPost()或者doGet()方法
部署servlet
1.配置web.xml
<servlet>
<servlet-name>servletTest</servlet-name>
<servlet-class>servlet.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletTest</servlet-name>
<url-pattern>/servletTest.html</url-pattern>
</servlet-mapping>
2.WebServlet注解
package Servlet;
import javax.servlet.*;
import java.io.IOException;
@WebServlet("/FirstServlet") //注解表示servlet默认路径可以省略上面servlet部署
public class FirstServlet implements Servlet {
//用于初始化,service第一次被访问时执行一次
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("执行了init");
}
servlet接口常用方法
servlet接口定义了所有servlet主键必须实现的方法
目录 | 说明 |
---|---|
void init(ServletConfig config) | Servlet对象的初始化方法 由Servlet容器调用 |
void service( ServletRequest req, ServletResponse res) | 处理客户端的请求 由Servlet容器调用 |
void destroy() | 释放Servlet对象所使用的资源 由Servlet容器调用 |
ServletConfig getServletConfig() | 返回传递给init()方法的ServletConfig对象,该对象包含此Servlet的初始化和启动参数 |
String getServletInfo() | 返回字符串文本形式的Servlet相关信息 |
GenericServlet抽象类
抽象类GenerivServlet定义了通用的不依赖于协议的servlet
目录 | 说明 |
---|---|
public void init(ServletConfig config) | 实现Servlet接口中init(ServletConfig config)方法将ServletConfig实例进行保存以备用 |
public void init() | 用于在子类中重写,以实现用户订制的初始化工作 |
public String getInitParameter(String name) | 返回web.xml中名称为name的初始化参数的值 |
public ServletContext getServletContext() | 返回ServletContext对象的引用 |
HttpServlet抽象类
抽象类HttpServlet继承自GenerivServlet类,除了具有GenerivServlet类相似的方法,还针对http提供了相关的技术支持,能够对http的post、get等请求进行差异化处理
目录 | 说明 |
---|---|
public void service( ServletRequest req, ServletResponse res) | 实现GenericServlet抽象类中的service()方法,根据请求方法的类型调用相应的doGet()或doPost方法 |
protected void service( HttpServletRequest req, HttpServletResponse res) | 接收HTTP请求,并将它们分发给此类中定义的一系列doXxx()方法 |
protected void doXxx( HttpServletRequest req, HttpServletResponse res) | 根据请求方式的不同分别调用的相应处理方法,如doGet()、doPost()等 |
ServletContext接口
1.ServletContext是一个接口,他表示Servlet上下文对象
2.一个web工程,只有一个ServletContext对象实例
3.ServletContext对象是一个域对象
域对象:是一种像Map一样存取数据的对象,叫域对象
ServletContextt类的四个作用域
1.获取web.xml中的配置上下文参数context-param
2.获取当前的工程路径,格式:/工程路径
3.获取工程部署后在服务器硬盘上的绝对路径
4.像Map一样存取数据
目录 | 说明 |
---|---|
String getInitParameter( String name) | 获取应用范围中名为name的初始化参数值,在web.xml中使用<context-param>元素定义 |
void setAttribute( String name, Object object) | 设置名称为name的属性 |
Object getAttribute(String name) | 获取名称为name的属性 |
void removeAttribute(String name) | 从Servlet上下文中删除指定名称的属性 |
String getRealPath(String path) | 返回参数所代表目录的真实路径 |
void log(String message) | 记录一般日志信息 |
ServletConfig接口
ServletConfig类(servlet程序的配置信息类) Servlet程序和ServletConfig对象都是由Tomcat负责创建的,我们只负责使用,Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象
作用: 可以获取Servlet程序的别名Servlet-name的值 获取初始化参数init-param 获取ServletContext对象
目录 | 说明 |
---|---|
Enumeration<String> getInitParameterNames() | 获取Servlet所有初始化参数的名称 |
String getInitParameter(String name) | 获取以name命名的初始化参数值 |
ServletContext getServletContext() | 返回Servlet的上下文对象引用 |
web.xml的配置
<servlet>
<!--servlet-name 标签给Servlet程序起别名(一般是类名) -->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet-class 是servlet程序的全类名-->
<servlet-class>servlet.HelloServlet</servlet-class>
<!--init-param初始化参数-->
<init-param>
<!--参数名-->
<param-name>username</param-name>
<!--参数值-->
<param-value>root</param-value>
</init-param>
<init-param>
<!--参数名-->
<param-name>url</param-name>
<!--参数值-->
<param-value>jdbc:mysql://localhost:3306/1</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!--servlet-name 标签的作用是告诉服务器,当前配置的地址给那个servlet程序使用 -->
<servlet-name>HelloServlet</servlet-name>
<!-- url-pattern 标签配置访问地址
/表示服务器解析的时候,表示地址为http://ip:port/工程路径 <br/>
/hello 表示地址为http://ip:port/工程路径/hello
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
Java类中
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2.init初始化方法");
//1. 可以获取Servlet程序的别名Servlet-name的值
System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
// 2. 获取初始化参数init-param
System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("username"));
System.out.println("初始化参数url的值是:"+servletConfig.getInitParameter("url"));
// 3. 获取ServletContext对象
System.out.println(servletConfig.getServletContext());
}
ServletRequest接口
servlet组件能够利用servletRequest接口获取客户端的请求数据
目录 | 说明 |
---|---|
Object getAttribute(String name) | 获取请求域中名称为name的属性值 |
void setAttribute( String name, Object object) | 在请求域中保存名称为name的属性 |
void removeAttribute(String name) | 清除请求域中名字为name的属性 |
String getCharacterEncoding() | 返回请求体所使用的字符编码 |
void setCharacterEncoding( String charset) | 设置请求体的字符编码 |
String getParameter(String name) | 返回指定请求参数的值 |
String[ ] getParameterValues( String name) | 返回指定请求参数的全部值 |
RequestDispatcher getRequestDispatcher(String path) | 返回指向指定路径的请求分发对象 |
HttpServletRequest接口
HttpServletRequest接口位于java.servlet.http包中,HttpServletRequest接口继承自ServletRequest接口,同时增加了一些用于读取http请求信息的方法
目录 | 说明 |
---|---|
String getContextPath() | 返回请求的上下文路径,上下文路径是请求URI的开始部分 |
Cookie[ ] getCookies() | 返回客户端在此次请求中发送的Cookie对象 |
HttpSession getSession() | 返回和此次请求相关联的session对象,若没有为客户端分配session对象,则创建一个新的 |
String getMethod() | 返回此次请求所使用的HTTP方法的名字,如GET、POST |
String getHeader(String name) | 获取指定的请求头信息 |
ServletResponse接口
servlet组件可以使用ServletResponse对象设置和发送响应数据
目录 | 说明 |
---|---|
PrintWriter getWriter() | 返回用于向客户端发送文本的PrintWrite对象 |
String getCharacterEncoding() | 返回发送响应正文所使用的字符编码 |
void setCharacterEncoding(String charset) | 为即将发送到客户端的响应设置字符编码 |
void setContentType(String type) | 设置发送到客户端的响应的内容类型 |
ServletOutputStream getOutputStream() | 返回适合于在响应中写入二进制数据的ServletOutputStream对象 |
HttpServletResponse接口
HttpServletResponse接口继承自ServletResponse接口,用于在发送响应时提供特定于http的功能
目录 | 说明 |
---|---|
void addCookie(Cookie cookie) | 向响应中增加一个cookie 多次调用,可设置多个cookie |
void addHeader( String name, String value) | 向响应中添加一个名称为name、值为value的响应报头 |
void sendRedirect(String location) | 向客户端发送一个临时的重定向响应,以便客户端访问新的URL |
void encodeRedirectURL(String url) | 使用session ID对用于重定向的URL进行编码 |
Servlet生命周期
示例代码:
package Servlet;
import javax.servlet.*;
import java.io.IOException;
@WebServlet("/FirstServlet") //注解表示servlet默认路径可以省略上面servlet部署
public class FirstServlet implements Servlet {
//用于初始化,service第一次被访问时执行一次
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("执行了init");
}
/*
* 获取配置
* */
@Override
public ServletConfig getServletConfig() {
System.out.println("执行了getServletConfig");
return null;
}
/*
* 当service被请求时触发, 请求多次触发多次
* */
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("执行了service");
}
/*
* 获取参数 可选
* */
@Override
public String getServletInfo() {
System.out.println("执行了getServletInfo");
return null;
}
//销毁,服务器关闭时执行
@Override
public void destroy() {
System.out.println("执行了destroy");
}
}
首页代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form action="FirstServlet" method="post"> //action地址与注解的一致
用户名 <input type="text" name="id"/><br/>
密码 <input type="text" name="name"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
结果:
Servlet继承体系
通过继承HttpServlet实现Servlet程序
一般使用继承HttpServlet类的方式实现Servlet程序
1.缩写一个类去继承HttpServlet类 2.根据业务重写doGet或者doPost方法 3.到web.xml中的配置Servlet程序的访问地址
Httpservlet类实现
package servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloSrevlet2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//系统默认使用get请求
System.out.println("HelloSrevlet2 的doPost请求");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloSrevlet2 的doGet请求");
}
}
访问应用上下文
使用<context-param>元素声明Web应用的全局范围参数
<param-name>:参数名
<param-value>:参数值
<context-param>
<param-name>adminEmail</param-name>
<param-value>admin@hotmail.com</param-value>
</context-param>
JSP对比Servlet
JSP:在HTML页面嵌入Java代码和JSP标记
便于表现层开发
前后端代码混乱,不利于代码重用和模块化开发
Servlet:在Java类中输出HTML代码
便于代码重用和模块化开发
不利于开发表现层功能、开发效率低
@webservlet常用属性
目录 | 数据类型 | 说明 |
---|---|---|
name | String | 指定Servlet名称,默认为类的全限定名 |
urlPatterns | String[] | 指定一组Servlet的URL匹配模式 |
loadOnStartup | int | 指定Servlet的加载顺序 |
initParams | WebInitParam[] | 指定一组Servlet初始化参数 |
疏导图