什么是Servlet
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
创建Servlet
1.新建一个类实现Servlet接口
public class Test implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
2.在web.xml文件配置Servlet
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>cn.lyx.web.servlet.Test/servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Servlet3.0支持注解配置
@WebServlet(value = "test")
public class Test implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
init()方法:Servlet被创建时调用
Servlet创建时机:在<servlet>标签下配置
- 第一次被访问时,创建
<load-on-startup>的值为负数 - 在服务器启动时,创建
<load-on-startup>的值为0或正整数
- Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
service()方法:提供服务,执行多次
destroy()方法:被销毁时执行destroy方法,只执行一次
- Servlet被销毁时执行。服务器关闭时,Servlet被销毁
- 只有服务器正常关闭时,才会执行destroy方法。
- destroy方法在Servlet被销毁之前执行,一般用于释放资源
Servlet体系结构
- GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
- HttpServlet:对http协议的一种封装,简化操作
1. 定义类继承HttpServlet
2. 复写doGet/doPost方法
Request:
request对象和response对象的原理
- . request和response对象是由服务器创建的。我们来使用它们
- . request对象是来获取请求消息,response对象是来设置响应消息
request对象继承体系结构:
request功能:
1.获取请求消息数据
- 获取请求行数据
-
. 获取请求方式 :GET
String getMethod() -
. 获取虚拟目录:
String getContextPath() -
. 获取Servlet路径:
String getServletPath() -
. 获取get方式请求参数:
String getQueryString() -
. 获取请求URI:
String getRequestURI()
StringBuffer getRequestURL() -
. 获取协议及版本:HTTP/1.1
String getProtocol() -
. 获取客户机的IP地址:
String getRemoteAddr()
- 获取请求头数据
- String getHeader(String name):通过请求头的名称获取请求头的值
- Enumeration getHeaderNames():获取所有的请求头名称
- 获取请求体数据:
步骤:
获取流对象
- BufferedReader getReader():获取字符输入流,只能操作字符数据
- ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
再从流对象中拿数据
其他功能:
1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
1. String getParameter(String name):根据参数名称获取参数值
2. String[] getParameterValues(String name):根据参数名称获取参数值的数组
3. Enumeration getParameterNames():获取所有请求的参数名称
4. Map<String,String[]> getParameterMap():获取所有参数的map集合
请求转发:一种在服务器内部的资源跳转方式
步骤:
1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
2. 特点:
1. 浏览器地址栏路径不发生变化
2. 只能转发到当前服务器内部资源中。
3. 转发是一次请求
3. 共享数据:
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
3. 方法:
1. void setAttribute(String name,Object obj):存储数据
2. Object getAttitude(String name):通过键获取值
3. void removeAttribute(String name):通过键移除键值对
Response对象
功能:设置响应消息
1. 设置响应行
2. 设置状态码:setStatus(int sc)
2. 设置响应头:setHeader(String name, String value)
3. 设置响应体:
使用步骤:
- 获取输出流
- 字符输出流:PrintWriter getWriter()
- 字节输出流:ServletOutputStream getOutputStream()
-
使用输出流,将数据输出到客户端浏览器
-
重定向:资源跳转的方式
* 代码实现 1.设置状态码为302 response.setStatus(302); 2.设置响应头location response.setHeader("location","/test1"); 简单的重定向方法 response.sendRedirect("/test1");
- 重定向的特点:redirect
1. 地址栏发生变化
2. 重定向可以访问其他站点(服务器)的资源
3. 重定向是两次请求。不能使用request对象来共享数据
- 转发的特点:forward
1. 转发地址栏路径不变
2. 转发只能访问当前服务器下的资源
3. 转发是一次请求,可以使用request对象来共享数据
ServletContext对象:
概念:代表整个web应用,可以和程序的容器(服务器)来通信
获取:
- . 通过request对象获取
request.getServletContext(); - . 通过HttpServlet获取
this.getServletContext();
功能:
1. 获取MIME类型:
MIME类型:在互联网通信过程中定义的一种文件数据类型
格式: 大类型/小类型 text/html image/jpeg
获取:String getMimeType(String file)
2. 域对象:共享数据
- . setAttribute(String name,Object value)
- . getAttribute(String name)
- . removeAttribute(String name)
- ServletContext对象范围:所有用户所有请求的数据
3.获取文件的真实(服务器)路径
方法:
- String getRealPath(String path)