zoukankan      html  css  js  c++  java
  • Document

    回顾:
    http::
        超文本传输协议
        请求和响应
    servlet:
        运行在服务器端的一个java小程序,本质就是一个类
        接受请求,处理逻辑,生成动态内容
        编写步骤:
            1.编写一个类
                继承HttpServlet
                重写doGet或者doPost方法
            2.编写路径
                <servlet>
                    <serlvet-name>
                    <serlvet-class>
                    
                <servlet-mapping>
                    <serlvet-name>
                    <url-pattern>
            3.测试
                http://主机:端口号/项目名/路径
        servlet的体系结构:
            Servlet--->GenericServlet-->HttpServlet
        HttpServlet:
            实现了service方法,强转了两个参数,调用了重载的service方法
             重载的service方法中,获取请求的方式,根据请求方式的不同调用相应的doXxx方法
            doGet():处理get请求的逻辑
            doPostt():处理post请求的逻辑 (只有表单提交的时候把method设置成post的时候)
        servlet的生命周期:
            init(ServletConfig config):
            service(ServletRequest request,ServletResponse response):
            destroy():
    /////////////////////
        url-pattern的配置:
            完全匹配  /a/b
            目录匹配  /a/b/*
            后缀名匹配 *.jsp
            优先级:完全匹配 >目录匹配 >后缀名匹配
          一个路径对应一个servlet
          一个servlet可以对应多个路径
    //////////////////////
        load-on-startup:修改servlet的初始化时机
    ////////////////////////
        当我们的项目处理不了请求的时候,服务器里面defaultservlet来处理.
    //////////////////////////
        路径的写法:
            相对路径
            绝对路径:(常用)
                带主机和协议的路径(访问站外资源)
                不带主机和协议的路径(最常用的)
                    /项目名/资源路径
    ////////////////////////////
    servletConfig:(了解)
        servlet的配置对象
        作用:
            获取servlet的名称
            获取servlet初始化参数
            ★获取全局管理者
    servletContext:
        上下文(全局管理者)
        作用:
            1.获取全局的初始化参数
            2.共享资源
            3.获取资源
            4.获取文件的mime类型
        获取:
            在servlet中直接调用 getServletContext()
        常用方法:
            String getInitParameter(String key):根据key获取指定的初始化参数
                <context-param>
                    <param-name>
                    <param-value>
                
            String getRealPath(String 文件路径):获取的指定文在在tomcat上的绝对路径
                文件路径从项目的根目录往后写
            InputStream getREsourceAsStream(String 文件路径):以流的形式返回一个文件
            
            String getMimeType(文件名):格式 大类型/小类型
            
    /////////////////////////////////////
    域对象:
        创建:在服务器启动的时候,服务器会为每一个项目创建一个全局管理者,servletcontext就是当前项目的引用
        销毁:在项目被移除或者服务器关闭的时候销毁
        常用的方法:
            xxxAttribute()
                setAttribute(String key,Object value)
                Object getAttribute(String key)
                removeAttribute(String key)
    //////////////////////////////////////////
    通过类加载器获取文件的路径(处于classes目录下的文件)
        类.class.getClassLoader().getReource("文件路径").getPath()
        类.class.getClassLoader().getReourceAsStream("文件路径")
    /////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////
    要求:会使用request和response
    案例1-文件下载案例
    技术分析:
        response
        文件下载
    //////////////////////
    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");
        
            注意:
                两个流互斥
                当响应完成之后,服务器会判断一下流是否已经关闭,若没有关闭,服务器会帮我们关闭.(底层使用的缓冲流)
    //////////////////////////////    
    文件下载:
        下载方式:
            1.超链接下载
                <a href="/day10/download/day10.txt">下载 day10.txt</a>
                若浏览器能解析该资源的mime类型,则打开;若不能接下则下载;
            2.编码下载 通过servlet完成
                <a href="/day10/download?name=day10.txt">下载 day10.txt</a>
                a.设置文件的mime类型
                    String mimeType=context.getMimeType(文件名)
                    response.setContentType(mimeType);
                    
                b.设置下载头信息 content-disposition
                    response.setHeader("content-disposition", "attachment;filename="+文件名称);
                    
                c.提供流
                    response.getOutputStream();
                    
            扩展:使用commons-io工具类
                对拷流:
                    IOUtils.copy(is,os);
    /////////////////////////////
    扩展:
        通过response生成验证码
        验证码:
            作用:防止暴力攻击
        点击换一张的js代码:
            function changeImg(obj){
                //操作src属性
                obj.src="/day10/code?i="+Math.random();
                //alert(1)
            }
    //////////////////////////////////////////////    
    案例2-完成用户注册操作
    需求:
        在一个表单页面上填写用户数据,点击提交,将所有的数据提交的服务器上,通过java代码最终保存到数据库中.
    技术分析:
        表单
        request
    ////////////////////////////////
    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);
    ///////////////////////////////////////////////////////////////            
    ///////////////////////////////////////////////////////////////            
                
    案例2-步骤分析:
        1.数据库和表(day09)
        2.页面(表单)
            给每个字段添加name属性
            还需修改表单提交的路径 method=post
        3.表单提交到一个servlet(RegistServlet)
        4.RegistServlet:
            操作:
                接受数据,封装成一个user
                调用UserSerivce完成保存操作  int regist(User user)
                判断结果是否符合我们预期
                    若int=1; 插入成功
                    若int!=1; 插入失败
                相应的提示信息在当前的servlet不做处理,将信息转发给另一个servlet展示(MsgServlet);
        5.UserService
            调用dao
        6.userdao 通过dbutils在数据库中插入一条记录.
    //////////////////
    封装对象:
        apache提供的一个工具类
            BeanUtils
                封装数据
                使用步骤:
                    1.导入jar包
                    2.调用 BeanUtils.populate(Object bean,Map<> 参数);
                
    
    /////////////////////////////////////////////
    /////////////////////////////////////////////
    请求转发和重定向区别:
        重定向发送两次请求,请求转发一次请求
        
        重定向地址栏发生该表,请求转发不变
        
        重定向是从浏览器发送,请求转发是服务器内部
        
        重定向不存在request域对象,请求转发可以使用request域对象
        
        重定向是response的方法,请求转发是request的方法
        
        重定向可以请求站外资源,请求转发不可以        
        
    
                
        /////////////////////////////////////////////        
        /////////////////////////////////////////////        
    扩展:
        URLEncoder.encode(s, "utf-8"); 指定编码
        URLDecoder.decode(s8, "iso8859-1");指定解码
    文件下载扩展:
        中文名称的文件名下载的时候名称会出现问题
        常见的浏览器需要提供文件名称的utf-8编码
        对于火狐来说需要提供文件名称的base64编码
            方案1:使用工具类
            方案2:网上的方式(8成好使)
                new String(filename.getByte("gbk"),"iso8859-1");
    
    
    
    ///////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////
    
    上午回顾:
    response:
        操作响应行
            状态码
            常用方法:
                setStatus(int code)  针对的1xx 2xx 3xx
        操作响应头:
            setHeader(String key,String value):设置
            addHeader(String key,String value):添加
            
            常用的响应头:
                location:重定向:
                    response.sendRedirect("跳转路径");
                refresh:定时刷新
                    response.setHeader("refresh","秒数;url=路径");//java
                    meta标签//html代码
                content-type:设置文件的mimeType,及设置响应流的编码并且通知浏览器用什么编码打开
                    response.setContentType("text/html;charset=utf-8");
                content-disposition:设置文件下载
                    response.setHeader("content-disposition","attachment;filename="+文件名称);
        操作响应体
            getWriter():
            getOutputStream():
            注意:俩流互斥,服务器帮我们关闭此流
        响应的中文乱码:
            response.setContentType("text/html;charset=utf-8");
    ////////////////////////////////
    文件下载:
        1.超链接下载
        2.编码下载(两个头一个流)
            设置文件的mimetype
            设置下载头信息
            对拷流
        扩展:
            文件名称中文问题:
                方法1:
                    firefox :base64
                    其他:utf-8
                方法2:(八九成可以使用)
                    new String(filename.getBytes("gbk"),"iso8859-1");
    ////////////////////////////////
    request:请求 获取浏览器发送过来的数据
        操作请求行
            getMethod():请求方式
            getContextPath():获取项目名称
            getRemoteAddr():获取请求的ip地址
            
        操作请求头
            String getHeader(String key)
            常见的头信息:
                user-agent:获取浏览器内核
                referer:页面从那里跳转过来的
        操作请求参数
            String getParameter(String key):
            String[] getParameterValues(String key):
            Map<String ,String[]> getParameterMap();
            
        请求的中文乱码:
            对于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);
            request生命周期:
                一次请求
    ////////////////
    扩展:封装数据:
        apache的BeanUtils
            1.导入两个jar包
            2.调用 BeanUtils.populate(Object bean,map);
  • 相关阅读:
    百万级数据库优化方案
    MySQL架构及优化原理
    性能优化建议
    索引
    sql语句优化(持续更新)
    sql语句优化原理
    常用命令
    常见问题
    三、范围和生命周期
    【UVa】[11582]Colossal Fibonacci Numbers!
  • 原文地址:https://www.cnblogs.com/chenyanlong/p/9972270.html
Copyright © 2011-2022 走看看