怎么做二维码转到网站,贵州普安县建设局网站,html页面布局,关于做网站pptServlet接口 什么是Servlet#xff1f; Servlet是一种基于Java技术的Web组件#xff0c;用于生成动态内容#xff0c;由容器管理#xff0c;是平台无关的Java类组成#xff0c;并且由Java Web服务器加载执行#xff0c;是Web容器的最基本组成单元 什么是Servlet容器… Servlet接口 什么是Servlet Servlet是一种基于Java技术的Web组件用于生成动态内容由容器管理是平台无关的Java类组成并且由Java Web服务器加载执行是Web容器的最基本组成单元 什么是Servlet容器 Servlet容器作为Web服务器或应用服务器的一部分通过请求和响应提供Web客户端与Servlets交互的能力容器管理Servlet实例以及它们的生命周期(创建、初始化、提供服务、销毁等) 在java web中不管是使用J2EE原生的servlet/jsp还是使用springmvc/springboot在web服务器看来只是对外暴露出来的Servlet而这个Servlet是javax.servlet.Servlet接口该接口定义了Servlet引擎与Servlet程序之间通信的协议约定。 // Servlet的加载和实例化可以发生在容器启动时也可以延迟初始化直到有请求需要处理时public interface Servlet { // 负责初始化Servlet对象容器创建好Servlet对象后由容器调用调用只执行一次 // 当load-on-startup设置为负数或者不设置时会在Servlet第一次用到时才被调用 void init(ServletConfig config) throws ServletException; // 获取该Servlet的初始化参数信息 ServletConfig getServletConfig(); // 负责响应客户端的请求当容器接收到客户端要求访问特定Servlet对象的请求时会调用该Servlet对象的service()方法每次请求都会执行 void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; // 返回Servlet信息包含创建者、版本、版权等信息 String getServletInfo(); // Servlet结束生命周期时调用释放Servlet对象占用的资源 void destroy();} 而为了简化开发jdk中提供了一个实现Servlet接口的简单的Servlet类javax.servlet.GenericServlet该类实现了Servlet的基本功能对init(ServletConfig config)、service(ServletRequest req, ServletResponse res)和destroy()方法提供了默认实现 jdk针对HTTP协议专门提供了一个Servlet类javax.servlet.http.HttpServlet该类继承于GenericServlet类在其基础上针对HTTP的特点进行扩充一般编写程序时继承HttpServlet即可这样只需要重写doGet()和doPost()方法即可 Servlet继承关系 Servlet中涉及的主要对象 请求对象 ServletRequest、HttpServletRequest 响应对象 ServletResponse、HttpServletResponse Servlet配置对象 ServletConfig Servlet上下文对象 ServletConfig Servlet注册与运行 Servlet编写好之后需要在web.xml中进行注册和映射才能被Servlet容器加载从而被外界访问 !-- 注意servlet和servlet-mapping都是成对出现的 -- !-- 注册Servlet -- servlet servlet-nameHW/servlet-name servlet-classcom.zhanghe.study.servlet.HelloWorldServlet/servlet-class !-- 配置servlet初始化init时中ServletConfig参数-- init-param param-namename/param-name param-valuejohn/param-value /init-param !-- servlet加载时机,若为负数则在第一次请求时被创建若为0或者正数在web应用被Servlet容器加载时创建实例值越小越早被启动 -- load-on-startup1/load-on-startup /servlet !-- 映射Servlet -- servlet-mapping !-- 对应servlet标签中的servlet-name值 -- servlet-nameHW/servlet-name !-- 开头的/表示web用用程序的根目录 -- url-pattern/HelloWorld/url-pattern /servlet-mapping tomcat中的web.xml包含有一个缺省的Servlet servlet servlet-namedefault/servlet-name servlet-classorg.apache.catalina.servlets.DefaultServlet/servlet-class init-param param-namedebug/param-name param-value0/param-value /init-param init-param param-namelistings/param-name param-valuefalse/param-value /init-param load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namedefault/servlet-name url-pattern//url-pattern /servlet-mapping ServletConfig 对于每个Servlet可能在启动时都需要一些初始化参数而所有的Servlet是交由Servlet引擎去实例化的那么也就是需要将每个Servlet的初始化参数也都配置到web.xml中Servlet引擎将Servlet容器对象和Servlet的配置信息封装到ServletConfig中并在Servlet初始化时将ServletConfig传递给该Servlet。javax.servlet.ServletConfig接口的作用就是用来定义ServletConfig对象所需要对外提供的方法 public interface ServletConfig { // 获取web.xml中定义的servlet-name String getServletName(); // ServletContext表示的是应用本身 ServletContext getServletContext(); // 获取init-param配置的参数 String getInitParameter(String name); // 获取init-param配置的所有参数 EnumerationString getInitParameterNames();} Servlet引擎装载并创建一个Servlet对象后会调用该对象的init(ServletConfig config)方法Servlet中的ServletConfig getServletConfig()方法会返回init传入的ServletConfig对象 servlet servlet-nameHW/servlet-name servlet-classcom.zhanghe.study.servlet.HelloWorldServlet/servlet-class init-param param-namename/param-name param-valuezhanghe/param-value /init-param /servlet // 获取指定的属性config.getInitParameter(name)// 获取所有的属性config.getInitParameters() ServletContext 每个Web应用程序在启动时都会创建一个ServletContext对象每个Web应用程序都有一个唯一的ServletContext对象javax.servlet.ServletContext接口定义了ServletContext需要对外提供的方法Servlet通过这些方法来和ServletContext容器进行通信 该对象代表当前WEB应用可以获取到web应用的信息一个Web应用只有一个ServletContext对象 可以使用ServletConfig的getServletContext()获取到ServletContext 可以获取web应用的初始化参数这是全局的方法在web.xml中配置 获取web应用某个文件的绝对路径(在服务器上的路径不是部署前的方法) getRealPath 获取当前应用的名称 getContextPath 获取当前web应用的某一个文件对应的输入流 getResourceAsStream() path是相对于当前web应用的根目录 context-param param-nameemail/param-name param-valuemaster163.com/param-value /context-param servlet生命周期 生命周期相关方法servlet生命周期中的方法全是由servlet容器来调用的 构造器 web容器调用Servlet的无参构造器默认是在第一次请求时被加载可以通过load-on-startup标签来进行设置什么时候加载 init方法 service方法 destory方法 init方法--初始化 init方法在第一次创建servlet时被调用在后续每次请求时都不会被调用。 当用户调用servlet的时候该servlet的一个实例就会被创建并且为每一个用户产生一个新的线程init()用于进行一些初始化数据的加载和处理这些数据会被用于servlet的整个生命周期 void init(ServletConfig config) throws ServletException; 为了防止重写该方法时开发者忘记将入参config赋值给成员变量config故而提供了GenericServlet类进行了一次封装 public void init(ServletConfig config) throws ServletException { this.config config; this.init();} 在进行Servlet重写时只需要重写不带参数的init方法即可 public void init() throws ServletException 该方法是由servlet容器调用的 什么时候触发初始化 有两种情况会进行Servlet的初始化 Servlet被客户端首次请求访问时触发初始化方法 如果配置了load-on-startup元素则在Servlet容器启动该Servlet所属Web应用时就会初始化该Servlet servlet servlet-namedispatcherServlet/servlet-name servlet-class org.springframework.web.servlet.DispatcherServlet /servlet-class load-on-startup1/load-on-startup /servlet 重写init方法 GenericServlet实现了Servlet和ServletConfig是一个抽象类并对init(ServletConfig var1)方法进行了一层封装有一个ServletConfig成员变量在init()方法中进行了初始化使得可以直接在GenericServlet中直接使用ServletConfig方法 而我们平时写Servlet大多是继承于HttpServlet类的在对init方法进行重写时重写不带参的init()方法即可 //GenericServlet类public void init(ServletConfig config) throws ServletException { this.config config; this.init();}public void init() throws ServletException {} 该方法由GenericServlet的调用如果需要使用到ServletConfig则调用getServletConfig()方法来获取 service方法 service方法是实际处理请求的方法servlet容器调用service方法来处理请求并将响应写回到客户端每次服务器接收到一个新的servlet请求时服务器会产生一个新的线程来调用服务 void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; 处理请求逻辑 HttpServlet继承了GenericServlet重写了service方法将ServletRequest和ServletResponse转换为HttpServletRequest和HttpServletResponse并根据不同的请求方式进行分发doGet/doPost/doHead等 Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException{ HttpServletRequest request; HttpServletResponse response; // 如果请求类型不相符则抛出异常 if (!(req instanceof HttpServletRequest res instanceof HttpServletResponse)) { throw new ServletException(non-HTTP request or response); } // 转换成Http的request和response request (HttpServletRequest) req; response (HttpServletResponse) res; // 进行http的处理方法 service(request, response);}protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取请求类型 String method req.getMethod(); // 根据不同的请求类型调用不同的方法 if (method.equals(METHOD_GET)) { long lastModified getLastModified(req); if (lastModified -1) { // servlet doesnt support if-modified-since, no reason // to go through further expensive logic doGet(req, resp); } else { long ifModifiedSince req.getDateHeader(HEADER_IFMODSINCE); if (ifModifiedSince lastModified) { // If the servlet mod time is later, call doGet() // Round down to the nearest second for a proper compare // A ifModifiedSince of -1 will always be less maybeSetLastModified(resp, lastModified); doGet(req, resp); } else { resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } } } else if (method.equals(METHOD_HEAD)) { long lastModified getLastModified(req); maybeSetLastModified(resp, lastModified); doHead(req, resp); } else if (method.equals(METHOD_POST)) { doPost(req, resp); } else if (method.equals(METHOD_PUT)) { doPut(req, resp); } else if (method.equals(METHOD_DELETE)) { doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) { doOptions(req,resp); } else if (method.equals(METHOD_TRACE)) { doTrace(req,resp); } else { // // Note that this means NO servlet supports whatever // method was requested, anywhere on this server. // String errMsg lStrings.getString(http.method_not_implemented); Object[] errArgs new Object[1]; errArgs[0] method; errMsg MessageFormat.format(errMsg, errArgs); resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg); } } servlet可以在任何协议下访问 ,写的Servlet必须实现Servlet接口,在http协议下可以使用HttpServlet 用来给Web访问的 在HttpServlet类中对于service()方法进行了处理根据请求方式的不同将请求分发到了不同的方法而我们一般情况下写Servlet也是继承自HttpServlet的所以在写请求处理逻辑时只需要重写doGet()和doPost()方法即可 // HttpServlet类protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String msg lStrings.getString(http.method_get_not_supported); this.sendMethodNotAllowed(req, resp, msg);}protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String msg lStrings.getString(http.method_post_not_supported); this.sendMethodNotAllowed(req, resp, msg);} GET方法 GET方法时浏览器向web服务器传递信息的默认方法会在地址栏上产生很长的字符串且GET方法有大小限制请求字符串中最多只能有1024个字符 POST方法 POST方法不将请求信息放到地址中 destroy方法 destory()方法只在servlet生命周期结束时被调用一次。可以在destory()方法中进行一些资源的清理如关闭数据库连接、停止后台线程等 https://zhhll.icu/2021/javaweb/基础/1.Servlet接口/ 本文由 mdnice 多平台发布