JavaWeb 前端

Java基础知识

Junit单元测试:

*  测试分类:
	1. 黑盒测试: 不需要写代码,给输入值,看程序是否能够输出期望的值
	2. 白盒测试: 需要写代码,关注程序具体的执行流程
* Junit使用: 白盒测试
	* 步骤
		1. 定义一个测试类 (测试用例)
			* 建议: 
				* 测试类名: 被测试的类名 	 
				* 包名 : xxx.xxx.xx.test  cn.itcast.test
		2. 定义测试方法:可以独立运行
			* 建议:
				* 方法名: test测试的方法名 testAdd()
				* 返回值: void 
				* 参数列表: 空参
		3. 给方法加@Test 
		4. 导入junit依赖环境
	* 判定结果
		*  红色是错误
		*  绿色是正确
		* 一般我们会使用断言操作来处理结果
		 	Assert.assertEquals(期望值, 实际值);
	* 补充
		* @Before
			* 修饰的方法会在测试方法之前被自动的执行
		* @After
			* 修饰的方法会在测试方法执行之后被执行  
package cn.itcast.junit;

/**
 * 计算器类
 */
public class Calculator {
   
    /**
     * 加法
     * @param a
     * @param b
     * @return
     */
    public int add (int a, int b) {
   
//        int i = 3 / 0;
        return a + b;
    }


    /**
     * 减法
     * @param a
     * @param b
     * @return
     */
    public int sub (int a, int b) {
   
        return a - b;
    }
}
package cn.itcast.test;

import cn.itcast.junit.Calculator;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class CalculatorTest {
   

    /**
     * 初始化方法:
     * 用于资源申请, 所有的测试方法在执行之前都会先执行该方法
     *
     */
    @Before
    public void init () {
   
        System.out.println("init....");
    }


    /**
     * 释放资源的方法
     * 在所有的测试方法执行完以后,都会自动执行改方法
     */
    @After
    public void close() {
   
        System.out.println("close...");
    }

    /**
     * 测试add方法
     */
    @Test
    public void testAdd(){
   
        //System.out.println("我被执行了");
        //1.创建计算器对象
        System.out.println("testAdd....");
        Calculator c = new Calculator();
        //2.调用add方法
        int result = c.add(1, 2);
//        System.out.println(result);
        //3.断言 我断言这个结果为3
        Assert.assertEquals(3, result);

    }

    @Test
    public void testSub() {
   
        //1.创建计算器对象
        Calculator c = new Calculator();
        int result = c.sub(1, 2);
        System.out.println("testSub....");
        Assert.assertEquals(-1, result);
    }
}

反射: 框架设计的灵魂

在这里插入图片描述

* 框架 : 半成品软件, 可以在框架的基础上进行软件开发,简化编码
* 反射: 将类的各个组成部分封装为其他对象,这就是反射机制
	* 好处
		1. 可以在程序的运行过程中,操作这些对象  
		2. 可以解耦, 提供程序的可扩展性
	
* 获取Class对象的方式
	1. Class.forName("全类名" ):将字节码文件加载进入内存,返回Class对象
		* 多用于配置文件,将类名定义在配置文件中,读取文件,加载类
	2. 类名.class: 通过类名的属性class获取
		* 多用于参数的传递
	3. 对象.getClass(): getClass() 方法在Object类中定义着
		* 多用于对象的获取字节码的方式 
* 结论:
		同一个字节码文件(*.class)在一次程序运行的过程中,只会被加载一次, 不论通过哪一种方式获取的Class对象都是同一个.
  • 使用Class对象功能:

    • 获取功能
      1. 获取成员变量们

        • Field[] getFields() //获取所有public修饰的成员变量

        • Field getField(String name) 获取所有指定名字的public修饰的成员变量

        • Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符

        • Field getDeclaredField(String name)

      2. 获取构造方法们

        • Constructor<?>[] getConstructors() 获取所有public修饰的构造器
        • Constructor getConstructor(类<?>… parameterTypes) 获取指定参数的public修饰的构造器
        • Constructor<?>[] getDeclaredConstructors() 获取所有的构造器,不考虑修饰符
        • Constructor getDeclaredConstructor(类<?>… parameterTypes)
      3. 获取成员方法们

        • Method[] getMethods()

        • Method getMethod(String name, 类<?>… parameterTypes)

        • Method[] getDeclaredMethods()

        • Method getDeclaredMethod(String name, 类<?>… parameterTypes)

      4. 获取类名

        • String getName()
  • Field: 成员变量

    • 操作:
      1. 设置值
      * void set(Object obj, Object value)
      2. 获取值
      * Object get(Object obj)
      3. 忽略访问权限修饰符的安全检查
      * setAccessible(true);//暴力反射
package cn.itcast.reflect;

import cn.itcast.domain.Person;

import java.lang.reflect.Field;

public class ReflectDemo2 {
   
    /**
     * * 使用Class对象功能:
     * 	* 获取功能
     * 		1. 获取成员变量们
     * 			* Field[] getFields()
     * 			* Field getField(String name)
     *
     * 			* Field[] getDeclaredFields()
     * 			* Field getDeclaredField(String name)
     *
     * 		2. 获取构造方法们
     * 			* Constructor<?>[] getConstructors()
     * 			* Constructor<T> getConstructor(类<?>... parameterTypes)
     *
     * 			* Constructor<?>[] getDeclaredConstructors()
     * 			* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
     *
     * 		3. 获取成员方法们
     * 			* Method[] getMethods()
     * 			* Method getMethod(String name, 类<?>... parameterTypes)
     *
     * 			* Method[] getDeclaredMethods()
     * 			* Method getDeclaredMethod(String name, 类<?>... parameterTypes)
     *
     * 		4. 获取类名
     * 			*  String getName()
     */

    public static void main(String[] args) throws Exception {
   
        //0.获取Person的Class对象
        Class personClass = Person.class;

        /**
          1. 获取成员变量们
          	* Field[] getFields()
          	* Field getField(String name)
          	* Field[] getDeclaredFields()
          	* Field getDeclaredField(String name)
         */
        //1.Field[] getFields() 获取所有public修饰的成员变量
        Field[] fields = personClass.getFields();
        for (Field field : fields) {
   
            System.out.println(field);
        }

        System.out.println("----------------------");
        //2. Field getField(String name)
        Field a = personClass.getField("a");
        //获取成员变量a的值
        Person p = new Person();
        Object value = a.get(p);
        System.out.println(value);

        //设置a的值
        a.set(p, "张三");
        System.out.println(p);

        System.out.println("=======================");
        //3. Field[] getDeclaredFields() : 获取所有的成员变量,不考虑修饰符
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
   
            System.out.println(declaredField);
        }
        //4.Field getDeclaredField(String name)
        Field d = personClass.getDeclaredField("d");
        //访问私有的值,忽略访问权限修饰符的安全检查
        d.setAccessible(true);//暴力反射
        Object value2 = d.get(p);
        System.out.println(value2);

    }
}

  • Constructor:构造方法
    • 创建对象 :
      • T newInstance(Object… initargs)
      • 如果使用空参数构造方法创建对象,操作可以简化: Class对象的newInstance方法
package cn.itcast.reflect;

import cn.itcast.domain.Person;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class ReflectDemo3 {
   
    /**
     * * 使用Class对象功能:
     * 	* 获取功能
     * 		1. 获取成员变量们
     * 			* Field[] getFields()
     * 			* Field getField(String name)
     *
     * 			* Field[] getDeclaredFields()
     * 			* Field getDeclaredField(String name)
     *
     * 		2. 获取构造方法们
     * 			* Constructor<?>[] getConstructors()
     * 			* Constructor<T> getConstructor(类<?>... parameterTypes)
     *
     * 			* Constructor<?>[] getDeclaredConstructors()
     * 			* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
     *
     * 		3. 获取成员方法们
     * 			* Method[] getMethods()
     * 			* Method getMethod(String name, 类<?>... parameterTypes)
     *
     * 			* Method[] getDeclaredMethods()
     * 			* Method getDeclaredMethod(String name, 类<?>... parameterTypes)
     *
     * 		4. 获取类名
     * 			*  String getName()
     */

    public static void main(String[] args) throws Exception {
   
        //0.获取Person的Class对象
        Class personClass = Person.class;

        /**
         2. 获取构造方法们
         * Constructor<?>[] getConstructors()
         * Constructor<T> getConstructor(类<?>... parameterTypes)
         * Constructor<?>[] getDeclaredConstructors()
         * Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
         */

        //Constructor<T> getConstructor(类<?>... parameterTypes)
        Constructor constructor = personClass.getConstructor(String.class, int.class);
        System.out.println(constructor);
        //创建对象
        Object person = constructor.newInstance("张三", 23);
        System.out.println(person);


        System.out.println("---------------");

        Constructor constructor1 = personClass.getConstructor();
        System.out.println(constructor);
        //创建对象
        Object person1 = constructor1.newInstance( );
        System.out.println(person1);

        System.out.println("=================");
        Object o = personClass.newInstance();
        System.out.println(o);
    }
}
  • Method: 方法对象
    • 执行方法

      • Object invoke(Object obj, Object… args)
    • 获取方法名称

      • String getName : 获取方法名

package cn.itcast.reflect;

import cn.itcast.domain.Person;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ReflectDemo4 {
   
    /**
     * * 使用Class对象功能:
     * 	* 获取功能
     * 		1. 获取成员变量们
     * 			* Field[] getFields()
     * 			* Field getField(String name)
     *
     * 			* Field[] getDeclaredFields()
     * 			* Field getDeclaredField(String name)
     *
     * 		2. 获取构造方法们
     * 			* Constructor<?>[] getConstructors()
     * 			* Constructor<T> getConstructor(类<?>... parameterTypes)
     *
     * 			* Constructor<?>[] getDeclaredConstructors()
     * 			* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
     *
     * 		3. 获取成员方法们
     * 			* Method[] getMethods()
     * 			* Method getMethod(String name, 类<?>... parameterTypes)
     *
     * 			* Method[] getDeclaredMethods()
     * 			* Method getDeclaredMethod(String name, 类<?>... parameterTypes)
     *
     * 		4. 获取类名
     * 			*  String getName()
     */

    public static void main(String[] args) throws Exception {
   
        //0.获取Person的Class对象
        Class personClass = Person.class;

        /**
         3. 获取成员方法们
         * Method[] getMethods()
         * Method getMethod(String name, 类<?>... parameterTypes)
         * Method[] getDeclaredMethods()
         * Method getDeclaredMethod(String name, 类<?>... parameterTypes)
         */

        Method eat_method = personClass.getMethod("eat");
        Person p = new Person();
        //执行方法
        eat_method.invoke(p);


        Method eat_method2 = personClass.getMethod("eat", String.class);
        //执行方法
        eat_method2.invoke(p, "饭");

        System.out.println("----------------");
        //获取所有的public修饰的方法
        Method[] methods = personClass.getMethods();
        for (Method method : methods) {
   
            System.out.println(method);
//            method.setAccessible(true);
            String name = method.getName();
            System.out.println(name);
        }

        //获取类名
        String classname = personClass.getName();
        System.out.println(classname);//cn.itcast.domain.Person
    }
}
  • 案例
    • 需求: 写一个"框架", 不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象, 并且执行其中任意方法.
      • 实现:
          1. 配置文件
          1. 反射
      • 步骤
        1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
        2. 在程序中加载读取配置文件
        3. 使用反射技术来加载类文件进内存
        4. 创建对象
        5. 执行方法
package cn.itcast.reflect;

import cn.itcast.domain.Person;
import cn.itcast.domain.Student;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * 框架类
 */
public class ReflectTest {
   
    public static void main(String[] args) throws Exception {
   
        //可以创建任意类的对象, 可以执行任意的方法

        /*
            前提: 不能改变该类的任何代码, 可以创建任意类的对象, 可以执行任意方法
        */
//        Person p = new Person();
//        p.eat();
//        Student stu = new Student();
//        stu.sleep();

        //1.加载配置文件
        //1.1创建Properties对象
        Properties pro = new Properties();
        //1.2加载配置文件,转换为一个集合(双列map)
        //1.2.1获取class目录下的配置文件
        ClassLoader classLoader = ReflectTest.class.getClassLoader();//获取这个类加载器
        InputStream is = classLoader.getResourceAsStream("pro.properties");//用这个类加载器获取同包下的资源得到字节流
        pro.load(is);

        //2.获取配置文件中定义的数据
        String className = pro.getProperty("className");
        String methodName = pro.getProperty("methodName");

        //3.加载该类进内存
        Class cls = Class.forName(className);

        //4.创建对象
        Object obj = cls.newInstance();

        //5.获取方法对象
        Method method = cls.getMethod(methodName);

        //6.执行方法
        method.invoke(obj);
    }
}
className=cn.itcast.domain.Student
methodName=sleep

注解

  • 概念:说明程序的,给计算机看的

  • 注释: 用文字描述程序的,给程序员看的

  • 定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

  • 概念描述

    • JDK1.5之后的新特性
    • 说明程序的
    • 使用注解: @注解名称
  • 作用分类:
    ①编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
    ② 代码分析:通过代码里标识的注解对代码进行分析【使用反射】
    ③编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】

  • JDK中预定义的一些注解

    • @Override: 检测被该注解标注的方法是否是继承自父类(接口)的
    • @Deprecated: 该注解标注的内容,表示已过时
    • @SuppressWarnings: 压制警告
      • 一般传递参数all @SuppressWarnings(“all”)
  • 自定义注解

    • 格式
      元注解
      public @interface 注解名称 {
      属性列表;
      }

    • 本质: 注解本质上就是一个接口, 该接口默认继承 Annotation接口

      • public interface MyAnno extends java.lang.annotation.Annotation {
        }
    • 属性: 接口中的抽象方法

      • 要求:
        1. 属性的返回值类型有下列取值
          • 基本数据类型
          • String
          • 枚举
          • 注解
          • 以上类型的数组
        2. 定义了属性,在使用时候,需要给属性赋值
          1. 如果定义属性时, 使用default关键字给属性默认初始化值,则使用注解时, 可以不进行属性赋值
          2. 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可
          3. 数组赋值时,值使用{}包裹,如果数组中只有一个值,则{}省略
    • 元注解:用于描述注解的注解

      • @Target : 描述注解能够作用的位置
        • ElementType取值
          • TYPE: 可以作用于类上
          • METHOD: 可以作用于方法上
          • FIELD: 可以作用于成员变量上
      • @Retention: 描述注解被保留的阶段
        • @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
        • @Retention(RetentionPolicy.CLASS):当前被描述的注解,会保留到class字节码文件中,但不会被JVM读取到
        • @Retention(RetentionPolicy.SOURCE):当前被描述的注解,不会保留到class字节码文件中
      • @Documented: 描述注解是否被抽取到api文档中
      • @Inherited:描述注解是否被子类继承
  • 在程序中使用(解析)注解: 获取注解中定义的属性值

      1. 获取注解定义的位置的对象 (Class, Method, Field)
      1. 获取指定的注解
*getAnnotation(Class) 
 //其实就是在内存中生成了一个该注解接口的子类实现对象

    public class ProImpl implements Pro{
   
        public String className() {
   
            return "cn.itcast.annotation.Demo1";
        }
        public String methodName() {
   
            return "show";
        }
    }

* 3.调用注解中的抽象方法获取配置的属性值
package cn.itcast.annotation;

import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * 框架类
 */
@Pro(className = "cn.itcast.annotation.Demo1", methodName = "show")
public class ReflectTest {
   
    public static void main(String[] args) throws Exception {
   
        //可以创建任意类的对象, 可以执行任意的方法

        /*
            前提: 不能改变该类的任何代码, 可以创建任意类的对象, 可以执行任意方法
        */
        //1.解析注解
        //1.1获取该类的字节码文件对象
        Class<ReflectTest> reflectTestClass = ReflectTest.class;
        //2.获取上边的注解对象
        //其实就是在内存中生成了一个该注解接口的子类实现对象

        /*
            public class ProImpl implements Pro{
                public String className() {
                    return "cn.itcast.annotation.Demo1";
                }
                public String methodName() {
                    return "show";
                }
            }
         */
        Pro an = reflectTestClass.getAnnotation(Pro.class);
        //3.调用注解对象中定义的抽象方法,获取返回值
        String className = an.className();
        String methodName = an.methodName();
        System.out.println(className);
        System.out.println(methodName);

        //4.加载该类进内存
        Class cls = Class.forName(className);

        //5.创建对象
        Object obj = cls.newInstance();

        //6.获取方法对象
        Method method = cls.getMethod(methodName);

        //7.执行方法
        method.invoke(obj);


    }
}

  • 注解小结:
    1. 以后大多数时候,我们会使用注解,而不是自定义注解
    2. 注解给谁用?
      1. 编译器
      2. 给解析程序用
    3. 注解不是程序的一部分,可以理解为注解就是一个标签
package cn.itcast.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Check {
   
}

package cn.itcast.annotation;

/**
 * 小明定义的计算器类
 */
public class Calculator {
   
    //加法
    @Check
    public void add() {
   
        String str = null;
        str.toString();
        System.out.println("1 + 0 =" + (1 + 0));
    }

    //减法
    @Check
    public void sub() {
   
        System.out.println("1 - 0 =" + (1 - 0));
    }

    //乘法
    @Check
    public void mul() {
   
        System.out.println("1 * 0 =" + (1 * 0));
    }

    //除法
    @Check
    public void div() {
   
        System.out.println("1 / 0 =" + (1 / 0));
    }

    public void show() {
   
        System.out.println("永无bug");
    }

}

package cn.itcast.annotation;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 简单的测试框架
 *
 * 当主方法执行后,会自动自行被检测的所有方法(加了Check注解的方法),判断方法是否有异常,记录到文件中
 */
public class TestCheck {
   

    public static void main(String[] args) throws IOException {
   
        //1.创建计算器对象
        Calculator c = new Calculator();
        //2.获取字节码文件对象
        Class cls = c.getClass();
        //3.获取所有方法
        Method[] methods = cls.getMethods();

        int number = 0; //出现异常的次数
        BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt"));


        for (Method method : methods) {
   
            //4.判断方法上是否有Check注解
            if (method.isAnnotationPresent(Check.class)) {
   
                //5.有,执行
                try {
   
                    method.invoke(c);
                } catch (Exception e) {
   
                    //6.捕获异常

                    //记录到文件中
                    number++;

                    bw.write(method.getName() + " 方法出异常了");
                    bw.newLine();
                    bw.write("异常的名称:" + e.getCause().getClass().getSimpleName());
                    bw.newLine();
                    bw.write("异常的原因:" + e.getCause().getMessage());
                    bw.newLine();
                    bw.write("---------------------");
                    bw.newLine();

                }
            }
        }

        bw.write("本次测试一共出现 " + number + " 次异常");
        bw.flush();
        bw.close();
    }
}

JavaWeb

  1. 什么是JavaWeb?
    • 使用Java语言开发互联网项目,用Java语言开发网站
      2.内容
    1. 数据库
    2. 网页前端
    3. web核心技术
    4. 旅游管理系统

数据库

数据库的基本概念

1. 数据库的英文单词: DataBases 简称:DB
2. 什么是数据库 
	* 用于存储和管理数据的仓库
3.数据库特点 
	1. 持久化存储数据,数据库就是一个文件系统
	2. 方便存储和管理数据
	3. 使用了统一的方式操作数据库 -- SQL
  4.常见的数据库软件
  	* 参见<<MySQL基础.pdf>>

MySQL数据库软件

	1.安装
	2.卸载
			1.去MySQL的安装目录找到my.ini
		* 复制 datadir=D:\Environment\mysql-5.7.19\data\
			
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值