servlet

servlet掌握清单

1.servlet概述
2.servlet配置
3.servlet体系结构
4.servlet生命周期
5.ServletContext类
6.response响应
7.request请求
8.请求转发和重定向区别

1、servlet概述:servle运行在服务端的一个小的java程序,接收和响应客户端发送的请求
    
2、servlet配置:
    在web.xml下配置流程:
        引入dtd
        <!-- 配置Servlet -->
          <servlet>
            <!-- Servlet的名称 -->
            <servlet-name>aaa</servlet-name>
            <!-- Servlet的类的全路径 -->
            <servlet-class>com.itheima.servlet.demo1.ServletDemo1</servlet-class>
          </servlet>
          
          <!-- 配置Servlet的映射 -->
          <servlet-mapping>
            <!-- Servlet的名称 -->
            <servlet-name>aaa</servlet-name>
            <!-- Servlet的访问路径 -->
            <url-pattern>/servletDemo1</url-pattern>
          </servlet-mapping>
        配置Servlet的启动时加载:
            在web.xml中<servlet>标签中配置
            <load-on-startup>2</load-on-startup>
        url-pattern的配置:★
        方式1:完全匹配  必须以"/"开始 例如: /hello /a/b/c
        方式2:目录匹配  必须"/"开始  以"*"结束   例如: /a/*  /*
        方式3:后缀名匹配 以"*"开始 以字符结尾 例如: *.jsp  *.do  *.action
        
        优先级:
            完全匹配>目录匹配>后缀名匹配
         练习:
            有如下的一些映射关系:
                Servlet1 映射到 /abc/*
                Servlet2 映射到 /*
                Servlet3 映射到 /abc
                Servlet4 映射到 *.do
        问题:
        当请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应
            Servlet引擎将调用Servlet1。
        当请求URL为“/abc”时,“/*”和“/abc”都匹配,哪个servlet响应
            Servlet引擎将调用Servlet3。
        当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应
            Servlet引擎将调用Servlet1。
        当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
            Servlet引擎将调用Servlet2.
        当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
            Servlet引擎将调用Servlet2。
3.servlet体系结构
        servlet的体系结构:(了解)
        Servlet:接口
            |
        GenericServlet:抽象类
            |
        HttpServlet:抽象类
            |
        自定义servlet
        
        servlet常用方法:
            void init(ServletConfig config):初始化
            void service(ServletRequest request,ServletResponse response):服务 处理业务逻辑
            void destroy():销毁
            
            ServletConfig getServletConfig() :获取当前servlet的配置对象
        
        GenericServlet常用方法:    
            除了service方法没有显示,其他都实现了
            空参的Init() 若我们自己想对servlet进行初始化操作,重写这个init()方法即可
        
        HttpServlet常用方法:
            service做了实现,把参数强转,调用了重载的service方法
                重载的service方法获取请求的方式,根据请求方式的不同调用相应doXxx()方法
            doGet和doPost方法
4.servlet生命周期 ★★★
        void init(ServletConfig config):初始化
         * 初始化方法
         * 执行者:服务器
         * 执行次数:一次
         * 执行时机:默认第一次访问的时候
        void service(ServletRequest request,ServletResponse response):服务 处理业务逻辑
         * 服务
         * 执行者:服务器
         * 执行次数:请求一次执行一次
         * 执行时机:请求来的时候
        void destroy():销毁
         * 销毁
         * 执行者:服务器
         * 执行次数:只执行一次
         * 执行时机:当servlet被移除的时候或者服务器正常关闭的时候
        
         serlvet是单实例多线程
         默认第一次访问的时候,服务器创建servlet,并调用init实现初始化操作.并调用一次service方法
         每当请求来的时候,服务器创建一个线程,调用service方法执行自己的业务逻辑
         当serlvet被移除的时候服务器正常关闭的时候,服务器调用servlet的destroy方法实现销毁操作.

5.ServletContext:
    Servlet中全部的内容ServletContext都了解.一个WEB应用只有一个ServletContext对象.服务器启动的时候,服务器为每个WEB工程创建一个属于自己项目的ServletContext对象.服务器关闭的时候或者项目从服务器中移除ServletContext才会被销毁.如果将值保存在ServletContext中.值就有一个作用的范围.所以这个对象称为”域对象”.
    * 在Servlet中获得ServletContext:
    * ServletContext getServletContext();

    * 操作这个对象的方法:
        * void setAttribute(String name,Object value);
        * Object getAttribute(String name);
        * void removeAttribute(String name);
    ServletContexty作用:
        1.获取全局的初始化参数
        2.共享资源(xxxAttribute)
        3.获取文件资源
        4.其他操作
    
6.获取文件的路径:
    通过类加载器获取文件:2.txt 放在classes目录下无论是java项目还是web项目都可以
        类.class.getClassLoader().getResource("2.txt").getPath()

7.response响应
    作用:
        往浏览器写东西
    组成部分:
        响应行 响应头 响应体
    操作响应行
        格式:
            协议/版本 状态码 状态码说明
        状态码:
            1xx:已发送请求
            2xx:已完成响应
                200:正常响应
            3xx:还需浏览器进一步操作
                302:重定向 配合响应头:location
                304:读缓存
            4xx:用户操作错误
                404:用户操作错误.
                405:访问的方法不存在
            5xx:服务器错误
                500:内部异常
        常用方法:
            setStatus(int 状态码):针对于 1 2 3
            了解 :
                sendError(int 状态码):针对于 4xx和5xx
    操作响应头
        格式:key/value(value可以是多个值)
        常用的方法:
            setHeader(String key,String value):设置字符串形式的响应头
            了解:setIntHeader(String key,int value):设值整形的响应头
            了解:setDateHeader(String key,long value):设值时间的响应头
            
            addHeader(String key,String value):添加置字符串形式的响应头 之前设置过则追加,若没有设置过则设置
            了解:addIntHeader(String key,int value):添加整形的响应头
            了解:addDateHeader(String key,long value):添加时间的响应头
        常用的响应头:
            location:重定向
            refresh:定时刷新
            content-type:设置文件的mime类型,设置响应流的编码及告诉浏览器用什么编码打开
            content-disposition:文件下载
            
            重定向:    
                方式1:
                    ★response.sendRedirect("/day10/loc2");
                方式2:
                    response.setStatus(302);
                    respooen.setHeader("location","/day10/loc2");
                    
            定时刷新:
                方案1:设置头 refresh 昨天做过
                    respooen.setHeader("refresh","秒数;url=跳转的路径");
                方案2:http的meta标签
                    <meta http-equiv="refresh" content="3;url=/day10/refresh2.html">
                    
        /////////////////////    
    操作响应体:
        页面上要展示的内容
        常用方法:
            Writer getWriter():字符流
            ServletOutputStream getOutputStream() :字节流
            
            自己写的东西用字符流,其他一概用字节流.
            
        处理响应中文乱码:
            方式1:★
                response.setContentType("text/html;charset=utf-8");
            方式2:理解
                response.setHeader("content-type", "text/html;charset=utf-8");
    
        注意:
            两个流互斥
            当响应完成之后,服务器会判断一下流是否已经关闭,若没有关闭,服务器会帮我们关闭.(底层使用的缓冲流)
8.request:请求
    作用:获取浏览器发送过来的数据
    组成部分:
        请求行 请求头 请求体
    操作请求行
        格式:
            请求方式 请求资源 协议/版本
        常用方法:HttpServletRequest
            掌握
                String getMethod():获取请求方式
                String getRemoteAddr():获取ip地址
                String getContextPath() :在java中获取项目名称  (/day10)
 
            
            了解:
                getRequestURI():获取的是 从项目名到参数之前的内容  /day10/regist
                getRequestURL():获取的带协议的完整路径   http://localhost/day10/regist
                String getQueryString():get请求的所有参数   username=tom&password=123
                String getProtocol():获取协议和版本
                
        例如:请求行
            GET /day10/row?username=tom&password=123 HTTP/1.1
            
    操作请求头
        格式:key/value(value可以是多个值)
        常用方法:
            ★String getHeader(String key):通过key获取指定的value (一个)
            
            了解:
                Enumeration getHeaders(String name) :通过key获取指定的value(多个)
                Enumeration getHeaderNames() :获取所有的请求头的名称
                int getIntHeader(String key):获取整型的请求头
                long getDateHeader(String key):获取时间的请求头
        重要的请求头:
            user-agent:浏览器内核 msie firefox chrome
            referer:页面从那里来 防盗链
 
    操作请求参数 ★
        username=tom&password=123&hobby=drink&hobby=sleep
        常用方法:
            String getParameter(String key):获取一个值
            String[] getParameterValues(String key):通过一个key获取多个值
            Map<String,String[]> getParameterMap():获取所有的参数名称和值
            
            
        username:tom
        ---------values---------
        hobby:[drink, sleep]
        =====map=======
        username::[tom]
        password::[123]
        hobby::[drink, sleep]
    
    请求的中文乱码:
        对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码
        对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码
        
        通用的方法:
            new String(参数.getBytes("iso-8859-1"),"utf-8");
        针对于post请求来说:只需要将请求流的编码设置成utf-8即可
            request.setCharacterEncoding("utf-8");

    域对象:
        request:
            创建:一次请求来的时候
            销毁:响应生成的时候
            作用:
                一次请求里面的数据
            请求转发(请求链,请求串)
                request.getRequestDispatcher("内部路径").forward(request,response);        

9.请求转发和重定向区别:
    重定向发送两次请求,请求转发一次请求
    
    重定向地址栏发生该表,请求转发不变
    
    重定向是从浏览器发送,请求转发是服务器内部
    
    重定向不存在request域对象,请求转发可以使用request域对象
    
    重定向是response的方法,请求转发是request的方法
    
    重定向可以请求站外资源,请求转发不可以        

posted @ 2017-08-28 11:15  learn_java  阅读(103)  评论(0编辑  收藏  举报