黑马程序员技术交流社区

标题: 【石家庄校区】JavaWeb常用标签 [打印本页]

作者: 雪落    时间: 2018-4-23 15:02
标题: 【石家庄校区】JavaWeb常用标签
本帖最后由 小石姐姐 于 2018-4-27 10:43 编辑

                                                         学习笔记

#------------------------web之前---------------------------
IO体系结构(终结版)
# 按照流的用途分:
文件输入输出流
    |_ 字节流
        |_ FileInputStream
        |_ FileOutputStream
    |_ 字符流
        |_ FileReader
        |_ FileWriter
缓冲输入输出流
    |_ 字节流
        |_ BufferedInputStream
        |_ BufferedOutputStream
    |_ 字符流
        |_ BufferedReader
        |_ BufferedWriter
对象输入输出流
    |_ ObjectInputStream
    |_ ObjectOutputStream
打印输出流
    |_ 字节流
        |_ PrintStream
    |_ 字符流
        |_ PrintWriter
# 体系结构:
字节流
    |_ InputStream                 # 字节输入流
    |    |_ FileInputStream         # 专门操作文件的字节输入流
    |    |_ BufferedInputStream     # 带有缓冲区的字节输入流, 效率高
    |    |_ ObjectInputStream       # 对象输入流
    |
    |_ OutputStream                # 字节输出流
        |_ FileOutputStream        # 专门操作文件的字节输出流
        |_ BufferedOutputStream    # 带有缓冲区的字节输出流, 效率高
        |_ ObjectOutputStream      # 对象输出流
        |_ PrintStream             # 字节打印流
字符流
    |_ Reader                      # 字符输入流
    |    |_ BufferedReader          # 带有缓冲区的字符输入流, 效率高
    |    |_ InputStreamReader       # 将字节流转换为字符流的转换输入流
    |        |_ FileReader          # 专门操作文件的字符输入流   
    |
    |_ Writer                      # 字符输出流
        |_ BufferedWriter          # 带有缓冲区的字符输出流, 效率高
        |_ OutputStreamWriter      # 将字节流转换为字符流的转换输出流
             |_ FileWriter         # 专门操作文件的字符输出流
        |_ PrintWriter             # 字符打印流
#乱码
1.原因: 读的编码与写的编码不一致
2.解决方法: 保证读和写的编码一致, 即可解决
处理乱码的2种方式:
1.String通过指定编码转为byte数组, 然后再创建String: (GBK字符串转UTF-8字符串写入文件)
先将String通过目标编码转为byte数组: byte[] bys = "月薪过万".getBytes("UTF-8");
再将byte数组转换为String: String str = new String(bys);
写入到文件: fw.write(str);
2.OutputStreamWriter可以指定编码写入文件, 免去使用String通过编码转换为byte数组的步骤
OutputStreamWriter OutputStreamWriter(OutputStream out, String charsetName): 创建转换流对象, 并指定编码
多线程中的常见问题
    1. 资源共享: 卖票问题
        * 共享资源定义位置: 共享资源要定义在多个线程能够共同使用的地方, 如:
            * 多个Thread共用同一个Runnable实现类对象, 则定义为Runnable实现类的非静态成员变量
            * 如果只用Thread子类, 则可以定义为Thread子类的静态成员变量
        * 操作共享数据的线程安全问题: 使用同步解决
            * 同步代码块
                * `synchronized (锁对象) {}`
                * 锁对象
                    * 必须是多个线程共享的对象:
                        * 一个类的Class对象
                        * 如果是实现Runnable, 则可以是this
            * 同步方法
                * `public (static) synchronized void method() {}`
                * 锁对象
                    * 静态同步方法, 锁对象是: 方法所在类的Class对象
                    * 非静态同步方法, 锁对象是: this
    2. 不同线程之间通信:
        * wait(), notify(), notifyAll()
        * 这三个方法必须在同步代码块中, 用锁对象来调用, 否则会抛异常
    3. 死锁: 同步代码块中的线程不出来, 也不释放锁; 同步代码块外的线程拿不到锁, 只能等在外面.
        * 发生死锁的原因:
            * 同步代码块内的线程, 可能处在死循环, IO阻塞, 或sleep状态
            * 多个线程互相持有锁又不释放锁
# UDP收发数据步骤
    * 发送端
        1. 为发送端创建Socket对象(DatagramSocket):
            * `DatagramSocket udp = new DatagramSocket();`
        2. 创建数据并打包:
            * `DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);`
        3. 发送数据:
            * `DatagramSocket`对象的`void send(DatagramPackage p)`
        4. 释放资源:
            * `DatagramSocket`对象的`void close()`
    * 接收端
        1. 创建接收端Socket对象:
            * `DatagramSocket DatagramSocket(int port)`
        2. 接收数据
            * 创建包对象: `DatagramPacket datagramPackage(byte[] buf, int length)`
            * 接收包: `DatagramSocket`对象的`void receive(DatagramPacket p)`, 该方法会阻塞等待接收数据
        3. 解析数据
            * 获取发送端信息
                * `DatagramPacket`对象的`InetAddress getAddress()`: 获取客户端
                * `DatagramPacket`对象的`byte[] getData()`: 获取数据
                * `DatagramPacket`对象的`int getLength()`: 获取数据长度
        4. 输出数据
        5. 释放资源:
            * `DatagramSocket`对象的`void close()`
#TCP收发数据步骤
    * 客户端
        1. 创建客户端Socket对象(建立连接):
            * `Socket Socket(InetAddress add, int port)`
        2. 获取输出流对象:
            * `Socket`对象的`OutputStream getOutputStream()`
        3. 发送数据:
            * `OutputStream`对象的`void write(byte[] b)`
        4. 释放资源:
            * `OutputStream`对象的`close()`
            * `Socket`对象的`close()`
    * 服务端
        1. 创建服务端ServerSocket对象:
            * `ServerSocket ServerSocket(int port)`
        2. 监听数据:
            * `ServerSocket`对象的`Socket accept()`, 获取客户端Socket对象
            * 监听时是阻塞的
        3. 获取输入流对象:
            * `Socket`对象的`InputStream getInputStream()`
        4. 获取数据:
            * `InputStream`对象的`int read(byte[] buf)`
        5. 输出数据:
            * 将获取的字节数组转换为String打印输出
        6. 释放资源:
            * `Socket`对象的`void close()`方法
            * `ServerSocket`对象的`void close()`方法
#反射
    * 概念: 在程序运行时, 获取任何一个类的所有属性和方法(包括私有的). 调用任意一个对象的所有属性和方法(包括私有的)
    * 前提:
        * 获得字节码对象
    * 获取字节码对象的3种方法
        1. `对象.getClass()`
        2. `类名.class`
        3. `Class.forName(String fullClassName)`
    * 反射能干的事
        * 获取一个类的字节码对象, 通过该字节码对象:
            * 获取一个类的构造方法(public或全部权限的)
            * 创建一个类的对象
            * 获取一个类的成员属性(public或全部权限的)
                * 获取属性值
                * 设置属性值
            * 获取一个类的成员方法(public或全部权限的)
                * 调用成员方法

#------------------------web第一天---------------------------
HTML的排版标签
标题标签:h标签<h1>...<h6>
段落标签:p标签
字体加粗标签:b标签
字体斜体标签:i标签
字体下划线:u标签
居中标签:<center>标签
图片标签:<img>
    * 属性:
         * src:图片的来源.
         * width:图片的宽度.
         * height:图片的高度.
         * alt:图片找不到显示的内容.
HTML的超链接标签
HTML的超链接标签:<a>
    * 属性:
        * href:链接的路径
        * target:打开的方式
            * _self        :在自身页面打开
            * _blank:新打开一个窗口
无序列表的属性:
    * type属性
        * disc        :实心点.
        * circle:空心圆
        * square:方块.

有序列表的属性:
    * type属性:
        * 1        :数字类型
        * a        :英文类型
        * i        :罗马字符
    * start属性:从哪开始
HTML的表格标签
属性:
    width        :表格宽度
    height        :表格高度
    border        :边框
    align        :表格水平位置:
        * left
        * center
        * right

<td>的属性:
    * colspan=”列数”
    * rowspan=”行数”
HTML的表单标签
HTML的表单标签:<form>
     * 常用属性:
          * action属性:提交的路径.默认提交到当前页面
          * method属性:请求的方式.GET和POST.默认是GET.
GET方式和POST方式的区别
          * GET        :数据会显示到地址栏中.GET方式提交是有大小的限制.
          * POST        :数据不会显示到地址栏中.POST方式提交的是没有大小限制.
#HTML中表单元素:
* <input type=”text”>                :文本框.
    * 常用属性:
        * name        :表单元素的名称.必须有name属性,然后后台才可以接收数据.
        * value        :文本框的默认值.
        * size        :文本框的长度.
        * maxlength:文本框输入的最大长度.
        * readonly:只读文本框.
* <input type=”password”>:密码框.
    * 常用属性:
        * name        :表单元素的名称.必须有name属性,然后后台才可以接收数据.
        * value        :密码框的默认值.
        * size        :密码框的长度.
        * maxlength:密码框输入的最大长度.
        

* <input type=”radio”>:单选按钮.
    * 常用的属性:
        * name        :表单元素的名称.必须有name属性,然后后台才可以接收数据.
        * value        :单选按钮的默认值.
        * checked:单选按钮默认被选中.

* <input type=”checkbox”>:复选按钮.
* 常用的属性:
        * name        :表单元素的名称.必须有name属性,然后后台才可以接收数据.
        * value        :单选按钮的默认值.
        * checked:单选按钮默认被选中.

* <input type=”button”>        :普通按钮.没有任何功能的按钮.
* <input type=”submit”>        :提交按钮.
* <input type=”reset”>        :重置按钮.
* <input type=”file”>        :文件上传的表单项.
* <input type=”hidden”>        :隐藏字段.
* <input type=”image”>        :图片按钮

* <select>:下拉列表.
* <textarea>:文本域.






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