初级Java学习笔记总结

java高并发解决方案:
    1.页面静态:静态访问消耗的资源少
            信息录入然后生成静态页面以供访问
    2.数据库集群和库表散列
            主-从数据库关系;将各个功能的表分类放到单个数据库中,减少访问压力;
        注意的是:使用同一的算法监视数据库的状态,将自动增长的字段去掉,id要使用同一的算法集中的分配,使用非持久性连接
    3.缓存
        基本的缓存,自带的MemoryCache
    4.均衡负载
        集群的均衡负载,通过算法,分配服务器的访问压力
    5.镜像
        电信网通的例子,在两个节点放置镜像,实时更新
    6.图文分离
        图片放到其他的服务器上,减轻访问压力    


    装饰设计模式:核心是在构造方法中传参! 静态代理
!!不要把事件和属性混淆 在事件触发时要用到属性 所以不能使用属性的改变来调用方法
!!使用this的时候要注意代码的执行顺序 比如 table.οnmοuseοver=function(){this.style.backgroundcolor="red"}
!!!如果使用frame框架的话,有时候会出现主页只能显示在一个frameset中,需要判断最外的地址栏和跳转地址栏是否相同,如果不同就赋值;
//将当前子窗口的地址赋值给window窗口
    if(top.location!=self.location){
        top.location=self.location
    }
    返回上次打开的页面:
    !!!!!!Eclipse 打不开的话修改配置文件参数为一半!!!!!!!!     mysql的跳过登录检测:mysqld下的skip-grant-tables;
    编码和解码都是以字节为单位的
    !!!!#接口是规范,软件是实现#
    异常之间如果需要转换的话(编译时异常转运行时异常),继承相应的类就好了
    序列化接口会因为版本不同导致读取出问题;
一     Html语言(不同浏览器对html语言的解析是不同的 标准一般是谷歌)
       Hyper text mark-up language  超文本语言
       标签  map标签的使用
             锚点的使用
             超链接的各种用法
       placeholder 提示"请输入用户名"
      默认值一般都是value,但文本表单的默认值直接在标签体中填写就好
         readonly 只读  数据会提交
         disabled 不可用 数据不会提交
             提交时 method=get 地址栏可以容纳的字符数目有限 1-2kb
             post提交时理论上无限制
二     CSS  Cascad style sheet 层叠样式表
     CSS  优先级  范围越小优先级越高
            display属性 inline-block 替代浮动
     一但使用position,对象就可以点出来上下左右四个属性可以设置多少px,直接确定位置;
三     JavaScript(初始化多个定时器 注意时间 定时器的参数(方法名 或者"方法名()"))
       组成  ECMAScript 提供核心语法
           BOM  浏览器
            DOM  具体文档对象
       JS中的数据类型
                   String 字符串类型 单双引号表示的都是字符串类型
               number  数字类型
               boolean 布尔类型
               undifined 未定义 已声明但是没有赋值
               null    引用类型的默认值  "NaN"==NaN false
            比较运算符 == 只比较值
             === 比较值和类型
       JS中的函数特点
        1.函数覆盖
          函数的参数不需要声明
          函数的调用和声明与参数没有关系
        2.参数按顺序传入args数组
       JS中二维数组的定义
          arr0=new Array()
          arr1=new Array()
         arr2=new Array()
         arr3=new Array()
         var arr=new Array(4)
       html一行一行的执行,一定要把大数组写在下面;
    !!window.confirm("");确认信息
    !!focus()方法     一般是通过ID获得对象来使用onfocus() (失去焦点和获得焦点和innerHTML的结合使用)  可以 通过JS中的双或  定义ID字符串 str=""|| "123";
        前面为空取字符串 前面不为空取前面;这个特性可以使得第一个报错的元素获得焦点
    !!避免方法重复过多,选择传参!!!!!!!
    !!在标签内传this参数是为了省去获取对象这一步骤,this指当前对象 谁调用就是谁 但是在script方法中因为调用者不确定所以不能写
    !!对象.属性 属性是字符串的都需要去掉单位才能计算;用parseInt()转化成number类型;
    !DOM对象的insertBefore方法   父节点对象.insertBefore(新节点,老节点);
       doument.forms[0].onsbumit       事件绑定的新方式
       JS的字符串转对象的方法:
       eval  将字符串转为对象 解析时有特殊的格式(前后必须加两个半个括号);
             将字符串转为可执行的脚本语言
============================================================================
!!jquery对象底层是只有一个js对象的数组(一切皆数组)
!!因为底层的数组结构 所以jQuery的方法不会被覆盖  长度length和size()都能用
!!script标签内 先加载jQuery页面加载函数不会被覆盖(页面加载函数可以都多个按顺序执行) 再加载js函数会被覆盖 window.onload只能有一次
!!js的onload在一个页面只能被赋值一次 而jQuery的ready可以多次使用(动态绑定 必须写页面加载)
!!jQuery中绑定事件没有on  方法中的参数如果被[]包裹 可以省略 没有的不行
        //加载事件 load  $(window).load();
!!style被css取代 传入键值对改变样式
!!选择器加冒号的(:)只有和表单有关有关的和基本的关键字 其他的不要用 切记!!
           基本类型
          层级选择器
          基本过滤选贼器
           基本属性选择器
          表单属性选择器
!!!this永远代表DOM对象 强制类型转换成JQuery对象 $(this) 回转用$(dom)[0]或者 $(dom).get(index)

        JQuery中的CSS语法  1.获取 对象.css("key")
                           2.设置 对象.css("key","value")
                           3.批量设置 链式操作
                  键值对数组类型 css({key:value,key:value})
                           4.css类 addClass("")  分离JQuery和CSS(就近原则使用)可以顺便给标签添加类型
        removeClass
        prop(key,value) 只能处理固有属性
        attr(key,value) 可以处理所有属性
        JS中的each循环  $.each(要遍历的对象,function(索引,值){});
        jQ中的remove()方法 移除自己
================================================================
        1.html和text在写入和获取时内容是相同的
        2.val(一个方法两个用途)(获取多个 打印第一个)
        3.append 向后
          prepend 向前
        4.jQuery的对象创建var s= $("标签"); 数组形式
        5.链式操作类似于java中的方法连续调用 明确对象和对象可以调用的方法即可;
        6.事件的转换 hover(css中鼠标移上效果关键词)(fn1,fn2)
                toggle(fn1,fn2,fn3)(1.83版本的)
        7.表单校验规则  注意事项:key:value,      使用的是name属性
                    1.类校验规则  class=要求;
                    2.属性校验规则 将校验类型自定义为属性
                    3.data校验规则 加data-rule-;
                    格式:data-rule-校验器名称="值"
                4.静态校验:记住格式;属性值都可替换为true和false;
            * 底层通过 $(ele).data("ruleRequired")获得数据
        8.自定义校验格式
                $.validator.addmethod(校验规则名称,校验方法,提示{0}信息{1})
                                 function(输入内容value,当前标签ele,规则参数params){}
                    行内样式的优先级要高一些
                    优先级:css(key.value)>对象.addClass
        9.查找
             children() 子元素
             closest    首先检查当前元素是否匹配,如果匹配则直接返回元素本身。如果不匹配则向上查找父元素,一层一层往上,直到找到匹配选择器的元素。如果什么都没找到则返回一个空的jQuery对象。
             parent     取得一个包含着所有匹配元素的唯一父元素的元素集合。
             siblings   所有同辈元素
             offsetParent() 作用于最近的父元素
             next() nextall() 后面
             prev() prevall() 前面
        10.id和方法名不能重复但是可以和name重复;

        11 jQuery不属于W3C规范,隐藏方法是hide,处理命名冲突的方法是noconflict 设置高度 对象.height(数值)
============================================================================
    感兴趣的API $.makeArray(obj);将对象数组转为数组(相同的标签)
              css的jQuery API taggleClass() 如果存在就删除不存在就添加
              $.data()可以存储数据 不过在上面是看不到的 用removedata()移除数据
              $.extend(fn1,fn2....);定义自己想要的方法直接用(逻辑写清楚);
              $.empty() 删除对象的子节点
              $.remove(可以加条件) 删除包含对象的元素(无参数)删除对象中条件元素(有参数)
                  删除之后绑定数据和事件都不能使用了
              $.detach() 与remove的唯一区别就是删除之后的绑定的数据和事件都可以使用
              $.clone() 克隆元素 后面有boolean参数 是决定是否复制事件(1个) 决定是否复制元素的事件函数和所有子元素
    四    易错点
        1.在条件判断是需要用= =!!!
        2.定义数组用  var arr=new Array(1,2,2,3);
        3.var flag;如果没有赋值的话,是未定义的,所以必须初始化;
        4.:even筛选偶数(0,2,4) 找的是奇数行(1,3,5) ;
        5.addClass这个jQ方法使用时 添加样式类时必须写在style标签里面;
        6.backgroundColor=======background-color  在JS中-是警号
        7.data-* 是html5 的自定义属性
            $.attr(data-*)
            $.data(*)获取属性
        8.在使用方法时要注意加不加后面的括号 不加的例子{settimeout(fn,1000),$.validator.addMethod(注意里面的参数)
        9.var x=1;  x=1;全局    10.在装箱时,如果数值在byte范围之内,那么数值相同,不会产生新的对象,也就是说多个数值相同的引用指向的是同一个对象。
        11.TreeSet集合排序有两种方式,Comparable和Comparator区别:
            1)让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法。
            2)让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将该类对象作为实际参数传递给TreeSet集合的构造函数。
                第二种方式较为灵活。
    bootstrap知识点:基于HTML CSS HE JAVASCRIPT
        1.引入顺序:先是bootstrap.min.css
          bootstrap-them.min.css
          jQuery 1.11.3版本最好
        2.栅格系统 响应式和流式布局
       行和列如果没有设置较大的值时采用小的 没有最小的默认12
      

       visible和hidden 只会在设置阶段生效
        3.本模块规则影响最大化 比如轮播图的计时器

mysql知识点:单双引号都行 一般用单引号|||||数据库添加的其实是字符串,数字类型可以省略引号
     判空方式 不能直接等于null  用is null 空字符串
            聚合函数不统计null
            exsit  比in 效率高
    java的内嵌式数据库db4o.
    Andrion SQlite 嵌入式数据库
    db2:分布式数据库
    数据库控制语言DCL:权限回收和赋予, grant和revoke;

数据库的定义语言DDL:定义数据库及表结构
    数据库操作
        常用命令:
            create database 数据库名字 character set 编码
            show databases
            select database
            use database
            show create databases
            drop database 数据库名称
        表操作:
        常用命令:create table 表名称{字段 类型 限制}
            show tables
            show create table
        !!!!!desc 表名; 查看当前表结构
            drop 表名
        修改表:
            修改表结构 alter table 表名 add 字段名 类型 约束
                   alter table 表名 modify 字段名 类型
                   alter table 表名 change 字段名 字段名2
                !!!!!alter table 表名 drop 字段名
                   rename table 表名 to 新表名
                   alter table 表名 character 字符集(不推荐)
数据库的操作语言DML:操作表里的数据
        插入数据 insert into 表名 values(value1,value2)
              insert into 表名(字段1,字段2) values(value1,value2)
        修改数据  update 表名 set 字段1=value
        删除数据  delete  from 表名
              delete和truncate的区别
                    删除方式 delete一条一条删除 不清空主键
                    truncate直接删除表重新建立一个新的表 全部初始化
                    事务方面 delete 删除的数据 如果在一个事物中可以找回
                    truncate 删除的数据不能找回(一般不用)
数据库的查询语言DML:查询表里的数据
    limit的用法 select * from 表名 limit m,n(表示从m+1条开始读取n条)
    in的用法 select* from 表名 where 字段名 in{}
    exist的用法 if(exists){执行的sql语句}
    order by a, b,c(desc是默认的升序排列)
mysql的多表查询
    alter table 从表 add [constraint] [外键名称] foreign key 从表的外键字段
    refrerences 主表主键名称
    从表添加数据规则:不能添加没有主键的元素
             添加元素时外键可以为空
             删除时先删除从表数据
    主表数据可以随意添加,删除时只有在从表中此主键不被引用时为空的时候才能删除
    1.内连接
    普通的 select * from 表1 inner join 表2 on 主外键关系
          隐式   select * from 表1,表2 where 主外键关系
    内连接产生的效果是一样的,找到的是两个表的交集  顺序无所谓
    自连接其实就是内连接的改变,一般运用子查询的方式
    2.外链接
    左连接 select * from 表1 left outer join 表2 on 主外键关系

          右连接 select * from 表1 right outer join 表2 on 主外键关系
        外链接产生的效果不一定一样
      左连接和右连接的关系
    左连接以左表为主,把左表所有的数据全部查询出来,拼上右表的数据,找不到显示null


    一对一的创建原则 :创建外键(从表的主键)指向主表主键,必须在外键加上unique约束
    一对多建表原则:创建外键指向主表主键
    多对对建表原则:新建一张表至少有两个字段 指向至少两个表的主键

    外键的作用是保证数据的完整性
    外键的删除:删除命名过的外键    alter table 表名 drop 外键名
JDBCUtils 工具类中读取配置文件获取流的方法:ResourceBundle rb =ResourceBundle.getBundle("文件名")  文件名没有后缀
    Dbutils工具类只是提供一个QueryRunner的核心类可以自行通过连接获取与处理对象 并不是提供了连接
    DBCP连接池 利用工厂模式去搞一个数据源 类似于线程池的工厂方法
    C3P0连接池 提供数据源和额外获取单连接的方法()
This关键字的使用:在类的继承和接口的实现中 编译看左边运行看右边 父类方法中的this在编译时代表的是父类 在运行时代表的是子类 也就是new谁 this代表谁
              在构造方法中调用其他构造函数
数据库的控制语言DCL:权限的控制
子查询的概念:一条select语句的结果作为另一条select语句的一部分(条件,表,字段)

 
字段类型:int double datetime timestrap decimal
重点: select name,key,case when 条件 then 算法
                          when 条件 then 算法
                          else 算法 end
                          from 表名
show variables like '%char%' 显示当前编码
set names 编码 修改当前窗口
Junit不能测试静态方法,对语言的要求更加严格,必须符合命名规则;
所有的类中都加上构造方法!(会碰到类无法创建的异常,就找构造方法)
12.25    xml:
        schema约束:明确跟标签.xml可以引入很多约束文档
        名称必须全球唯一,一般使用公司域名+公司内部唯一;
        Xpath:获取单个的时候 是第一个符合条件的节点,直接返回
反射:动态语言的定义:在程序运行时,允许改变程序的结构和变量类型,即动态
    语言;
    动态语言:Perl,Python,Ruby;
    静态语言:C++,Java,C#
        Java的反射机制
    反射机制在使用无参构造的时候,可以直接用Class对象实例化,不需
要再获得无参构造方法;
    装箱和拆箱发生在编译阶段,反射机制是在运行时获取class对象,解
剖类
xml:用户可以自定义标签;
    xml文档声明:必须出现在文档的第一行
    
    version:必须有;使用1.0
    encoding:字符集  浏览器打开默认字符集默认utf-8
    standalone:描述文档是否需要依赖其他的文件
    xml的注释:和html一样的格式
    xml的语法:有且只有一个根节点,比html更严格
    xml元素的定义:不能和xml重复 不能使用数字开头 不能包含空格 不能包含冒号(:)
    xml的属性:命名规范和元素相同; 属性值需要引号包裹
    xml的特殊字符:会跟基本语法冲突,要转义
    CDATA区:所有内容都会成为普通文本解析
xml的解析:针对这两种解析方式,不同的公司提供了不同的技术
        JAXP:sun公司提供的套XML的解析的API
        JDOM:开原组织提供了一套XML的API-jdom
        DOM4J:开原组织提供的一套XML解析的API-DOM4J,拉过来一
条,不是自己想要的就放弃;
        SAX:一条一条的解析,
        pull:主要应用在Andrion手机端;

xml的解析方式:DOM解析:Dcument Object Model:将文档加载到内存形成

一个二叉树,当然会有节点,然后就能根据节点获得文本
缺点: 文档特别大的话 会很耗内存,容易导致内存的溢出
优点:解析很清晰,可以对XML进行增删改查;
             SAX解析:Simple for XML:事件驱动的方式进行逐行解析:
缺点:只能做查询
优点:不会导致内存的溢出
///各种类型的集合都是有迭代器的

DOM4J支持Xpath解析方式
使用Xpath解析的话 只能使用两个常用方法:Document.selectNodes(String

Xpath);参数是元素
                      document.selectSingleNode

(String Xpath);参数是元素

xml的约束:规范xml的写法
    xml约束的种类和级别:
        DTD和Schema
            区别:
             1.DTD语法是自成一体的,Schema语法就是xml语法
            2.Schema更容易被解析器解析,支持名称空间,DTD
不支持;
            3.Schema有比DTD更加强大的语义和语法的约束;

了解DTD:
    引入方式:内部和外部两种类似于js的引入 外部可以引入网络的规范
    内部格式:
    外部的:本地:
           网络:
    Schema的引入:1.明确跟标签
                2.导入xmlns指向xsd文件的targetnamespace 命名空间(开辟空间的名称) 找第一个(可能不止一个约束)
                3.固定值 找第四个
                4.找第三个 名称和位置
Schema的名称空间是什么? 区分标签名的约束来自哪个约束文件  类似于jar包

HTTP HyperText Transfer Potocol 超文本传输语言
特点
基于请求/响应模式的协议,请求和响应必须成对;现有请求后有响应
Http协议的默认端口号是80;
版本
HTTP/1.0 发送请求,创建一次连接,获得一个web资源 连接断开
HTTP/1.1 发送请求,创建一次连接,获得多个web资源 连接断开
组成
请求协议:请求行-请求头-(空行)请求体(一般只有post会使用)
协议:响应行-响应头-(空行)响应体

请求:
常见的请求头:Referer 浏览器通知服务器当前请求来自何处
         if-Modified-Since
         Cookie  与会话技术有关,存放浏览器缓存的cookie信息
         user-agent 可以获得访问系统信息
常见的响应头:Location
         Content-Type  响应正文的类型
         Content-Disposition 通过浏览器以下载的方式解析正文 取值是可下载文件类型
         Set-Cookie 与会话技术相关,服务器向浏览器写入cookie
响应行的状态码:
    1xx
    2xx
    3xx:本次访问未结束,请继续操作
        302:服务器无法处理返回302,紧接着会给一个location地址
        304:读取缓存,服务器通知浏览器,浏览器已经有缓存,直接显示即可,此时响应协议没有响应体
    4xx:404 错误页面,无法找到,无法找到资源
    5xx:500:服务器程序错误;

netstat -ano 查看正在运行程序的端口号
tomcat服务器工作空间下的配置文件如果不存在,会自动遵循服务器配置文件

浏览器发送请求到服务器,服务器处理数据然后响应浏览器 是一个浏览器和服务器的交互过程,要清楚服务器的功能和浏览器的功能(html解析器),
    交互的过程中必须清楚两个对象之间的联系和各自的功能可以很好的利用
    在html中 这个标签可以模拟http的响应头,直接向浏览器写一个meta标签 也是666

####response笔记:
    处理编码:
        setCharacterEncoding 设置请求或者响应使用的码表(仅仅对post提交方式有用)只对请求体有效 get方式的数据在头中 所以没有
        response.setContentType("text/html;charset=utf-8");
        response.setHeader("context-type","text/html;charset=utf-8")
        通过构造方法编码解码  终端以什么解码就先以什么编码,http协议使用的是iso-8859-1的编码
        IE浏览器默认编码和操作系统是一样的(内核),与其他浏览器使用的使url编码
        火狐浏览器是base64编码(内核)
    ServletContext 项目上下文根对象,整个项目只有一个
        设置全局参数 整体修改比如编码
    配置文件写错的话 服务器会直接抛运行时异常,报错的
    ServletContext几个获取流和路径的方法 除了getResourcePaths 填的是本路径之外 其他的都是到项目根目录下的相对路径
Servlet的生命周期 :一个接口 Servlet
         两个实现类:GenericServlet
                    HttpServlet
         接口是定义规范
        GenericServlet实现了init(有参数)
        1.给config初始化
        2.调用无参数的init()
        结论:复写初始化方法时,应该复写无参的(让父类去执行有参的,然后调用子类的无参的方法),如果复写有参的 需要调用父类中的有参的init()
=======================================================================================================
        HttpServlet
        1.将ServletRequest 和ServletResponse强转成和协议相关的参数
        2.调用自己写的service 调用getmethod()方法 获得请求方式,然后根据获得的请求方式调用请求方式的方法.
        3.发送消息体时,字符流和字节流不能同时使用,互相排斥,IllegalStateExpection异常
        print底层是write;
        println是源码换行(在响应体中);
        4.文件下载:中文,命名的文件需要进行URL编码
    
    !获取服务器路径
        !获取文件名
        !发送下载头
        !读写
        5.随机图片
        @BufferImage的类 中的getGraphics方法 返回一个Graphics对象
        @然后draw图 各种东西都可以写(看要求) 时刻记得抽取方法
        @imageio(之前见过的)要搞清楚各个类和接口的继承和实现关系 面向对象的多态思想!!!
        @度和弧度的转变    度*3.14/180=弧度  度数可以用随机数的任意值%目标数 这样就正负都有了;
        !!!!注意的是浏览器会缓存页面 设置Header不缓存任何数据
        // 禁止缓存
        // response.setHeader("Cache-Control", "no-cache");
        // response.setHeader("Pragma", "no-cache");
        // response.setDateHeader("Expires", -1);Expires控制浏览器缓存:注意是必须是当前的时间,
        ###刷新按钮的作用,将上一次的请求重新发送给服务器
        %%点击切换图片的时候,就算重新赋值地址的话,也会读取缓存,需要搞一个全新的地址!
        6.javaScript代码不执行 加一句"javascript:void(0)" ;
url编码知识:浏览器用来打包表单输入的格式;
        在cmd中默认支持的是GBK编码 代号是936 而utf-8编码的代号是 65001 通过chcp命令就可以更改编码,注意要设置字体;
重定向的知识:
    常用的重定向方式有三种:sendRedirect(相对根目录路径),可以在不同的项目内使用
        301 redirect:301代表永久性转移(Permanently move),是网页更改地址后对搜索引擎友好的最好方法,只要不
                     是暂时搬离,建议使用301;
        302 redirect:302代表暂时性转移(Temprorarily Moved),暂时性转移域名作弊,比如访问过的一些***,你懂得,地址栏发生变化
        meta fresh 网页的meta命令
跳转:request.getServletContext().getRequestDispatcher(跳转的消息).forward(response,request);
          然后将数据放入Context中由JSP取出,利用浏览器识别的语言,进行跳转;
         ###还有一个include()包含的方法  将一个网页的相同的部分封装;被封装的部分不能有全局架构标签
请求转发:一次请求和响应,共享数据,在本项目内跳转,地址栏不加项目名,地址栏不发生改变
重定向:两次请求和响应,不能共享数据,可以调到项目外,地址栏加项目名,发生改变
获得项目名:getContextPath()
request:
    url:统一资源定位符,精确到绝对路径
    uri:相对来路径;
    头以及其信息的获得:Enumeration 迭代器的前身;
    post方式提交:1.处理简单.  2.参数可以任意设置   3.数据相对安全
    编码和解码是相对来说的!一切都是相对来说的!
    禁用脚本调试,跳过脚本语言

请求:请求行:提交方式+地址+?健值对信息+协议版本
    请求头:健值对的信息 都有方法获取
    请求体:健值对信息(提交的信息) get提交方法没有这东西
响应:响应行:协议版本+状态码+状态码描述
    响应头:键值对信息
    响应体:服务器发送给浏览器的原文 记住在servlet文件中换行的是这个换行 并不是显示在浏览器的内容换行


Beanutils 里的方法 一个是封装populate(对象,map)   还有一个复制对象copyProperties(对象1,对象2);

或许有用:防盗链:referer(可以)
    1.首先获得referer的头
    2.然后判断头的符合条件(主要是判断referer的来源)
    3.response.sendRedirect("路径");
web开发地址问题:以"/"开头:给服务器用 代表当前Web页面
        给浏览器用 代表网站 下面会有多个web应用 在加上工程目录就好了
        有四个匹配规则:完全匹配 目录匹配 扩展名匹配//*.扩展名 缺省匹配
获取硬盘的时候用反斜杠\\ 服务器资源的话用斜杠/

会话:访问web资源到关浏览器完毕就是一个会话;连接的建立到关闭;
session是基于cookie的,标志通过cookie存在客户端,具体通过session内容存在服务器

cookie  客户端技术 数据存在客户端,安全问题,不合适存中文 (一般存ID等)
        构造方法(name,value);
在服务器和客户端之间通过头的键值对形式传递;
设置cookie的有效期 setMaxAge()如果没调这个方法,默认是浏览器进程的时间;
设置带着数据访问的路径;默认是发出cookie的那个目录;
Cookie的删除即覆盖,同名cookie 时间设为0;

session 服务器技术 数据存在服务器为用户开辟的session:同一段代码不同的数据(多线程问题),服务器压力大,作用范围是一次会话;
    request.getSession();创建和查找;找到就返回,找不到就是用在手的资源创建;
session的销毁方式:
    1.非正常关闭服务器
    2.默认30分钟;最后一次访问开始计时;
    3.session.invalidate()销毁;

Cookie:一个Cookie只能表示一种信息,至少含有一个标示该信息的name和value;
    每个浏览器最多存储300个Cookie,一个站点最多20个,一个Cookie的大小最大是4KB;
如果没有cookie存储sessionID的话 会用其他的技术去识别用户,比如URL重写,将sessionID拼接在浏览器的路径后面;
                                                             作为查询字符串附加在URL后面;
                                                             隐藏域 不多用!
Session存到服务器没有大小和个数的限制
cookie 搞一个数组 回写给浏览器
服务器所有的响应其实都是servlet响应的
单列和双列容器,检索数据需求使用双列容器
表单重复提交的问题:客户端和服务器端的防范;
随机数的数据摘要:可以做到随机统一;
UUID的静态方法UUID 随机字符串;
2.jsp声明语句
定义用<%!%>   翻译到成员位置
1.JSP Scriptlets
输出用<%%>     翻译到Service方法内部 相当于方法
3.JSp表达式
<%=%>中间插入的是表达式,不能插入语句,JSP表达式中不能有;
4.JSP注释格式
<%--内容--%>

JAVA注释  存在于java源码和JSP源码 不存在于html源码
html注释 JSP,JAVA,HTML源码中都存在
jsp注释 只存在于JSP源码中,其他的都不存在

指令严格区分大小写
JSP的page指令:pageencoding 指定当前页面的编码格式;
contentype 客户端浏览器根据该属性判断文档类型;
buffer JSP缓存大小 默认8KB;out可以马上输出;
autoFlush  是否自动刷新
errorPage 自动跳转的错误页面,相对路径
iserrorPage 指定是否为错误处理页面 是的话会内置异常对象
import 唯一一个可以多次声明的指令;中间用逗号隔开;
language 解释文本的语言
session 指明是否内置session对象 默认为true 自动导入四大常用包 lang servlet servlet/jsp  servlet/http

pagecontext include指令包含页面
<%@ include file="被包含文件的地址"%>  这个东西和request.ServletContext.getRequestDispatcher(被包含页面的路径).include();


常用的对象之out
在整个JSP页面加载完毕之后才会将缓冲区的内容写入页面,通过设置buffer的大小可以马上输出;

访问的JSP在服务器的work目录中没有对应的servlet,就找JSPServlet翻译

静态资源的访问: 先找动态资源,如果没有通过缺省路径找到阿帕奇提供的DefaultServlet中自动寻找静态资源然后通过java代码写到页面上

问题:
    1.无状态;http是无状态协议,原因是不会对上次访问进行记忆,如果再次访问,需要重新传输,因此数据量大对服务器的压力比较大,此缓存技术就产生了
    2.根据用户存储和根据cookie和session存储数据?
    3.注册时间什么时候用? 在使用BeanUtils封装对象的时候,起将时间格式化成字符串的作用
    <%@ taglib uri="标签库相对地址" perfix="前缀"%>
  -1-10
pageContext提供了管理所有域的方法
////////////////////////exception config request response session pagecontext out application page;
javaBean:
    
    这个标签和request.getSession一样 带着id去寻找 如果没有的话 会重新创建一个标签中可以写内容,但只有在bean实例化的时候才会执行;
    
    数据类型转换的时候要注意不是8大类型的数据转换
    所有的请求参数的值全部赋值 名称必须一致
    
    获取属性值
    
el隐藏错误,取不到显示的是空字符串不是null;
实际开发中null禁止向客户端输出;加判断,不输出;
浮点数只适合科学运算;
碰到不能编译的情况;考虑这个:刷新或者在工程中把需要的jar包放在lib下就好了 不要重复放在其他的文件夹下
JSP中取数据的时候用的都是反射技术;
el表达式:${} 取数据的时候通常用(.) 点不出来就用[] 里面的数字要加单引号;
MVC三层架构:开发步骤:javabean-dao-services-servlet-jsp;

el作用:
    1.取数据
    2.11个内置对象
    3.可以调用el函数库的函数
el取值:${name}
        ${name.["name(有特殊符号的)"]}
        如果按照${name.value(有特殊符号)} 取到的是0;
在表单提交过程中,文本框取不到值得话,得到的是空串(前提是name存在,不存在的是null), 其他的框取到的是(on);

JS的location对象的href页面跳转方法;客户端地址
如果没有向request中设置参数 尽量使用sendRedirect(客户端地址)

在页面定义的数据存放在page域中;

preparestatement  预处理对象   执行效率高 一次执行多个结构相同的数据;









  -1-11
数据库事务:事务的提交和内存数据库有什么关系?
        commit 事务结束;;
        rollback 事务不结束;
ThreadLocal:get(),set(),remove(),initialValue() 初始值!!
事务保存点:事务回滚到指定地点,只撤销部分操作;
            Savepoint sp=con.setSavepoint();
            con.rollback(sp);con.commit();
事务的特性:
    ACID:原子性-数据库中操作的最小单位
         一致性-事务的操作中数据是平衡的;
         隔离性-多个事务操作不会互相影响
         持久性-事务结束后的影响会永久保存在数据库中
事务的隔离:
read uncommitted
read committed  解决脏读      oracle的隔离级别
repeatable read  解决脏读和不可重复读  mysql的默认的隔离级别
seriazable  串行化 解决所有问题 效率很低
mysql支持四个事务隔离级别,orcle只支持前三个;

脏读:线程Y读到了其他线程未提交的数据
不可重复读:T线程读取到的数据被其他线程修改了
虚读幻读:T线程做了条件查询,其他线程做了满足该条件的插入或修改,导致T读取前后的数据的条数不一致;

联想到序列化流 对象实现序列化(将对象序列化到文件中 键值对 中间不能有空格)
批处理:
        ps.addBatch();
        ps.executeBatch();
StringBuilder的使用:有个吊用!!!
2.表查询和product的属性结合(内连接和外链接);
3.传参的时候要加引号;
4.JS中可以使用el;
5.只要是夺标查询,需要封装都要用map;
6.利用jQuery对象选中;
7.利用隐藏域传递需要的参数;
8.表单调用submit();
9.jQuery的循环看一下;
10.值对象封装散数据;  建在vo包下;
11.trim方法 字符串的方法 今天看一下微信上的Sring和StringBuffer;
12.数据类型的转换 封装的时候要注意!
13.数据的回显;
  -1-12
分页:
    物理分页:数据库层次上的分页,查询数据事分页
        优点:占用服务器内存资源少
        缺点:增加数据库和服务器的通信次数,增加可数据库查询的压力
    表中数据量大的时候选择
            格式:Mysql limit 关键字放在查询语句的最末尾
                    limit m,n; m是查询的起始索引下标
                                n是查询的数据条数
                    算法:起始索引=(当前页数-1)*一页有多少数据
                 Sqlserver top
                 Oracle:子查询三层嵌套rownum



    逻辑分页:把数据一次性查询到服务器内存中,在显示的时候写算法进行分页
        优点:只查询一次,减少通信次数
        缺点:java集合无法一次性保存过多的数据,常用内存
    数据量没有达到万级使用逻辑分页;


pageBean在service层生成!!
Count(*)  返回值是long型;
类型转换方法:想字符串就好了;
每次都全部按条件查询 然后封装到pageBean中
3.继承pageBean这个加泛型的类!
4.input和button的区别:
        input是Html服务器控件;
        button是web服务器控件 有其他的额外功能,不一定反映Html语法;
    两个东西一般是很难对其的,而且还会因为浏览器的版本不同产生不一样的效果;要对其的话要在外面套用其他行内标签,还有设置浮动之类的东西;

  -1-13
基本选择器  ID选择器 类选择器  层级选择器 属性选择器 表单属性(加:的那些)
checked  selected
同步发送:页面直接发送给服务器,在服务器响应返回之前,客户端处于卡死状态
异步发送:页面发送给浏览器内核ajax引擎再发送到服务器端,在服务器响应返回之前,客户端可以进行其他操作
Ajax:异步发送请求到服务器端;
        1.获得对象
        2.绑定监听(监听响应结果,监听服务器端的数据响应后主动给客户端的页面)
        3.指定请求地址
        4.发送请求

$.ajax({Type:"请求方式",
url:"请求路径",
data:{请求参数,键值对},
success:function(data){
    请求成功后(状态码是200)的回调函数
},
error:function(XMLHttpRequest,textStatus,errorThrown){
    XMLHttpRequet:AJAX的引擎,一般用不到
    textStatus:状态信息
    errorThrown:抛出的异常信息
 状态码为5XX或者4XX的回调函数;
}

})
$.get()
$.post()
为什么没有响应而data是一个空串?  有请求必定有响应吗?

eval()允许执行js代码; 第二个参数Unsafe是区分大小写的;
如果参数是值的话,返回的是值,如果参数是对象或者其他引用类型的话,返回的就是它的引用;
是不是所有的方法都可以重新赋值成变量,即改名???
jQuery的json格式的字符串必须使用双引号;
  -1-15
EasyUI:封装样式,和服务器进行数据交互;底层对Jquery的封装;
        1.静态方式:
                加class   easyui-组件名称
                使用data-option 设置键值对属性 类似于style的格式
        2.动态方式:
                使用Jquery获取对象,调用组件名称方法;
                $("#id").属性名称({
                    键值对属性;
                });
                 类似于validate的校验!!!!!!!!!
        3.三大元素:属性和事件可以写到一起(无关顺序);
            组件属性:
                静态和动态;
            组件事件:
                类似于属性;
            组件方法:
                对象.组件名称(方法名称,参数列表大括号内);
        fit属性 自适应父容器;
常用组件:
    dialog-------messager-----datagrid-----form----layout(整体布局)----tabs(content属性 和href属性)
    别的组件有没有href?
    toolbar属性:值是ID;
    formatter属性的三个参数:value代表当前字段的值的简单数据类型;
                            row代表当前行数据对象--串;
                            index代表当前行的索引;
    datagrid中的pagenations 分页工具;modal模态框;
    ZTree是jquery的插件;
    
    1.所有的显示数据的地方都可以异步加载;
    2.ztree的使用;
    文本框支持多行,框的大小支持自适应;
    load和reload方法;加载和重新加载都有参数;参数url代表的是服务器的资源地址,返回json数据,数据会和表单自动相对应
    表单数据回显:
时间的注册:
        时间的注册:
        创建时间转换器:类似于监听器
        DataConverter date new DataConverter();
        设置格式
        date.setPattern("时间格式");
        将转换器注册给需要时间转换的对象
        ConvertUtils.register(时间转换器对象,需要注册的对象的字节码文件);
  -1-16
javaEE包括13门规范:1.JDBC(java Database Connectivity) 数据库访问的统一途径
                   2.JDNI(java name adn directory interface) 被用于执行名字和目录服务,提供了一致的模型存取和操作企业级的资源如DNS何LDAP,本地文件系统或者应用服务器中的对象;
                   3.EJB(Enterprise JavaBean) JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序; 企业Bean是java的核心代码,分别是会话bean实体bean和驱动bean;
                   4.RMI(RemoteMethod Invoke) 使用序列化方式在客户端和服务器端传递数据,是一种被EJB使用的更底层的协议;
                   5.Java IDL(接口定义语言)/CORBA:公共对象请求代理结构(Common Object Request Breaker Architecture):将java与CORBA结合起来,被应用于新的应用和旧的系统结合起来;
                   6.JSP (Java Servlet Page) 可以写java代码(el和jstl)的Servlet页面
                   7.Servlet 小型的java程序;
                   8.XML(Extensible Markup Language) 共享数据 ,配置文件
                   9.JMS(Java message Service) 用于和面向消息的中间软件进行通信的应用程序接口,支持点对点的域和发布/订阅类型的域,还有:经过认可的消息传递,事务性消息传递,一致性消息和具有持久性的订阅者的支持.还提供新应用与旧系统集成的方式;
                   10.JTA(Java Transaction Architecture) 访问各种事务监控,主要应用于分布式;
                   11.JTS(Java Transaction Service) 是CORBA OTS事务监控的基本实现,规定了事务管理器的实现方式,该事务管理器是在高层支持Java Transaction API 规范,并在较底层实现OMG OTS specification 的java 映像;
                   12.Java Mail    提供了一套邮件服务器的抽象类,不仅支持SMTP服务器也支持IMAP服务器
                   13.JAF (JavaBean Actication Framework) JavaMail利用JAF来处理MIME编码的邮件附件,MEMI的字节流可以被转换为对象,或者转换自Java对象  (序列化   哈哈哈哈) 大多数应用是不需要直接使用的;



监听器:javaWeb中有8中监听器;

应用场景:javaSE GUI编程,Android手机开发 JAVEE的一些旁门需求
监听器术语:
            1.事件源:被监听的对象,目标的对象::::::::获取
            getServletContext()
            getResouce()
            2.监听器对象:用于监听事件源的对象;;;;;;;;;感觉是要创建导包获取?
            3.注册:将监听器对象注册给事件源,当事件源的状态改变时发生会执行监听器对象:类似于时间的注册
            4.事件:被监听对象的行为,会触发
            5.事件对象:怎么获得
            !!!!!!事件对象可以获取到事件源对象;
    结论:监听器专门用来处理事件源产生的事件;

监听器都是接口 方法两个:Initialized(ServletContextEvent sce)  监听器的初始化
                            初始化需要的数据,加载文件
                        Destoryed(ServletContextEvent sce)  监听器的销毁
sessionlistener session创建次数估计访问人数;
Bean的监听器在实现类的时候就已经注册了所以不需要再配置文件中注册,必须实现序列化接口否则会抛异常和监听器接口;
    Bean在session作用于的钝化:服务器正常关闭时将数据写入到文件;
                         活化:将指定文件加载到作用于;
钝化和活化运用于服务器的优化:  加缓存,分布式;
钝化和活化时机是由服务器配置的,可以通过手动设置改变,通过设置maxIdleSwap的分钟数;
指定钝化时间_在META-INF文件夹下创建Context.xml

 
 
 
 
 



复习对象的序列化:利用ObjectOutputStream和ObjectInputStream实现对象的序列化,必须实现序列化接口;


常见监听器:前者监视创建和销毁后者监视属性变化,需要在xml中配置
ServletContext:ServletContextListener和ServletContextAttributeListener!!!!!!常用功能:初始化对象数据(数据库-连接池等) 加载框架配置文件,任务调度
HttpSession:HttpSessionListener和HttpSessionAttributeListener
ServletRequest:ServletRequestListener和ServletRequestAttributeListener


邮箱服务器:
反向代理服务器和缓存服务器 查一下
SMTP协议-发邮件协议:端口号:25;
                    全称是Simple Mail Transfer Protocol(简单邮件传输协议),他定义了邮件客户端与SMTP之间\以及两台SMTP之间的通讯规则
POP/POP3协议-邮件接收协议:端口号是110
                    全称是Post Office Protocol(邮局协议),定义了客户端与POP3服务器之间的通讯规则;

邮件的发送与接收:客户端到SMTP服务器,再传输到另一台SMTP服务器,存储到服务器本地,由POP3服务器取出,经过POP3/IMAP(???????????????????)传到客户端;

    配置文件--创建验证器--Session 代表与邮箱服务器会话对象(参数看一下)-- 创建邮件--配置邮件-- --发送邮件
    记得配置XML;
在以后的变成中谨记,用什么封装就用什么解开,除非可以互通;
  -1-17
过滤器 Fileter:本质特殊的Servlet 运行在服务器端的程序,先于附加的Servlet和Jsp运行,实现对请求的规律功能;
                对Servlet容器调用Servlet的过程进行拦截;
    应用:解决全站乱码,自动登录,屏蔽非法文字,进行响应数据的压缩;
    生命周期:创建:服务器正常启动
             工作:服务器接收到请求
             销毁:服务器正常关闭
    直接访问才会执行,并不是访问一次执行一次;

过程:1.用户登录,访问servlet,在数据库中查询,在service中处理返回给servlet
            登录成功:将用户信息保存在session中;
                     如果用户勾选自动登录,用cookie记录信息 格式是用户名@密码;
                    重定向到首页
            登录不成功提示错误信息,跳转到登录页面重新登录;

     2.第二次登录:发送浏览器缓存的cookie信息:
        注意所用的request是转型之后封装起来的request;
        过滤器: 如果已经登录 不进行自动登录
                如果浏览器没有自动登录cookie信息,不进行自动登录
                如果cookie信息有误,不进行自动登录
                用户没有登录,浏览器记录正确的Cookie 将完成登录(session记录状态)


枚举的格式: enum Color{BLUE,RED;}  你家的类才有括号 记住了!!!
    一般用来静态的表示一些类型较少的值;

1.5 新特性:    泛型 自动封装箱 注解 静态倒入即静态方法不需要写大类名
web工程下的两个文件夹
META-INF文件夹:主要用来存放一些信息
MANIFEST.MF文件 是在将java代码打包的时候出现的文件,里面的信息表明了使用的Manifest的版本和使用打包的JDK的版本;

Control character in cookie value or attribute
为什么cookie在存的时候要用url编码?因为cookie参照的是ASCII编码;
因为cookie不支持中文,所以在设置cookie的时候用URL编码 取出cooki的时候解码;

  -1-19
    注解:具有一定功能的语法形式
        耦合性大不利于维护,但开发成本低,效率高
    简介:
        Annotation注解,代码级别的说明,JDK1.5的新特性,与类,接口,枚举是同一个层次;
    作用:
        1.使得编译器能够实现基本的便已检查
        2.对代码进行分析,从而达到取代xml的目的;
        3.辅助生成帮助文档对应的内容;
JDK提供的注解:
        1.@Deprecated 表示被修饰的方法已经过时.(安全问题或者是被新的API取代)
        2.@override JDK5.0表示复写父类的方法,JDK6.0还可以表示实现接口的方法
        3.@SuppressWarnings 表示警告,会被编译器忽略
            deprecation  过时
            rawtypes     忽略类型安全
            unused       未使用
            unchecked    忽略安全检查
            null           忽略空指针
            all             忽略所有
自定义注解:使用@inteface关键字;
            内部格式:修饰符  返回值类型  属性名() default(可以省略) 值;
                注解中的属性和方法的默认修饰符是public abstract;
                返回值类型可以是String 基本类型 Class 注解 枚举 以及以上任意一个类型的数组;
注解使用的注意事项:@注解可以没有属性,  但是有的话必须用小括号包住;
                   @属性的格式:键值对的形式,用逗号隔开
                   @如果属性名为value,且只有一个属性,value可以省略;
                   @属性的类型为数组的时候设置的格式是:{1,2,3};
                   @属性为数组的话,数组中只有一个值,大括号可以省略;
                   @一个对象上注解只能使用一次不能重复;
!!只有用JDK提供的元注解修饰之后才能通过 java.lang.reflect.AnnotatedElement接口中的方法获取到注解;
                    类似于反射中的方法:
元注解:用于修饰注解的注解;
        JDK提供的四种注解:
                @Retention用于确定被修饰的自定义注解的生命周期;
                    RetentionPolicy.SOURCE  被修饰的注解只能出现在 源码 字节码中没有 提供给编译器使用
                                   .Class             源码和字节码中                  JVM使用
                                   .RUNTIME            源码  字节码 运行内存中        取代XML配置

                @Target 确定被修饰注解的使用位置
                    ElementType.TYPE  修饰类 接口
                               .CONSTRUCTOR 修饰构造方法
                               .METHOD    修饰方法
                               .FIELD     修饰字段;
                @Documented 使用javaDoc生成API文档时是否包含此注解
                @Inherited  父类被注解修饰,子类是否继承(接口应该也一样的)
    解析注解的过程就是获得使用注解的参数的过程
接口中没有的方法,动态代理是无法增强的;
Proxy:静态方法newPorxyInstance(loader,interfacs,h);
        参数:
            loader:当前类.class,getClassLoader();
            //interfaces:代理类实现的所有的接口,不能使用getclass.getinterfaces() 只能取到自己的;
            //new class[]{接口.class} 这是自己一个一个找的吗??
动态代理与静态代理的区别:接口中没有方法不能实现
            动态代理:接口下所有的实现类的对象
                代理对象:手动创建
                被代理对象:HttpServletRequest 对象
            动态代理使用反射技术,扩展性强,但是执行效率低;
            静态代理:接口现所有的实现类
                代理类:新建一个类 实现接口 增强方法
                被代理类:HttpServletRequest
                适配器可以减轻方法实现的负担;(只实现增强的)
类加载器:将字节码文件加载到运行时中,并形成字节码对象
    反射和动态代理操作的都是字节码对象;
    通过类加载器获得类加载路径(字节码文件存在的文件夹路径 web项目中是在web-inf/classes)下的文件
读取文件路径
方法1:相对于classes文件夹
ClassLoader loder=Class对象.getClassLoader() 获得类加载器
Source source=loder.getResource(资源名称); 获得加载资源
source.getPath()  带盘符的绝对路径
方法2:相对于web应用的
ServltContext读取文件
this.getServletContext().getRealPath();
使用getResource使用相对地址;


  -01-20
分类:图形化界面和服务器版
     内核和发行版本
linux的目录:
            bin  二进制可执行文件
            sbin 存放二进制可执行文件 只有root访问
            etc  存放系统配置文件
            usr  共享文件
            home 用户文件根目录
            root 最高权限用户单独的文件夹
            监视器和过滤器;
            
在linux中安装mysql时会出现mysql登录时不能通过mysql.socket连接的问题, 报错提示是不能通过'/tmp/mysql.sock'连接到服务器,而PHP的标准配置是通过'/tmp/mysql.sock'连接的;一些安装方法将这个文件放到/var/lib/mysql.sock
        通过修改/etc/mysql.cnf  改成socket=/var/lib/mysql.sock  再加上[mysql]  socket=/tmp/mysql.sock  还可以修改php.ini中的配置来使用php的其他mysql.sock连接
        或者是ln -s /var/lib/mysql.sock/tmp/mysql.sock
linux的软件安装:
    修改linux编码 etc/sysconfig/i18n(国际化库 编码和语言) ;
    linux的防火墙的端口必须手动开放;
    /sbin/iptables -I INPUT -p tcp --dport 端口号 -j ACCEPT
    /etc/rc.d/init.d/iptables save ---将修改永久保存到防火墙中
    lixux中可以安装官网的wine来运行exe文件,一般是寻找后缀问sh的文件来运行;
    执行sh文件时,需要看是否有文件的执行权,可以手动添加执行权 chmod u+x 文件名  然后./执行文件
    数据库乱码问题:修改编码;    
Redis:内存数据库;
        存储的是类似于map的键值对表:键是String(最好不要超过1024个字节) 值有String(最长是512M),map(被json取代),list(不存在创建,键对应的所有值都不存在,那么键也将被删除),set,hashset;
    String :存取时String和其他的用的方法不一样;其他的需要加前缀h,多个加m;
    List:存取list时,前缀头是l 尾是r  增删是push 查看是range 删除是pop就是弹栈; 获取格式是llen(同其他); 整数表示从头开始 负数表示从尾开始;删除某种元素lrem;
        设置某个索引的元素 使用的是lset;
    Set:什么叫操作的时间复杂度为O(1);  长度使用前缀加card;
    可以追踪一些唯一性的数据,还有就是服务端的聚合操作整合数据;
    服务器端完成多个sets之间的聚合计算操作(unions\intersections\differences),效率高,节省网络IO开销;
        前缀是s 增删是add和rem;
        获取所有的成员:smember;判断是否存在:sismember set 元素名称;返回值是0(元素不存在或者set本身就不存在)或1;
        sdiff set1 set2   返回前者和后者的差,与顺序有关;
        sinter set1 set2 set3  返回交集;
        sunion set1 set2 set3 返回并集;
    Sorted-Set:每一个成员都会有一个分数与之相关联;
    前缀是Z 增加是zadd 集合 分数 成员; 获得是zscore 集合 成员;
    (包括索引前后)范围查询:从小到大zrange 集合 索引范围 [withscores]
             从大到小zrevrange 集合 索引范围(包含两端)[withscores]
             zremrangebyrank 集合 索引范围 按照排名范围删除元素 默认从小到大
             zremrangebyscore 集合 范围  按照分数删除;
             limit的用法类似于数据库查询中的limit;
    key的通用操作:keys 正则
                  del keys
                  exists key
                  rename key newkey
                  expire key 设置过期时间
                  ttl key 获取该key所剩的时间;
                  type key 返回类型(五大类型)
启动多个redis的方法:
    1.直接在启动的时候修改端口号;
    2.拷贝redis的目录 然后编写配置文件修改端口号,适合部署集群;
jedis是java    Redis 使用hava语言操作redis数据库;主流是jedis和Redisson,托管在github上;
        Redis的命令和Jedis的命令是一样的,String在Redis中是二进制安全的,存入的是二进制字节流,存入的是什么,取出来就是什么,保存的时候没有编码;
redis的持久化:
    1.dump文件的rdb方式:固定时间检查,持久化到dump文件中
    2.AOF基于语句追加,全部存到一个log文件中,服务器重启时读取效率极低;
Redis的集群默认分配16384个哈希槽供键存储,内部通过redisObject来存储
redis使用建议:
    1.关闭快照
    2.关闭虚拟内存功能
    3.设置maxmemory选项,当物理内存达到一定程度开始拒绝读写,很好的保护服务器
    4.查看slowlog get
    5.压缩内存:默认使用ziplist
    6.redis所在的机器的物理内存不要超过实际内存的3/5;
    
  -02-06
    1.增加了加密
    2.发送邮件字符串拼接
    3.发送邮件工具类使用外网发送邮件时: 账号和授权码
    4.页面在重新找服务器要的资源,如果涉及地址要写绝对地址
    5.增加了内存数据库;
    6.加入购物车,所有的数据都要封装对象
    7.涉及事务,必须要用ThreadLocal;看下那个工具了;
    8.支付的时候 客户端必须重定向到第三方支付平台,不能跳转,并且比较的是秘钥生成的hmac码;
    9.曾与层之间的解耦,使用配置文件,看下xpath解析字符串;
    10.使用pageBean的时候一定要把list加到属性中;
    11:使用bean的时候一定要将内部的数据全部封装起来;
    12.将项目发布之后,配置文件会出现在web-info的class文件下;
  .01.23
文件上传需要注意的几个问题:
        1.需要把文件放在用户直接访问不到的地方;(服务器的安全性)
        获得的文件需要处理路径,为了防止上传的时候文件路径报错;
        使用一个文件名的工具类处理文件路径;
        2.使用UUID保证文件名的唯一性防止覆盖
        3.避免同一个文件夹中的文件过多;(文件夹过多怎么办?)
        4.限制上传文件的大小(核心类中的api);
        5.用户没有上传文件 一个判空的问题
        6.临时文件
            有一个默认是10KB大小的缓存,如果上传的文件超过10KB的话 用磁盘缓存
            默认的缓存目录是系统的临时目录; 可以进行更改
            如果自己用IO实现文件上传需要在关闭流之后进行临时文件的清理;
        7.中文上传乱码问题;
  -01-28
命令模式:按框架开发标准进行拓展和填充;
框架:重复性的代码的封装;
    MVC三层架构和Struts2:
        表现层:M model V view C control  Struts2是表现层的框架
        业务层:service
        持久层:dao data access object  Hibernate 处理持久层的框架
    Struts2的核心控制器是一个过滤器;
    获取请求路径:request.getServletPath();
Struts2==>WEB层框架:
        优势:1.易于测试,降低耦合性
             2.整合了一些以前需要手动的功能:validate验证,表单回显,防止表单重复提交,自动封装表单参数;
             //===============================================================================
             3.表达语言方面 整合了OGNL(object Graph NavigationLanguage)对象图形导航语言;缩写
                OGNL的功能
                    1.支持java对象方法的调用
                    2.支持类静态方法的调用和值得访问;表达式的格式为@全包名@方法名(参数列表)或者值名
                    3.支持复制操作和表达式串联
                    4.访问OGNL上下文对象和ActionContext===意味着可以访问servlet对象
                    5.操作集合对象
                OGNL的三要素:
                    1.表达式:要做什么
                    2.根对象(Root):对谁以及谁的关联对象操作
                    3.Context对象:操作对象的上下文环境,是一个Map类型的对象,访问上下文中的对象的格式是:"#对象名称";
                Ognl.getvalue(描述,上下文对象,上下文对象.getRoot);
                如果在对象域中设置了对象 第三个参数就是那个对象,否则为null,但是依旧可以运行这个方法;
            
            //================================================================================
             4.绑定值到视图技术,使用"valueStack"技术.
             5.类型转换,使用OGNL进行转换;
             6.基于Spring AOP思想的拦截器机制,更容易拓展;
             7.一次请求一个Action 线程安全,但是高并发需要消耗大量资源
        基本配置:配置文件的加载顺序,如果重名,后者覆盖前者; xml在服务器启动时就会被加载;
            default.properties(用于配置struts常量)——struts-default.xml(struts提供的默认配置文件,大部分功能都在此配置)——plugins配置(插件核心配置文件,整合其他框架的工具)——struts.xml(用户自定义核心配置文件)——struts.properties(用于自定义struts常量配置文件)——web.xml(也可以配置常量)        
                前三个文件用户不进行修改!
        常见的struts常量:
            1.struts.i18n.encoding=UTF-8;       编码   i18n在linux编码的设置中见过
            2.struts.objectFactory=spring;      整合Spring所需要的配置 默认注释掉了
            3.struts默认使用文件上传解析工具:apache-commons-fileupload
                struts.multipart.parser=jakarta
                3.1 临时文件保存位置
                        struts.multipart.saveDir=
                3.2 上传文件最大大小,默认值:2M,单位字节
                        struts.multipart.maxSize.
            4..用于设置action请求路径扩展名。默认:action或空。多个值使用逗号分隔
                    struts.action.extension=action,,
                    例如:/hello/userAction  或  /hello/userAction.action
            5..确定是否使用动态方法调用。默认关闭的。
                    struts.enable.DynamicMethodInvocation = false
                动态调用格式,xml文件中普通配置,地址栏方法和名称中间加!
            6.设置开发模式,默认关闭。如果设置true:将提供更多提示信息,自动加载文件。
                    struts.devMode = false
                6.1 自动重新加载国际化资源文件。
                    struts.i18n.reload = true
                6.2 自动冲洗加载xml配置文件。例如:struts.xml。但不会自动加载action类。
                            struts.configuration.xml.reload = true
            7.设置struts标签主题,默认值:xhtml。取值:simple。
                struts.ui.theme=xhtml
                开发中常用simple。xhtml存在默认布局,开发中布局使用美工提供页面,布局自定义。
        struts.xml详解:顺序不能倒
            1. 配置常量
            2.             ="action访问路径前缀" extends="继承的其他包名" abstract="是否抽象,默认true 表示没有action实现具体的功能">
            
            jsp路径
            

            3.将多个配置文件组合成一个,struts.xml的入口配置文件,共同用于存放通用模块.
        action访问:
            通配符:路径使用(*_*_*) 分别表示 action的名称 方法名和返回值的名称;
            访问路径:默认访问一个action时,将依次从最小路径向上获取action
        action类:1.普通类 POJO
                 2.实现Action接口
                 3.继承ActionSupport类
        action中的方法:
                 1.必须是public
                 2.建议有返回值,类型必须为String,如果没有的话 使用 return "none";
                 3.名称自定义,没有参数,抛大异常,非静态;
        访问ServletAPI:完全解耦.只能操作request,session和application三个作用域;
                    使用ActionContext 工具类
                    ActionContext.getContext();
        操作servlet对象:ServletActionContext 工具类 获得需要servlet对象
                    都是静态方法;
        通过实现接口进行struts注入,实现接口后,重写方法进行对象的赋值;
        struts2的执行过程:请求先进入StrutsPrepareAndExecuteFilter过滤器,然后由一个叫ActionMapping分析请求信息,分析之后反馈给过滤器,过滤器创建一个ActionProxy代理对象去执行本次请求要走的流程,具体流程从ConfigManager获取,而ConfigManager从struts.xml获取配置信息,代理类将任务委托给一个叫ActionInvocation的代理,在执行的时候会经过框架中全部的拦截器,进行拦截器的预处理,拦截器就是框架对一些常用功能的封装,全部经过后,找到了Action 返回一个字符串,跳转到JSP,然后JSP将重新倒序经过拦截器进行拦截器的后处理,(类似调用方法返回的路径)最后封装成一次响应;
    拦截器原理:AOP思想
               责任链模式:
                    过滤器中的放行方法;
    配置过滤器时,因为struts2的过滤器没有放行方法,所以应该放在所有过滤器的最后;
  -02-20
    参数的封装:
        属性驱动:
            提供set方法:如果数据过多抽取javaBean;
            通表达式直接封装:表单中name属性的格式:name="javaBean.属性名";,提供get和set,自动封装    
        模型驱动:Action实现ModelDriven接口,重写getModel()方法,返回一个数据模型对象;    
        指定的实体必须手动实例化;只能制定一个模型;
==================================================================================    
        1.只要将参数在action内私有化,提供get和set方法就可以根据字段名称自动获取并封装;
        2.struts会自动转换基本类型,包装类和date类型(要求格式yyyy-MM-dd或后面加HH:mm:ss);
        3.容器数据封装
        Map:    JSP页面:name属性格式:name="userMap['u001'].userName";
               action类:必须提供私有的Map和get和set方法;
        List:   JSP页面: name属性格式:name="userList[0].userName";
               action类:提供私有的List和构造方法
        Array:  JSP页面:正常;
               action类:request的方法获取;
    ==================================================================================
    统一可以通过实现接口或者继承父类自定义的部分:
        1.字符串和指定类型之间的转换;
            提交表单是正向转换,回显是反向转换;
            指定类型:8大基本类型和包装类,Date,Map,List,Array
            支持自定义类型转换!!!!!!
        2.注册转换器
            局部:配置文件在同包下,内容是属性=转换器
            全局:配置文件在src下,内容是类=转换器
        3.数据校验
            手动校验:创建的Action继承ActionSupport类然后重写validate方法,方法名必须是validate加上大写的校验方法名(底层拦截器先执行);
            xml配置校验:      
        4.自定义拦截器
            默认拦截器:栈
            可以自定义并将之指定为默认的拦截器,使用自定义会覆盖框架提供的默认拦截器;
    访问servlet的API:
        1.ActionContext类 :可以获得Servlet API的域对象,无法直接获得API对象;
        2.实现接口直接访问Servlet API对象;
            通过实现注入对象的接口(接口中有设置对象的方法,),实现获取注入对象的值;(框架解耦获得其他对象的基本思想)
                例如:ServletRequestAware,这类接口的后缀是Aware;
        3.ServletActionContext类中的静态方法获取;
    Result的配置:
        局部配置:正常配置在Action内部就可以实现
        全局配置:在同一个package下配置的Action都执行这个result,在action外,package内;    
        :chain--处理action链,被跳转的action依然能获取上个页面的值
                      dispatcher--默认值,转发,可以获取到request中的值;
                      redirect--重定向到一个URL,request中的信息丢失;   
                      redirectAction--重定向到一个Action,request中的信息丢失;
                      stream--向浏览器发送Imputstream对象,通常用来处理文件下载和ajax数据;
    Action:每个Action都有一个ActionContext上下文对象;
        生命周期:
            创建:每次访问都会创建Action对象;而Servlet对象只在初次访问的时候创建一个;
            销毁:访问结束就会Action销毁;
        Action对象由struts2框架创建,servlet是tomocat服务器框架创建;    
    ActionContext actionContext=ActionContext.getContext();
        获得的是域对象功能==容器;
        
//    LAMP:LINUX  Apache Mysql PHP(PHP开发的一套架构)

//Ctrl shift R 搜索资源文件
//Ctrl shift T 搜索源码中的类
//隐藏的标签还是挺有用的
  -02-23
    ☆ValueStack值栈:是一个接口,通常使用的是他的实现类OgnlValueStack;一个请求,建立一个action的同时创建一个ActionContext,在中间创建一个OgnlValueStack的对象,获得Map对象(有值栈的引用)传入到ActionContext的构造方法创建ActionContext,生命周期和action是相同的生命周期和action是相同的;                    ☆OGNL会将请求的参数封装成对象存储到值栈中,然后用表达式读取;
    ☆//CompoundRoot root:存储了action对象,是OgnlContext的Root对象;继承了ArrayList实现了压栈和出栈功能,被称为对象栈,root栈,集合类型;
    ☆Context:OgnlContext上下文,一个map结构,存储了servlet的一些引用:parameters,request,session,applocation, attr             检索顺数据的序是从小到大;还存有值栈的引用;
    //ActionContext和ValueStack互相有引用,前者在获取ServletAPI的时候会依赖后者;
    !!!!!先获得ActionContext对象 然后获得值栈(就相当于一个大的域)  可以存值取值 在页面取的时候是利用OGNL 表达式;
    ☆EL特殊字符的使用:
    警号   #request(域).key
    百分号:强制解析OGNL    %{#request.key}
           强制不解析OGNL  %{'#request.key'}
    $  用于struts的配置文件中使用.xml文件或者是属性文件
    //向栈中保存数据
        1.向root栈保存数据
            手动向Root栈保存数据:
            push();pop();peek();set();   
            自动向Root栈保存数据(struts框架自动保存):
            1)自动向栈顶压入当前Action
            2)自动压入Model;
        2.向context栈保存数据
        手动向Context中保存数据:
        
        自动向Context中保存数据:
        对象:request,response,servletontext;
        域数据:request,aplocation,session,attr,paramters;
        ValueStack对象封装的保存数据的方法:
            push();pop();peek();set();
        标志位思想:使用一个标识符,保证使用同一个对象;
        
    取出root栈顶的数据:    
    取出context中的值需要加#,由key取value
    为什么el表达式也可以取栈内的值?
        el是从request域中取值;
    经常看到方法A和方法A1同名 前者有返回值(参数)--后者没有返回值(参数),一般使用后者调用前者;利于维护,解耦;
  -02-24
    SOA 面向服务架构;--模块化手机!
    IOC在struts2中的体现:Action对象的创建由struts框架去创建;
    AOP在struts2中的实现:拦截器的实现;
    拦截器(Intercepter):在AOP(Aspect-Oriented Programming)中由拦截链(Intercepter Chain)在struts2中是拦截栈(    Intercpter  Stack),按顺序排列好的,在Action前后执行的的代码;可以实现拦截和增强功能;
    
    拦截器和过滤器在使用的时候一定要加上使用的目录,或者配置跳过方法;
    
    自定义拦截器的实现:
            1.实现Intercepter接口
            2.继承AbstractIntercepter类,
            ,继承methodFilterIntercepter类;
    配置拦截器:
            
                
                
                    
                    
                

            

    Struts2de 标签库:
        额外标签: 显示action中的属性的信息;
        普通标签:在页面生成时,控制执行流程
            控制标签:完成逻辑控制,做集合的操作;
                
                
                
                
            数据标签:显示后台数据和进行数据访问;
            
            
            弹出debug信息
            
        UI标签:使用html文件显示数据;
            主题:
                simple:UI标签只生成最基本的元素没有附加功能
                xhtml:默认主题,扩展了simple,提供了布局,