黑马程序员技术交流社区

标题: 【石家庄校区】JDBC到JavaWeb学习笔记 [打印本页]

作者: syc123    时间: 2018-2-4 15:14
标题: 【石家庄校区】JDBC到JavaWeb学习笔记
          JDBC到JavaWeb学习笔记

JDBC篇        
                 为什么装饰者设计模式要实现相同的接口????
                     答:  保证被装饰对象全部功能
                         
        还有一个设计模式通常和装饰者一起使用,  适配器设计模式
                     为了解决,超多的方法重写而存在的!!!!!


         MYSQL:
                        * 数据库的概述:指的是一个文件系统,这个文件系统通过SQL访问.
                        * 关系型数据库:数据库中存放的是实体之间的关系.
                        * 常见的关系型数据库:MYSQL,Oracle,DB2,SQLServer,SQLite,SyBase


                SQL的分类:
                * DDL:数据定义语言.create,alter,drop...
                * DML:数据操纵语言.update,insert,delete
                * DCL:数据控制语言.grant,if,...
                * DQL:数据查询语言.select
         
        SQL对数据库中表的记录的操作:
                        * update,insert,delete
                        * Select ... From ... Where ... Group by ... Having ... Order by ...;
            SQL的多表设计:
                        * 一对多:在多的一方创建外键执向一的一方的主键.
                        * 多对多:创建中间表,至少两个字段作为外键执向多对多双方的主键.
                        * 一对一:唯一外键对应,主键对应.
                SQL的多表的查询:
                        * 连接查询:
                                * 交叉连接:
                                * 内连接:
                                        * 显式内连接:inner join
                                        * 隐式内连接:
                                * 外连接
                                        * 左外连接:left outer join
                                        * 右外连接:right outer join
         
            【JDBC的概述】
                ?        JDBC:Java DataBase Connectivity Java数据库的连接.
                * 是SUN公司统一提供的一套接口规范(JDBC).各个数据库生产商提供实现.
                ?        驱动:两个硬件设备之间通信的桥梁.
                【JDBC的开发步骤】
                ?        注册驱动:
                ?        获得连接:
                ?        获得执行SQL语句对象:
                ?        释放资源:


         * 增强一个Java类中的某个方法有几种方式???
    * 一种方式:继承的方式.
        * 能够控制这个类的构造的时候,才可以使用继承.


    * 二种方式:装饰者模式方式.
        * 包装对象和被包装的对象都要实现相同的接口.
        * 包装的对象中需要获得到被包装对象的引用.
        ***** 缺点:如果接口的方法比较多,增强其中的某个方法.其他的功能的方法需要原有调用.


    * 三种方式:动态代理的方式.
        * 被增强的对象实现接口就可以.


                为什么装饰者设计模式要实现相同的接口????
                     答:  保证被装饰对象全部功能
                         
        还有一个设计模式通常和装饰者一起使用,  适配器设计模式
                     为了解决,超多的方法重写而存在的!!!!!
                         
                         
                       
0.封装DButils小框架的的原理:获取元数据 设置参数 ()增删改)


        1.每次进行JDBC的增删改查的操作的时候,有很多的代码相似,可以抽取工具类,完成一些通用性的代码


        2.SQL和设置参数不一样
                把一样的用参数形式传进来




        3.【JDBC的元数据MetaData】(了解)-- 编写通用性较高的代码.
                1.数据库元数据
                        DatabaseMetaData:可以获取数据库的信息,获得数据库表的信息
                        * 获得数据库元数据:Connection中getMetaData();
                2.参数元数据:?
                        ParameterMetaData:获得SQL中的参数的个数及类型.
                        * 获得参数元数据:PreparedStatement中getParameterMetaData()
                3.结果集元数据:
                        ?ResultSetMetaData:获得结果集中的列名及列的类型.
                        * 获得结果集元数据:ResultSet中getMetadata()  获得字段名称以及类型
       
               




1.使用XML作为配置文件的方式完成模拟Tomcat


        0.需求
                现在有一套页面,这套页面想被其他人访问到.端口号可以进行修改的-(不修改源码的基础上).


        Java基础的网络编程

        1.XML  允许用户自定义标签的(可扩展的标记语言)
                作用:传输(json)和存储数据(数据库)  作为框架的配置文件
         
        2.XML使用语法:
                * XML必须有关闭标签
                * 区分大小写
                * 属性需要有引号  
                * 标签必须正确嵌套.


        3.XML的文档声明
                * 文档声明:通常出现在XML的第一行第一列的位置!!!
                * 写法:
                             * <?xml 属性名=”属性值” 属性名=”属性值” ...?>
                          * version        :必须的. 使用”1.0”
      *** encoding        :字符集. 是使用浏览器打开的时候采用的默认的字符集的编码.
                                * standalone        :描述XML文档是否需要依赖其他的文件.






3.XML的解析获得XML文档中的数据
        1.XML解析
                * DOM解析:DOM:Document Object Model.  文档对象模型
                * SAX解析:Simple Api for XML.


        (面试题)*区别:DOM将文档加载进内存,形成树形结构,然后进行解析
                                缺点:文档过大,导致内存溢出  优点:解析比较清晰,可以对XML进行增删改操作
                       SAX:事件驱动的方式,逐行进行解析;
                                缺点:不能对文档进行增删改操作   优点:文档特别大,不会导致内存溢出
          
  


        ?2.针对这两种解析的方式,不同的公司提供了不同的API的实现类.
                * JAXP                :SUN公司提供的一套XML的解析的API.
                * JDOM                :开源组织提供了一套XML的解析的API-jdom.
                * DOM4J                :开源组织提供了一套XML的解析的API-dom4j.  支持xpath需要导一个包在dom4j包下的lib夹下的1.1包,才能使用xpath的那两个方法
                * pull                :主要应用在Android手机端解析XML.




                ?XPath:
                        * dom4j支持XPath的jar包.
                            * jaxen-1.1-beta-6.jar
                        * dom4j的XPath支持的API:
                            * List document.selectNodes(String xPath);返回一个;list集合
                             * Node document.selectSingleNode(String xPath);返回一个节点






           3.DOM4J
                DOM4J的入门案例步骤:  在dom4j的使用手册中
                 * 【步骤一】导入jar包.dom4j-1.6.1.jar
                 * 【步骤二】创建解析器 SaxReader
                 * 【步骤三】解析文档获得代表文档的Document对象. —— SAXReader 的 read()方法获取Document。
                 * 【步骤四】获得跟节点.——通过Document对象的getRootElement()得到根节点
                 * 【步骤五】从跟节点下查找其他的节点. 使用根节点获取他下面的节点element() elements(“标签名称”)


                xpath入门案例步骤
                        导包
                        创建解析器
                       


        4 * XML的CDATA区:(CDATA:Character Data)
                * <![CDATA[  内容  ]]>


                pcdata 可以加特殊符号 可被解析


        6.xml约束《基本用不上,看懂就行》


                ?XML的约束的概述:
                        * 什么是XML的约束 :就是用来约束XML的文档中可以出现哪些标签,不能出现哪些标签,标签中是否有顺序,出现的次数.
                        * XML的约束  :用来规范XML的写法.


                        ***** XML的约束的种类及区别?(面试题)
                             * DTD 和 Schema
                                        * 区别:
                                             1.DTD语法是自成一体的.Schema语法就是XML的语法.
                                             2.Schema的语法就是XML的语法所以更容易被解析器所解析.
                                             3.Schema支持名称空间.
                                             4.Schema有比DTD更加强大的语义和语法的约束.
                                          5.在一个xml 中只能引入一个DTD,而能映入多个Schema


                Schema  


                        Schema约束的步骤:
                                1.引入W3C名称空间;标示这个文档是被约束文档
                                2.定义的元素或属性绑定一个名称空间
                                3.定义元素和属性
                                        *找找有多少个元素
                                        *区分元素是简单的还是复杂的
                                        *复杂需要确定是否有序,出现次数。。。
                        XML约束的步骤
                                4.引入W3C的实例文档的名称空间;标示这个文档的约束文档
                                5.引入的约束的文档的名称空间
                                6.引入约束文档的位置
                                7.编写XML文档


         xml的作用:
                 传输和存储数据
                  软件的配置文件
                  
                 xml的语法
                     xml的文档声明   xml的第一行第一列
                         
?        XML的约束的额概述:
                        * 什么是XML的约束        :就是用来约束XML的文档中可以出现哪些标签,不能出现哪些标签,标签中是否有顺序,出现的次数.
                        * XML的约束                        :用来规范XML的写法.
                        ***** XML的约束的种类及区别?
     * DTD 和 Schema        :
         * 区别:
             1.DTD语法是自成一体的.Schema语法就是XML的语法.
             2.Schema的语法就是XML的语法所以更容易被解析器所解析.
             3.Schema支持名称空间.
             4.Schema有比DTD更加强大的语义和语法的约束.
                                                                                                                                             
         
    1.Tomcat
        1.安装Tomcat
        --1.JAVA_HOME要配置正确
        --2.端口号冲突的问题要自己会解决---->去conf-->server.xml去找Connectioner的标签里面去修改
        2.要会在Tomcat中发布自己的项目
        --1.直接拷贝
        --2.在conf--->server.xml中找Host--->Context的标签--->重要的两个属性-->(path(虚拟路径),docBase(实际路径))
        --3.在conf--->引擎文件夹中---主机文件夹中---->创建以.xml结尾的文件(xml的文件名是虚拟路径)--->Context的标签-->一个重要的属性docBase
2.STS关联Tomcat
        如何关联????
                window-->prefer--->server--->runtime--->add--->apache7.0--->关联本地tomcat路径
                server--->new Server--->apache7.0--->open---将默认的项目发送地址给成webapps
       
        【HTTP协议的详解】
?        请求部分
* 请求行
    * 提交方式:
        * 提交方式有很多,常用的GET和POST:
        * GET和POST的区别:
            * GET的提交的参数会显示到地址栏上,而POST不显示.
            * GET往往是有大小限制的,而POST没有大小的限制.
            * GET没有请求体,而POST有请求体.
    * 提交路径:
    * 协议版本:
* 请求头
    * 都是键值对的形式显示的.一般一个key对应一个value,也有个别的是一个key对应多个value.
    * User-Agent                                :代表浏览器的类型. --- 文件下载:下载中文文件:IE使用URLEncodor进行编码,而Firefox使用Base64编码.
    * Referer                                :代表的是网页的来源. --- 防盗链.
    * If-Modified-Since                :通常与响应中的头Last-Modified一起使用查找本地缓存.
* 请求体
    * 就是POST提交方式的提交的参数.
?        响应部分
* 响应行:
    * 协议版本
    * 状态码                :
        * 200        :成功
        * 302        :重定向
        * 304        :查找本地缓存
        * 404        :资源不存在
        * 500        :服务器内部错误
    * 状态码描述
* 响应头:键值对,一般一个key对应一个value,也有一个key对应多个value.
    * Last-Modified                        :与请求中的If-Modified-Since一起使用查找本地缓存.
    * Content-Dispostion        :文件下载的使用使用的一个头信息.
    * Location                                :重定向的跳转的路径.
    * Refresh                                :定时刷新/定时跳转.
* 响应体:显示浏览器的页面的内容.
       
       
3.Http协议
        1.0(已经淘汰了)
        1.1这个不是立马断开连接
       
        请求:
                1.请求行
                        1.请求方式(get和post)
                        2.请求资源路径
                        3.协议的版本
                       
                2.请求头(消息报头)
                        User-agent--->用来解决浏览器版本不一致的问题
                        Referer--->防盗链
                        if-modify-since-->查找本地缓存
                3.请求体(get方式没有请求体)
        响应:
                1.响应行
                        1.协议版本
                        2.状态码
                                200(成功)
                                302(重定向)
                                304(请求本地缓存)
                                404(请求的资源找不到)
                                500(服务器内部错误)
                        3.状态码描述
                2.响应头
                        last-modify:查缓存
                        Location--->专门用来重定向用的
                        Content-disposition--->专门用来下载用的--->让浏览器以下载的方式打开文件
                        Refresh--->页面定时跳转用的
                3.响应体
4.Servlet
        用什么用?
                运行在服务端的小程序
        作用:
                用来接受请求,处理请求的
        使用方式:
                1.定义一个类实现 servlet的接口
                2.用去web.xml中配置虚拟路径
                        Servlet
                        Servlet-mapping
        Servlet将请求封装成了ServletRequest对象,将响应封装成了ServletResponse对象
        ServletRequest这个对象可以接受浏览器传来的数据
                getParameter...这一类方式
        乱码问题:
                我们解决post的乱码
                        request.setCharaterEnconding("UTF-8");--->专门设置请求体中编码,如果不设置默认编码是ISO8859-1的编码,               
                        get的方式不是这种解决方案
                       
        * String getParameter(String name);                ---用于接收一个名称对应一个值的数据.
        * String[] getParameterValues(String name);---用于接收一个名称对应多个值的数据.
        * Map getParameterMap();                                        ---用于接收表单中的所有的数据,Map的key是表单提交的参数名称,Map的value是提交参数的值.
               




1.Servlet
        什么是Servlet??
                运行在服务器端的小程序
        作用???
                用来处理用户的请求并作出响应
       
        定义方式:
                1.定义一个类去实现Servlet接口---->现在是定义一个类去继承 HttpServlet---->要求会模板创建就行了
                2.以前需要去web.xml自己手动配置, 现在不需要--->要求大家能够配置


        Servlet的声明周期
                1.什么时候创建????
                        第一个人访问Servlet的时候,服务会创建Servlet对象,而且是单例的;并且创建的时候 init(只有第一次执行)方法执行,
                        所有的访问service方法会执行, 服务器关闭或者项目被移除Servlet销毁并且destroy的方法会执行
        注意事项:
                1.url-pattern虚拟路径的编写???
                        1.完全路径          例如:/DemoServlet
                        2.目录匹配          例如:/aaa/*
                        3.后缀名匹配:         例如  *.txt
                        完全路径 >目录匹配>后缀名匹配
                2.编写的a的访问路径或者是form的访问路径的问题
                        相对路径和绝对路径:  不能以/开头
                        建议以后都使用绝对路径 ;  例如 /项目名称/资源目录
2.案例--->服务器定时跳转
        1.设置响应头
                响应头属性名:Refresh   响应头属性值 "秒数;url=要跳转的绝对路径"
        2.可以调用JS中Location对象中href属性;
        3.在页面添加meta的标签
                <meta http-equiv="Refresh" content="3;url=/day12/WEB01/index.html">
        4.重定向:
                需要设置响应码 302
                需要设置一个头 Location的头 --- 值是要跳转的绝对路径


3.ServletContext
                是一个域对象:
                ServletContext的生命周期
                出生: 服务器启动的时候为每一个web工程创建单独的一个ServletContext的域对象有且仅有一个,这个被整个工程所共享
                死亡: 服务器关闭或者项目被移除
        作用:
                1.获取全局参数
                2.获取文件mime类型
                3.存储全局变量
                        setAttribute  , getAttribute  , removeAttribute
                4.读取web下的文件
                        getResouceAsStream("服务器路径(不加工程名)")
               
1.2.4.1        Servlet的生命周期:(*****)
?        生命周期:就是一个对象从创建到销毁的过程.
?        Servlet生命周期:Servlet从创建到销毁的过程.
* 何时创建:用户第一次访问Servlet创建Servlet的实例
* 何时销毁:当项目从服务器中移除的时候,或者关闭服务器的时候.
?        用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中init方法就会执行.
任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法.在service方法内部根据请求的
方式的不同调用doXXX的方法.(get请求调用doGet,post请求调用doPost).当Servlet中服务器中移除掉,
或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行.




2.1        注解概述
        什么是注解:Annotation注解,是一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、
        接口、枚举是在同一个层次
       
        对比注释:注释是给开发人员阅读的,注解是给计算机提供相应信息的。
        注解的作用:
                1.        编译检查:通过代码里标识注解,让编译器能够实现基本的编译检查。例如:@Override
                2.        代码分析:通过代码里标识注解,对代码进行分析,从而达到取代xml目的。
                3.        编写文档:通过代码里标识注解,辅助生成帮助文档对应的内容
2.2        JDK常见注解
        2.2.1        常见注解
                @Deprecated 表示被修饰的方法已经过时。过时的方法不建议使用,但仍可以使用。
                                一般被标记位过时的方法都存在不同的缺陷:1安全问题;2新的API取代
                @Override  JDK5.0表示复写父类的方法;jdk6.0 还可以表示实现接口的方法
                @SuppressWarnings 表示抑制警告,被修饰的类或方法如果存在编译警告,将被编译器忽略
                        deprecation ,或略过时
                        rawtypes ,忽略类型安全
                        unused , 忽略不使用
                        unchecked ,忽略安全检查
                        null,忽略空指针
                        all,忽略所有
2.3        自定义注解
        自定义注解--定义与使用


        定义注解使用关键字: @interface
        定义类: class
        定义接口:interface
        定义枚举:enum
       
        定义属性步骤
        1
        注解中属性定义的格式:修饰符  返回值类型  属性名()  [default 默认值]
        其中修饰符:默认值 public abstract ,且只能是public abstract。
        2
        其中返回值类型:基本类型、字符串String、Class、注解、枚举,以及以上类型的一维数组
        3.
        其中属性名:自定义
        4.       
        其中default 默认值:可以省略
       
       
2.4        注解使用的注意事项:
        1.        注解可以没有属性,如果有属性需要使用小括号括住。例如:@MyAnno1 或 @MyAnno1()
        2.        属性格式:属性名=属性值,多个属性使用逗号分隔。例如:@MyAnno2(username="rose")
        3.        如果属性名为value,且当前只有一个属性,value可以省略。
        4.        如果使用多个属性时,k的名称为value不能省略
        5.        如果属性类型为数组,设置内容格式为:{ 1,2,3 }。例如:arrs = {"itcast","itheima"}
        6.        如果属性类型为数组,值只有一个{} 可以省略的。例如:arrs = "itcast"
        7.        一个对象上,注解只能使用一次,不能重复使用。
2.5
        自定义注解--解析和元注解
        解析
        如果给类、方法等添加注解,如果需要获得注解上设置的数据,那么我们就必须对注解进行解析,
        JDK提供java.lang.reflect.AnnotatedElement接口允许在运行时通过反射获得注解。
       
       
        常用方法:(都是从字节码调用这些方法)
                boolean isAnnotationPresent(Class annotationClass) 当前对象是否有注解
                T getAnnotation(Class<T> annotationClass) 获得当前对象上指定的注解
                Annotation[] getAnnotations() 获得当前对象及其从父类上继承的,所有的注解
                Annotation[] getDeclaredAnnotations() 获得当前对象上所有的注解
        有了这些还是不够因为,我们发现注解的东西即使通过字节码也不能获取,因为注解有自己的作用范围
        如何去调整注解的作用范围呢???,那么就需要JDK提供的元注解来控制我们的自己写的注解
2.6
        元注解:用于修饰注解的注解。(用于修饰自定义注解的JDK提供的注解)
                JDK提供4种元注解:
                @Retention 用于确定被修饰的自定义注解生命周期
                        RetentionPolicy.SOURCE 被修饰的注解只能存在源码中,字节码class没有。用途:提供给编译器使用。
                        RetentionPolicy.CLASS 被修饰的注解只能存在源码和字节码中,运行时内存中没有。用途:JVM java虚拟机使用
                        RetentionPolicy.RUNTIME 被修饰的注解存在源码、字节码、内存(运行时)。用途:取代xml配置
                @Target 用于确定被修饰的自定义注解 使用位置
                        ElementType.TYPE 修饰 类、接口
                        ElementType.CONSTRUCTOR  修饰构造
                        ElementType.METHOD 修饰方法
                        ElementType.FIELD 修饰字段
                @Documented 使用javaDoc生成 api文档时,是否包含此注解 (了解)
                @Inherited 如果父类使用被修饰的注解,子类是否继承。(了解)




               
               
               
request&response篇


  【Response的概述】
?        Response:代表响应的对象.从服务器向浏览器输出内容.
       
        【文件下载的方式】
        ?        一种:超链接下载.直接将文件的路径写到超链接的href中.---前提:文件类型,浏览器不支持.
        ?        二种:手动编写代码的方式完成文件的下载.
                * 设置两个头和一个流:
                * Content-Type                        :文件的MIME的类型.
                * Content-Disposition        :以下载的形式打开文件.
                * InputStream                        :文件的输入流.


        response输出响应内容的方法:
        向页面响应的方法:
        * getOutputStream();
        * getWriter();


        * 这两个方法是互斥的.
                * 做出响应的时候只能使用其中的一种流响应.


        * 输出中文乱码的处理:
                * 字节流:
                        * 设置浏览器默认打开的编码:
                                * resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
                        * 设置中文字节取出的时候编码.
                                * “中文”.getBytes(“UTF-8”);
                * 字符流:
                        * 设置浏览器打开的时候的编码
                                * resposne.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
                        * 设置response的缓冲区的编码
                                * response.setCharacterEncoding(“UTF-8”);


                        ***** 简化的写法:response.setContentType(“text/html;charset=UTF-8”);


                       
        处理request接收参数的中文乱码的问题:
        现在无论是GET还是POST提交中文的时候,都会出现乱码的问题.
        解决:
        ?        POST的解决方案:
        * POST的参数在请求体中,直接到达后台的Servlet.数据封装到Servlet中的request中.request也有一个缓冲区.request的缓冲区也是ISO-8859-1编码.
        * 设置request的缓冲区的编码:
                * request.setCharacterEncoding(“UTF-8”);  --- 一定要在接收参数之前设置编码就OK.
        ?        GET的解决方案:
        * 1.修改tomcat的字符集的编码.(不推荐)
        * 2.使用URLEncoder和URLDecoder进行编码和解码的操作.
        * 3.使用String的构造方法:
       
                       
        Request作为域对象存取数据:
        使用request对象存取数据:
        * setAttribute(String name,String value);
        * Object getAttribute(String name);


        request的作用范围:
        * 作用范围就是一次请求的范围.
        * 创建和销毁:
                * 创建:客户端向服务器发送了一次请求以后,服务器就会创建一个request的对象.
                * 销毁:当服务器对这次请求作出了响应之后.


        1.4.4.3        重定向和转发的区别:(redirect和forward的区别)
        * 1.重定向的地址栏会发生变化,转发的地址栏不变.
        * 2.重定向两次请求两次响应,转发一次请求一次响应.
        * 3.重定向路径需要加工程名,转发的路径不需要加工程名.
        * 4.重定向可以跳转到任意网站,转发只能在服务器内部进行转发.




        Response
        * 通过response设置状态码:setStatus(int status);
        * 通过response设置响应头:setHeader(String name,String value);,setIntHeader(String name,int value),setDateHeader(String name,long date);
        * 通过response设置响应体:getOutputStream(),getWriter();
        * response的其他的API:
                 * sendRedirect(String path);
        * response输出中文的乱码问题:
                 * 字节流输出中文:
                         * 设置浏览器的字符集编码.   response.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
                         * 设置输出内容的字节数组的字符集编码.                “”.getBytes(“UTF-8”);
                 * 字符流输出中文:
                         * 设置浏览器字符集编码.                response.setHeader(“Content-Type”,”text/html;charset=UTF-8”);
                         * 设置response的缓冲区的编码.                response.setCharacterEncoding(“UTF-8”);
        * response完成了文件下载功能:


        Request
        * 使用request获得客户机的信息. getRemoteAddr(),getMethod(),getRequestURI(),getRequestURL()
        * 获得请求参数:getParameter(),getParameterValues(),getParameterMap()
        * 作为域对象存取数据:setAttribute(),getAttribute(),removeAttribute();
        * 接收参数的中文乱码的处理:
                * GET        :new String(“”.getBytes(“ISO-8859-1”),”UTF-8”)
                * POST        :request.setCharacterEncoding(“UTF-8”);
        * request何时创建和销毁的?
                * 创建:从客户端向服务器发送请求.那么服务器创建一个request对象.
                * 销毁:服务器为这次请求作出了响应之后,服务器就会销毁request对象.
                * 作用范围:一次请求.
        * 转发和重定向区别?
                * 转发是一次请求一次响应,重定向两次请求和两次响应.
                * 转发地址栏不变,重定向会变化.
                * 转发的路径不需要加工程名,重定向需要加工程名.
                * 转发只能在本网站内部,重定向可以定向到任何网站.


       
乱码问题
        浏览器向服务器携带中文?
        get方式
                get的参数都藏在请求行中,请求行中编码是固定ISO8859-1
                解决方案: 通过String的构造方式来解决  例如:  文件名是filename--->  new String(filename.getByte("ISO8859-1"),"UTF-8");
        post方式
                post的方式参数藏在请求体中,将请求体中的编码改成UTF-8就行了
                request.setCharacherEnconding("UTF-8");
               
服务器向浏览器输出中文的时候乱码解决???
        设置响应头
                响应头的编码是固定的ISO-8859-1,所有我们需要给浏览器能看懂的东西
                if(header.contains("Firefox")){
                        filename = base64EncodeFileName(filename);
                }else{
                        filename = URLEncoder.encode(filename, "UTF-8");
                }
                public static String base64EncodeFileName(String fileName) {
                        BASE64Encoder base64Encoder = new BASE64Encoder();
                        try {
                                return "=?UTF-8?B?"
                                                + new String(base64Encoder.encode(fileName
                                                                .getBytes("UTF-8"))) + "?=";
                        } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                                throw new RuntimeException(e);
                        }
                }
        设置响应体
                getOutputStream
                getWriter
                setContextType("text/html;charset=UTF-8")---> setHeader("Context-Type","text/html;charset=UTF-8 ")  setCharaterEnconding("UTF-8");
       
               
路径的编写
        1.浏览器端如果想直接访问Servlet的话
        路径的编写:使用:  /工程名/servlet的虚拟路径
2.浏览器如果想要直接访问.html.jsp或者其他静态资源
        路径的编写:使用: /工程名/资源所在的路径
3.servlet A想要跳转其他servlet B
        1.重定向
                路径的编写:使用: /工程名/B对应的虚拟路径
        2.请求转发
                路径的编写:使用: /B对应的虚拟路径
4.servlet A想要跳转到 .html或者.jsp
        1.重定向
                路径的编写:使用: /工程名/.jsp或者.html所在的子路径
        2.请求转发
                路径的编写:使用: /.jsp或者.html所在的子路径
5.servlet想要读取项目下文件
        1.需要用ServletContext的对象来读取
                1.ServletContext.getResouceAsStream("资源路径(不用再加工程名)")
                2.ServletContext.getRealPath("资源路径(不用再加工程名)")
       
       
       
Cookie
        什么是Cookie???
                是一种会话技术;
        能够做什么???
                能够存用户私有的数据
        怎么学好它??
                其实就是一个键值对的容器
                        添加
                                response.addCookie()来添加
                        删除
                                setPath("路径")
                                setMaxAge(0)
                        创建
                                new Cookie("键","值");
                        获取
                                request.getCookies();
JSP
        什么是jsp
                其实本质上就是一个Servlet
        能够干什么?
                能够嵌入java代码
                <%! %>//写到成员位置,用的不多,因为有线程安全问题
                <% %> //这个是在Service方法里面书写的代码
                <%=%> //相当于out.print(); 这里书写不准有分号       
       
       
        【会话技术】
?        什么是会话        :用户打开一个浏览器访问页面,访问网站的很多页面,访问完成后将浏览器关闭的过程称为是一次会话.
?        常见的会话技术:
* Cookie        :将数据保存到客户端浏览器.
* Session        :将数据保存到服务器端.
?        为什么使用会话技术?
* 私有的数据,购物信息数据保存在会话技术中.




【Cookie技术的使用】
?        向浏览器保存数据:
HttpServletResponse有一个方法:
* void addCookie(Cookie cookie);
?        获得浏览器带过来的Cookie:
HttpServletRequest有一个方法:
* Cookie[] getCookies();
?        创建一个Cookie对象:
* Cookie(String name,String value);
【JSP的简单概述】
?        什么是JSP        :Java Server Pages(Java服务器端页面).JSP = Java代码 + HTML的元素 + JSP内置东西
?        SUN公司为什么推出JSP动态网页开发技术:
* SUN公司推出的Servlet技术进行动态网页开发.发现Servlet自身有不足没有办法与ASP,PHP技术竞争.想在动态网页中输出表单.在Servlet中获得PrintWriter out = response.getWriter();
* out.println(“<form action=’’ method=’’>”);
* out.println(“</form>”);
* SUN又推出了动态的网页开发技术就是JSP.
?        JSP的执行过程:
* JSP会被翻译成Servlet,编译成class进行执行的.
?        JSP的嵌入Java代码:JSP的脚本元素
* <%!    %>                :翻译成类中的成员部分. 定义变量,定义方法,定义类.Servlet是线程不安全的,尽量少在类中定义成员属性!!
* <%     %>                :翻译成类的service方法内部的内容. 定义变量,定义类,直接写代码块.
* <%=    %>                :翻译成service方法内部的out.print();




?        Cookie的常用的API:
* getName();
* getValue();
* setDomain(String domain); -- 设置Cookie的有效域名. //  www.baidu.com  music.baidu.com
* setPath(String path); -- 设置Cookie的有效路径.
* setMaxAge(int maxAge); -- 设置Cookie的有效时间.


?        Cookie的分类有关:
* 会话级别的Cookie:默认的Cookie.关闭浏览器Cookie就会销毁.
* 持久级别的Cookie:可以设置Cookie的有效时间.那么关闭浏览器Cookie还会存在. 手动销毁持久性Cookie. setMaxAge(0)---前提是有效路径必须一致.


【Session的概述】
Cookie本身是有大小和个数的限制.Session没有限制.Cookie的数据保存在客户端,Session数据保存在服务器端.
?        Session的执行原理:基于Cookie的.
?        使用Session:
* 获得Session:
    * request.getSession();


        session何时创建和销毁?作用范围:
* 创建:服务器端第一次调用getSession()创建session.
* 销毁:三种情况销毁session:
    * 1.session过期. 默认过期时间为30分钟.
    * 2.非正常关闭服务器.如果正常关闭session序列化到硬盘.
    * 3.手动调用session.invalidate();
* 作用范围:多次请求.(一次会话)




jsp
        html + java + 内置对象 + 指令 + 动作标签
        java
                <% service方法内部 %><%! 成员位置 %><%= 输出语句,不能有分号 %>
        指令
                page
                        ContextType---->设置浏览器默认打开的编码
                        pageEnconding --->用来设置JSP生成servlet的保持时用的编码
                        import ---->用来导包的,可以出现多个,也不用我们担心
                include
                        能够将其他页面包含进来
                        file --->用的相对路径
                taglib--->明天讲
        内置对象
                request          HttpServletRequest
                        1.作为域对象 2.获取客户机相关的信息(请求方式,请求路径,请求的id地址,请求头,)
                session                                HttpSession
                        1.作为域对象--->会话技术
                                注意:需要使用一把钥匙才能打开session,这个钥匙其实就是Cookie这个cookie的名字是JSESSIONID
                application
                        1.获取全局参数 2.获取mime类型 3.作为全局域对象  4. 读取web的资源文件
                pageContext
                        1.获取其他八个内置对象
                        2.可以向四个域中存储东西
                                requestScope
                                sessionScope
                                applicationScope
                                pageScope
                        3.findAttribute --->从小范围开始找
                response
                        1.设置响应头
                        2.设置响应体
                        3.设置状态码
                page
                        了解一下,他代表的就是jsp生成Servlet的对象,他是单例的
                out
                        JSPWriter  和  response.getWriter()是有区别的
                        response.getWriter()才能正真的设置响应体
                       
                config
                exception
                        exception.printStackTrice();
        动作标签
                用来简化我们的书写
                        <jsp:forword>用于转发
                        <jsp:include>用于包含
                                静态包含和动态包含的区别
                                        :静态包含相当于复制原码(相当于多个jsp在同一个类中)
                                        :动态包含只要运行结果(多个jsp分别在不同类中)
                        <jsp:param name="" value="">
                                作用:一般和有路径结合使用
                                        携带参数
                        <jsp:useBean>
                        <jsp:setProperty>
                        <jsp:useProperty>
                       
       
       
1.el
        叫做表达式语言
       
        作用:简化jsp中有些代码
                1.获取四个域对象中的数据${ 属性名|变量名 }
                2.执行普通的运算(逻辑运算,关系运算,三元运算...)
                3.操作el中的对象
                        1.四个域  pageScope  requestScope sessionScope applicationScope
                        2.一对专门用来接受参数 param paramValues
                        3.获取请求头的一对: header  headerValues
                        3.获取全局参数:   initParam
                        4.获取cookie:     cookie.库克的名称
                        5.pageContext:    可以获取jsp中其他八个内置对象
                                获取工程名:  pageContext.request.contextPath
                               
                4调用java的代码,需要自定义标签库(目前先放一放)
2.jstl
        jsp standard tag lib
        标签库需要引入
                <%@ taglib uri ="地址"   prefix="缩写"%>
        核心标签库:
                1.0和1.1,1.2
                1.1,1.2是支持el表达式
               
                c:if 可以条件的筛选
                c:set(了解)
                c:out(了解一下)
                c:forEach
                        var --->遍历出的元素的变量名
                        items--->要遍历的对象
                        begin
                        end
                        step
                        varStatus


                       
        JSTL的标签库:包含了五类标签.
                * core(核心标签),fmt(国际化标签),xml(XML标签),sql(SQL标签),fn(JSTL提供EL函数库)
                ?        使用JSTL:
                * 引入JSTL的相关的jar包.
                * 在页面中引入标签库.<%@ taglib uri=”” prefix=””%


                               
        函数库
                就是处理字符串相关的东西
                ${ fn:split  }
                ${ fn:subString }







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2