Servlet 运行在服务端(tomcat) 的Java小程序,是sun公司提供一套规范. 就是动态资源
用来处理客户端请求、响应给浏览器的动态资源。
但servlet的实质就是java代码,通过java的API动态的向客户端输出内容
ServletDemo01
com.web.ServletDemo01
ServletDemo01
/demo01
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo01 implements Servlet {
@Override
//服务方法: 处理请求的
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("hello...");
response.getWriter().print("hello...");//向页面输出内容
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo02")
public class ServletDemo02 implements Servlet{
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello...");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
servlet从创建到销毁的过程
出生:(初始化)用户第一次访问时执行。
活着:(服务)应用活着。每次访问都会执行。
死亡:(销毁)应用卸载。
serrvlet生命周期方法:
init(ServletConfig config)
service(ServletRequest req, ServletResponse res)
destroy()
Servlet的配置对象, 可以使用用ServletConfig来获得Servlet的初始化参数, 在SpringMVC里面会遇到
Servlet默认情况下什么是创建? 默认情况下是第一次请求的时候.
如果我想让Servlet提前创建(服务器器的时候), 这个时候就可以使用启动项 在SpringMVC里面会遇到
我们先来查阅API回顾Servlet接口:
由上图可知在servlet接口规范下,官方推荐使用继承的方式,继承GenericServlet 或者HttpServlet来实现接口,那么我们接下来再去查看一下这两个类的API:
我们来使用GenericServlet 创建servlet:
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet(name = "GenericDemoServlet",urlPatterns = "/generic")
public class GenericDemoServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("GenericDemoServlet执行.......");
}
}
虽然,GenericServlet已经简化了servlet开发,但是我们平时开发程序需要按照一种互联网传输数据的协议来开发程序——http协议,因此,sun公司又专门提供了HttpServlet,来适配这种协议下的开发。
我们来使用HttpServlet创建servlet:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "HttpDemoServlet",urlPatterns = "/http")
public class HttpDemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HttpDemoServlet执行.......");
}
}
通过以上两个API阅读,注意一个细节,HttpServlet是GenericServlet的子类,它增强了GenericServlet一些功能,因此,在后期使用的时候,我们都是选择继承HttpServlet来开发servlet程序。
体系源码
ServletContext: 是一个全局对象, 上下文对象.
服务器为每一个应用(项目)都创建了一个ServletContext对象。 ServletContext属于整个应用的,不局限于某个Servlet。
eg: 把我们班当做应用, 把班主任当做ServletContext, 每一位学生当做Servlet
作为域对象存取数据,让Servlet共享
获得文件MIME类型(文件下载)
获得全局初始化参数
获取web资源路径
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//存
//1.获得ServletContext
ServletContext servletContext = getServletContext();
//2.调用存的方法
servletContext.setAttribute("akey","aaa");
response.getWriter().print("ServletDemo03");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//取
//1.获得ServletContext
ServletContext servletContext = getServletContext();
//2.调用取的方法
String value = (String) servletContext.getAttribute("akey");
response.getWriter().print("ServletDemo04..."+value);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//根据文件名获得文件的mini类型
//1.获得ServletContext
//2.调用getMimeType()方法
String file01 = "a.mp3";
String file02 = "b.png";
String mimeType01 = getServletContext().getMimeType(file01);
String mimeType02 = getServletContext().getMimeType(file02);
String value = getServletContext().getInitParameter("bkey");
response.getWriter().print("ServletDemo05..."+mimeType01+":"+mimeType02+":"+value);
}
在web.xml配置
注意: filepath:直接从项目的根目录开始写
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获得文件的绝对路径 getRealPath()这个方法的路径已经在项目下了, 已经到了web目录下了
String realPath = getServletContext().getRealPath("a.txt");
System.out.println("realPath="+realPath);
//2.获得文件的输入流 getResourceAsStream(String path);这个方法的路径已经在项目下了, 已经到了web目录下了
//new FileInputStream(realPath);
InputStream is = getServletContext().getResourceAsStream("a.txt");
System.out.println(is);
}