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文件就可以了,不用在去修改源代码。

    优点在于有利于你以后的代码重构,维护方便
原文地址:https://www.cnblogs.com/nanfengnan/p/15408895.html