Servlet介绍
什么是Servlet?
Servlet是JavaWeb服务器的三大组件之一,主要的作用是接收请求、处理请求、反馈请求。把它想象成某些公司的客服人员就比较好理解一些,如听取客户问题、处理客户问题、给客户反馈处理的结果。
并且每个Servlet在服务器端是不一样的,各自有各自处理请求的内容。
Servlet接口和类的介绍
1.实现Servlet接口
三个周期方法:对象由服务器创建并调用相应的方法
方法 | 作用 |
void init(ServletConfig) | Servlet对象创建之后,马上进行初始化,只调用一次 |
void Server(Request , Response) | 每处理一次请求调用一次 |
void destory() | Servlet对象销毁之前,调用一次 |
package servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class ServletDemo1 implements Servlet {
//生命周期方法
@Override
public void destroy() {
// TODO 自动生成的方法存根
System.out.println("destroy");
}
//获取Servlet配置信息
@Override
public ServletConfig getServletConfig() {
// TODO 自动生成的方法存根
System.out.println("getServletConfig");
return null;
}
//获取Servlet信息
@Override
public String getServletInfo() {
// TODO 自动生成的方法存根
System.out.println("getServletInfo");
return null;
}
//生命周期方法
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO 自动生成的方法存根
System.out.println("init");
}
//生命周期方法
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO 自动生成的方法存根
System.out.println("service");
}
}
从浏览器访问到Servlet:在web.xml添加如下配置信息(浏览器访问url:http://localhost:8080/Servlet/ServletDemo1)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>Servlet Test</servlet-name><!-- 随意起名 -->
<servlet-class>servlet.ServletDemo1</servlet-class><!-- 实现Servlet的具体类路径 -->
</servlet>
<servlet-mapping>
<servlet-name>Servlet Test</servlet-name><!-- 与<servlet>中的<servlet-name>中名称相同即可 -->
<url-pattern>/ServletDemo1</url-pattern><!-- 必须以/开头,后边信息随意,之后访问需要这个路径 -->
</servlet-mapping>
</web-app>
特性:
1).一个Servlet类只有一个对象,当然可以存在多个Servlet类
2).线程不安全的,但是效率是非常高的
ServletConfig介绍:
方法 | 作用 |
String getInitParameter(String name) | 获取初始化指定name的value值 |
Enumeration getInitParameter() | 获取初始化所有参数的value值集合 |
String getServletName() | 获取Servlet的name值 |
ServletContext getServletContext() | 获取Servlet的上下文 |
<servlet>
<servlet-name>Servlet Test</servlet-name><!-- 随意起名 -->
<servlet-class>servlet.ServletDemo1</servlet-class><!-- 实现Servlet的具体类路径 -->
<init-param>
<param-name>n1</param-name>
<param-value>v1</param-value>
</init-param>
<init-param>
<param-name>n2</param-name>
<param-value>v2</param-value>
</init-param>
</servlet>
public void init(ServletConfig servletConfig) throws ServletException {
// TODO 自动生成的方法存根
System.out.println("init");
System.out.println(servletConfig.getServletName());
System.out.println(servletConfig.getInitParameter("n1"));
System.out.println(servletConfig.getInitParameter("n2"));
Enumeration e= servletConfig.getInitParameterNames();
while(e.hasMoreElements()) {
System.out.println(e.nextElement());
}
}
2.继承GenericServlet类
package servlet;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/*
* 继承GenericServlet类只需要重写service方法,其他方法在GenericServlet已经实现
*
* 其它方法init destroy依照具体情况实现
* 不会覆盖掉父类的init destroy等方法,在GenericServlet中有具体的空类可供实现
*/
public class ServletDemo2 extends GenericServlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO 自动生成的方法存根
System.out.println("处理请求");
}
}
3.继承HttpServlet类
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 这两个方法doGet() doPost()是必须实现的,虽然不是抽象方法
* doGet doPost方法是浏览器以Get或Post方式访问必须调用的方法
* 若访问时没有doGet doPost这两个方法,将会出现405错误
*/
public class ServletDemo3 extends HttpServlet {
// @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
}
}
Servlet细节
预防线程安全的三个小方法:
1.不要再Servlet中创建成员变量,创建局部变量即可
2.可以创建无状态成员变量
3.可以创建有状态成员变量,但状态必须为只读的
服务器启动时创建Servlet
<servlet>
<servlet-name>Servlet Test2</servlet-name><!-- 随意起名 -->
<servlet-class>servlet.ServletDemo3</servlet-class><!-- 实现Servlet的具体类路径 -->
<load-on-startup>0</load-on-startup><!-- 服务器启动时创建,非负数整数,数字越小就先启动 -->
</servlet>
ServletContext介绍
ServletContext:整个web项目中只存在一个ServletContext对象,主要作用是在Servlet间传递数据,生命周期和服务器(服务器开启到关闭)生命周期相同。并且是四大域对象之一,其它三大域对象分别是HttpSession、PageContext、ServletRequest,域对象就是用来在多个Servlet间传递数据,并且域对象必须有存数据和取数据的功能。
获取ServletContext对象
在void init(ServletConfig config)中:ServletContext context = config.getServletContext();ServletConfig类中含有getServletContext()方法。
在GenericServlet和HttpServlet中获取对象:ServletContext context = this.getServletContext();
域对象的功能
其它方法:removeAttribute(String name)移除此键值对
package servlet;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ServletDemo4")
public class ServletDemo4 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取ServletContext对象
ServletContext context = this.getServletContext();
//进行赋值
context.setAttribute("name", "zhangsan");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
package servlet;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ServletDemo5")
public class ServletDemo5 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 创建ServletContext对象
ServletContext context = this.getServletContext();
// 获取值
System.out.println((String) context.getAttribute("name"));
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
获取应用初始化值
context-param>
<param-name>name</param-name>
<param-value>value</param-value>
</context-param>
package servlet;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ServletDemo6")
public class ServletDemo6 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context = this.getServletContext();
String s = context.getInitParameter("name");
System.out.println(s);
}
}
获取资源相关方法
package servlet;
import java.io.IOException;
import java.io.InputStream;
import java.util.Set;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ServletDemo1")
public class ServletDemo1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context = this.getServletContext();
// 获取资源路径
String path = context.getRealPath("//index.jsp");
System.out.println(path);
// 获取资源路径对应的输入流,先获取路径,在创建输入流对象
InputStream is = context.getResourceAsStream("//index.jsp");
// 或取WEB-INF下的所有文件,必须以“/”开头
Set set = context.getResourcePaths("/WEB-INF");
System.out.println(set);
}
}