zoukankan      html  css  js  c++  java
  • Servlet和JSP读书笔记(一)

    Java Servlet 技术,简称Servlet,是Java中用于开发web应用程序的基本技术。

    Servlet实际上也就是一个Java程序。一个Servlet应用程序通常包含很多Servlet。而我们熟知的JSP页面最终也是要被编译为Servlet。

    Servlet应用程序是不能像一个普通类直接运行的,它必须运行在Servlet容器中。

    Servlet容器的作用就是将一个客户端的请求传给Servlet,并将Servlet应用程序的响应回传给客户端。  

    一. Servlet API 概述

    Servlet API 中有4个Java包:

        javax.servlet.*;
    
        javax.servlet.http.*;
    
        javax.servlet.annotation.*;
    
        javax.servlet.descriptor.*;

    二.  关于第一个包 javax.servlet.*  的主要类型(没有全部列出)     

       public interface javax.servlet.Servlet
    
       public interface javax.servlet.ServletRequest
    
      public interface javax.servlet.ServletResponse
    
      public interface javax.servlet.ServletContext
    
      public interface javax.servlet.ServletConfig
    
      public interface javax.servlet.RequestDispatcher
    
      public interface javax.servlet.Filter
    
      public abstract class GenericServlet extends java.lang.Object implements Servlet, ServletConfig, java.io.Serializable

      

    三 .  public interface javax.servlet.Servlet 接口

        1.该接口中声明的方法如下: 

        public void init(ServletConfig config)  throws ServletException

        public void service(ServletRequest req, ServletResponse res)  throws ServletException,java.io.IOException

        public ServletConfig getServletConfig()

        
    public java.lang.String getServletInfo()

        
    public void destroy()


        2. Servlet技术的
    核心就是这个Servlet接口。这是所有Servlet类都必须直接或者间接实现的一个类。(直接实现就是一个Servlet类直接implements Servlet,间接实现

    就是继承一个实现了Servlet的类)。 

          Servelt接口定义了Servlet应用程序和Servlet之间的规则。这个规则就是:Servlet容器负责把Servlet类加载到内存中,并在Servlet实例中调用特定的方法(特别注

    意:在一个Servlet应用程序中,每个Servlet只有一个实例。)。客户端用户的请求会触发Servlet容器调用一个Servelt实例的service 方法,并传递给这个方法一个

    ServletRequest实例和一个ServletResponse实例。ServletRequest实例封装当前HTTP请求,它的作用是便于开发者解析和操作原始的HTTP数据;ServletResponse封装当前

    用户的HTTP响应,它的作用是可以将响应回传给客户端。Servlet容器还为每个应用程序创建一个ServeltContext实例,其主要作用就是封装了应用程序(Context)的环境细节。

    每一个应用程序(Context)只有一个ServletContext实例。同时,Servlet容器还为每个应用程序创建一个ServeltConfig实例,它的主要作用就是封装一些Servlet的配置信息。

          关于ServletContext和ServletConfig后面会给出详细的解说。

        3.  public void init(ServletConfig config) throws  ServletException

        第一次请求Servlet时,Servlet容器就会调用这个方法且只调用一次。

        可在此方法中编写一些于应用程序相关的初始化代码。

        Servlet容器会向该方法传递一个ServletConfig实例,一般会在init方法中将这个实例对象赋值给一个ServletCofig类型的成员变量。便于其他方法使用。

      

        4. public void service(ServletRequest req, ServletResponse res)  throws ServletException,  java.io.IOException

          每次请求Servelt时都会调用这个方法。

          在此方法中编写实现程序功能和逻辑的代码。

        5. public void destroy()

          卸载应用程序或者关闭应用程序时会调用destory()方法。

          在此方法中编写与资源清理相关的代码。

        6. public ServletConfig getServletConfig()

         返回Servlet容器传给init方法的ServletConfig。

         为了让这个方法不返回null,你需要将Servlet容器传给init方法的ServletConfig对象赋值给一个类成员变量。

      

        7. public java.lang.String getServletInfo()

          返回任意有用的一个字符串或者null。

        

         8.在演示实例之前必须知道我们在浏览器中输入的url和我们编写的servlet如何才能对应起来,换句话说就是在浏览器中输入怎样的url就可以调用相应的servlet

         类。servlet中实现此功能有两个技术:web.xml 和 @WebServlet注解。

          

          ①web.xml  

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app 
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
    "http://java.sun.com/dtd/web-app_2_3.dtd"> 
    <web-app> 
    
        <servlet>     
            <!--    <servlet-name>由你自己定,但是必须和 <servlet-mapping>中的<servlet-name>一致  -->
            <servlet-name>   servletName </servlet-name>  
            
            <!-- <servlet-class> 为你想要调用的servlet的全类名 -->
            <servlet-class> fullClassName </servlet-class> 
            

         <!-- 传给servlet 的初始化参数,可以有多个 init-param 初始化参数这部分可以先忽略不看 直接看 <servlet-mapping> --> <init-param>
            
           <!-- 参数名 --> <param-name> name </param-name>
            
           <!-- 参数值 --> <param-value> value </param-value> </init-param> <init-param> <param-name>name</param-name> <param-value>admin</param-value> </init-param> </servlet>

    <servlet-mapping> <servlet-name> servletName </servlet-name> <!-- 上面 <servlet-class> 类所匹配到浏览器输入的url --> <url-pattern>/url</url-pattern> </servlet-mapping> </web-app>

          

        ② @WebServlet注解方式

    /*

      name 对应 web.xml的 <servlet-name>servletName</servlet-name>
      urlPatterns      对应 web.xml的  <url-pattern>/url</servlet-name>  
      initParams={@WebInitParam(name="name",value="value")}  对应web.xml的  <init-param>
                                               <param-name> name </param-name>
                                                  <param-value> value </param-value>
                                              </init-param>



    */
    @WebServlet(name="servletName",urlPatterns="/url", initParams={ @WebInitParam(name="name",value="value"), @WebInitParam(name="name1",value="value1") }) public class MyFirstServlet implements Servlet { // ....... }

         

          ③ 任意选择上面的一种去配置。例如,采用注解方式配置如下:

    @WebServlet(name="myFirstServlet",urlPatterns="/my",
                })
    public class MyFirstServlet implements Servlet {
          //......
    }

          则浏览器输入 http://localhost:8080/项目名称/my 就可执行MyFirstServlet 这个servlet类,并调用init()方法和service()方法。

         

        9. 关于前面知识的一个Servlet应用程序小实例。

    package com.hjj.servlet.one;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.Servlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebServlet;
    
    /*
        采用@WebServlet注解的方式配置该servlet访问路径,此时就不需要在web.xml文件中进行配置
         配置访问路径的属性就是urlPatterns
        
    */
    @WebServlet(name="MyFirstServlet",urlPatterns="/myFirstServlet")
    public class MyFirstServlet implements Servlet {
        
        private ServletConfig servletConfig = null;
        @Override
        public void destroy() {
            System.out.println("我是Detstroy方法,我被调用了 ^_^");
            System.out.println("-----------------------servlet结束-------------------------");
            
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return this.servletConfig;
        }
    
        @Override
        public String getServletInfo() {
            
            return "myFirstServlet";
        }
    
        @Override
        public void init(ServletConfig arg0) throws ServletException {
            System.out.println("----------------------servlet开始--------------------------");
            this.servletConfig = arg0;  //
            System.out.println("我是init方法,我被调用了 ^_^");
            
        }
    
        @Override
        public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
            
            System.out.println("我是service方法,我被调用了 ^_^");
            String servletName = this.servletConfig.getServletName();
            System.out.println("servletName = "+servletName);
            
            
            response.setContentType("text/html");
            response.setCharacterEncoding("UTF-8");
            PrintWriter pw = response.getWriter();
            pw.print("<html><head><head><title>我的第一个servlet app</title><body> hello "+servletName+"</body></html>");
            System.out.println("---------------------------");
            
            
        }
    
    }
                        

         ① 在浏览器中首次输入:http://localhost:8080/one/myFirstServlet

        页面显示如下:

          

        控制台:

          

        ②再次刷新页面:html页面依然不变

        控制台:证明service方法会被调用多次,而init只被调用一次。

        

         ③此时在关闭服务器,控制台输出:可见destory方法在关闭容器后执行了

        

    四. 关于init方法中传递的两个参数ServletRequest和ServletResponse

      1. ServletRequest

        ① 客户端的每一次请求,Servlet容器都会创建一个ServletRequest实例,并将它传递给service方法。

        Servlet封装客户端请求的相关信息。

        ② ServeltRequest接口的主要方法如下:

    public int getContentType()  //返回请求主体的MIME类型
    
    public java.lang.String getParameter(java.lang.String name) //根据String类型的参数返回对应的值
    
    public int getContentLength() //返回请求主体中的字节数

        我们平时最常用的就是上面红色标注的方法。

        例如使用如下url调用一个Servlet:

          http://localhost:8080/myapp/myservelt?id=10

          则在Servelt类中的service方法中使用ServletRequest就可以拿到这个值:ServletRequest.getParameter("id");

        此外,如果传递给此方法的的字符不存在,该方法返回null。

      2. ServletResponse

        ①ServletResponse接口表示一个Servlet响应。

         在调用Servlet之前,Servlet容器都会创建一个ServletResponse并将其传递给service方法。

        ②ServletResponse接口常用方法

    public java.io.PrintWriter getWriter() throws java.io.IOException  //返回可以将文本传给客户端的java.io.PrintWriter实例
    
    public void setContentType(java.lang.String type) //在给客户端发送响应之前设置响应内容类型,例如 text/html,即发送的响应的类型为html。另外如果不进行设置,有些浏览器默认以html格式显示,有些浏览器默认以文本格式显示

        该对象的应用在前面3.8的小实例中已经演示过,就不在演示了。

    五. ServletContext

      1. ServletContext表示Servlet应用程序。且每一个web应用程序只有一个ServletContext。

      2. 同一个web应用的所有servlet对象共享一个ServletContext。Servlet对象可以通过它来访问容器中的各种资源。

      3. ServletContext 接口常用方法    

    public void setAttribute(java.lang.String name,java.lang.Object object)  //把一个java对象和一个属性名绑定,并存放到ServletContext中,参数name指定属性名,参数Object表示共享数据。 
    

    public java.lang.Object getAttribute(java.lang.String name) //根据参数给定的属性名,返回一个Object类型的对象。 和setAttribute方法是对应的

    public java.util.Enumeration getAttributeNames() //返回一个Enumeration对象,该对象包含了所有存放在ServletContext中的属性名。


    public void removeAttribute(java.lang.String name) //根据参数指定的属性名,从servletContext对象中删除匹配的属性。
    public java.lang.String getServletContextName() //返回当前web应用的URL入口。

    public java.lang.String getInitParameter(java.lang.String name) //返回web应用方位内的匹配的初始化参数值。在web.xml中<web-app>元素中<context-param>元素表示应用范围内的初始化参数。其作用同下面六中所讲的的ServletConfig的getInitParameter()方法

    public java.util.Enumeration getInitParameterNames() //返回一个Enumeration对象。


    public java.lang.String getServletContextName() //返回web应用的名字。即<web-app>元素中<display-name>元素的值。

    六. ServletConfig

      1. Servlet封装了@WebServlet 或者 web.xml 中Servlet的配置信息。

      2. 这样的信息叫做初始参数。初始参数由两部分组成:键和值。

      3. 那么如何去获取初始参数的值呢? ServletConfig提供了两个方法:

    public java.lang.String getInitParameter(java.lang.String name) //传递String类型的键,获取键对应的值
    
    public java.util.Enumeration getInitParameterNames()  //返回所有初始参数名称(也就是键)的一个Enmueration

     

     4. ServletConfig还封装了对ServletContext的操作。

    public ServletContext getServletContext)  //返回当前web应用的ServletContext实例

     

     5. ServletConfig小实例演示。

        

    package com.hjj.servlet.one;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.Servlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebInitParam;
    import javax.servlet.annotation.WebServlet;
    
    @WebServlet(name="testServiceConfig",urlPatterns="/testServiceConfig",
                initParams={
                        @WebInitParam(name="email",value="test@qq.com"),
                        @WebInitParam(name="name",value="test")
                })
    public class TestServiceConfig implements Servlet {
        private ServletConfig servletConfig = null;
        @Override
        public void destroy() {    
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return this.servletConfig;
        }
    
        @Override
        public String getServletInfo() {
            return "myFirstServlet";
        }
    
        @Override
        public void init(ServletConfig arg0) throws ServletException {
            this.servletConfig = arg0;
        }
    
        @Override
        public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
            System.out.println("service被调用了");
            String name = this.servletConfig.getInitParameter("name");
            String email = this.servletConfig.getInitParameter("email");
            System.out.println();
            response.setContentType("text/html");
            response.setCharacterEncoding("UTF-8");
            PrintWriter pw = response.getWriter();
            pw.print("<html><head><head><title>testServletConfig</title><body>我的姓名 name:"+name+"<br>我的邮箱email:"+email+"</body></html>");
    
            
        }
    }

          浏览器输入:http://localhost:8080/one/testServiceConfig

          页面显示:

          

      

      

      

       

       

  • 相关阅读:
    java int转byte数组
    业务网关-操作手册
    业务网关-配置
    H2数据库的导入、导出(CSV)
    sequelize踩坑处理:时间格式化
    引入koa-static处理静态资源
    MySql利用case when实现批量更新多条记录的不同值实现方法
    Sequelize增删改查及批量新增或批量更新(bulkCreate的updateOnDuplicate)等常用接口
    数据结构队列、双端队列、队列系算法题解析
    配置webpack中externals来减少打包后vendor.js的体积
  • 原文地址:https://www.cnblogs.com/HouJiao/p/5431237.html
Copyright © 2011-2022 走看看