• Servlet总结


    1.Servlet是使用Java语言编写的运行在服务器端的程序.狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了Servlet这个接口的类,一般情况下,人们理解为后者.
    Servlet作用:Servlet主要用于处理客户端传来的HTTP请求.并返回一个响应
    Servlet UML图简略:
    顶层接口        Servlet     ServletConfig         Serializalbe
    抽象类                        GenericServlet
    实现类                        HttpServlet   ---- 我们一般都是继承他
    
    2.Servlet由Servlet容器提供,所谓的Servlet容器是指提供了Servlet功能的服务器,
    Servlet容器将Servlet动态的加载到服务器上.
    客户端 ---HTTP请求和响应-- HTTP服务器      ----- Servlet容器  ------ Servlet
    3.在Servlet接口中定义了5个抽象方法
        1.void init(ServletConfig config);
        2.ServletConfig getServletConfig();
        3.String getServletInfo();
        4.void service(ServletRequest req,ServletResponse res);
        5.void destory();
    4.Servlet接口下的实现类
        1.GenericServlet:它是一个抽象类,该类为servlet接口提供了部分实现功能,他并没有HTTP请求处理
        2.HttpServlet:HttpServlet是GenericServlet的一个子类,他继承了GenernicServlet类的所有方法,并且为HTTP请求中的post,get等类型提供了具体的操作方法.
    5.创建Sservlet方法:
        1.直接实现Servlet接口。重写接口里面的所有方法
        2.继承GenericServlet
        3.继承HttpServlet
    6.Servlet的主要方法:
        1.初始化Servlet对象的方法:public void init(ServletConfig config);
        2.用于处理客户端请求(当客户端请求到来时,容器将调用Servlet实例的service()方法,对请求进行处理):public void service(ServletRequest request, ServletResponse response);
        3.当Servlet对象从Servlet中移除时,容器调用该方法释放资源:public void destory();
    7.HttpServlet类:
        1.作用根据用户请求方式的不同,定义相应的方法去处理用户的请求:
        eg:doPost(HttpServletRequest res,HttpServletResponse rep);
        2.通过自动调用service()方法,将HTTP请求和HTTP响应分别转为HttpServletRequest和HttpServletResponse类型的对象
    8.创建Servlet过程:两种方法
        方法1.通过Ecplice开发工具直接创建Servlet
            1.在Ecplise的包资源管理器中,右击相应的包,在弹出的快捷菜单中选择"新建"->Servlet->输入要创建的Servlet名字->单击下一步->自由添加Servlet包含的方法->单击完成   --创建结束
        方法2.手工创建
        配置Web.xml文件
        <servlet>
          <servlet-name>AServlet(映射名字,随便起,和下面一样就行)</servlet-name>
          <servlet-class>com.ServletDemo1(报名.类名)</servlet-class>
        </servlet>
    <!-- 设置Servlet在tomcat启动时初始化 --!>
    <!-- 
    <load-on-startup>1(0,正整数将会在tomcat启动时加载Servlet)</load-on-startup> 
    --!>
        <servlet-mapping>
          <servlet-name>AServlet</servlet-name>
          <url-pattern>/ServletDemo1(前端访问的路径映射到这里)</url-pattern>    
    <!--localhost:8080/weblearn(项目名)/ServletDemo1访问到web.xml这里,找到url-pattern,在通过Aservlet映射到servlet-class,然后找到类的全路径,去执行相应的doGet()等方法--!>
        </servlet-mapping>
    9.实现Servlet的虚拟路径映射(servlet-mapping中的路径url-pattern):
        1.Servlet的多重映射:一个Servlet可以对应对个前端访问路径
        eg:localhost:8080/Weblearn/ServletDemo1
        eg:localhost:8080/Weblearn/ServletDemo2
        他们俩都能访问到com.ServletDemo1类中的do**()方法;
        <servlet>
          <servlet-name>AServlet(映射名字,随便起,和下面一样就行)</servlet-name>
          <servlet-class>com.ServletDemo1(报名.类名)</servlet-class>
        </servlet>
        <servlet-mapping>
          <servlet-name>AServlet</servlet-name>
          <url-pattern>/ServletDemo1</url-pattern>
          <url-pattern>/ServletDemo2</url-pattern>    
        </servlet-mapping>
        2.Servlet映射路径中使用通配符
            1.完全目录匹配:    如:/ServletDemo1
            2.目录匹配:        如:/abc/*或/*
            3.拓展名匹配:    如:*.do,*.action,错误写法:/*.do,前面不能加"/"
            eg:localhost:8080/Weblearn/*.do
             任何以do结尾的路径都能访问到ServletDemo1类的方法,
            eg:localhost:8080/Weblearn/tt.do 访问ServletDemo1类
              <servlet>
                <servlet-name>AServlet</servlet-name>
                <servlet-class>com.ServletDemo1</servlet-class>
              </servlet>
              <servlet-mapping>
                <servlet-name>AServlet</servlet-name>
              <url-pattern>*.do</url-pattern>
            </servlet-mapping>
            优先级问题: 1 > 2 > 3,先访问1,2,3
        3.缺省Servlet:映射路径就是一个"/",代表这是一个缺省的servlet,
        就是如果请求地址和web.xml中的url-pattern找不到匹配的URL,则会将访问请求交给缺省Servlet处理,也就是说缺省的servlet通常用来处理请求资源找不到的问题(404)
        eg:
        <!-- 缺省Servlet,当访问路径不存在自动跳到error包下的Cod1中输出404 -->
        <servlet>
          <servlet-name>default</servlet-name>
             <servlet-class>error.Code1</servlet-class>
          <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
          <servlet-name>default</servlet-name>
          <url-pattern>/</url-pattern>
        </servlet-mapping>
    10.ServletConfig接口:
        它是Servlet的配置对象,作用就是获得servlet的初始化参数,如获得web.xml中为Servlet初始化的参数
    ServletConfig config = this.getServletConfig();
    常用方法:
    1.String getInitParameter(String name):返回类型名为name的初始化参数
    2.Enumeration getInitParameterNames():获取所有初始化参数名的枚举集合
    3.ServletContext geServletContext():返回一个代表当前应用servletContext对象
    4.String getServletName():获取Servlet的名字(web.xml中<servlet-name>里面的名字)
    11.web.xml中Servlet的其他配置
      <init-param>节点表示要设置的初始参数,为Servlet配置初始化参数的
      <param-name>:表示参数名称
      <param-value>:表示参数值
      eg:在<init-param>节点中为ServletDemo1配置一个名为encoding的参数,并设置参数值为UTF-8
      <servlet>
        <servlet-name>AServlet</servlet-name>
        <servlet-class>com.ServletDemo1</servlet-class>
        <!-- 为Servlet配置参数信息 -->
        <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
      </servlet>
      访问方法:在ServletDemo1中用ServletConfig对象来获取ServletDemo1的初始化参数
    //com.ServletDemo1类
    public class ServletDemo1 extends HttpServlet
    {
        private static final long serialVersionUID = 1L;
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            PrintWriter out = resp.getWriter();
            //获得ServletConfig对象
            ServletConfig config = this.getServletConfig(); 
            //得到名为encoding的初始化配置参数
            String string = config.getInitParameter("encoding");
            out.println(string);
        }
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req, resp);
        }
    }
    12.ServletContext接口:
        每当Servlet容器启动时,会为每个web应用创建一个唯一的ServletContext对象,代表当前web应用,该对象不仅封装了当前web应用所有信息,而且实现了多个Servlet之间数据共享.
        应用1.获取web应用程序的的初始化参数:
            在web.xml中不仅可以配置Servlet的初始化信息,还可以配置整个web应用的初始化信息.
            web应用初始化参数的配置方法具体如下:
            <context-param>
                  <param-name>参数名</param-name>
                  <param-value>参数值</param-value>
              </context-param>
        eg:web.xml中为整个web应用配置初始化信息
          <!-- 为整个web应用配置初始化信息 -->
          <context-param>
              <param-name>companyName</param-name>
              <param-value>itcast</param-value>
          </context-param>
          <context-param>
              <param-name>address</param-name>
              <param-value>beijing</param-value>
          </context-param>
          
          <!-- ServletDemo1 -->
          <servlet>
            <servlet-name>AServlet</servlet-name>
            <servlet-class>com.ServletDemo1</servlet-class>
          </servlet>
          <servlet-mapping>
            <servlet-name>AServlet</servlet-name>
            <url-pattern>/ServletDemo1</url-pattern>
          </servlet-mapping>
          <!-- ServletDemo1 -->
        访问web应用的初始化参数:
        public class ServletDemo1 extends HttpServlet
        {
            private static final long serialVersionUID = 1L;
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                PrintWriter out = resp.getWriter();
                //得到ServletContext对象
                ServletContext context = this.getServletContext();
                //得到(这个web应用)context对象的参数的枚举集合
                Enumeration<String> paramNames = context.getInitParameterNames();
                //访问paramNames中的所有参数值
                while (paramNames.hasMoreElements()) {
                    String name = (String) paramNames.nextElement();
                    String value = context.getInitParameter(name);
                    out.println(name+": "+value);
                }
            }
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                this.doGet(req, resp);
            }
        }
        应用2.实现多个Servlet对象共享数据
        由于一个web应用中所有Servlet共享同一个SrevletContext对象,因此,ServletContext对象的域属性可以被该web应用中的所有Servlet访问。在Servlet接口中定义了分别用于增加,删除,设置ServletContext域属性的四个方法.
            1.Enumeraton getAttributeNames();//返回一个Enumeration对象,该独享包含了所有存放在ServletContext中的所有于属性名
            2.Object getAttribute(String name);//根据给定指定属性名返回一个与之匹配的属性值,转换为具体类型要强制转换
            3.void removeAttribute(String name);//根据指定的域属性名,从ServletContext中删除匹配的域属性名
            4.void setAttribute(String name,Object obj);//设置ServletContext的域属性,其中name是域属性名,obj是域属性值
        eg:创建一个ServletDemo1和ServletDemo2实现共享ServletContext域(整个web应用)数据
        //com. ServletDemo1.java
        public class ServletDemo1 extends HttpServlet
        {
            private static final long serialVersionUID = 1L;
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                ServletContext context = this.getServletContext();
                //通过setAttribute(name,value)方法配置同一个web下的共享参数
                context.setAttribute("data", "this servlet save data!");
            }
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                this.doGet(req, resp);
            }
        }
        //com. ServletDemo2.java
        public class ServletDemo2 extends HttpServlet
        {
            private static final long serialVersionUID = 1L;
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                PrintWriter out = resp.getWriter();
                //得到这个web应用的ServletContext对象
                ServletContext context = this.getServletContext();
                //通过context的getAttribute()方法获得属性值
                String string = (String)context.getAttribute("data");
                out.println(string);
            }
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                this.doGet(req, resp);
            }
        }
        应用3.读取web应用下的资源文件
        实际开发中,有时候可能需要读取web应用下的一些资源,比如配置文件,图片等.
        为此,在ServletContext接口中定义了一些读取web资源的方法,这些方法是依靠Servlet容器实现的.servlet容器根据资源文件相对于web应用的路径,返回关联资源的IO流,资源文件在系统中的绝对路径.下面是ServletContext获取资源路径的方法:
            参数说明:path以"/"开始,"/"表示当前web应用的根目录,
            //返回一个set集合,集合中包含资源目录中子目录和文件的路径名称。
            1.Set getResourcePaths(String path);
            //返回资源文件在服务器文件系统上的真实路径(文件的绝对路径),如果Servlet容器不能将虚拟路径转换为文件系统的真实路径返回null。
            2.String getRealPath(String path);
            //返回映射到某个资源文件的URL对象。
            3.URL getResource(String path);
            //返回映射到某个资源文件的InputStream输入流对象.
            4.InputStream getResourceAsStream(String path);
        eg:得到itcast.properties文件内容
        /*
         * 读取itcast.properties文件中的内容
         * src下创建的属性文件实际保存在/WEB-INF/classes/itcast.properties下
         */
        public class ServletDemo3 extends HttpServlet
        {
            private static final long serialVersionUID = 1L;
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                resp.setContentType("text/html;charset=utf-8");
                ServletContext context = this.getServletContext();
                PrintWriter out = resp.getWriter();
                //得到itcast.properties文件的输入流对象
                InputStream inputStream = context.getResourceAsStream("/WEB-INF/classes/itcast.properties");
                Properties pros = new Properties();
                pros.load(inputStream);
                out.println("Company="+pros.getProperty("Company"));
                out.println("Address="+pros.getProperty("Address"));
            }
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                this.doGet(req, resp);
            }
        }
        itcast.properties文件:
            Company = itcast
            Address = Beijing
        //补充知识:
        后缀properties是一种属性文件。
        这种文件以key=value格式存储内容
        Java中可以使用Properties类来读取这个文件
        String value=p.getProperty(key);
        就能得到对应的数据
        一般这个文件作为一些参数的存储,代码就可以灵活一点
    
        用于适应多语言环境,随着系统的语言环境的变化,读取不同的属性文件,显示对应语言的UI
        当配置文件用,在里面读取一些关于路径方面的设置(如ant中的build.properties)
    
        存放一组配置.(类似win下ini, 还要简单些, 因为没有section)
        由于难以表达层次, 复杂点可以用xml做配置.
        通俗点讲就相当于定义一个变量,在这个文件里面定义这些变量的值,在程序里面可以调用这些变量,好处就是,如果程序中的参数值需要变动,直接来改这个.property文件就可以了,不用在去修改源代码。
    
        优点在于有利于你以后的代码重构,维护方便
  • 相关阅读:
    jenkins任务
    追涨手段
    识别上升浪中的假反弹假阻力
    上升浪的判断
    点位超过10的上涨高位转折点
    纯碱下跌巨幅捕捉
    纯碱规律
    玉米
    iOS基础之界面通信
    iOS基础之UINavigationController(导航视图控制器)
  • 原文地址:https://www.cnblogs.com/nanfengnan/p/15408895.html
Copyright © 2020-2023  润新知