Servlet详谈

Servlet

  • tomcat
  • Mysql
  • web前端
    • html
    • css
    • js
    • juery
    • es6
    • npm
    • nodejs
  • javaWEB阶段
    • servlet
    • jsp (淘汰了)

1.Servlet

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。

狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。

1.1 Servlet接口

This interface defines methods to initialize a servlet, to service requests, and to remove a servlet from the server. These are known as life-cycle methods and are called in the following sequence: 该接口定义了方法来初始化servlet,处理请求,和删除服务器上的servlet。 这些生命周期的方法按以下顺序调用。

  1. The servlet is constructed, then initialized with the init method.构造servlet,然后init方法初始化。
  2. Any calls from clients to the service method are handled.处理客户端对service方法的任何调用。
  3. The servlet is taken out of service, then destroyed with the destroy method, then garbage collected and finalized. Servlet从服务中取出,然后destory方法清除,接着垃圾收集和终止。

HelloServlet.java

package com.shangguan.servlet;

import javax.servlet.*;
import java.io.IOException;

/**
 * Description:
 *
 * @Author:一尘
 * @Version:1.0
 * @Date:2020-09-16-9:31
 */
public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("----init--------");
        System.out.println(config);
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("---------service-----------");
        System.out.println(req.getLocalName());
        System.out.println(req.getLocalPort());
        res.getWriter().write("Hello Servlet");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("----------destroy--------------");
    }
}

web.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0">

  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.shangguan.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
    <h2>Hello World!</h2>
    <a href="hello">Hello World</a>
</body>
</html>

  • init
    • 初始化方法 服务器自动实例化servlet对象了,并在后台自己实例化很多的对象,传入servlet中供我们使用(使用到了IOC和DI的思想)

Servlet 执行以下主要任务

  • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
  • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
  • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
  • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
  • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。

1.2 GenericServlet

GenericServlet是Servlet接口的实现类,是和http协议无关的,是对Servlet接口的增强类。

  • getInitParamater()
  • getInitParameterNames()
  • getServletConfig()
  • getServletContext()

HelloGenericServlet.java

package com.shangguan.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.Enumeration;

/**
 * Description:
 *
 * @Author:一尘
 * @Version:1.0
 * @Date:2020-09-16-10:23
 */
@WebServlet(urlPatterns = "/helloGenericServlet",
        initParams = {
        @WebInitParam(name="encoding",value = "utf-8"),
                @WebInitParam(name = "address",value = "西安市")
})
public class HelloGenericServlet  extends GenericServlet {
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        //获取初始化参数
        System.out.println(this.getInitParameter("encoding"));
        //枚举
        Enumeration<String> initParameterNames = this.getInitParameterNames();
        while(initParameterNames.hasMoreElements()){
            String name = initParameterNames.nextElement();
            System.out.println(this.getInitParameter(name));
        }
        //获取初始化参数的接口
        ServletConfig servletConfig = this.getServletConfig();
        System.out.println(servletConfig.getInitParameter("encoding"));
        //上下文对象
        ServletContext servletContext = this.getServletContext();
        //     /servlet_demo01_war_exploded    web应用的名称 部署在服务器上的web应用的的名称
        System.out.println(servletContext.getContextPath());

    }
}

web.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0">

  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.shangguan.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  
  
  <!--<servlet>
    <servlet-name>helloGeneric</servlet-name>
    <servlet-class>com.shangguan.servlet.HelloGenericServlet</servlet-class>
    &lt;!&ndash;当前的Servlet的初始化参数&ndash;&gt;
    <init-param>
      <param-name>encoding</param-name>
      <param-value>GBK</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>helloGeneric</servlet-name>
    <url-pattern>/helloGenericServlet</url-pattern>
  </servlet-mapping>-->
</web-app>

1.3 ServletConfig

是获取当前的Servlet配置信息的接口

A servlet configuration object used by a servlet container to pass information
to a servlet during initialization. 一个servlet配置对象,在初始化过程中由servlet容器传递信息给servlet。

当前的Servlet初始化配置信息。只能被当前的Servlet所使用。

1.4 ServletContext

web application的上下文环境,一个web应用只有一个环境。

上下文中的数据,可以被所有的Servlet所共享。

  • getAttribute()
  • getAttributeNames()
  • getRealPath()
  • getServletPath()
  • getServletName()
  • getRequestDIspatcher()
  • removeAttribute()
  • setAttribute()
  • getInitParamter()
  • getInitParameterNames()

servletContext是我们的全局的域对象.

package com.shangguan.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.Enumeration;

/**
 * Description:
 *
 * @Author:一尘
 * @Version:1.0
 * @Date:2020-09-16-10:23
 */
@WebServlet(urlPatterns = "/helloGenericServlet",
        initParams = {
        @WebInitParam(name="encoding",value = "utf-8"),
                @WebInitParam(name = "address",value = "西安市")
})
public class HelloGenericServlet  extends GenericServlet {
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        //获取初始化参数
        System.out.println(this.getInitParameter("encoding"));
        //枚举
        Enumeration<String> initParameterNames = this.getInitParameterNames();
        while(initParameterNames.hasMoreElements()){
            String name = initParameterNames.nextElement();
            System.out.println(this.getInitParameter(name));
        }
        //获取初始化参数的接口
        ServletConfig servletConfig = this.getServletConfig();
        System.out.println(servletConfig.getInitParameter("encoding"));
        //上下文对象
        ServletContext servletContext = this.getServletContext();
        //     /servlet_demo01_war_exploded    web应用的名称 部署在服务器上的web应用的的名称
        System.out.println(servletContext.getContextPath());
        //获取全局的初始化参数
        System.out.println(servletContext.getInitParameter("age"));

        servletContext.setAttribute("king","詹姆斯");
        System.out.println(servletContext.getAttribute("king"));
    }
}

1.5 HttpServlet

是基于我们的网络协议的/ htpp /https

我们没有必要去重写service方法, service方法会分发我们的网络请求到我们的doxxx方法中进行处理。

我们请求的提交方式有get post

我们重写doGet doPost方法就可以了。

在我们的httpServlet中我们要去研究两个东西:

  • HttpServletRequest
  • HttpServletResponse
1.5.1 HttpServletRequest

是servletRequest接口的实现类。

servlet容器实例化我们的httpServletRequest对象,将他作为参数传递给我们的doxxx方法去使用。

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req,resp);
    }
  • getConetxtPath() 获取上下文路径

  • getCookies()

  • getHeader()

  • getHeaerNames()

  • getHeaders()

  • getMethod() 获取请求方式

  • getQueryString() ?name=admin&age=10

  • getRemoterUser()

  • getRequestURL()

  • getRequestURI()

  • getServletPath()

  • getSession()

  • getAttribute()

  • getAttributeNames()

  • getCharacterEncoding()

  • getContentLength()

  • getContentType()

  • getInputStream()

  • getLocalAddr()

  • getLocalName()

  • getLocalPort()

  • getParameter()

  • getParameterNames()

  • getServerName()

  • getScheme() 获取协议

  • getReader()

  • getRealPath()

  • getRequestDispatcher() 请求分发器

  • setAttribute()

  • removeAttribute()

HelloHttpServletRequest.java

package com.shangguan.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;
import java.util.Enumeration;

/**
 * Description:
 *
 * @Author:一尘
 * @Version:1.0
 * @Date:2020-09-16-14:13
 */
@WebServlet("/helloHttpServlet")
public class HelloHttpServlet  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("-----------获取服务器信息--------------");
        System.out.println(req.getScheme()); //协议
        System.out.println(req.getLocalName());//主机
        System.out.println(req.getLocalPort());//端口
        System.out.println(req.getServerName());//服务名  主机
        System.out.println("----------------获取http协议  请求头--------------");
        System.out.println(req.getHeader("Cookie"));
        Enumeration<String> headerNames = req.getHeaderNames();
        while(headerNames.hasMoreElements()){
            String name = headerNames.nextElement();
            System.out.println(req.getHeader(name));
        }
        System.out.println("---------------web应用的信息-------------");
        System.out.println(req.getRequestURI());//资源路径
        System.out.println(req.getRequestURL());//绝对路径
        System.out.println(req.getMethod());//请求方式
        System.out.println(req.getContextPath());//上下文路径  web应用的根路径

        System.out.println("--------------请求参数------------");
        req.setCharacterEncoding("utf-8");
        String name = req.getParameter("name");
        String age = req.getParameter("age");
        System.out.println(req.getCharacterEncoding());
        System.out.println(name + "-----"+ age);

        System.out.println(req.getContentType()); //null
        System.out.println("----------页面跳转-------------");

        req.setAttribute("address","西安市高新区");
        /**
         * 客户端发送请求,服务器接收请求 在doxxx中进行处理,处理完成以后再获取资源分发器判断
         * 要跳转的目标页面是否存在,页面存在,有服务器进行页面跳转,从始至终只发送了一次请求。
         * 页面跳转只有一次请求,
         * 页面跳转url地址栏不会发生变化
         *
         *
         * */
        req.getRequestDispatcher("/info.jsp").forward(req,resp);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req,resp);
    }
}

页面跳转:
* 客户端发送请求,服务器接收请求 在doxxx中进行处理,处理完成以后再获取资源分发器判断
* 要跳转的目标页面是否存在,页面存在,有服务器进行页面跳转,从始至终只发送了一次请求。
* 页面跳转只有一次请求,
* 页面跳转url地址栏不会发生变化
req.getRequestDispatcher("/info.jsp").forward(req,resp);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值