Java Servlet基础知识必知必会

一、什么是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对象用来设置响应消息

对于响应行:

  1. 响应行格式一般为 HTTP/1.1 200 ok
  2. 设置状态码:setStatus(int sc)

对于响应头:

  • serHeader(String name, String value)

对于响应体:

  • 获取输出流:字符输出流PrintWriter getWriter() 字节输出流ServletOutputStream getOutPutStream()
  • 使用输出流将数据输出到客户端浏览器

response可以完成重定向:response.sendRedirect(String s),其中s为重定向的路径。
重定向的特点:

  1. 地址栏发生变化;
  2. 重定向可以访问其他站点(服务器)的资源;
  3. 重定向是两次请求,不能用request对象来共享数据。

而相对于重定向,转发则:

  1. 地址栏路径不发生变化
  2. 只能访问当前服务器下的资源
  3. 转发是一次请求,可以用request对象来共享数据

七、ServletContext对象

ServletContext对象代表整个Web应用,也就是说这个对象作用范围为整个Web应用,它可以和程序的容器(服务器)来进行通信。
我们有两种获取ServletContext对象的方法:

  1. 通过request对象获取:request.getServletContext()
  2. 通过HttpServlet获取:this.getServletContext()

ServletContext的功能:

  1. 获取MIME对象:MIME类型(在互联网通信过程中定义的一种文件数据类型,一般格式为(大类型/小类型 例如text/html)获取:getMimeType(String file)
  2. 域对象,用来共享数据(前面提到的request就是一个域对象),里面包含setAttribute(String name, Object value)、getAttribute(String name)、以及removeAttribute(String name)
  3. 获取文件的真实(服务器)路径:getRealPath(String filePath)

八、小结

Servlet技术是JavaEE技术的一部分,所有Servlet都运行在Servlet容器(例如Tomcat)中,容器和Servlet间的接口为javax.servlet.Servlet。javax.servlet包还提供了一个名为GenericServlet的Servlet实现类,该类是一个辅助类,以便可以创建一个servlet,不过一般开发的时候我们都使用的是HttpServlet。

猜你喜欢

转载自blog.csdn.net/laobanhuanghe/article/details/102640379