zoukankan      html  css  js  c++  java
  • Servlet

    Servlet准备工作

    1、Servlet3.0 :支持注解配置。可以不需要配置web.xml了。
    2、 Servlet的体系结构 
    Servlet -- 接口
    |
    GenericServlet -- 抽象类
    |
    HttpServlet -- 抽象类

    * GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
    * 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可

    【推荐使用】HttpServlet:对http协议的一种封装,简化操作
    1. 定义类继承HttpServlet
    2. 复写doGet/doPost方法

    3、 Servlet相关配置 ——
    urlpartten:Servlet访问路径
           1. 一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})
    2. 路径定义规则
    1. /xxx:路径匹配
    2. /xxx/xxx:多层路径,目录结构
    3. *.do:扩展名匹配

      4、 doGet和doPost方法

      1、通过表单提交到的servlet,看form的method是get还是post

      2、通过链接<a href...>访问的servlet调用doGet方法

      3、直接在浏览器地址栏键入的servlet地址调用也是doGet方法

      post方式:将各个表单字段元素及其数据作为http消息的实体内容发送给web服务器端,传送的数据量要比get方式传送的数据量大的多。

    一、ServletRequest和ServletResponse接口

      当客户请求到来时,由容器创建一个ServletRequest对象,封装请求数据,同时创建一个ServletResponse对象,封装响应数据。这两个对象作为参数传递给service方法。

      这两个接口都用很多方法,可查看api文档。

      HttpServletRequest和HttpServletResponse分别继承自ServletRequest和ServletResponse接口(要使用http协议进行传输)。

    二、ServletConfig接口

      Servlet容器使用ServletConfig对象在Servlet初始化期间向它传递配置信息,一个Servlet对象只有一个ServletConfig对象。该接口中定义下述四个方法:

         //返回名字为name的初始化参数的值
             String getInitParameter(String name);
          //返回所有初始化参数的的名字的枚举集合
             Enumeration getInitParameterNames() ;
          //返回Servlet上下文对象的引用
             ServletContext getServletContext();
          //返回Servlet实例的名字
             String getServletName() ;

    三、ServletContext接口

      一个Web应用程序只有一个ServletContext对象,该对象可以被Web应用程序的所有Servlet所访问,因此通常使用Servlet对象保存一些需要在Web应用程序中共享的信息

      ServletContext对象是Web服务器中一个已知路径的根 —— 用来表示上下文。该接口定义一组方法,Servlet可以使用这些方法与它的Servlet容器进行通信。

      (1)ServletContext对象被包含在ServletConfig对象中

    // 可以通过ServletConfig对象的getServletContext方法来得到ServletContext对象,

      (2)由于一个Web应用程序中的所有Servlet都共享一个ServletContext对象,所以,ServletContext对象被称之为application对象

      【获取】
    1. 通过request对象获取
    request.getServletContext();
    2. 通过HttpServlet获取
    this.getServletContext();
    【功能】
    1. 获取MIME类型:
    * MIME类型:在互联网通信过程中定义的一种文件数据类型
    * 格式: 大类型/小类型   text/html image/jpeg

    * 获取:String getMimeType(String file)  
    2. 域对象:共享数据
    1. setAttribute(String name,Object value)
    2. getAttribute(String name)
    3. removeAttribute(String name)

    * ServletContext对象范围:所有用户所有请求的数据
    3. 获取文件的真实(服务器)路径
    1. 方法:String getRealPath(String path)  
        String b = context.getRealPath("/b.txt");   //web目录下资源访问
        System.out.println(b);
        
        String c = context.getRealPath("/WEB-INF/c.txt");   //WEB-INF目录下的资源访问
        System.out.println(c);
        
        String a = context.getRealPath("/WEB-INF/classes/a.txt");   //src目录下的资源访问
        System.out.println(a);
    public class ContextDemo extends HttpServlet
    {
        private static final long serialVersionUID = 1L;
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
        {
            ServletContext context=getServletContext();
            Integer count=null;
            synchronized(context)
            {
                count=(Integer)context.getAttribute("counter");
                if(count==null)
                {
                    count=new Integer(1);
                }
                else
                {
                    count=new Integer(count.intValue()+1);
                }
                context.setAttribute("counter", count);
            }
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out=response.getWriter();
            out.println("<html><head><title>页面访问统计</title></head><body>");
            out.println("该页面已被访问了"+"<b>"+count+"</b>"+"次");
            out.println("</body></html>");
            out.close();
        }
    统计页面访问量的小例子

     四、RequestDispatcher接口

      RequestDispatcher对象用于封装一个由路径所标识的服务器资源,利用RequestDispatcher对象可以将请求转发给其他的Servlet或者JSP页面

    • 获取RequestDispatcher对象

      两种方法可以获取该对象,

      (1)一种是从ServletRequest接口的getRequestDispatcher方法获取【可以是相对于上下文根的路径名,而且可以是相对于当前Servlet的路径】

      (2)另一种是从ServletContext接口的getRequestDispatcher获取【只能是是相对于上下文根的路径名】

    • 请求转发方法

      在RequestDispatcher接口中定义了两种方法:forward(req,resp)和include(req,resp)

      两者的区别是:

      前者将请求转发给其他的Servlet,将由被调用的Servlet负责对请求作出相应,而原先Servlet的执行则终止

      后者将调用的Servlet对请求作出的响应并入原先的响应对象中,原先的Servlet还可以继续输出响应信息。示例代码如下:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
        {
            //该方法用于在响应中包含其他资源的内容并从ServletContext接口得到RequestDispatcher对象
            /*RequestDispatcher rd=this.getServletContext().getRequestDispatcher("/hello.html");
            rd.include(request, response);*/
            
            //该方法用于将请求从一个Servlet传递给服务器上另外的Servlet、JSP页面或者是HTML文件。
            /*RequestDispatcher rd=this.getServletContext().getRequestDispatcher("/hello.html");
            rd.forward(request, response);*/
            
            //从ServletRequest接口得到RequestDispatcher对象
            RequestDispatcher rd=request.getRequestDispatcher("hello.html");
            rd.include(request, response);
        }
    示例

    五、Servlet生命周期 

      服务器调用一个Servlet的8个步骤:

      1、在服务器启动时,当Servlet被配置好或者被客户首次请求时,由服务器加载servlet,这一步相当于下列代码:

         Class c=Class.forName("com.source.MyServlet");

      2、服务器创建一个Servlet类的实例来为所有的请求服务。利用多线程,可以由单个servlet类的实例来服务于并行的请求,此步相当于下列代码:

        Servlet s=(Servlet)c.newInstance();

      3、服务器调用Servlet的init方法,用来对客户端的首次请求提供服务之前,完成一些初始化的工作。

      4、服务器从包含在客户请求中的数据里构造一个ServletRequest或者HttpServletRequest对象,还构造一个ServletResponse或者HttpServletResponse对象来为返回响应提供方法。到底生成哪一种类型的对象,取决于Servlet是扩展了GenericServlet还是扩展了HttpServlet。

      5、服务器调用Servlet的service方法,将步骤4中的对象作为参数传递进去。当并行的请求到来时,多个service方法能够同时运行在独立的线程中。

      6、通过分析ServletRequestt或者HttpServletRequest对象,service方法处理客户端的请求,并用ServletResponse或者HttpServletResponse对象来响应。

      7、如果服务器收到另一个对该Servlet的请求,处理过程从步骤5重复。

      8、一旦Servlet容器检测到一个Servlet要被卸载(可能是因为停止Servlet容器或者web应用要被卸载掉),服务器会在所有的Servlet的service线程完成之后调用Servlet的destory方法。  

               

    六、使用IDEA开发Servlet

    1、new的时候直接选择Servlet即可   

          

    package cn.timetell.servlet;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebServlet;
    import java.io.IOException;
    
    /**
     * Created by Timetellu on 2019/9/27.
     * Servlet3.0:
     * 好处:
     *      支持注解配置。可以不需要web.xml了。
     */
    
    @WebServlet("/anno")
    public class Servlet_anno implements Servlet{
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
    
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("Servlet3.0 is coming");
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        @Override
        public void destroy() {
    
        }
    }
    Servlet示例

    2、可以配置Servlet模板

     

    #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
    #parse("File Header.java")
    @javax.servlet.annotation.WebServlet("/${Entity_Name}")
    public class ${Class_Name} extends javax.servlet.http.HttpServlet {
        protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
    
        }
    
        protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
            this.doPost(request,response);
        }
    }
    参考

     

  • 相关阅读:
    线性表之链式存储结构
    最大公约数:辗转相除法
    字符串系列之:逆序输出字符串
    链表有关的常见面试题
    从数组中找出最大的和最小的数
    C语言实现简单线程池
    线性表之顺序存储结构
    新学了姜葱豆腐
    渗透1
    MySQL注入中新Tips
  • 原文地址:https://www.cnblogs.com/timetellu/p/11616102.html
Copyright © 2011-2022 走看看