W8-Servlet[JavaWeb]

1. 什么是Servlet

  1.1 Servlet是JavaWeb的三大组件之一,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:

  (1)接收请求数据;

  (2)处理请求;

  (3)完成响应;

   1.2 Servlet的特性

  (1)单例,一个类只有一个对象,可能存在多个Servlet类

  (2)线程不安全的,所以效率是最高的

  1.3 Servlet类由我们写,但是对象由服务器创建,并由服务器调用相应的方法

2.实现Servlet的方式

  (1)实现javax.servlet.Servlet接口

 1 package cn.itcast.web.servlet;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.Servlet;
 6 import javax.servlet.ServletConfig;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.ServletRequest;
 9 import javax.servlet.ServletResponse;
10 
11 /*
12  * 查看Servlet中的方法
13  */
14 public class AServlet implements Servlet {
15     /*
16      * 生命周期方法(non-Javadoc) 在Servlet被销毁之前调用,只会被调用一次
17      * @see javax.servlet.Servlet#destroy()
18      */
19     public void destroy() {
20         System.out.println("destory()....");
21     }
22     /* 
23      * 获取Servlet的配置信息(non-Javadoc)
24      * @see javax.servlet.Servlet#getServletConfig()
25      */
26     public ServletConfig getServletConfig() {
27         System.out.println("getServletConfig()....");
28         return null;
29     }
30     /*
31      * 可以获取Servlet的信息(non-Javadoc)
32      * @see javax.servlet.Servlet#getServletInfo()
33      */
34     public String getServletInfo() {
35         System.out.println("getServletInfo()....");
36         return null;
37     }
38 
39     /*
40      * 生命周期方法(non-Javadoc) 在Servlet对象创建之后马上执行,并且只执行一次(出生之后)
41      * @see javax.servlet.Servlet#init(javax.servlet.ServletConfig)
42      */
43     public void init(ServletConfig servletConfig) throws ServletException {
44         System.out.println("init()...");
45     }
46 
47     /*
48      * 生命周期方法(non-Javadoc) 会被调用多次,每次处理请求,都会被调用
49      * @see javax.servlet.Servlet#service(javax.servlet.ServletRequest,
50      * javax.servlet.ServletResponse)
51      */
52     public void service(ServletRequest servletRequest,
53             ServletResponse servletResponse) throws ServletException,
54             IOException {
55         System.out.println("service()...");
56     }
57 
58 }

 

  (2)继承javax.servlet.GenericServlet类

  (3)继承javax.servlet.http.HttpServlet类 (使用该方式)

 

3. 如何让浏览器访问Servlet

  3.1 给Servlet指定一个Servlet路径

  (1)要在Servlet中对Servlet进行配置(7-15行)

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" 
 3     xmlns="http://java.sun.com/xml/ns/javaee" 
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 7   <servlet>
 8       <servlet-name>xxx</servlet-name>
 9       <servlet-class>cn.itcast.web.servlet.AServlet</servlet-class>
10   </servlet>
11   
12   <servlet-mapping>
13       <servlet-name>xxx</servlet-name>
14       <url-pattern>/AServlet</url-pattern>
15   </servlet-mapping>
16 </web-app>

  (2)1个ServletConfig对象,对应一端web.xml中Servlet的配置信息(7-10行)

    API:

    String getServletName():获取的是<servlet-name>中的内容;

    ServletContext getServletContext():获取Servlet上下文对象;

    String getInitParameter(String name):通过名称获取初始化参数的值;

    Enumeration getInitParameterNames():获取所有初始化参数的名称;

  3.2 浏览器访问Servlet路径

 

4. GenericServlet类

   查看API

5.HttpServlet类

  5.1 原理

 

6 Servlet细节

  6.1 不要在Servlet中创建成员,可以创建局部变量;可以创建无状态成员;可以创建有状态的成员,但是它的状态必须是只读的;不能直接创建成员变量是因为可能会存在一个线程对这个成员变量进行写操作,另一个线程对这个成员变量进行读操作。

  6.2 让服务器在启动时就创建Servlet

  默认情况下,服务器会在某个Servlet第一次接收到请求时创建它,也可以在web.xml中对servlet进行配置,使得服务器启动时就创建servlet。(第4行)

1  <servlet>
2   <servlet-name>xxx</servlet-name>
3   <servlet-class>cn.itcast.web.Aservlet.AServlet</servlet-class>
4   <load-on-startup>0</load-on-startup>
5   </servlet>

   6.3<url-pattern>

  (1)<url-pattern>是<servlet-mapping>的子元素,用来指定元素Servlet的访问路径,以“/”开头;

  (2)在<servlet-mapping>可以由多个<url-pattern>,说明其有多个访问路径;

  (3)可以在<url-pattern>中使用通配符,通配符只能出现在两端,不能出现在中间,谁的匹配越具体谁的优先级越高;

  6.4 Web.xml文件的继承(了解)

  所有的Web.xml文件都有一个公共的父文件,它在Tomcat的conf/web.xml路径;

 1 <servlet>
 2         <servlet-name>default</servlet-name>
 3         <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
 4         <init-param>
 5             <param-name>debug</param-name>
 6             <param-value>0</param-value>
 7         </init-param>
 8         <init-param>
 9             <param-name>listings</param-name>
10             <param-value>false</param-value>
11         </init-param>
12         <load-on-startup>1</load-on-startup>
13    </servlet>
14 
15 <servlet-mapping>
16         <servlet-name>default</servlet-name>
17         <url-pattern>/</url-pattern>
18    </servlet-mapping>

  第2行:它的优先级最低,如果一个请求没有人处理,那么由它来处理,显示404;

  当访问路径不存在时,会访问该servlet;

 

7 ServletContext

  7.1 ServletContext概述

  (1)一个项目只有一个ServletContext对象;

  (2)可以在N个Servlet中获取这个唯一的对象,使用它可以给多个Servlet传递数据;

  (3)服务器会为每一个应用创建一个ServletContext对象:ServletContext对象的创建是在服务器启动时完成的,ServletContext对象的销毁时在服务器关闭时完成的;

  (4)ServletContext对象的作用是在整个Web应用的动态资源之间共享数据

  7.2 获取ServletContext

  (1)在Servlet中获取ServletContext对象

    在void init(ServletConfig config)中:ServletContext context=config.getServletContext() 

    ServletConfig接口中的getServletContext() 方法获取ServletContext对象;

  (2)在GenericServlet类或HttpSession类或ServletContextEvent类中获取ServletContext对象 :getServletContext() 

    直接使用this.getServletContext() 方法获取得到;

  7.3 域的功能

  (1)ServletContext是JavaWeb四大域对象之一:PageContext;ServletRequest;HttpSession;ServletContext;

  (2)所有的域对象都有存储数据的功能,因为域对象内部有一个Map,用来存储数据,域对象就是用来在多个Servlet中传递数据,域对象还需要有取数据的功能;

  (3)ServletContext对象操作数据的方法

    -void setAttribute(String name,Object object) :用来存储一个对象,也可以称之为存储一个域属性;如果多次调用该方法,并且使用相同的name,那么就会覆盖上一次的值,这一特性与Map相同;

    -Object  getAttribute(String name) :用来获取ServletContext中的数据,当前在获取之前需要先存储;

    -void removeAttribute(String name) :用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,本方法什么都不做;

    -Enumeration getAttributeNames() :获取所有域属性的名称;

 1 package cn.itcast.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.ServletContext;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 
12 public class AServlet extends HttpServlet {
13 
14     /**
15      * 演示向ServletContext中保存数据
16      */
17     public void doGet(HttpServletRequest request, HttpServletResponse response)
18             throws ServletException, IOException {
19         /*
20          * 1.获取ServletContext对象
21          * 2.调用其setAttribute()方法完成保存数据
22          */
23         ServletContext application=this.getServletContext();
24         application.setAttribute("name", "张三");
25     }
26 
27 }

 

 1 package cn.itcast.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.ServletContext;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 
12 public class BServlet extends HttpServlet {
13 
14     /**
15      * 演示从ServletContext中获取数据
16      */
17     public void doGet(HttpServletRequest request, HttpServletResponse response)
18             throws ServletException, IOException {
19         /*
20          * 1.获取ServletContext对象
21          * 2.调用其getAttribute()方法完成获取数据
22          */
23         ServletContext application=this.getServletContext();
24         String name=(String)application.getAttribute("name");
25         System.out.println(name);
26     }
27 
28 }

 

  添加项目到Tomcat,启动Tomcat,通过浏览器打开AServlet,再打开BServlet,可看到输出"张三"

  7.4 获取应用初始化参数

  (1)Servlet可以获取初始化参数,但是一个Servlet对象只能获取自身的初始化参数,不能获取别人的;

  (2)ServletContext获取Web.xml文件中的配置的应用初始化参数,应用初始化参数与Servlet初始化参数不同,应用初始化参数为所有Servlet所用;

  在Web.xml文件下<web-app>根目录下添加

<context-param>
  <param-name>context-param</param-name>
  <param-value>context-value</param-value>
  </context-param>

   创建新的Servlet文件

 1 package cn.itcast.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.ServletContext;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 
12 public class CServlet extends HttpServlet {
13 
14     /**
15      * 演示ServletContext获取公共初始化参数
16      */
17     public void doGet(HttpServletRequest request, HttpServletResponse response)
18             throws ServletException, IOException {
19         /*
20          * 1.得到ServletContext
21          * 2.调用他的getInitParameter(java.lang.String name) 得到初始化参数
22          */
23         ServletContext application=this.getServletContext();
24         String value=application.getInitParameter("context-param");
25         System.out.println(value);
26     }
27 
28 }

   7.5 获取相关资源方法

  (1)获取真实路径:可以使用ServletContext对象来获取Web应用下的资源

    (2)获取资源流

  (3)获取所有的资源路径

 1 package cn.itcast.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.PrintWriter;
 6 import java.util.Set;
 7 
 8 import javax.servlet.ServletException;
 9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12 
13 import com.sun.faces.taglib.html_basic.InputSecretTag;
14 
15 public class DServlet extends HttpServlet {
16 
17     /**
18      * 使用ServletContext获取资源路径,资源流
19      */
20     public void doGet(HttpServletRequest request, HttpServletResponse response)
21             throws ServletException, IOException {
22         //得到的是有盘符的路径:F:/xxx/xxx/xxx/xx/
23         //F:\motke\job preparation\Java\javaWeb\.metadata\.me_tcat\webapps\Day9-2
24         String path=this.getServletContext().getRealPath("/index.jsp");
25         System.out.println(path);
26         //获取资源流,获取资源的路径后,再创建输入流对象
27         InputStream input=this.getServletContext().getResourceAsStream("/index,jsp");
28         //获取当前路径下所有资源的路径
29         Set<String> paths=this.getServletContext().getResourcePaths("/WEB-INF");
30         System.out.println(paths);
31     }
32 
33 }

  7.6 案例:统计页面的访问量

 1 package cn.itcast.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.ServletContext;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 
12 import com.sun.corba.se.spi.activation.Repository;
13 
14 public class AServlet extends HttpServlet {
15 
16     /**
17      * 统计访问量
18      */
19     public void doGet(HttpServletRequest request, HttpServletResponse response)
20             throws ServletException, IOException {
21         /*
22          * 1.获取ServletContext对象
23          * 2.从ServletContext对象中获取名为count的属性
24          *     3.如果存在,访问量+1,然后保存回去;
25          *     4.如果不存在,说明是第一次方法,向ServletContext中保存名为count的属性,值为1
26          */
27         ServletContext app=this.getServletContext();
28         Integer count=(Integer)app.getAttribute("count");
29         if(count==null){
30             app.setAttribute("count", 1);
31         }else{
32             app.setAttribute("count", count+1);
33         }
34         //向浏览器输出
35         //使用相应对象
36         PrintWriter pw=response.getWriter();
37         pw.print("<h1>"+count+"</h1>");
38     }
39 
40 }

   7.7 获取类路径下的资源

  (1)获取类路径资源,类路径对一个JavaWeb项目而言,就是/WEB-INF/classes和/WEB-INF/lib/每个jar包

  (2)

 1 package cn.itcast.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.PrintWriter;
 6 
 7 import javax.servlet.ServletException;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 
12 import com.sun.faces.taglib.html_basic.InputSecretTag;
13 
14 public class AServlet extends HttpServlet {
15 
16     /**
17      * 获取类路径下的资源
18      */
19     public void doGet(HttpServletRequest request, HttpServletResponse response)
20             throws ServletException, IOException {
21         /*
22          * 1.得到classLoader
23          *  先得到class,再得到classLoader
24          * 2.调用其getResourceAsStream(),得到InputStream
25          */
26         ClassLoader c1=this.getClass().getClassLoader();
27         InputStream is=c1.getResourceAsStream("a.txt");
28     }
29 
30 }

 

posted on 2019-08-18 12:37  ERFishing  阅读(161)  评论(0编辑  收藏  举报