一、 Servlet简介
- 概念
Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API 动态的向客户端输出内容
- servlet规范:包含三个技术点
- servlet技术
- filter技术—过滤器
- listener技术—监听器
二、 Servlet的API(生命周期)
- Servlet接口方法
- init(ServletConfig config)
何时执行:servlet对象创建的时候执行。我们一般在web.xml当中写的一些配置信息,都是在init方法中可以获取到。
ServletConfig : 代表的是该servlet对象的配置信息 - service(ServletRequest request,ServletResponse response)
何时执行:每次请求都会执行
ServletRequest :代表请求 认为ServletRequest 内部封装的是http请求的信息
ServletResponse:代表响应 认为要封装的是响应的信息 - destroy()
何时执行:servlet销毁的时候执行
- HttpServlet类的方法
- init()
- doGet(HttpServletRequest request,HttpServletResponse response)
- doPost(HttpServletRequest request,HttpServletResponse response)
- destroy()
3)面试三问:
- Servlet何时创建
默认第一次访问servlet时创建该对象 - Servlet何时销毁
服务器关闭servlet就销毁了 - 每次访问必然执行的方法
service(ServletRequest req, ServletResponse res)方法
传入的参数,详细请看上面第一条的信息。
三、 Servlet配置
首先我们在web.xml
中写一些常用的东西
<servlet>
<servlet-name>ASD</servlet-name>
<servlet-class>servlet.QuickStartServlet</servlet-class>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://sort</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ASD</servlet-name>
<url-pattern>/quickStartServlet</url-pattern>
<url-pattern>/aaa/bbb/ccc/*</url-pattern>
</servlet-mapping>
这里提一句:第一个servlet中的servelt-name中的ASD 和第二个servlet-mapping中servlet-name的ASD必须一样
一.配置信息的一些注意事项:
1、<url-pattern></url-pattern>
的匹配方式
a) 完全匹配 访问的资源与配置的资源完全相同才能访问到
<url-pattern>/quickStartServlet</url-pattern>
标准的访问方式
b) 目录匹配 格式:/虚拟的目录…/ ,其中*号代表任意*
<url-pattern>/aaa/bbb/ccc/*</url-pattern
此时我们在浏览器中访问一个servlet的时候,只要我们前面/aaa/bbb/ccc输入正确即可。后面可以随便输入
c) 扩展名匹配 格式:*.扩展名
<url-pattern>*.abcd</url-pattern>
此时我们在浏览器中访问一个servlet的时候,只要我们前面随便输入即可。后面可以输入.abcd就行
注意:第二种与第三种不要混用 /aaa/bbb/*.abcd(错误的)
2、服务器启动实例化Servlet配置
首先回顾一下:
Servlet的何时创建:默认第一次访问时创建。
如果我们需要在服务器启动的时候,在servlet的配置时,加上一个配置 <load-on-startup>
servlet对象在服务器启动时就创建。
<!--servlet在服务器启动时创建对象-->
<!--数字代表优先级 数字越小 优先级越高-->
<load-on-startup>1</load-on-startup>
这是我们再次运行上面的QuickServlet的时候,我们没有输入网站的时候,服务器中就已经运行init里面的方法。因为主要服务器启动的时候,该servlet就已经创建完毕。
3、缺省servlet
可以将url-pattern配置一个/,代表该servlet是缺省的servlet
什么是缺省的servlet?
当你访问资源地址所有的servlet都不匹配时 , 缺省的servlet负责处理
其实,web应用中所有的资源的响应都是servlet负责,包括静态资源
4、欢迎页面
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
在默认情况下,会自动访问jsp,html文件
二.如何在Servlet中获取这些配置?
public class QuickStratServlet implements Servlet{
@Override
public void init(ServletConfig config) throws ServletException {
//1、获得servlet的name----<servlet-name>ASD</servlet-name>
String servletName = config.getServletName();
System.out.println(servletName);//ASD
//2、获得该servlet的初始化的参数
String initParameter = config.getInitParameter("url");
System.out.println(initParameter);
//3、获得Servletcontext对象
ServletContext servletContext = config.getServletContext();
System.out.println("init running....");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("QuickStratServlet running....");
res.getWriter().write("QuickStratServlet running....");
}
@Override
public void destroy() {
System.out.println("destroy running....");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
}
输出结果,分别是ASD,jdbc:mysql://sort,init running…
四、 ServletContext对象
1. 什么是ServletContext对象
ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象内部封装是该web应用的信息,ServletContext对象一个web应用只有一个
问题:
- 一个web应用有多个servlet对象
- ServletContext对象的生命周期?
创建:该web应用被加载(服务器启动或发布web应用(前提,服务器启动状态)
销毁:web应用被卸载(服务器关闭,移除该web应用)
2. 怎样获得ServletContext对象
- ServletContext servletContext = config.getServletContext();
- ServletContext servletContext = this.getServletContext();
3. 作用
- 获得web应用全局的初始化参数
这时我们不在servlet中配置,我们在全局中
web.xml中配置初始化参数
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>WEB19</display-name>
<!--配置全局的初始化参数-->
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
之后通过context对象获得参数
//获得ServletContext对象
ServletContext servletContext = getServletContext();
//1.获得初始化参数
String ininParamter = servletContext.getInitParameter("driver");
System.out.println(ininParamter);
打印结果为:param-value里面的内容com.mysql.jdbc.Driver
- 获得web应用中任何资源的绝对路径(重要 重要 重要)
方法:String path = context.getRealPath(相对于该web应用的相对地址)
;
注意该处获得路径是相对于发布到Tomcat下的工程。
案例:如图建立abcd.txt。分别获取它的绝对路径
ServletContext servletContext = getServletContext();
//获得a.txt
String realPath_A = servletContext.getRealPath("a.txt");
//获得b.txt
String realPath_B = servletContext.getRealPath("WEB-INF/b.txt");
//获得c.txt
String realPath_C = servletContext.getRealPath("WEB-INF/classes/c.txt");
//d获取不到
//读src(classes)下的资源是通过类加载器专门加载的
ContextServlet.class.getClassLoader().getResource("d.txt").getPath();
解释一下:d.txt为什么找不到,因为我们发布工程是发布WEB-CONTENT下的内容,而d.txt他是和web工程下的文件,不是WEB-CONTENT下的内容
- ServletContext是一个域对象(重要 重要 重要)
- 什么是域对象?什么是域?
存储数据的区域就是域对象
ServletContext域对象的作用范围:整个web应用(所有的web资源都可以随意向 servletcontext域中存取数据,数据可以共享)
域对象的通用的方法:setAtrribute(String name,Object obj)
;getAttribute(String name)
;removeAttribute(String name)
;