一、什么是Servlet
概念:Servlet是由两个单词Server和Applet拼接而成,意思为运行在服务器上的小程序。其实Servlet就是一个借口,定义了Java类被浏览器访问到(由tomcat识别)的规则。
我们一般在使用的时候,会自己定义一个类,实现Servlet接口,并重写里面的方法(最快的)。
二、Servlet快速入门
1.创建JavaEE项目
2.定义一个类,实现Servlet接口
public static ServletDemo1 implements Servlet
3.实现接口中的抽象方法
public class ServletDemo1 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 {
System.out.println("hello servlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
4.在web.xml文件中配置Servlet
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>webServlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
点击运行,可以看出每刷新一次页面,控制台就会输出一次hello servlet
当然,每次都配置xml十分麻烦,这里我们可以在新建Module的时候不勾选创建web.xml,在类的前面用注解@WebServlet(“demo1”)即可。
三、配置虚拟路径
在IDEA的Run->Run/Debug Configurations->Deployment->Application context中修改路径即可。
四、Servlet生命周期详解
1.Servlet通过调用init()方法进行初始化
init()方法被设计成只调用一次,它在第一次创建Servlet时被调用,在后续每次用户请求的时候不会再被调用,我们可以利用这个方法执行响应的初始化操作。调用此方法时,Servlet容器会传入一个ServletConfig。
2.Servlet调用service()方法来处理客户端的请求
service()方法是执行实际任务的主要方法,Servlet容器调用service()方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。每次服务器接收到一个Servlet请求时,服务器会产生一个新的线程并调用服务。
3.Servlet调用destroy()方法来处理客户端请求
这个方法与前面的init()一样,只会被调用一次,在Servlet声明周期结束时被调用。destroy()方法可以让Servlet关闭数据库连接、停止后台线程、把Cookie列表或点击计数器写入磁盘,并执行其他类似的清理活动,调用后Servlet对象被标记为垃圾回收,被JVM的垃圾回收器回收。当要卸载应用程序,或者当要关闭Servlet容器时,就会发生这种情况,一般会在这个方法中编写清除代码。
ps:Servlet里还有两个方法,分别为
- getServletInfo() :这个方法会返回Servlet的藐视,当然你也可以返回有用或为null的任意字符串。
- getServletConfig:这个方法会返回由Servlet容器传给init方法的ServletConfig。
五、Servlet继承体系结构
GenericServlet实现了Servlet和ServletConfig接口,并完成了以下任务:
- 将init()方法中的ServletConfig赋给一个类级变量,以便可以通过调用getServiceConfig获取。
- 为Servlet接口中的所有方法提供默认实现。
- 提供方法。
一般开发我们都会选择使用HttpServlet,它具有两个GenericServlet不具备的特性:
- 不用覆盖service()方法,而是覆盖doGet()或者doPost(),或者两个都覆盖了。在少数情况下还会覆盖以下任意方法:doHead()、doPut()、doTrace()、doOptions()和doDelete()。
- 使用HttpServiceRequest和HttpServletResponse。
六、Request与Response?
request和response对象原理:
- request对象和response对象是由服务器创建的,我们来使用他们。
- request对象是来获取请求消息,response对象是来设置响应消息。
request用来获取请求消息数据,可以获取请求行、请求头、请求体的数据:
对于请求行:
- 获取请求方式:String getMethod()
- 获取虚拟目录:String getContentPath()
- 获取Servlet路径:String getServletPath()
- 获取get方式的请求参数:String getQueryString()
- 获取请求URI(虚拟目录+Servlet路径):String getRequestURI()
- 获取请求URL:StringBuffer getRequestURL()
- 获取协议及版本:Strting getProtocol()
- 获取客户机的ip地址:String getRemoteAddr()
其中URI为同一资源定位符,而URL为统一资源标识符。
对于请求头:
- String getHeader(String name):通过请求头的名称获取请求头的值
- Enumeration< String > getHeaderNames():获取所有请求头的名称(迭代器)
对于请求体:
- 只有POST请求方式才有请求体,在请求体中封装了POST请求的请求参数,步骤如下:1.获取流对象 getReader()和getInputStream(),第一个只能操作字符数据,而第二个可以操作所有类型数据;2.再从流对象中拿数据即可。
request的一些其他功能:
1、不管是get请求还是post请求都可以使用下列方法来获取请求值:
- 获取请求参数的通用方式:String getParameter(String name) 根据参数名称获取参数值
- String[] getPatameterValues(String name) 根据参数名称获取参数值数组
- Enumeration< String > getParameterNames() 获取所有请求的参数名称
- Map< String, String[] > getParameterMap() 获取所有参数的map集合
ps:如果我们要结局POST请求的中文乱码问题,则需要在获取请求前加上reques.setChatacterEncoding(“uft-8”);
2、对请求进行转发(转发是一种在服务器内部的资源进行跳转的方式):
- 步骤:①通过request对象获取请求转发器对象RequestDispatcher getRequestDispatcher(String path);②使用RequestDispatcher对象来进行转发forword(ServletRequest request, ServletResponse response)
- 特点:①浏览器的地址栏路径不发生变化;②只能转发到当前服务器内部资源中;③转发是一次请求,即使转发多个也是一次请求。
response对象用来设置响应消息
对于响应行:
- 响应行格式一般为 HTTP/1.1 200 ok
- 设置状态码:setStatus(int sc)
对于响应头:
- serHeader(String name, String value)
对于响应体:
- 获取输出流:字符输出流PrintWriter getWriter() 字节输出流ServletOutputStream getOutPutStream()
- 使用输出流将数据输出到客户端浏览器
response可以完成重定向:response.sendRedirect(String s),其中s为重定向的路径。
重定向的特点:
- 地址栏发生变化;
- 重定向可以访问其他站点(服务器)的资源;
- 重定向是两次请求,不能用request对象来共享数据。
而相对于重定向,转发则:
- 地址栏路径不发生变化
- 只能访问当前服务器下的资源
- 转发是一次请求,可以用request对象来共享数据
七、ServletContext对象
ServletContext对象代表整个Web应用,也就是说这个对象作用范围为整个Web应用,它可以和程序的容器(服务器)来进行通信。
我们有两种获取ServletContext对象的方法:
- 通过request对象获取:request.getServletContext()
- 通过HttpServlet获取:this.getServletContext()
ServletContext的功能:
- 获取MIME对象:MIME类型(在互联网通信过程中定义的一种文件数据类型,一般格式为(大类型/小类型 例如text/html)获取:getMimeType(String file)
- 域对象,用来共享数据(前面提到的request就是一个域对象),里面包含setAttribute(String name, Object value)、getAttribute(String name)、以及removeAttribute(String name)
- 获取文件的真实(服务器)路径:getRealPath(String filePath)
八、小结
Servlet技术是JavaEE技术的一部分,所有Servlet都运行在Servlet容器(例如Tomcat)中,容器和Servlet间的接口为javax.servlet.Servlet。javax.servlet包还提供了一个名为GenericServlet的Servlet实现类,该类是一个辅助类,以便可以创建一个servlet,不过一般开发的时候我们都使用的是HttpServlet。