java知识点

java必会知识 专栏收录该内容
1 篇文章 0 订阅
  • 必会知识点

是什么 在哪里用,怎么用,遇到了什么问题

绿色:看到问题想到代码
黄色:知道理论不知道代码
红色:没有听过
一.Corejava 【】
1.jdk ,jre,jvm的区别:
jdk:Java 开发工具包(JRE+编译工具)
jre:Java 运行时环境(JVM+类库)
jvm:Java 虚拟机
2.环境变量的解释:
目的:在任意路径下能够直接执行相关命令。
原理:在命令行中执行某个命令时,首先在当前路径下查找,如果找不到则到PATH 配置的各个路径下查找。
3.声明数组的三种方式
int[] nums = new int[5]; //初始化为默认值
int[] nums = {1,2,3,4,5}; //初始化为{}中指定的值,静态初始化
int[] nums = new int[] {1,2,3,4,5};//初始化为{}中指定的值,静态初始化
4.java标识符的命名规则
(1)以字母、数字、_或$组成
(2)不能以数字开头
(3)不能使用 java 的关键字和保留字
(4) 标识符的长度没有限制
(5) Java 是大小写敏感的,所有标识符区分大小写
5.java的注释有几种
单行注释 //、多行注释//、文档注释/ /
6.java注释的应用场景
一般类、方法、非私有变量 用/
* */,这样他人开发用到jar中的该类时,调用它的人看到,生产doc文档时也能被生产出来,内部私有变量、方法里的语句注释用// 自己知道就行

注释格式:
1、单行(single-line)注释:“//……”
2、块(block)注释:“/*……*/”
3、文档注释:“/**……*/”
4、javadoc 注释标签语法
@author  对类的说明标明开发该类模块的作者
@version  对类的说明标明该类模块的版本
@see    对类、属性、方法的说明参考转向,也就是相关主题
@param   对方法的说明对方法中某参数的说明
@return  对方法的说明对方法返回值的说明
@exception 对方法的说明对方法可能抛出的异常进行说明

Java SE5内置了三种标准注解:
@Override,表示当前的方法定义将覆盖超类中的方法。
@Deprecated,使用了注解为它的元素编译器将发出警告,因为注解@Deprecated是不赞成使用的代码,被弃用的代码。
@SuppressWarnings,关闭不当编译器警告信息。
7.java的关键字有多少种 ? 50种
8.java的保留字有哪些? Java 保留了 const 和 goto 关键字
9.java的数据类型分为哪些?
基本数据类型 { 数值型{ 整数类型(byte,short,int,long) 浮点类型(float,double) } 字符型(char) 布尔型(boolean)}
引用数据类型{类(class) 接口(interface) 数组 }
4类8种

10.说出5个String的常用方法?
(1)替换字符串 replace();
(2)分割字符串 split(“regex”);
(3)equals 字符串比较
(4)length() 获取长度、
(5) getBytes() 将一个字符串转换成字节数组
(6)toCharArray()将一个字符串转换成字符数组
(7)equalsIgnoreCase(String) 忽略大小写的比较两个字符串的内容是否一模一样
(8)contains(String)判断一个字符串里面是否包含指定的内容
(9)startsWith(String)判断一个字符串是否以指定的内容开头
(10)endsWith(String)判断一个字符串是否以指定的内容结尾
(11)toUpperCase()将一个字符串全部转换成大写
(12)toLowerCase() 将一个字符串全部转换成小写
11.java的double类型占用多少位? 64/8
12.常量的命名规则
(1)常量是使用 final 修饰的存储单元
(2)全部为大写字母表示
12.100%3的结果? 1
13.关系运算有什么?
== != >< >= <=
14.关系运算符的结果为什么? true false
15.逻辑短路与和逻辑短路或的解释
对于|| ,只要有一个操作数为true,则结果为true
对于&& ,只要有一个操作数为false,则结果为false
16.说明for循环的循环流程
四个部分:初始化部分 A、循环条件 B、循环体 D、迭代部分 C
for(int i=0;i<20;i++)
{
循环体

}
执行步骤是:
1、i=0 初始化初值;
2、 进行条件判断i是否<20,如果条件为真,则继续执行;
3、执行循环体的代码;
4、i++ 变量i自增一次;
5、回到第2步,一直循环,直到第2步条件为假时, 退出循环,结束。
17.break和continue的作用
break:终止直接包含的循环体,结束(本层)循环
continue:终止本次循环,直接执行循环的下一次
18.“==”和equals的区别
如果比较的是数值,那么比较的就是数值的大小,如果比较的类,那么比较的就是内存地址
equals方法,如果比较的是一个自定义的类,如果不重写equals方法,那么他将使用Object的equals方法
而 Object的equals方法使用
做比较的,所以比较的是内存地址。如果想让他比较内容的话,那么就要重写equals方法
19.说出五个jdk1.5的新特性
jdk5.0中出现的新特性 泛型(Generics) 增强的“for”循环(Enhanced For loop) 自动装箱/ 自动拆箱(Autoboxing/unboxing) 类型安全的枚举(Type safe enums) 静态导入(Static import) 可变参数(Var args)

20.重写
重写:在不同类中(子父类中)。
方法声明相同(返回类型,方法名,参数列表均相同)。
重写需要注意:
**子类方法的访问权限要大于等于父类方法的访问权限。
**静态只能重写静态。但是这种情况一般不会出现。
21.什么是重载?
重载:在同一类中。方法名相同,参数列表不同。重载可以改变返回类型
22.Integer的取值范围
Integer的取值范围(-231~231-1)
最小值为 -2^31,最大值为 2^31-1
23.Integer a=128; Integer b=128;输出a==b的结果是什么? false
24.byte的取值范围 -128 至 127
25.说出十进制和二进制的转换技巧?
任意进制转 10(系数*基数的权次幂) 10 进行转任意进制 (除奇倒取余)
快速转换法:8421 码 (128 64 32 16 8 4 2 1) 100000

26.static可修饰什么?
属性,方法,代码块
27.final可以修饰什么?
final 可以修饰: 类 变量 方法
final修饰的类不能被继承。
final修饰的方法不能被重写。
final修饰的变量是一个常量。只能被赋值一次。
28.说说为什么自定义一个类,使用toString输出的不是,这个类的赋值信息?
因为没有重写object的tostring()方法
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}

29.java的访问修饰符有哪些?
public > protected >default> private
30.为什么静态方法,不能输出普通变量?
因为静态方法是类级别的,随着类的加载而加载,而普通变量要和实例化的那个对象绑定在一起才能够使用,所以就产生了矛盾(先后顺序)
public void test6(){//后有
String a = “123”;
}
public static void test7(){//先有

}

31.switch的表达式里面可以放什么数据类型?
java 1.6(包括)以前,只是支持等价成int 基本类型的数据:byte ,short,char,int(其他的都不可以)。 1.7加入的新特性可以支持String类型的数据。
32.int a =i++和 int b =++i有什么区别?
int a =i++ 先赋值给a,i再自增
int b =++i i先自增,再赋值给
前缀形式:
int i = 10;
int a = ++ i; //等同于 i++; int a = i; 所以 a=11, i= 11
后缀形式:
int j = 10;
int b = j++; //等同于 int b = j; j++; 所以 b=10,j = 11
33.为什么String有length()?
因为string是用char类型的数组实现的,char里边有length()属性,所以string可以调用length();
34.类,方法,常量,包名的命名规则?
1、类名:首字母最好大写。
2、类名:如果有多个单词可以使用_区分,或者:AirBace;第二个单词大写。
3、类名、方法、变量、常量名:只能是字母、下划线、美元$符号开头。
4、方法名首字母小写,如果有多个单词可以使用_区分,或者:airBace;第二个单词大写。
5、变量名跟第4项一样。
6、常量名:全部大写,必须赋值、最好static、final,也就是说定义为静态的、最终的
35.1-100的偶数和? 2550
int sum = 0;
for (int i = 1; i <= 100; i++) {
if (i%2==0) {
sum+=i;
}
}
System.out.println(sum); //2550
36. 定义一个map,添加内容(“1”,“2”)(“1”,“3”)(“2”,“4”),循环输出键值对?
Map<String,String> map = new HashMap<String,String>();
map.put(“1”,“2”);
map.put(“1”,“3”);
map.put(“2”,“4”);
Set<Entry<String,String>> entrySet = map.entrySet();
for (Entry<String, String> entry : entrySet) {
System.out.println(“键”+entry.getKey()+"=值"+entry.getValue());
}
37.创建5个学生里面有姓名和年龄,使用Arrays.sort()方法对年龄进行排序,然后输出,并分析程序执行效果?
public static void main(String[] args) {
List list1 = new ArrayList();
list1.add(new student(“张三”,20));
list1.add(new student(“李四”,15));
list1.add(new student(“张三”,18));
list1.add(new student(“王五”,23));

	    Set<student> set = new HashSet<student>();
	    set.addAll(list1);
	  Collections.sort(list1);
	    System.out.println(set);
}

39.编写代码比较两个自定义的类是否相等?
1、如果说两个对象的判断可以使用 equals,或者 ==。
2、如果判断对象是否某个类 可以使用 instanceof ,isInstance
3、如果两个类的比较 可以使用 isAssignableFrom,但只能得到是否是自身或者子类的结果,不能完全确定是否相同。
public static void main(String[] args) {

    String s1 = new String("javaisland");//测试两个对象是否相同
    System.out.println(s1 instanceof String); // true

    String s2 = new String("javaisland");//测试是否对象属于某个类
    System.out.println(String.class.isInstance(s2)); // true

    System.out.println(ArrayList.class.isAssignableFrom(Object.class)); // false
    System.out.println(Object.class.isAssignableFrom(ArrayList.class)); // true
 }

40.封装一个静态方法(功能自定义)
private static void ceShi(){
System.out.println(“标题”);}
41.写一个switch语句,根据相应的数字输出星期
public static void main(String[] args) {
int i=0;
switch (i) {
case 0:
System.out.println(“星期一”);
break;
case 1:
System.out.println(“星期二”);
break;
case 2:
System.out.println(“星期三”);
break;
case 3:
System.out.println(“星期四”);
break;
case 4:
System.out.println(“星期五”);
break;
case 5:
System.out.println(“星期六”);
break;
case 6:
System.out.println(“星期日”);
break;
default:
}
}
42.对String a=“1,5,1,3,2,7”,排序并且去重复?
String a=“1,5,1,3,2,7”;
String[] split = a.split(",");
List list = Arrays.asList(split);
//TreeSet以升序保存对象,所以TreeSet中保存的对象比较能够比较大小
TreeSet treeSet = new TreeSet();
treeSet.addAll(list);
System.out.println(list);
System.out.println(treeSet);
43.自定义对象如何去重
public static void main(String[] args) {

	  List<student> list1 = new ArrayList<student>();
	  list1.add(new student("张三",20));
	  list1.add(new student("李四",15));
	  list1.add(new student("张三",18));
	  list1.add(new student("王五",23));
	  
	    Set<student> set = new HashSet<student>();
	    set.addAll(list1);
	    System.out.println(set);
}

44.自定义对象如何排序
//student类,并实现Comparable接口
class Student implements Comparable{
//姓名,成绩,年龄三个变量
private String name;
private int score;
private int age;

//构造方法
public Student() {}
public Student(String name, int score,int age) {
    this.name = name;
    this.score = score;
    this.age = age;
}

//get set 方法
public String getName() {
    return this.name;
}
public int getScore() {
    return this.score;
}
public int getAge(){
    return this.age;
}
public void setName(String name) {
    this.name = name;
}
public void setScore(int score) {
    this.score = score;
}
public void setAge(int age){
    this.age = age;
}

//重写toString方法
public String toString(){
    return "姓名:"+this.getName()+"\t成绩:"+this.getScore()+"\t年龄:"+this.getAge();
}

@Override
//实现Comparable的compareTo方法
public int compareTo(Student stu) {
    // TODO Auto-generated method stub
    return this.getScore()-stu.getScore();
}

}

public class SortList {
public static void main(String [] args){
//集合的定义
List list = new ArrayList();
//学生对象的加入
list.add(new Student(“张三”,89,20));
list.add(new Student(“李四”,60,21));
list.add(new Student(“路人”,99,15));
//排序
Collections.sort(list);
//遍历输出
for(Student stu : list){
System.out.println(stu.toString());
}
}
}
45.定义一个List集合,集合里面放多个自定义的对象,如何完成去重?
public static void main(String[] args) {
List list1 = new ArrayList();
list1.add(new student(“张三”,20));
list1.add(new student(“李四”,15));
list1.add(new student(“张三”,18));
list1.add(new student(“王五”,23));
Set set = new HashSet();
set.addAll(list1);
System.out.println(set);
}
46.如何创建线程?
第一种方法:继承Thread类
第二种方法:实现Runnable接口
第三种方法:实现callable接口
public class MyThread implements Runnable{

public static void main(String[] args) {
	MyThread t = new MyThread();
	Thread thread = new Thread(t);
	thread.start();
}

@Override
public void run() {
	// TODO Auto-generated method stub
	System.out.println("运行");
}

}
47.反射创建对象,反射获取,属性,方法,泛型
/*

  • 反射:可以在类的运行期间,获取到类的信息(属性 , 方法, 注解, 泛型等等)
  • 反射提高了程序的扩展性()
  • //反射的第一步,都是要获取到Class对象---->>类的信息
  • /
    public class StudentFanShe {
    public void lean(){
    System.out.println(“在学习”);
    }
    public void add(String a){
    System.out.println(“在学习”);
    }
    public int status;
    private String name;
    private int age;
    public StudentFanShe(String name, int age) {
    super();
    this.name = name;
    this.age = age;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
    @Override
    public String toString() {
    return “StudentFanShe [name=” + name + “, age=” + age + “]”;
    }
    public StudentFanShe(){
    super();
    }
    /
    • 三种方式获取到Class
    /
    @Test
    public void getClassTest(){
    //1.类名.class student.class
    //2.对象名的getClass
    StudentFanShe studentFanShe = new StudentFanShe();
    Class<? extends StudentFanShe> class1 = studentFanShe.getClass();
    //3.Class.forName();
    String name = studentFanShe.getClass().getName();
    try {
    Class<?> forName = Class.forName(name);
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    /
    • JunitTest这个测试工具,要求

    • 1.写的测试方法,访问修饰符必须是public的,返回值必须是void

    • 2.Test写反射的时候,只能有默认的构造方法,如果有多个构造方法就会报,

    • java.lang.IllegalArgumentException: Test class can only have one constructor
      */
      @Test
      public void getClassInfo(){
      //1.
      // Class<? extends Class> class1 = Student.class.getClass();
      StudentFanShe studentFanShe = new StudentFanShe();
      Class<? extends StudentFanShe> class1 = studentFanShe.getClass();
      }
      //获取构造方法
      public static void main(String[] args) {
      //1.
      // Class<? extends Class> class1 = Student.class.getClass();
      StudentFanShe studentFanShe = new StudentFanShe();
      Class<? extends StudentFanShe> class1 = studentFanShe.getClass();
      //获取构造方法
      Constructor<?>[] constructors = class1.getConstructors();
      for (Constructor<?> constructor : constructors) {
      Class<?>[] parameterTypes = constructor.getParameterTypes();
      for (Class<?> class2 : parameterTypes) {
      System.out.println(“constructor parameter =”+parameterTypes);
      }
      }
      //普通方法,调用一个方法
      Method[] methods = class1.getMethods();//利用得到的Class对象的自审,返回方法对象集合
      for (Method method : methods) {

      if ("lean".equals(method.getName())) {
      	StudentFanShe newInstance;
      	try {
      		newInstance = StudentFanShe.class.newInstance();
      		System.out.println("调用lean方法  "+method.invoke(newInstance,null));
      	} catch (Exception e) {
      		// TODO Auto-generated catch block
      		e.printStackTrace();
      	} 
      }
      

      }
      //获取公共的属性 用public修饰的属性
      Field[] fields = class1.getFields();//利用得到的Class对象的自审,返回属性对象集合
      for (Field field : fields) {
      System.out.println(“field for”);
      try {
      StudentFanShe newInstance = StudentFanShe.class.newInstance();
      Class<?> type = field.getType();
      System.out.println("字符的类型 "+type);
      field.set(newInstance, 1);
      System.out.println(“newInstance.status=”+newInstance.status);
      } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
      System.out.println(“public修饰的属性”+field.getName());
      }
      //获取私有的属性[获取到全部的属性包括私有的属性]Field
      Field[] fields1 = class1.getDeclaredFields();
      //获取注解Annotation
      Annotation[] annotations = class1.getAnnotations();
      //获取泛型Generic, 获取父类泛型是,子类必须要new
      Teacher teacher = new Teacher();
      Class<? extends Teacher> class2 = teacher.getClass();
      Class<?> superclass = class2.getSuperclass();
      Type genericSuperclass = class2.getGenericSuperclass();
      System.out.println(“父类泛型”+genericSuperclass);
      System.out.println(“父类”+superclass.getName());
      }
      }
      class Teacher extends A1{
      }
      class A1{
      }
      48.什么是泛型,泛型的作用?
      java 泛型是java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
      49.什么是树,为什么有红黑树?
      树状图是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合
      红黑树是一种比较宽泛化的平衡树,没AVL的平衡要求高,同时他的插入删除都能在O(lgN)的时间内完成,而且对于其性质的维护,插入至多只需要进行2次旋转就可以完成,对于删除,至多只需要三次就可以完成,所以其统计性能要比AVL树好
      50.数组结构的特点是什么?
      概念:同一种数据类型的集合。
      好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
      51.list集合的特点
      List 中的元素可以重复,有序,List 有索引(下标)的概念,可以有null元素
      52.set集合的特点
      Set 中的元素不能重复,无序,Set 没有索引的概念,可以有null元素
      对于 Set 表示的集合,通常是遍历操作,没有 get()和 set()方法
      53.什么是封装,用代码举例子?
      私有化属性,提供公共的get和set方法

54.什么是多态,用代码举例子?

55.java异常的体系结构?
Throwable:
|–Error:重大的问题,我们处理不了。也不需要编写代码处理。比如说内存溢出。
|–Exception:一般性的错误,是需要我们编写代码进行处理的。
|–RuntimeException:运行时异常,这个我们也不需要处理。
其实就是为了让他在运行时出问题,然后我们回来修改代码。
|-检查异常/编译异常
56.代码遇到异常,没有进行处理,后面的代码还能执行吗? 不能
57.代码遇到异常要想让后面的代码,继续运行,应该怎么办? try…catch…finally
58. 如何抛出一个编译异常
public class exception{
@Test
public void test() throws LoginException{
A a = new A();
a.setAge(20);
System.out.println(a);
try {
a.ji(0);
} catch (java.lang.Exception e) {
e.printStackTrace();
throw new LoginException();
}
System.out.println(“我运行了”);
}
}
class A{
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return “A [age=” + age + “]”;
}
public void ji(int b){
System.out.println(age/b);
}
}
59.如何抛异常
throw Exception用于抛出异常
boolean testEx2() throws Exception{
boolean ret = true;
int b=12;
int c;
for (int i=2;i>=-2;i–){
c=b/i;
System.out.println(“i=”+i);
}
return true;
}
60.使用io流,创建一个文件,读取一个文件
public static void main(String[] args){
String fileDir=“D:”+File.separator+“hepuwen”;
String fileString = “www.txt”;
File file = new File(fileDir);
System.out.println(fileDir);
OutputStream outputStream =null;
try{
if (!file.isDirectory()) {
file.mkdirs();
}
String filepathString = fileDir+File.separator+fileString;
File file2 = new File(filepathString);
boolean createNewFile = file2.createNewFile();
//进去读出来写
outputStream = new FileOutputStream(file2);
String string = “学习是你快乐!”;
outputStream.write(string.getBytes());
}catch (Exception e) {
e.printStackTrace();
}finally{
try {
outputStream.close();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
61.之前写的HelloA和HelloB的代码执行流程必须搞明白
HelloB是HelloA的子类
静态代码块>代码块>构造方法>静态方法>普通方法
static a
static b
a的代码块
a的有参构造方法
b的代码块
b的有参构造方法zhangsan
62.“java学习主线”的思维导图能手画出来

63.如何“学习一个新知识”的思维导图,能说出来

64.java实例化对象有几种方式
1.new对象new User();
2.反射
3.克隆
4.序列化
65.如何知道一个对象是否被实例化
new User()
二.javaweb
1.什么是servlet
Servlet是一种Web交互规范
2.如何自定义一个servlet
两种方法
1.实现Servlet接口
2.继承HttpServlet抽象类(最好使用)
3.什么是http协议
HTTP是超文本传输协议.是一种应用层协议,由W3C制定,它定义了浏览器与Web服务器之间通讯的过程及数据格式
4.http的请求和响应的构成(看文章https://www.cnblogs.com/imyalost/p/5629606.html)
http协议用于客户端和服务器之间的通信,请求访问资源的一方称为客户端,而提供资源响应的一方称为服务器端。
下面就是客户端和服务端之间简单的通信过程
请求的构成:
1)请求方法URI协议/版本
2)请求头(Request Header)
3)请求正文
响应的构成
HTTP响应与HTTP请求相似,HTTP响应也由3个部分构成:
1)状态行
2)响应头
3)响应正文
5.servlet如何获取参数(从浏览器传递参数—》web服务器接受)
① 方法一:String str=request.getParameter(“参数名称”)方法可以获得参数。
1.如果参数名称与实际参数不一致,会获得null(不报错);
2.在使用表单提交数据时,如果用户没有填写任何的值,会获得空字符串”.”

② 方法二:String[] str=request.getParameterValues(“参数名称”)
1.当有多个参数且名称相同时,使用该方法
注意事项 : getParameterValues方法也可以用于只有一个参数的情况
6.servlet如何响应一个页面给前台
resp.setCharacterEncoding(“GBK”);
resp.getWriter().write(“响应给页面”);
7.web服务(tomcat)可以处理的资源
8.jsp和servlet的区别
JSP与Servlet主要有两方面的不同:
编译:JSP修改后可以立即看到结果,不需要编译;而Servelt缺需要编译。
转换:JSP是动态网页开发技术,是运行在服务器端的脚本语言,而Servlet是web服务器端编程技术。所以JSP运行时就是转换为Servlet, 也就是java程序来执行。
9.jsp是如何被运行的
第一步,客户端通过浏览器发送指定页面的请求(jsp文件)
第二步,web容器读取jsp文件
第三步,被读取文件转化成java文件,准确的说应该是一个servlet源文件
第四步,web容器将产生的代码进行编译,得到类文件
第五步,web容器加载编译后的代码,并执行
第六步,把执行结果响应至客户端
10.什么是jsp页面的指令 <%@指令名字 属性名=属性值 %> //page include taglib
11.什么是转发,什么是重定向,用代码如何写
转发:1.浏览器的地址栏不发生变化 2.是一个请求的延续可以传递request数据 3.在本服务器
【req.getRequestDispatcher(“index.jsp”).forward(req, resp);//转发是一个请求的延续】

重定向:1.浏览器的地址栏发生变化 2.可以重定向到其他服务器(跨域)
3,http://www.jd.com?name="123"以问号的方式传递参数,用request.getParameter(“1510C”)
【resp.sendRedirect(“index.jsp?1510C=11111”);//重定向的地址】

1.转发在服务器端完成的;重定向是在客户端完成的
★2.转发的速度快;重定向速度慢
3.转发的是同一次请求;重定向是两次不同请求
★4.转发不会执行转发后的代码;重定向会执行重定向之后的代码
★5.转发地址栏没有变化;重定向地址栏有变化
6.转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成

12.什么时候用转发,什么时候用重定向?
转发:是在本服务器内跳转的
重定向:跳转到其他服务器
13.jsp页面如何使用jstl标签 <%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%> isELIgnored=“false”
14.jsp的九大内置对象和四大作用域(他们的用途是什么,看以前录屏或百度搜索)
jsp的九大内置对象
输入/输出对象: request response out
作用域通信对象: session application pageContext
Servlet 对象: page config
错误对象: exception
四个作用域从大到小:
Application > session > request > page
application:全局作用范围,整个应用程序共享.生命周期为:应用程序启动到停止。
session:会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态。
request:请求作用域,就是客户端的一次请求。
page:一个JSP页面。

15.为什么get请求传中文的时候乱码 (http://www.zuidaima.com/blog/3466863142800384.htm)
1、通用get请求乱码问题
针对Get方式的乱码问题,由于参数是通过URL传递的,所以上面通过request设置的编码格式是不起作用的,此时可以在每次发生请求之前对URL进行编码:例如:Location.href="/encodeURI"(“http://localhost/test/s?name=中文&sex=女”);
当然也有更简便的方法,那就是在服务器端配置URL编码格式:
修改tomcat的配置文件server.xml:

只需增加 URIEncoding=“UTF-8” 这一句,然后重启tomcat即可。
2、通用post请求乱码问题
针对Post方式提交的请求如果出现乱码,可以每次在request解析数据时设置编码格式:
request.setCharacterEncoding(“utf-8”);
也可以使用编码过滤器来解决,最常用的方法是使用spring提供的编码过滤器:
在Web.xml中增加如下配置(要注意的是它的位置一定要是第一个执行的过滤器):

charsetFilter
org.springframework.web.filter.CharacterEncodingFilter

encoding
UTF-8


forceEncoding
true

该过滤器要做的其实就是强制为所有请求和响应设置编码格式:
request.setCharacterEncoding(“utf-8”);
response.setCharacterEncoding(“utf-8”);
3.Eclipse使用Maven tomcat:run命令启动web项目时修改uriEncoding编码
在eclipse开发调试时,get请求包含中文时会乱码,需要设置tomat的uriEncoding,我们知道外置的tomcat,修改tomcat下conf下的server.xml,那么maven内置的tomcat怎么设置呢?
测试于:Maven 3.0.5, eclipse-jee-indigo-SR2-win32
设置方法同设置端口方法,直接在上述文章中的Goals值中的tomcat:run前边加上-Dmaven.tomcat.uriEncoding=UTF-8即可,最终效果为:
-Dmaven.tomcat.uriEncoding=UTF-8 tomcat:run
16.servlet的生命周期,用代码测试一下
第一,加载并实例化,
第二,初始化,
第三,服务,
第四,销毁。
容器启动的时候,会加载servlet的class,并new出这个对象,然后,当用户请求这个servlet的时候,容器会调用init方法初始化这个servlet,这也是整个生命周期中只会调用一次的方法,然后,会调用service方法,由这个方法调用doGet或doPost方法来响应用户,然后,容器在可用资源紧张或是长期没有对Servlet发出请求的情况下,会销毁这个servlet。
17.servlet默认是单例还是原型的呀,用代码如何测试
单例,
18.什么是相对路径,什么是绝对路径,举例子
相对路径
以 ”/” 开头的路径
注意: 点击访问a2.jsp
相对路径容易出错,在实际开发中建议使用绝对路径
绝对路径
以 “/” 开头
案例:相对、绝对路径对比
应用名web05_path中的WebRoot文件夹下有a2.jsp和app01文件夹,而app01文件夹中有a1.jsp。
a1.jsp页面:

a1的内容……
使用相对路径
访问a2.jsp
使用绝对路径:硬编码
访问a2.jsp
使用绝对路径:方法
访问a2.jsp a2.jsp页面 <!—a2.jsp --> a2的内容……
使用相对路径
访问a1.jsp
使用绝对路径:硬编码
访问a1.jsp
使用绝对路径:方法
访问a1.jsp

1.绝对路径:譬如A要看B下载的电影,B告诉他,那部电影是保存在“E:\视频\我的电影\”目录下,像这种
直接指明了文件所在的盘符和所在具体位置的完整路径,即为绝对路径。   
我们可以根据该路径明确地找到所对应的文件(夹)。而对于“网上邻居”共享的文件(夹),其绝对路
径信息应包括“\计算机名\共享文件夹名\文件路径”,比如路径“\server\网友世界\备份\setup.rar”,
则是一台名为server的计算机共享名“网友世界”下的“\备份\setup.rar”文件。除了在资源管理器地址栏
查看,文件的属性窗口也可以查看这些地址信息。   
2.相对路径 :如果A看到B已经打开了E分区窗口,这时A只需告诉B,他的电脑是保存在“视频\我的电影”目录下。像这种舍去磁盘盘符、计算机名等信息,以当前文件夹为根目录的路径,即为相对路径。
另外,做过网页的朋友都知道,一般我们在制作网页文件链接、设计程序使用的图片时,使用的都是文件的相对路径信息。这样做的目的在于防止因为网页和程序文件存储路径变化,而造成的网页不正常显示、程序不正常运行现象。
举个例子,制作网页的存储根文件夹是“D:\html”、图片路径是“D:\html\pic”,当我们在“D:\html”里存储的网页文件里插入“D:\html\pic\xxx.jpg”的图片,使用的路径只需是“pic\xxx.jpg”即可。这样,当我们把“D:\html”文件夹移动到“E:\”甚至是“C:\WINDOWS\Help”比较深的目录,打开html文件夹的网页文件仍然会正常显示。   
3.系统路径   系统路径是指一些以%SystemRoot%(以“%名称%”表示)开头的路径。它的作用是告诉系统,我要定位的文件(夹)在系统分区Windows目录下。比如你要进入Windows下的system32文件夹,只而在IE浏览器的地址栏,或“运行”对话框中输入“%SystemRoot%\system32”,回车即可,而不必注明系统分区是C盘还是D盘,因为系统路径会自动定位查找到系统分区的。
再说的直白一点,它的作用其实就相当于一个绝对路径:X:\Windows(其中X为系统分区盘符)。   下面,我们以安装在C盘并使用默认系统文件夹、当前用户名是Administrator的Windows XP系统为例,罗列几个常用的系统路径所对应的绝对路径。   
系统路径含义系统路径(不区分大小写)对应的绝对路径   当前系统盘符%systemdrive%或%HOMEDRIVE%C:\   当前系统目录%systemroot%或%Windir%C:\WINDOWS  当前用户文件夹%UserProfile%或%HOMEPATH%C:\Documents and Settings\Administrator   所有用户文件夹%AllUsersProfile%C:\Documents and Settings\All Users   临时文件夹1%temp%C:\Documents and Settings\Administrator\Local Settings\Temp   临时文件夹2%SystemRoot%\TEMPC:\WINDOWS\Temp 程序文件夹%ProgramFiles%C:\Program Files
19.cookie和session的区别【1.为什么有这个技术 】
之所以有cookie和seesion,是因为http是一个无状态的协议,不能记录用户的行为。为了记录用户的行为,就发明了cookie和seesion ,cookie是存放在客户端的浏览器中(不同的浏览器不共享cookie),cookie分为会话cookie和持久化cookie, 会话cookie里面包含sessionid,用来和服务器的seesion交互,持久化cookie,可以设置有效时间,而session是存放在服务端的,他的作用范围是一次会话。
20.演示cookie的获取
综述:Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
1.获取Cookie的值:获取Cookie值的标准代码格为:myCookie.Values[“auth”];
上句代码可以获取名为myCookie的Cookie对象键名为auth的键值。如果不存在,则返回null。
DateTime now=new DateTime.Now;
Response.Cookies[“Info”].Expires = DateTime.Now.AddDays(1);
//设定Cookie过期时间下面的代码示例演示删除应用程序中所有可用 Cookie 的一种方法
2.代码如下:
HttpCookie aCookie;
string cookieName;
int limit = Request.Cookies.Count;
for (int i = 0; i < limit; i++)
{
cookieName = Request.Cookies[i].Name;
aCookie = new HttpCookie(cookieName);
aCookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(aCookie);
}
3.以上就是Java程序开发中涉及到的获取cookie方法
21.演示在浏览器种cookie
public class ServletTwo extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// TODO Auto-generated method stub
resp.setCharacterEncoding(“GBK”);
req.setCharacterEncoding(“GBK”);
//种cookie
Cookie cookie2 = new Cookie(“1510C”, “123”);
cookie2.setMaxAge(10000);
resp.addCookie(cookie2);
Cookie[] cookies = req.getCookies();
//获取cookie
//1D966ED6CD14C732348166FCB19C2F64
for (Cookie cookie : cookies) {
System.out.println(“name=”+cookie.getName()+" value="+cookie.getValue());
}
}
22.如何自定义一个过滤器
web应用(自己写的项目)可以在web.xml配置多个过滤器,执行的先后顺序和配置的先后顺序一致
23.web应用(自己写的项目)可以在web.xml配置多个过滤器,执行的先后顺序和配置的先后顺序一致
24.【spring定义ContextLoaderListener用来加载spring的配置文件】8种,监听容器产生的事件 (request,session,servletContext,)
25.Filter多会进行实例化呢? 在web容器启动的时候就进行实例化
26.如何自定义一个监听器
27.servlet有线程安全问题吗,为什么
Servlet容器默认采用单实例多线程的方式来处理请求,默认是非线程安全的
servlet是单列的,对于所有请求都使用一个实例,所以如果有全局变量被多线程使用的时候,就会出现线程安全问题
28、jsp页面无法解析EL表达式如何处理
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8” isELIgnored=“false”%>
isELIgnored="false"不忽略el表达式

29.EL表达式的作用
从作用域中取值 ${pageScope.name} < ${requseScope.name} < ${sessionScope.name}< ${applicationScope.name}

30如何防止表单的重复提交
网络延时
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交。
重新刷新
表单提交后用户点击【刷新】按钮导致表单重复提交
点击浏览器的【后退】按钮回退到表单页面后进行再次提交
用户提交表单后,点击浏览器的【后退】按钮回退到表单页面后进行再次提交
解决方案
使用javascript 解决
既然存在上述所说的表单重复提交问题,那么我们就要想办法解决,比较常用的方法是采用JavaScript来防止表单重复提交,具体做法如下:
修改form.jsp页面,添加如下的JavaScript代码来防止表单重复提交
代码:
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

Form表单 用户名: 除了用这种方式之外,经常见的另一种方式就是表单提交之后,将提交按钮设置为不可用,让用户没有机会点击第二次提交按钮,代码如下:

function dosubmit(){
//获取表单提交按钮
var btnSubmit = document.getElementById(“submit”);
//将表单提交按钮设置为不可用,这样就可以避免用户再次点击提交按钮
btnSubmit.disabled= “disabled”;
//返回true让表单可以正常提交
return true;
}

使用后端提交解决
对于【场景二】和【场景三】导致表单重复提交的问题,既然客户端无法解决,那么就在服务器端解决,在服务器端解决就需要用到session了。
具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
在下列情况下,服务器程序将拒绝处理用户提交的表单请求:
1.存储Session域中的Token(令牌)与表单提交的Token(令牌)不同。
2.当前用户的Session中不存在Token(令牌)。
3.用户提交的表单数据中没有Token(令牌)。
转发代码:
@WebServlet("/ForwardServlet")
public class ForwardServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().setAttribute(“sesionToken”, TokenUtils.getToken());
req.getRequestDispatcher(“form.jsp”).forward(req, resp);
}
}
转发页面:
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

Form表单 用户名: 后端Java代码: @WebServlet("/DoFormServlet") public class DoFormServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); boolean flag = isFlag(req); if (!flag) { resp.getWriter().write("已经提交..."); System.out.println("数据已经提交了.."); return; } String userName = req.getParameter("userName"); try { Thread.sleep(300); } catch (Exception e) { // TODO: handle exception } System.out.println("往数据库插入数据...." + userName); resp.getWriter().write("success"); }
public boolean isFlag(HttpServletRequest request) {
	HttpSession session = request.getSession();
	String sesionToken = (String) session.getAttribute("sesionToken");
	String token = request.getParameter("token");
	if (!(token.equals(sesionToken))) {
		return false;
	}
	session.removeAttribute("sesionToken");
	return true;
}

}

Filter 也称之为过滤器,它是 Servlet 技术中最实用的技术,Web 开发人员通过 Filter 技术,对 web 服务器管理的所有 web 资源:例如 Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现 URL 级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
它主要用于对用户请求进行预处理,也可以对 HttpServletResponse 进行后处理。使用 Filter 的完整流程:Filter 对用户请求进行预处理,接着将请求交给 Servlet 进行处理并生成响应,最后 Filter 再对服务器响应进行后处理。

三.Jquery
js也是一个面向对象的语言: 属性和方法组成
js的对象如何表示:就是json对象
success: function(data){
$.messager.progress(‘close’); // 如果提交成功则隐藏进度条
console.info(“data=”+data);
var dataJson = eval("("+data+")");
console.info(“dataJson=”+dataJson);
//js的对象,其实就是json数据
if(dataJson.code==200){
/* location.href="/index.jsp"; */
}else{
$.messager.alert(‘提示’,dataJson.msg);
}

			}

1.什么是jquery
jQuery是一个兼容多浏览器的javascript框架,它是轻量级的js库,jQuery能够使用户的html页面保持代码和html内容分离
JavaScript的一个框架,轻量级的js库,封装了很多js方法,可以使客户端html页保持代码和内容分离,也就是不用在html里插入一堆js来调用命令,只需要定义id即可。用jQuery的前提是要先引用一个由jQuery的文件。

Jquery是一个封装了js的前端框架。解决了大部分js浏览器的兼容问题。	

Jquery利用选择器获取页面的元素,将其封装成一个Jquery对象,调用Jquery对象的方法和属性对html元素进行操作
1)选择器
2)方法
3)事件
4)属性
5)ajax
$(‘’)
2.项目中想使用jquery,如何和引入
1.将Jquery的js, 拷贝到项目中
2.在项目的页面中进行引用

3.开始使用

3.jquery的常用选择器,有哪些,代码写出来
1.基本选择器
1)通用选择器 *

  • $("*") 所有元素

2)id选择器 #id
#id $("#lastname") id=“lastname” 的元素

3)类选择器 .class
.class $(".intro") class=“intro” 的所有元素

4)复合选择器
$(“h1,div,p”) 所有

元素

1.基本选择器

2.层次选择器

3表单选择器

4.基本过滤选择器

5内容过滤器

6可见性选择器

7属性过滤器

8表单过滤器

3.1 搜索xml中的信息使用xpath
Json-json对象 json数组 和 xml

4.el表达式和jquery写法的区别
el表达式:${} jquery的写法 ( ) E L 表 达 式 : 为 了 使 J S P 写 起 来 更 加 简 单 , 隶 属 于 j s p , 在 服 务 器 上 运 行 , 标 识 符 : () EL表达式:为了使JSP写起来更加简单,隶属于jsp,在服务器上运行,标识符: ()EL使JSPjsp{ },文件类型:无
jquery:用js实现,是对js的封装,一个非常强大的js类库,在浏览器上运行,文件类型 js
5.利用选择器获取到要操作的节点,获得节点的值,属性值,文本和html内容
val() 方法返回或设置被选元素的值。单标签
html() 方法返回或设置被选元素的内容 (inner HTML),包括标签。
text() 方法方法设置或返回被选元素的文本内容
6.jquery的ajax如何写
$.ajax()
语法
$.ajax({name:value, name:value, … })

$.post()
语法:
$.post(URL,data,callback);
$.post(http://地址,{“name”:“value”, “name”,”value”},function(data){ data就是服务器返回的数据。回调的业务逻辑 })
$.get()
7.利用jquery的ajax写一个下拉框的异步回填
8.如何使用jquery删除某个匹配的内容
 删除元素使用.remove()和.detach()。两者的区别在于,前者不保留被删除元素的事件,后者保留,有利于重新插入文档时使用。
  清空元素内容(但是不删除该元素)使用.empty()。

9.使用jquery完成追加的功能
10.jquery的常用事件写三个
选择器.事件名字(function(){})
$(“input”).change(function(){
alert(“文本已被修改”);
});
$(“input”).keydown(function(){ $(“input”).css(“background-color”,“yellow”); });
.blur() 表单元素失去焦点。
.change() 表单元素的值发生变化
.click() 鼠标单击
.dblclick() 鼠标双击
.focus() 表单元素获得焦点
.focusin() 子元素获得焦点
.focusout() 子元素失去焦点
.hover() 同时为mouseenter和mouseleave事件指定处理函数
.keydown() 按下键盘(长时间按键,只返回一个事件)
.keypress() 按下键盘(长时间按键,将返回多个事件)
.keyup() 松开键盘
.load() 元素加载完毕
.mousedown() 按下鼠标
.mouseenter() 鼠标进入(进入子元素不触发)
.mouseleave() 鼠标离开(离开子元素不触发)
.mousemove() 鼠标在元素内部移动
.mouseout() 鼠标离开(离开子元素也触发)
.mouseover() 鼠标进入(进入子元素也触发)
.mouseup() 松开鼠标
.ready() DOM加载完成
.resize() 浏览器窗口的大小发生改变
.scroll() 滚动条的位置发生变化
.select() 用户选中文本框中的内容
.submit() 用户递交表单
.toggle() 根据鼠标点击的次数,依次运行多个函数
.unload()
11.如何使用jquery的api
1.找到中文api
2.查看api的结构,从而掌握使用技巧
12.完成表单注册时,使用jquery,做校验(校验手机号是否合法,校验邮箱是否正确,校验两次输入的密码是否一致)
在jquery后面引入jquery.validate.js,就可以使用jquery的校验插件
好处:不需要自己在写正则表达式做匹配了,插件封装好了,可以直接使用
$("#signupForm").validate({
rules: {
blog: {//校验的name字段
required: true,//校验规则
url: true //校验规则

},

},//规则
messages{}//提示信息
})
13.如何完成jquery的封装
Crud的时候再封装
14.jQuery 库中的 KaTeX parse error: Expected 'EOF', got '#' at position 93: …s选择器有什么不同 id :#̲ class: .cl…(document).ready( ) 函数是什么?干什么用的?
$(document).ready( function(){}) ===== $(function(){}) 页面加载的时候就初始化
19.怎样找到所有HTML中 select标签的选中项
$(‘select option[selected=“selected”]’).text();
20.jQuery中的each( ) 是什么函数? 如何使用它
循环遍历
KaTeX parse error: Expected '}', got 'EOF' at end of input: …on(){ alert((this).text())
});
21.省市县三级联动
22js创建对象的三种方式
(1)使用内置对象
1,JavaScript语言原生对象(语言级对象),如String、Object、Function等;
2,JavaScript运行期的宿主对象(环境宿主级对象),如window、document、body等

(2)使用JSON
对象{name:“刘德华”,age:“25”,sex:“男”}
数组{member:[{name:“刘德华”},{name:“郭富城”},{name:“张学友”},{name:“黎明”}]}

(3)自定义对象构造
var user={name:“user1”,age:18,getName:function(){
return this.name;
}
};

function User(name,age){

      this.name=name;

      this.age=age;

      this.canFly=false;

}

var use=new User(“111”,12);

四、Mysql
1.Mysql的组成
1)数据库 2)表 3)列 4)行 5)主键 6)外键 7)索引
2.mysql数据库如何安装
Windos 服务端
linux
3.数据库的客户端和服务端有什么区别
客户端:连接mysql服务的工具(mysql自带的客户端工具”mysql”, 视图化的客户端工具“navicat”)
服务端:mysql的服务,没有服务有客户端也不能连接。
4.数据库的DML和DDL,TCL,是什么
Dml(数据操作语言):1.insert 2.delete 3.update
Ddl(数据库定义语言):1.create table 2.alert table 3.drop table

5.如何用客户端连接别人的数据库服务器
1)开发环境 2)测试环境 3)灰度环境(预发布环境) 4)生成环境(线上环境)
去了公司后,系统已经跑起来了,【数据库的数据和代码都是在公司的服务器上】
数据库获取: 远程连接公司的数据库服务器

2.如何获取服务器的项目代码
要一个Svn/git的账户名和密码,连上服务器,检出代码。

6.写出select ,insert,update, delete的sql
Select * from 表明
Insert into 表名(“字段1”,“字段2”,…)values (“字段值1”,“字段值2”,…’)
Update 表名 set 字段1=“修改的值”,字段2=“修改的值” where id=1
Delete from 表名 where id=1
7.sql的执行顺序
(1)from
(3) join
(2) on
(4) where
(5)group by(开始使用select中的别名,后面的语句中都可以使用)
(6) avg,sum…
(7)having
(8) select
(9) distinct
(10) order by
(11)limit

8.sql的常用函数有哪些
max(), min(), avg(), sum(), count(), concat(), DATE_FORMAT(creat_time ,’%Y-%m-%d’)
9.mysql如何创建索引

10.mysql的常用引擎
MyISAM mysql5.5之前默认使用的存储引擎
InnoDB 之后就是InnoDB
11.mysql如何使用客户端完成数据的导入导出
12.WHERE和HAVING的区别在于:
8.where 子句的作用是对查询结果进行分组前, where条件中不能包含函数
9.having 子句的作用是筛选满足条件的组,使用having 条件过滤出特定的组
13.sql练习

SELECT name,COUNT(name) from t_attendance GROUP BY name

1)SELECT s.sno,s.sname from student s
LEFT JOIN
sc sc ON s.sno = sc.sno
LEFT JOIN
course c on c.cno=sc.cno where c.cname=‘java’
2) SELECT s.sno,s.sname from student s
LEFT JOIN
sc sc ON s.sno = sc.sno
LEFT JOIN
course c on c.cno=sc.cno GROUP BY s.sname
HAVING min(sc.score)>80

  1. SELECT * from student s
    LEFT JOIN sc sc on s.sno=sc.sno
    LEFT JOIN course c on sc.cno=c.cno
    WHERE c.cname!=‘java’
  2. SELECT c.cname,avg(sc.score) from student s
    LEFT JOIN sc sc on s.sno=sc.sno
    LEFT JOIN course c on sc.cno=c.cno
    GROUP BY c.cname ORDER BY sc.score
  3. SELECT s.sname from student s
    LEFT JOIN sc sc on s.sno=sc.sno
    LEFT JOIN course c on sc.cno=c.cno
    GROUP BY s.sname HAVING COUNT(s.sname)>1

SELECT * from student WHERE age=
(SELECT age from student GROUP BY age ORDER BY age desc LIMIT 1,1)

  1. SELECT gc.g_applydate from g_cardapply gc LEFT JOIN g_cardapplydetail gcd
    ON gc.g_applyno = gcd.g_applyno where gcd.g_idcard=‘123’
  2. SELECT
    gc.g_applydate,gcd.g_name,COUNT(gcd.g_idcard) cardcount
    FROM
    g_cardapply gc
    LEFT JOIN g_cardapplydetail gcd ON gc.g_applyno = gcd.g_applyno
    GROUP BY gcd.g_idcard HAVING cardcount>1
    3)自己练
    4)自己练

1)SELECT *,count(sname) scount from student GROUP BY sname HAVING scount>1
2)SELECT s.sno,s.sname,c.cname,sc.score from student s
LEFT JOIN sc sc ON sc.sno=s.sno
LEFT JOIN course c ON c.cno=sc.cno
ORDER BY sc.score desc
LIMIT 10
3) SELECT s.sname,sc.score from student s LEFT JOIN
score sc on s.sno=sc.sno where sc.subject=‘数学’

查询某日人员的出勤时间问题。
我们都知道,企业员工考勤使用打卡方式,每天会记录每个员工的多次打卡记录,最后取每个员工的每天:
上班时间:当日最早时间;
下班时间:当日最晚时间。
所以分析查询每个员工每日考勤记录,需要根据员工分组,当天时间、时间最小和最大,时间格式化等操作,下面举例模拟该问题:
学生表student

学生考勤表student_attendance

SELECT
stu.sid,
stu.sname,
date_format(min(clock_time), ‘%H:%i’) ‘入园’,
date_format(max(clock_time), ‘%H:%i’) ‘出园’
FROM
student stu,
student_attendance sa
WHERE
stu.sid = sa.stuid
AND DATEDIFF(sa.clock_time, ‘2018-07-16’) = 0
GROUP BY
stu.sid

解释:
1.date_format(min(clock_time), ‘%H:%i’) :
min(clock_time) 按人员分组后,获取最小时间
date_format(min(clock_time), ‘%H:%i’) 将获得的时间格式化,获得 “分钟:秒“的格式
date_format(date,format) 时间格式化,获得满足格式的字符串
data表示要格式化的时间
format格式 ‘%Y%m%d%H%i%s’ 分别为:%Y 年 %m月 %d日 %H时 %i分 %s秒

   date_format(max(clock_time), '%H:%i') '出园'
   语法同上。

2.DATEDIFF(sa.clock_time, ‘2018-07-16’) = 0
sa.clock_time为打卡时间
‘2018-07-16’为设定的某天,根据项目需求,应该是传递的考勤日期

     datediff(date1,date2)               MySQL 日期相减函数
     date1和date2日期做差,返回相差天数。
     判断当天,日期做差为0,即为当天。
     timediff(time1,time2)               MySQL 时间相减函数

14.如何
14.如何判断表关系
表关系:
一对多 :比如学生和班级
一个学生-一个班级
一个班级—》多个学生 (班级外键字段)
一对一:比如学生和身份证
一个学生—》一个身份证
一个身份证—》一个学生

多对多 :用户和权限 【多对多加中间表】
一个用户—》多个权限
一个权限—》多个用户

外键字段设置在多的以一方

班级
1 1510a 1
2 1510b 2
3.1510c

学生 –》班级外键
1 张三 1
2 李四 2
3 王五 2
4 赵六 3
15.如何设计表
生活—》理解业务—》确认业务和生活的联系—》看页面原型 —》从业务中提取对象—》
找出这些对象的关系—》对象和对象之间的关系就是表与表之间的关系
对象里面的属性对应的就是表的字段

规格表:id,name,orders,createTime,updateTime, createBy,updateBy
规格选项:id,name,gid, createTime,updateTime, createBy,updateBy

数据库设计(高级开发)
一般在项目中,设计数据库是按这样的顺序,
先从业务中抽象出实体对象,
然后判定实体和实体之间的关联关系,
最后,就可以根据关联关系,设计表
比如一对一,可以设计A表,B表,通过主键关联,也可以在B表使用外键aid来关联(商品和商品描述表)
比如一对多,多的一方使用外键来关联 (广告类型表 广告表)
比如多对多,可以设计中间表是aid,bid. (用户和角色)
还有自关联,像部门子部门,分类子分类,菜单子菜单等等,可以使用子关联,放一个pid (商品的三级分类)
另外,在设计表的时候,可能还要注意唯一性字段,排序字段,冗余字段(不经常变动的字段)等等,一般在系统也会设计一些基础数据表,系统配置项表,日志表等等。
学生 老师 多对一
Id name …teacherId teacherName

每一张表的设计最好加上 creatTime updateTime creatby updateby //version(乐观锁)
广告位的表设计实践
广告类型表 广告表 用户 角色
一 多 一 多
多 一
一 一
id name status creatTime updateTime creatby updateby
11
2

id title url sort pic status cid creatTime updateTime creatby updateby
1 小米8 1 1 1
2 华为P20 1
ID cid adId
1 1 1
2 2 1
16.如何分析sql是否进行了全表扫描
Explain +sql 看type,如何type是all就行进了全表扫描
五Easyui的教程
1.为什么学习easyui
方便后台人员,快速搭建一个后台管理的页面。
2.Easyui是什么
jQuery EasyUI 是一个基于 jQuery 的框架,集成了各种用户界面插件
3.开始到官网下载最正规的资料

4.开始使用插件
4.1布局
布局容器有5个区域:北、南、东、西和中间。中间区域面板是必须的,边缘的面板都是可选的

4.2Datagrid(表格)
4.2.1 使用datagrid完成分页

page:当前页 rows 每一页显示多少条数据

4.2.2使用springmvc完成datagrid数据展示
Datagrid需要的数据 格式 total :总条数 rows 列表数据
1.因为每个页面都需要进行数据的列表展示或者分页,这个时候我们就不适合使用Map的形式返回数据了。而是封装一个工具类搞定数据的传输

DataGrid dataGrid = new DataGrid(5,Arrays.asList(user,user1,user2,user3,user4));
Easyui的使用技巧
1.创建组件的方式
1.1html方式创建
不需要动态获取或修改的组件
1.2通过js的方式创建
需要动态获取或修改的组件
2.属性的调用方式(对象的特征)
2.1 调用的方式data-options(html)
2.2 js方式创建的时候,要把属性方到 {属性:属性值}

2.事件(动作的触发)
3. $(’#contentAddForm’).form({
4. 事件名:function(参数){
5. 业务处理
6. }
7. });
5.方法(对象的行为)
$(’#contentAddForm’).form(‘reset’,{key:value});
6.有些属性在本组件中找不到
7.Easyui功能的扩展
对easyui的扩展validatebox,
添加验证两次密码功能,验证手机号,验证身份证号等等
根据官方文档的提示,自定义规则就可以了。
. e x t e n d ( .extend( .extend(.fn.validatebox.defaults.rules, {
eqPwd : {
validator : function(value, param) {
return value == $(param[0]).val();
},
message : ‘密码不一致!’
}
}

小工具的使用
1.浏览器开发者工具

1.1console的使用可以看到详细的信息
console.info(“控制台打印”);

2.mybatis的逆向生成工具
2.1使用逆向生成工具的目的
提高代码的开发速度,从而节约项目成本 (时间就是金钱)
2.2 使用过程

   下载generator的包,主要是修改generator.xml的配置文件(utf-8无bom格式)
<?xml version="1.0" encoding="UTF-8"?>
<table tableName="t_user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
</context>

2.3作用
将数据库中的表生成 1.实体类,2.dao 3.xml配置文件

3.分页插件
3.1目的:
3.2使用过程
1.导入pagehelper-3.7.5.jar (分页插件)
2.在mybatis-config.xml配置插件 (还需要让这个配置文件加载到)

<plugins>
	<plugin interceptor="com.github.pagehelper.PageHelper">
		<!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库 -->
		<!--  -->
		<property name="dialect" value="mysql" />
 </plugin>

3.java代码里面

PageHelper.startPage(page, rows);//page当前页 rows每页显示条数
List list = userMapper.getUserList();
PageInfo pageInfo = new PageInfo(list);

4.错误状态码的分类
2XX 成功 3XX 重定向 4XX 客户端和服务端匹配错误 5XX 服务器错误
5.微软的文档工具,如何打开导航窗口

6.如何测试HTTP不同的请求方式
Postman 官方中文版v4.9.3
8.eclipse安装properties插件

9.前后台分离
前台:页面效果
后台:
1.有原型图
2.根据原型图创建数据库的表(设计表)
3.技术选型—》框架的搭建
4.写接口,返回数据(封装实体类)—》接口文档
5.自测:postman,swagger等

6.前后台联调

10.maven项目定位jar的办法

11.使用eclipse提取公共代码、
ALT+SHIFT+M

常见的错误
前言
1.如果是在浏览器访问的,那么遇到问题,一定要先进行F12定位问题,如果F12发现控制台(console),没有问题,那就看看(network)查看网络请求的,状态码是否正常,如果不正常,项目debug启动,进行后台打断点,进行调试。
1.项目格式不规范

Java 单一职责

8.断点调试使用不熟悉
9.遇到错误不知道如何下手

1)冷静看错误信息(一定要看你的子异常(和报错相关性最大的地方)去找和自己代码有关的地方)
2)通过以上的分析,没有自己的代码
3)后台断点查看变量的值

10.对基础知识的不熟悉,导致简单的问题无法定位
1)有计划多复习 2)少玩(抑制住自己爱玩的心) 【睡觉之前反省一下自己】
5.使用mybatis的逆向生成工具
6.mybatis的分页插件
7.easyui的传值
8.tomcat中只放一个你使用的项目
webapps
work 这两个目录有一个项目

9.在mybatis中参数名的错误
#{值} 必须和mapper方法里面的参数名一直

10空指针
Null.方法()----》会报空指针
Null赋值给基本数据类型 ----》会报空指针 Int–Integer

11.Integer的比较
因为有缓存池(-128-127), 所以在比较的时候,使用==有可能会超出缓存范围,新创建对象,就导致数据不一致
而Integer重写了equals方法,在比较的时候,会调用Integer的intValue方法,将其转换成int数据类型在进行比较这样就
不会出现错误了。

错误解决方法
第一步:一定要看到报错日志(如何没有报错日志,查是否集成了日志框架,
springboot内置logback)
第二部:找到报错异常,看看报错日志中是否有 【Caused by】有,就优先看
这个里面的异常,没有就看普通异常就可以,有没有自己的代码(排除是否是自己代码引起的错误)
第三部:利用已有的知识,进行详细的推断错误的原因
Ctrl+SHIFT+T

权限的设计
1.业务场景
商城后台管理系统
—》不同人登录进入系统看到的权限不一样
用户—权限
张三(商品管理)—》1.商品的管理(商品的列表,商品的审核……)
李四(系统管理员)–》1.商品管理 2.订单管理3.促销管理 4.库存管理 5.系统管理

小明入职---》商品管理 (勾选6个权限)
小李入职---》商品管理 (勾选6个权限)

角色表(商品管理员(商品的crud+审核+上架))
小王入职—》赋商品管理的角色就搞定了

五表rbac:用户表 用户角色中间表 角色表 角色权限中间表 权限表
用户和角色是多对多的关系
角色和权限是多对多的关系

中间表
11
12
21
33

王五 63

用户 --》角色表 —》权限
业务组长 63
业务主管 80
业务经理 99
业务员 30

数据库的设计:
1.需求分析(生活-业务)
2.开会讨论 (开会讨论业务)
3.开始设计: 1.从业务流程中找对象,,对象对应的就是咱们的表,对象和对象之间的关系就是表的关系,对象的属性对应的就是数据库的字段。

2…表的设计

3.技术分析
Panel 面板 【登录】 验证码
Layout 页面布局
Tree 树形
Tabs 选项卡

Ssm框架

4.开始编写代码

11.1登录
登录中验证码的作用: 防止暴力破解,增加代码的安全性

4.2spring拦截器的实现
什么是拦截器

项目中配置多个拦截器是有顺序的,按照配置的顺序依次执行(链式的调用关系)
【时间拦截器】【登录拦截器】

什么是过滤器
过滤器是需要在web.xml中配置
</ filter>
什么是监听器
Web.xml中配置

</ listener>

12.ztree
用来做树形的展示

Ztree也是依赖于jquery.

5.1 Ztree展示

分析:因为每个用户的权限都是不一样的,所以登录成功后,看到的权限树也是不一样的。

1.下载官方的API文档
2.从官方文档中找到自己想要的效果
分析效果中的页面源代码,将其应用到自己的项目中。
3.导入css,js到项目中
4.分析效果展示,需要哪些代码
1.页面一加载 就初始化树

页面一加载初始化: ( f u n c t i o n ( ) ) 树 的 初 始 化 : (function(){}) 树的初始化: (function()).fn.zTree.init(KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲treeDemo")//把树放…(function(){
. f n . z T r e e . i n i t ( .fn.zTree.init( .fn.zTree.init(("#treeDemo"), setting, zNodes);
})

2.从结果推断过程
$("#schoolTree ")

    Setting 树的配置信息 【和java的实力类进行对应】 id节点的id pid父节点的id , var setting = { data: { simpleData: { enable: true, idKey: "id", pIdKey: "pid",//java的实力类进行对应 rootPId: 0. //根节点的id为0 } } };

    树的名称对应menuName
    key: {
    name: “menuName”
    }

    zNodes 提供数据
    var setting = {
    async: {
    enable: true,
    url: “/getMenu/”+${user.id} //异步加载数据的地址
    }
    };

    后台需要提供一个根据用户id获取用户权限返回json数据的接口:
    @RequestMapping(“getMenu/{uid}”)
    @ResponseBody //使用jackson,进行json的转换
    public List

    getMenu(@PathVariable Integer uid){
    log.info(“getMenu uid={}”,uid);
    List list = menuService.getMenu(uid);
    return list;

    }
    

    扩展知识
    6.1 接口文档
    接口文档是: 前台和后台交互的标准,或者是系统和系统交互的标准 文档

    Ajax 前后后台交互 【Http请求】
    后台和后台交互【Httpclient】
    接口应该包括: 1.调用的地址(http地址也有可能是rpc框架的地址,maven项目需要提供对外的依赖) 2.传递的参数 3.返回值 4.特殊说明

    6.2httpclient (作业)
    为什么使用:
    越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源(接入第三方:支付,登录,身份验证)

    功能介绍
    实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
    支持自动转向
    支持 HTTPS 协议
    支持代理服务器等
    应用:
    Apache封装的Httpclient的工具类

    作业
    作用:通过代码发送http请求。
    作业要求:写两个项目,
    1.提供用户信息的项目springmvcrest风格(http://www.bwie.com/user/{username}) user
    2.完成用户的登录(界面用bootstrap搭建) login

    商品 —购物车

    Angularjs

    http://www.runoob.com
    1.是什么
    是一个js的框架(框架: 完成了一些通用的功能,简化了开发,提高开发效率)

    2.解决了什么问题
    Easyui和bootstrap解决的是后台人员编写前台页面的门槛。(页面的搭建)

    Angularjs是完成了数据的交互和前台的mvc的搭建(从而提高开发效率)

    AngularJS 把应用程序数据绑定到 HTML 元素。
    AngularJS 可以克隆和重复 HTML 元素。
    AngularJS 可以隐藏和显示 HTML 元素。
    AngularJS 可以在 HTML 元素"背后"添加代码。
    AngularJS 支持输入验证。
    3.使用过程
    1.在页面申明 一个angularjs的应用程序

    2.写js 4.var app = angular.module('userApp',[]);//获取angularjs应用程序 5.//调用controller 6. app.controller('userController',function($scope,$http){ 7. $http.get('${path}/admin/getUser.jhtml').then( 8. function successCallback(resp){ 9. $scope.userList = resp.data.rows; 10. },function errorCallback(resp){ 11. Alert(“获取用户失败”); 12. 13. }); 14. })

    Fastdfs的使用
    1.安装到linux中
    1)tracker服务搭建
    2)storage服务搭建
    3)继承nginx-fastdfs的模块(ngx_fastdfs_module)
    4)修改配置文件(1. Tracker.conf 2. Storage.conf 3. Nginx配置)
    5)启动服务

    2.改造图片服务器
    1)在虚拟机中选择 “”文件“”----》“”打开“” —》找到虚拟机“”Redis_02.vmx “”
    2)修改机器的iP
    [root@training ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0

    重启网卡是配置生效:[root@training ~]# service network restart
    3)修改Tracker.conf Storage.conf配置文件

    如何判断配置文件的地址?
    
     ps -ef | grep fdfs
    
              
           修改Tracker.conf
              
    
            
          修改Storage.conf
          
         
       Nginx的配置文件
     
        
    
       如果需要开通端口号:22122
         Vi  /etc/sysconfig/iptables
    

    专业名词
    客单价:每一位顾客平均购买商品金额
    网络拓扑图
    项目的架构图
    TPS: 每秒的事务数
    你们网站的并发量大概是多少?
    我们这边测试做过压测,之前看过他们的压测报告,因为我当时主要负责购物,他们压测从加入购物车到下单,每秒的并发量大概是500左右
    QPS: 每秒的查询速度
    PV: 页面被访问数量【用户行为分析软件】
    UV: 用户访问页面数量【用户行为分析软件】

    Sku: 最小库存单位。商品。(小米6 亮黑色 64G 官方标配)

    Spu: 产品。(小米6)

    Pc端:电脑页面
    Wap:手机浏览器页面
    App:安卓,iOS
    Wechat:微信端

    B2B2C: 天猫,京东
    B2C: 小米,华为,联想
    B2B: 阿里巴巴,
    C2C: 淘宝,咸鱼
    O2O: 美团,饿了么
    F2C: 工厂对个人 商城众网
    P2P: 金融系统

    CDN: 内容分发网络,将用户重定向到里自己最近的cdn节点上从而,可以提高网站的访问速度和稳定性(阿里云,腾讯云,蓝汛,网宿科技等)

    架构的演变历程
    架构的目标:高可用(避免单点故障)(集群),高性能(redis),易扩展(dubbo/Springcloud),可伸缩性(容器技术docker)且安全(加密,证书)的网站。

    内存是电子设备,硬盘是机械设备(需要磁头的寻道,所以查询速度比较慢)

    项目的开发流程

    所有的web项目都是由 请求和响应组成的(数据的流转)

    Java 项目:

    1.接口文档
    1.后台和后台之间的交互

    2.前后之间的交互

    封装了一个响应的实体类
    public class PageResult {

    private int code;//响应给页面的状态码
    private String msg;//响应给页面的提示信息
    private Object data;//响应给页面的数据
    private Boolean status;//请求成后或失败
    

    getter/setter
    }

    项目上线:
    (java项目)项目部署上线(Linux):

    1.具备java的环境(安装jdk)【tar.gz rpm】
    2.安装tomcat
    将打包的tomcat上传到Linux服务器
    解压:如果是zip压缩包就用 unzip 文件
    3.将项目打包成一个war(普通web项目(利用ide工具进行导出就可以了),maven项目(install就可得到war))
    4.部署web服务器上(tomcat,resin)
    将打包好的web项目,放到tomcat的webapps目录下(默认找ROOT.war)
    5.将服务器启动
    6.查询服务启动日志
    流程:
    1)开发人员打war包----》运维人员—》Linux服务器(放到tomcat里面webapps)【效率低】【自动化运维】

    2)开发人员自己传项目—》Linux服务器
    一种是普通的项目(单一应用架构:所有的功能都是在一台服务器上,就一个单一的项目)
    项目打war ,放到tomcat里面webapps

    1.Tomcat 默认访问的项目是ROOT项目(这样访问的时候就不需要加项目名了)
    2.利用nginx做反向代理
    增加server, 在location里面写proxy_pass www.tianti.com(反向代理到upstream www.tianti.com
    上)

    3)tomcat热部署[利用maven的插件]
    [缺点:发布项目的时候一次只能发布一台服务器,项目少服务器少,还比较适合,但是项目做了分布式项目比较多,服务器比较多的时候就不太合适了]
    1.修改tomcat的配置文件,添加用户名、密码、权限
    需要修改tomcat的conf/tomcat-users.xml配置文件。添加用户名、密码、权限。
    2.在项目里面配置tomcat热部署插件
    第一次

    后面多次

    4)分布式,微服务架构(多个项目)【互联网公司,持续集成的方案】
    hudson/Jenkins持续集成工具

    打war包:maven:install
    普通项目:

    项目采用的技术
    SSM (技术基本框架) 【精通】
    Maven【】
    Mysql , redis (数据库)
    Eclipse(开发工具) idea , STS(SpringTools)
    Easyui(后端管理框架)
    Dubbo(完成rpc的分布式调用) zk(分布式协调框架)
    Mq(activeMQ) [消息队列]
    Solr(搜索)
    Freemaker(实现页面的静态化) []
    Nginx(反向代理和负载均衡)
    Fastdfs(图片服务器) [文件服务器]
    Cdn(内容分发网络) 【发展比较大了】
    Tomcat(web应用服务器)
    Svn(git)版本控制 (代码的协同开发)
    Jenkins(持续集成工具)[]
    Sonar(代码质量分析) []
    spring quartz(任务调度框架)

    实际工作的流程
    测试平台—>
    Testlink是一个开源的测试管理工具,主要用于管理测试用例,从测试需求、测试计划、测试用例管理和用例执行,到最后的结果分析,一套完整的测试流程控制,帮助测试人员有效的控制测试过程 (我就看了一下他们的平台)
    项目管理平台---->
    禅道 项目管理软件 是国产的开源项目管理软件,专注研发项目管理,内置需求管理、任务管理、bug管理、缺陷管理、用例管理、计划发布等功能,实现了软件的完整生命周期管理(后端)

    项目的架构

    前后台分离的开发模式
    前端负责页面,后台负责写接口(接口文档)【swagger,postman】

    域名
    方便记忆 ,宣传品牌 www.jd.com

    .COM .CN 等等都是顶级域名
    一级域名:www.jd.com jd.com
    二级域名:https://miaosha.jd.com/ XX.jd.com
    三级域名:xxx. XX.jd.com

    独立域名部署的好处: 达到分流效果,解决高并发问题

    商品模块的开发
    http://note.youdao.com/noteshare?id=2ea62bb3d2a20d695fec4fcc0d16fe87&sub=63A86EBCA07A478589264CB320440D3C

    http://note.youdao.com/noteshare?id=a4a28249b719e1d01c8ea06a510a0641&sub=BC3D55BB92BF4359BCF2C8D3A8C41C8A
    集群的搭建
    1.集群的定义:
    多个服务器同时对外提供相同的功能
    2.为什么搭建集群
    1.提高并发量(并发压力大,一台服务器支撑不了网站的并发,所以需要多台服务器,同时提供服务)
    2.避免单点故障
    3.集群的搭建
    Redis的集群搭建

    分布式架构
    1.分布式,微服务
    多个服务器协同完成一个功能。
    2.分布式的拆分原则
    按照业务拆分,成不同的模块,,,不同的模块又叫服务
    3.例子
    电商网站:1.登录 2.搜索商品 【商品详情页】 3.购物车 4. 结算页(订单提交页)5.收货地址 6.优惠券,优惠码
    7.支付
    一个项目里面包括这些功能。

    Maven

    1.是一个约定由于配置的项目管理工具 (骨架)
    2.管理jar包(本地,私服,中央) gav到仓库确定唯一的一个jar包

    com.tg.admin
    tg-admin-parent
    0.0.1-SNAPSHOT

    3.仓库,继承,聚合
    4.pom.xml
    5. 统一管理版本号
    dependencyManagement

    Maven依赖的一定是一个jar
    tg-parent 父项目
    1)作用:为避免jar的冲突问题,统一管理jar包
    2)父项目pom.xml的特点:pom
    3)如何创建
    使用properties进行jar包版本的集中定义

    <junit.version>4.10</junit.version>
    <spring.version>4.1.3.RELEASE</spring.version>
    <mybatis.version>3.2.8</mybatis.version>
    <mybatis.spring.version>1.2.2</mybatis.spring.version>
    <mybatis.paginator.version>1.2.15</mybatis.paginator.version>

    tg-common 所有项目需要依赖的公共代码
    单独创建一个项目
    tg-manage 后台管理项目 (是聚合项目和父项目)

    聚合项目的特点:
    Maven分模块的好处,就是为了提高代码的重复利用(复用率),提高开发效率
    模块可以单独打包,方便对外提供

    tg-admin-web
    tg-admin-service
    tg-admin-dao
    tg-admin-pojo

    Maven如何在install或者运行项目的时候跳过测试

    Maven集成tomcat插件

    org.apache.tomcat.maven
    tomcat7-maven-plugin
    2.2

    /
    80

    使用maven创建的两种项目
    1.普通的java项目

    jar

    2.Web项目

    war

    Maven的运行流程
    存jar: install
    取jar: dependency的GAV
    加插件: plugin

    如何避免maven的循环依赖
    通过注释的方式写一下,依赖关系

    Maven项目,依赖的类,之前不报错,之后报错(报找不到)

    Maven添加tomcat插件
    代码
    1.

    bootstrap



    org.apache.maven.plugins
    maven-resources-plugin
    2.7

    UTF-8




    org.apache.maven.plugins
    maven-compiler-plugin
    3.2

    1.7
    1.7
    UTF-8



    org.apache.tomcat.maven
    tomcat7-maven-plugin
    2.2

    /
    8082


    Maven的依赖包在中央仓库是没有的,如何让团队的人使用
    上传到私服
    1)自己开发的jar

    上传jar包:mvn deploy
    上传源码mvn clean source:jar deploy
    2)别人提供的jar(用视图化的方式上传)

    打包到本地仓库

    Maven的scope标签的说明

    可以看到这里配置了scope,那么这个scope有什么意义呢?
    Scope主要管理依赖的部署。目前可以使用5个值:
    1)compile,缺省值,适用于所有阶段,会随着项目一起发布。
    2)provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。 【解决同包的冲突】
    1.java.lang.ClassCastException: com.xxxx.xxxx.filter.BlacklistIPFilter cannot be cast to javax.servlet.Filter
    2.org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletCon

    3)runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
    4)test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
    5)system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。[一般不用]

    maven项目断点找源码
    1.

    Xml和json数据结构的特点
    Xml:
    3、xml声明

    例子:

    注:xml声明一般是xml文档的第一行;xml声明由以下几个部分组成:

    4、根元素

    它是xml文档里面唯一的;它的开始是放在最前面,结束是放在最后面。
    5、元素:

    (1) 所有的xml元素都必须有结束标签;
    (2) xml标签对大小写敏感;

    (3) xml必须正确地嵌套;

    (4)元素的命名规则:
    名称中可以包含字母、数字或者其他的字符;
    名称不能以数字或者标点符号开始;
    名称中不能包含空格。
    (5)空元素

    6、属性
    (1)语法
    <元素名 属性名=“属性值”/>
    例:
    Tom

    (2)注意:
    属性值用双引号包裹;一个元素可以有多个属性,它的基本格式为:
    <元素名 属性名=“属性值” 属性名=“属性值”>;
    属性值中不能够直接包含<.”,&。
    7、实体:
    在xml中,一些字符拥有特殊的意义。如果把字符“<”放在xml元素中,会发生错误,这是因为解析器会把它当作新元素的开始,这样会产生xml错误:

    为了避免这个错误,请用实体引用来代替“<”字符:

    xml中5个预定义实体

    8、注释

    注:注释内容中不要出现”–”;不要把注释放在标签中间;注释不能嵌套。

    Json数据特点:
    (1)对象:在json中是“{}”括起来的内容,数据结构为{key:vlaue,key : value…}的键值对结构。在面向对象中,key为对象的属性,value为对象的属性值,取值方法为对象key获取属性值,该属性值得类型可以是数字,字符串,数组,对象等。
    (2)数组:在json中是‘[]’括起来的内容,数据结构为[{key:value, key:vlaue },{key:value, key:vlaue },{key:value, key:vlaue }…],与所有的语言一样,使用索引获取值,字段的类型可以是数字,字符串、数组、对象等
    如何使用json解析json数据呢?
    {“name”:“zhangsan”,“age”:27,“married”:true}
    SpringMVC
    1.springmvc的rest风格 web.xml
    4)
    5)
    6) tg-admin
    7) org.springframework.web.servlet.DispatcherServlet
    8)
    9)
    10) contextConfigLocation
    11) classpath:spring-mvc.xml
    12)
    13) 1
    14)
    15)
    16)
    17) tg-admin
    18) /
    19)

    url特点
    1.url更加简洁,将参数通过url传到服务端。
    非REST的url:http://…/queryUserById?id=1
    REST的url风格:http://…/queryUserById/1

    http实现增删改查
    Restful具体来讲就是四种表现形式,HTTP协议中四个表示操作方式的动词:GET、POST、PUT、DELETE。
    分别对应四种基本操作:
    GET用来获取资源,
    POST用来添加资源,
    PUT用来修改资源,
    DELETE用来删除资源。
    遇到的问题
    1)但是,form表单只支持 GET与 POST 请求,不支持DELETE、PUT,如何解决这一问题?
    在web.xml中添加HiddenHttpMethodFilter过滤器,可以将POST请求转位PUT或DELETE。
    2)如果使用rest风格那么springmvc的核心控制器要写成/,那么所有的请求都要交给springmvc的核心控制器解决,像静态资源,css,和js以及图片等也要到后台去匹配controller,但是并没有对应的requestMapping,所以会报404. 这个 时候需要在springmvc的配置文件中加入静态资源处理

    <mvc:resources location="/css/" mapping="/css/**" />
    <mvc:resources location="/js/" mapping="/js/**" />
    

    2.springmvc解决@ResponseBody中文乱码
    <mvc:annotation-driven >

    <mvc:message-converters register-defaults=“true”>



    </mvc:message-converters>
    </mvc:annotation-driven>

    3.@ResponseBody不能返回json数据,而是根据视图解析器匹配
    错误展示
    @ResponseBody
    @RequestMapping(value="/getUserList")
     public Map<String,Object> getUserList(Map<String,Object> map){
     List list = userService.getUserList();
     map.put(“total”, 12);
     map.put(“rows”, list);
     return map;
     }
    正确的展示

     @ResponseBody
     @RequestMapping(value="/getUserList")
     public Map<String,Object> getUserList(){
     Map<String,Object> map = new HashMap<String,Object>();
     List list = userService.getUserList();
     map.put(“total”, 12);
     map.put(“rows”, list);
     return map;
     }

    4.项目集成登录拦截器
    前言
    Servlet:过滤器(filter),监听器(listener) 需要在web.xml配置
    框架:拦截器(interceptor)。在框架的配置文件中配置
    操作步骤
    1.springmvc的配置文件中配置拦截器

     mvc:interceptors
     mvc:interceptor

     <mvc:mapping path="/"/>

     <mvc:exclude-mapping path="/
    /login/"/><mvc:exclude-mapping path="//static/"/>

     </mvc:interceptor>
     </mvc:interceptors>

    15.编写登录拦截器
    在执行方法之前进行拦截请求:
    public class LoginInterceptor extends HandlerInterceptorAdapter{
    /**
    * 在调用controller方法之前进行调用
    * 返回值: 返回true,继续执行。返回false,终止调用controller方法
    * Handle就是controller方法
    *
    */
    @Override
    public boolean preHandle(HttpServletRequest request,
    HttpServletResponse response, Object handler) throws Exception {
    User user = (User)request.getSession().getAttribute(“user”);
    if(user==null){
    //没有登录就跳转到登录页面,并且终止调用controller方法
    response.sendRedirect(request.getContextPath()+"/login.jsp");
    return false;
    }
    return super.preHandle(request, response, handler);
    }

    }

    5理解springmvc核心控制器在web.xml中的配置

    crud org.springframework.web.servlet.DispatcherServlet 1 contextConfigLocation classpath:springmvc.xml

    ServletConfig config = super.getServletConfig();
    String initParameter = config.getInitParameter(“contextConfigLocation”);
    System.out.println(“initParameter”+initParameter);

    6.前台请求类型对springmvc接受参数的影响
    form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。
    请求头类型:Content-Type:
    如果是application/x-www-form-urlencoded,后台可以直接接受参数
    如果是application/json 那么后台不能直接获取参数值,需要使用@RequsetBody,才能将前台传过来的json对象转换成java对象
    Spring
    Springaop应用:
    1.springaop的事物管理
    1.spring事物不生效的原因
    1.配置有问题1)切点表达式有问题 2)事物传播特性

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    	<tx:attributes>
    		<!-- 传播特性 -->
    		<tx:method name="save*" propagation="REQUIRED" />
    		<tx:method name="insert*" propagation="REQUIRED" />
    		<tx:method name="add*" propagation="REQUIRED" />
    		<tx:method name="create*" propagation="REQUIRED" />
    		<tx:method name="delete*" propagation="REQUIRED" />
    		<tx:method name="update*" propagation="REQUIRED" />
    		<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
    		<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
    		<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
    	</tx:attributes>
    </tx:advice>
    
    <aop:config>
    	<aop:advisor advice-ref="txAdvice"
    		pointcut="execution(* com.lenovo.t2.g2.rbac.service.*.*(..))" />
    </aop:config>
    

    2.如果你用了mysql数据库,查看数据库存储引擎,MyISAM是不支持事物的,需要改成InnoDB
    3.将service的注解放到子容器初始化,会产生事物失效
    子容器(是servlet):springmvc --加载的配置文件—》加载扫描—》如何子容器扫描到了service注解,那么就会实例化一个没有经过事务加强处理的Service
    父容器(监听器):spring - 加载配置文件—》加载扫描—》父容器进行初始化的Service是有事物处理能力的
    16.没有将异常抛给spring
    } catch (Exception e) {
    log.error(“添加用户失败”,e,e);
    throw new RuntimeException(“添加用户失败”);
    }

    2.spring的xml配置文件如何读取资源文件中的内容
    <context:property-placeholder location="*.properties"/>




    3.理解spring监听器在web.xml中的配置

    contextConfigLocation classpath:spring-*.xml org.springframework.web.context.ContextLoaderListener

    4.spring
    Mybatis
    mybatis的mapper里面的方法对应的是xml里面 id
    在xml中获取mapper里面传递的参数
    //调用getUserByLogin对应哪个sql
    User getUserByLogin(@Param(“username”)String username, @Param(“pwd”)String pwd);

    select from t_user where username=#{username} and password=#{pwd}

    mybatise插入返回主键ID
    useGeneratedKeys=“true” keyProperty=“id”
    Xml配置文件

    Java代码写法

    Mybatis的批量插入

    INSERT INTO t_user_role(uid, rid) values

    –>

    #{item.uid,jdbcType=VARCHAR}, #{item.rid,jdbcType=VARCHAR}

    分页计算公式
    Mysql
    关键字 limit 起始页下标,每页展示的条数
    起始页下标 = (当前页-1)* 每页展示的条数

    前端
    1.页面元素的隐藏
    visibility: hidden----将元素隐藏,但是在网页中该占的位置还是占着。
    display: none----将元素的显示设为无,即在网页中不占任何的位置。
    KaTeX parse error: Expected 'EOF', got '#' at position 3: (‘#̲form’).hiden();…(‘#form’).show();

    *您的手机号有误,请重新输入

    查看账户>>

    2.计时器(setTimeout)
    setTimeout(调用的方法,调用方法的间隔时间);

    3.js循环数组
    for(var i in data.data){//js进行数组的循环
    dates.push(data.data[i].creatTime);//填充时间到数组中
    counts.push(data.data[i].count);//填充人数到数组中
    }

    代码的自测
    1.junit测试
    1)在maven项目中使用junit
    默认创建的maven项目,会默认加一个junit的依赖,但是在代码里面却找不到

    把默认的junit的版本提升为junit4的版本就可以使用了
    2.springTest
    搭建ssm框架

    1.创建父项目

    2.创建子模块

    3.在pom.xml中配置ssm的依赖包()

    4.从web项目的入口开始写代码在web.xml进行相应的配置
    1)spring监听器 —》默认加载WEB-IFN/applictionContext.xml 通过context-param自定义加载spring的配置文件 ,
    2)spring的编码过滤器
    3)springmvc的核心控制器(DispatcherServlet)–》默认加载WEB-IFN/servletname-servlet.xml ,通过init-param自定义加载springmvc的配置文件

    17.先测试springmvc框架是否好使
    18.spring和mybatis的整合

    4)可选配置

    3.查看配置文件是否被加载

    代码规范

    开发:单一职责原则
    日志
    1.项目中为什么要加入日志?
    为了方便定位问题 ,可以对日志进行集中管理 ,相比于用system.out输出提高效率, 对日志进行数据的分析获取用户行为
    2…有几种实现方式
    Log4j(日志的具体实现) logback(日志的具体实现) sl4j(日志的接口)

    4.如何加入

    <!-- 日志处理 -->
    	<dependency>
    		<groupId>org.slf4j</groupId>
    		<artifactId>slf4j-log4j12</artifactId>
    		<version>${slf4j.version}</version>
    	</dependency>
    

    5.最佳实践(企业标准)
    如果项目中出现了两种日志的具体实现(log4j和logback同时存在,哪一种会实效)
    场景:购物车模块(log4j12)—》库存模块(logback,默认使用debug级别输出日志)

    前言:
    #配置根Logger [ level ] , appenderName1 , appenderName2 , …
    log4j.rootLogger=DEBUG,A1,file
    #配置日志信息输出目的地Appender
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    #配置日志信息的格式(布局)
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m—%l%n
    #每天产生一个日志文件
    log4j.appender.file= org.apache.log4j.DailyRollingFileAppender
    #指定日志的存放位置
    log4j.appender.file.File=logs/log.log
    log4j.appender.file.Append = true
    #配置日志信息的格式(布局)
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m—%l%n

    1.每写一个类,都要加日志(slf4j)

    @Controller
    public class UserController {

    private Logger log = LoggerFactory.getLogger(UserController.class);
    

    }

    2.打印日志的规范
    log.info(“login username={},pwd={},validatecode={}”,new String[]{username,pwd,validatecode});//提倡使用 三个以上的参数用数组
    log.info(“login username={},pwd={}”,username,pwd);//提倡使用 两个一下用逗号分来就行
    3,.日志的输出级别
    FATAL 0
    ERROR 3
    WARN 4
    INFO 6 上线用的级别
    DEBUG 7 越往下,日志越详细,输出的内容越多 (本地调式使用的级别)

    3.mvc框架http请求方式的限定
    浏览器在地址栏数据的url地址,都是get请求
    1)前台:表单提交用post请求方式(表单默认用get提交)

    后台: @RequestMapping(value="login",method=RequestMethod.POST) 4.公共代码的提取(提高代码的复用率) 添加角色的时候,我们的修改和添加使用的是同一个方法。在进行权限添加的时候,发现添加和修改的逻辑是一样的。 所有我们把给角色添加权限的这个过程封装了一个公共的方法 19.工具类的封装(提高代码的复用率)hutool(开源工具类) 6.在写url地址时。要写绝对路径防止修改项目路径 <% String path = request.getContextPath(); request.setAttribute("path", path); %> 7.阿里的p3c安装(阿里的代码规范) 8.springTest在项目中完成单元测试 org.springframework spring-test ${spring.version} test

    @RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试
    @ContextConfiguration(locations={“classpath:spring-mybatis.xml”}) //加载配置文件
    public class SpringTest {

    @Autowired
    private GoodsMapper goodsMapper;
    @Test
    public void test(){
    	/*ApplicationContext application = new  ClassPathXmlApplicationContext("classpath:spring-mybatis.xml");
    	GoodsMapper bean = (GoodsMapper)application.getBean("goodsMapper");*/
    	List<Goods> list = goodsMapper.list();
    	for (Goods goods : list) {
    		System.out.println(goods);
    	}
    }
    

    }

    9.枚举写错误码表
    20./**
    21. * @desc 定义全局的错误码表,方便统一管理错误
    22. * @author luqian
    23. * @date 2018年3月16日10:57:44
    24. * 枚举类的特点:
    25. * 1、枚举的直接父类是java.lang.Enum,但是不能显示的继承Enum
    26. 2、枚举就相当于一个类,可以定义构造方法、成员变量、普通方法和抽象方法
    27. 3、默认私有的构造方法,即使不写访问权限也是private。(假构造器,底层没有无参数的构造器)
    28. 4、每个实例分别用于一个全局常量表示,枚举类型的对象是固定的,实例个数有限,不能使用new关键字。
    29. 5、枚举实例必须位于枚举中最开始部分,枚举实例列表的后面要有分号月其他成员相分隔
    30. 6、枚举实例后有花括号时,该实例是枚举的 【匿名内部类对象】
    31. /
    32.public enum GloablErrorMessageEnum {
    33.
    34. ILLEGAL(50000,“参数不合法”),
    35. ERROR_VALIDSUCCESS(200, “操作成功”),
    36. ERROR_PARAM_ATECODE_ILLEGAL(50001,“验证码错误”),
    37. /
    *
    38. * 3开头的都是商品相关
    39. /
    40. ERROR_PRODUCT_SAVE(30000,“商品保存失败”),
    41. ERROR_PRODUCT_QUERY(30001,“商品查询失败”),
    42.
    43. /6开始的都是用户相关的/
    44. ERROR_USER_PWD_NAME(60001,“用户名或密码错误”),
    45. ERROR_USER_LOGOUT(60002,“注销失败”),
    46. ERROR_PUSH_REDIS(60003,“用户删除失败”),
    47. ERROR_SYSTEM_ERROR(60004,“用户修改失败”),
    48.
    49.
    50. /

    51. * 7开头都是文件相关的代码
    52. /
    53. ERROR_FILE_TYPE(70001,“文件类型不允许”),
    54. ERROR_FILE_DOWN(70002,“文件下载错误”),
    55. ERROR_FILE_UPLOAD(7003,“文件上传失败”),
    56. ERROR_FILE_EXCEL(7004,“excel导出错误”),
    57. /
    *
    58. * 8开头是数据库相关
    59. /
    60. ERROR_DB_FILE(80000,“数据库连接失败”);
    61. /
    *
    62. *
    63. */
    64.
    65. private Integer code;
    66. private String message;
    67.
    68.
    69. GloablErrorMessageEnum(Integer code, String message){
    70. this.code = code;
    71. this.message = message;
    72. }
    73.
    74. public Integer getCode() {
    75. return code;
    76. }
    77. public void setCode(Integer code) {
    78. this.code = code;
    79. }
    80. public String getMessage() {
    81. return message;
    82. }
    83. public void setMessage(String message) {
    84. this.message = message;
    85. }
    86.
    87. final static Map<Integer,GloablErrorMessageEnum> enumMap = new HashMap<Integer,GloablErrorMessageEnum>();
    88. public static GloablErrorMessageEnum getDisabledByType(String code){
    89. if(enumMap.size() > 0){
    90. return enumMap.get(code);
    91. }
    92. GloablErrorMessageEnum[]gloablErrorMessageEnums = GloablErrorMessageEnum.values();
    93. for (GloablErrorMessageEnum gloablErrorMessageEnum:gloablErrorMessageEnums){
    94. enumMap.put(gloablErrorMessageEnum.getCode(),gloablErrorMessageEnum);
    95. }
    96. return enumMap.get(code);
    97. }
    98.}
    99.

    10.定义全局常量
    public class Constant {
    public static final int REDIS_EXPIRE_SECONDS = 606024*7;//7天失效
    /商品列表的redis key/
    public static final String PRODUCT_LIST=“product_list”;

    }

    11.springbootTest
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class DaoTest {

    @Autowired
    private GroupBuysMapper groupBuysMapper;
    
    @Test
    public void test(){
    	GroupBuys findOne = groupBuysMapper.findOne(1L);
    	System.out.println(findOne);
    }
    

    }

    公司稳定必会代码
    1.Springmvc的rest风格代码
    2.Springmvc的上传下载和安全问题的解决 —》 debug屡清楚代码的流程,能说出来

    3.poi的导入导出(未) //在用户列表加入导出excel功能
    4.dubbo的交互方式(未)
    5.redis会使用工具类、在linux上搭建redis集群(未) 1.将用户列表的数据从redis中进行查询 2. 使用redis完成7天免登陆,画流程图 3.使用redis集群 //2018/4/2
    6.cookie会使用工具类往浏览器种cookie
    获取cookie
    7.mq 会使用工具类完成 消费者和提供者和spring进行整合(未)
    8.会使用httpclient发送http或https的请求
    整合spring设置httpclient的连接池
    9.手写单例模式
    10.Zk集群配置(和4关联)
    11.创建线程池的代码(利用spring)
    12.strus2、springmvc拦截器 看代码
    13.过滤器
    14.监听器
    15.spring的定时器
    16.nginx的配置
    17.搭建fastDFS图片服务器
    18.maven多模块的搭建 , 如何配置连接公司的私服地址
    19.svn的使用,提交代码检出代码,如何避免冲突
    20. easyui ztree
    21.hashmap的原理(会背)
    22.创建java对象的方式(克隆、序列化、反射、new)要求会写
    23.threadlocal()
    24.tomcat优化、sql优化,jvm优化
    25.spring的ioc原理和aop的原理
    26.solr集群搭建(solrCloud实现)
    27.jquery的东西 如:ajax(看前面)
    28.servlet的运行原理 (看前面)
    29.接入第三方(利用httpclient、ssm,完成发送短信登录)
    30.数据库设计工具(powerDesiger) ,数据库字段的命名规范
    31.异常处理机制(service throw), 定义全局错误字典(枚举) 做项目优化 //
    32.xml解析(dom4j+xpath),json的解析
    33.前台对接后台(前后台交互规范) pageresult
    34.跨域(jsonp、cors)
    35.域名解析过程
    36.独立完成任务(需求的分析,技术选型,编码,测试,上线)
    37.公司的组织架构,人员配置
    38.一个类如何被jvm加载
    39.项目的架构图
    40.负责模块的业务流程图
    41.学会使用网络,检索自己的问题
    42.前后台的断点调式
    43.如何和同事处好关系
    44.如何快速融入团队
    45.和不同部门的交流
    46.运行一个之前没有接触过的项目 (svn / git)
    四组,五组: https://github.com/Exrick/xmall 支付:https://gitee.com/52itstyle/springMvc-dubbo-pay
    六组(4人):https://github.com/xuhuisheng/lemon OA
    一组、三组:https://gitee.com/qq1350048638/p2p 金融
    二组(5人):在线考试:https://github.com/mikemelon/java-exam 在线教育:https://gitee.com/inxeduopen/inxedu

    47.如何在一个项目上增加功能
    48.项目的部署上线(看上面)
    49.如何从一个开源的项目中找到自己需要的代码

    如何完成一个任务

    1.分析需求
    2.创建数据库表(分析对象是一对多,多对多)
    从原型图上,咱们看到对象(对象:1.作物(属性:名称,资金,面积)2.补贴subsidies(属性:环节,单价))
    3.编写代码
    前后台分离(大部分)
    前台的请求类型如何是 ,那么springmvc后台想要接受到这个值就需要使用

     非前后台自己写
     去了公司写代码(大部分都是老的项目)
    

    1.你的代码写到哪个项目里面 2.写到哪个包里面 3.写到哪个类里面
    搭建ssm+maven的项目
    前后台交互的数据如何定义:
    添加:
    一对一:
    商品表和商品描述表
    先添加商品–》返回商品表主键(mapper的xml文件里面加入属性)—》把商品表的主键作为id,添加商品描述表
    一对多:
    先添加主表–》返回主表主键—》使用for将主表的id作为外键,插入到多的一方的表里面
    {“id”:1,”name”:”zhangsan”,list:[{},{}]}
    多对多:
    用户和角色
    其实添加的时候就是一个1对多的特殊情况(需要看中间)----》根据1的一方删除中间表的记录—》在往中间表
    做添加操作。
    多重一对多:
    [{“id”:1,”name”:”zhangsan”,list:[{},{}]}, {“id”:1,”name”:”zhangsan”,list:[{},{}]}]

    https://www.json.cn/ 在线校验json格式
    将json数据转换成实体类

    4.单元测试
    SpringTest
    5.提交到svn/git(协同开发)

    6.发布到测试环境(测试)
    Linux(1.jdk 2.tomcat 3.数据库 )
    7.上线

    1.搜索 【百度,谷歌】-----》 “关键字”(一定要精确到想要的答案)
    多打开几个网页进行对比。(至少3个)
    下载demo ( csdn, github.com,码云),看明白进行移植(跑起来进行debug)

    2.开始实践 调试—》一边调式一边搜索—》出效果—》优化

    (文件上传安全问题的解决方案http://blog.csdn.net/u014609111/article/details/52701827)

    添加缓存的逻辑
    第一步:根据应用场景,选择技术(redis)
    场景:排序+分页----》细化技术(sortset)
    第二步:编码
    写思路注释的

    Echarts(百度开源报表工具)
    开发思路(面试话术)
    其实这个报表工具还是很方便,提供了非常多的图形样式,现在更新到4版本,
    在使用的时候,只需要到官方的案例里面找到自己想到的图形效果,然后就可以将页面,下载到本地,复制到项目中,将静态的数据,修改成从后台获取就可以了。一般后台返回json数据,组装成前台需要的数据,进行展示。
    当时我们在做XXX的时候遇到了一个什么问题,然后我们怎么解决了。
    模块
    1短信登录或注册

    6.实现点击类目弹出一个窗口(Window)

    Linux的学习
    为什么学习Linux?
    Linux 1.稳定 (相比windos系统) 24*365 2.开源免费 3.安全

    Linux内核是在1991年由芬兰赫尔辛基大学大学生李纳斯.托沃滋(Linus.Torvalds)发起创建的开源软件项目。

    经理:你上Linux服务器,看一下日志,定位一下程序问题?
    你:

    自己: Windos - 虚拟机(系统的平台)安装任意的系统 (学习的目的)

    公司:有服务器(Linux服务器) 【ip (身份标识), 用户名和密码】 用来放公司的项目的

    客户端的使用

    使用客户端连接公司的服务器: Xshell ,putty, crt, ssh

    CRT的设置

    连接服务器的步骤

    去了公司以后:
    多个环境
    1.本地开发环境
    2.测试环境(测试代码)(Linux) 【供内部人员测试使用】
    3.灰度环境(预发布环境) (Linux) 【预发布环境】
    4.生产环境 (Linux)

    Jdk > jre > jvm(跨平台)
    去部署项目:
    环境:jdk , tomcat(web容器) /
    rmp(不需要配置环境变量) tar.gz(需要要配置环境变量)

       服务器:Ip  name  pwd
    

    自建机房:自己买机器
    购买云服务:阿里云,亚马逊,万维,腾讯云,华为云

    开机启动:tomcat

    本地的hosts文件地址:(编辑域名和ip的对应关系)
    Win: C:\Windows\System32\Drivers\etc
    Linux:vim /etc/hosts

    Permission denied 这个提示是没有权限

    1.Linux的目录结构
    Cd /
    根目录是 Linux 文件系统的起点,所在分区称为根分区
    /root
    Linux系统管理员(超级用户)root的宿主目录,如win的administrator
    /bin
    存放系统中基本的用户命令,普通用户权限可以执行
    /sbin
    存放系统中基本的管理命令,管理员用户权限可以执行
    /boot
    存放Linux系统启动所必需的文件(“/boot”分区)
    /dev
    存放Linux系统设备文件
    /etc /etc/profile /etc/sysconfig/iptables /etc/hosts(hosts)
    存放Linux系统和各种应用程序的配置文件
    /home
    存放普通用户的宿主目录,如win的“C:\Users,可独立分区备份
    /var nginx
    存放系统中经常需要变化的一些文件,如log文件
    /usr
    存放Linux系统中大量的应用程序

    2.Linux中不同颜色代表的含义
    1)白色的文件:一般的文件
    2)蓝色的文件:目录
    3)绿色的文件:可执行文件
    4)红色的文件: 代表压缩包

    3.基本命令

    Power off 关闭电源
    shutdown –h now 关机
    reboot 重启
    shutdown –r now 重启
    logout 注销
    exit 退出
    echo 在终端显示命令行中键入的任何信息:echo ni hao,显示ni hao。
    WINDOS系统上Echo %JAVA_HOME%
    若在一行上需要同时执行2条以上命令是用“;”分隔
    echo $JAVA_HOME

    添加用户:useradd 用户名
    添加用户组:groupadd
    创建用户时指定用户初始组
    useradd -g <initial_group>
    修改用户所在初始组
    usermod -g
    查看用户所属组:groups
    删除用户组:groupdel

    使用passwd设置密码 :passwd 用户名
    注意:若无则默认为root修改密码 忘记密码可以进入安全模式(单用户模式)进行修改
    查看当前用户: whoami / who am i
    查看所有已登录用户:who
    查看所有登录用户记录:last
    切换用户:su
    删除用户: userdel [-r]

    环境变量地址:/etc/profile
    4.常用命令 2018/3/28
    chmod +x *.sh 给文件加给执行权限
    ps -ef | grep java 查看应用进程
    1)显示当前工作目录中的内容
    命令:ll ls
    2)删除命令
    rm -rf
    cd /data/soft mv * /usr/gc
    模拟回收站:mv * /usr/gc

     rm  -rf   *
    
    1. 文件的复制
      Cp 复制的文件 复制的路径 (同一个服务器的拷贝)
      Scp可以跨服务器复制
      【scp jenkinstest.war 1510c@192.168.77.132:/data/apache-tomcat-7.0.14/webapps
      scp local_file remote_username@remote_ip:remote_folder
    2. 文件的移动
      Mv 移动的文件 移动的路径
      5)创建一个文件
      Touch 创建的文件名 vi/vim 文件名
      6)进入目录
      Cd 返回上一级 cd …
      7)创建文件夹
      Mkdir 文件夹的名字
      8)查看当前目录
      pwd
    3. 修改密码
      Passwd
      10)添加用户
      UserAdd
      11)查找文件
      Locate 有局限性:找不到新建的文件 需要更新一下数据库 updatedb
      find -name find / -name fire
      在指定目录下查找指定文件
      注意:
      文件名中可用“*”和“?”
    • 表示0到多个字符
      ?表示一个字符

      12)cat more less tail (动态查看日志) head grep
      Cat 直接显示文件的内容到屏幕上 (适合看配置文件)
      有局限性:
      前面的内容比较多,用“…”省略,我们只看到了这个文件的后面的部分,由此可以知道,这个命令适合于显示内容少于屏幕所能显示的最大行数。
      More
      注意最下面显示了一个提示,表示只显示这个文件的2%,按下空格键就翻下一页,当内容显示完后,就自动的退出,还可以按下“Q”键也可以退出。
      有局限性:
      more虽然可以显示比较大的文件,但是也有一个缺点,就是不能向上翻页
      Less
      最下面显示的是这个文件的名称,我们可以使用“PageUp”和“PageDown”可以进行上一页和下一页的翻页。如果要知道具体的控制键,我们可以按下“H”键,可以显示less命令的所有控制键,如果想结束,可以按“Q”键
      Head 和tail
      上面是最常用的几个显示文件内容的命令,这里还介绍两个显示文件内容的命令,分别是head和tail命令,head是显示文件的头几行,tail是显示文件的末尾几行,默认情况下,都是10行

    rz(上传) sz(下载)
    测试是否有网使用 ping www.baidu.com

    yum -y install lrzsz (有网)

    unzip 解压命令

    grep:
    $grep -5 ‘parttern’ inputfile //打印匹配行的前后5行

    $grep -C 5 ‘parttern’ inputfile //打印匹配行的前后5行

    $grep -A 5 ‘parttern’ inputfile //打印匹配行的后5行

    $grep -B 5 ‘parttern’ inputfile //打印匹配行的前5行

    grep -5 ‘订单号110000’ catalina.out > orderLog2luqian.txt //线上找错经常会用的

    ps -ef | grep java //查看tomcat的进程号
    netstat -anp | grep 进程号 //监听的端口

    telnet 10.30.8.97 3306 判断服务器上的一个具体的应用程序通不通
    ping 判断服务器通不通
    chown 普通用户名: 普通用户名组 data 将data文件夹设置为普通的用户

    wget https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.7.tar.gz 联网下载指定的内容
    uname -a 查询系统的版本

    ./startup.sh(命令) && tail -100f …/logs/catalina.out(命令)【命令联合使用】
    Liunx设置开机自启
    两种方式:1)修改配置文件vim /etc/rc.d/rc.local
    su - 1510c(你指定的用户)-c “/data/redis/bin/redis-server /data/redis/redis-4.0.1/redis.conf”
    如果不指定默认是用root用户启动

    2)将其设为系统服务
    Liunx配置开机欢迎页
    vim /etc/motd
    5.权限
    保证了服务器的安全。

    Nginx tomcat mysql .sh root orale
    T1
    T2 nginx
    chown t1 nginx

    1)更改用户和用户组 chown 用户:用户组 文件
    更改文件权限:chmod [ugoa][±=][rwx] (用逗号分隔)
    更改文件所有者:chown
    更改文件所属组:chgrp
    同时更改所有者和所属组:chown owner:group
    2)
    “-rw-r—r–”部分的第一个字符表示文件类型,可以是d(目录)、b(块设备文件)、c(字符设备文件),减号“-”(普通文件)、字母“l”(链接文件)等
    ln -s jdk jdk1.8
    其余部分指定了文件的访问权限
    在表示属主、属组内用户或其他用户对该文件的访问权限时,主要使用了四种不同的权限字符: r 可读 ;w 可写 ;x 可执行 ;- 无权限
    r、w、x、- 权限字符还可分别表示为8进制数字4、2、1、0

    6.vi命令
    Vi server.xml 第6报错

    vi 打开或新建文件
    退出编辑器:
    :q(已保存或未更改)
    :wq / x!(保存后退出)
    :q!(强制退出)

    Set nu显示行号
    dd 删除光标所在行
    撤销操作: u

    7.网络配置
    8.netstat -anp | grep 进程号 //监听的端口

    ifconfig [网络接口名称]
    “eth0”是Linux系统中第一块以太网卡名称
    “lo”是Linux系统中的回环网络接口,它不代表真正的网络接口,而是一个虚拟的网络接口,IP永远是“127.0.0.1”
    Ping
    Telnet [windos使用需要在 控制面板\所有控制面板项\程序和功能 里面开启]
    本地主机名称解析文件:/etc/hosts
    使配置生效service network restart

    配置固定IP
    进入/etc/sysconfig/network-scripts文件下,修改ifcfg-eth0这个文件。(红色字体不可以修改)

    防火墙的关闭和开启
    开启: service iptables start
    关闭: service iptables stop
    在开启了防火墙时,做如下设置,开启相关端口, 修改vim /etc/sysconfig/iptables 文件,添加以下内容:
    -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
    -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
    修改完成后进行防火墙的重启,使其生效:service iptables restart

    9.软件的安装
    tar包,如software-1.2.3-1.tar.gz。他是使用UNIX系统的打包工具tar打包的。[nginx.tar.gz]
    1)tar -zxvf backup.tar.gz
    进入解压目录
    2)./configure (看没有这个文件,有就执行,没有直接执行3)[redis.tar.gz]
    3) make && make install (默认安装,默认安装到/usr/local,是管理员权限)
    普通用户自定义安装make && make PREFIX=/data/redis/(自己定义安装的目录) install

    rpm包,如software-1.2.3-1.i386.rpm。他是Redhat Linux提供的一种包封装格式。
    安装rpm -ivh 软件包名

    查看rpm -qa | grep jdk
    卸载rpm -e 软件名 (卸载linux自带的安装包)
    rpm -e 'java的版本 ’ --nodeps(强制卸载)
    dpkg包,如software-1.2.3-1.deb。他是Debain Linux提供的一种包封装格式。
    bin包,如jdk-1_5_0_05-linux-i586.bin,有些Linux软件不公开源代码,只发布二进制可执行程序,这类程序一般会以bin来标记。
    yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE、CentOS中的Shell前端软件包g基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
    Yum -y install软件名字 //yum -y install lrzsz (安装上传下载的软件)
    联网安装(在线安装),版本取决于yum库里面的软件版本。

    9了解shell脚本
    shell脚本是用shell命令编写的可执行程序
    /etc/rc.d/init.d/

    10.jdk安装

    安装rpm不需要配置环境变量

    安装的tar.gz是需要配置环境变量的 /etc/profile source /etc/profile

    11.如何将一个项目部署到linux服务器上
    条件:
    从服务器方面
    1)tomcat /resin/jboss/ 是什么:web容器 (serlvet容器)

    2)jdk环境 jdk > jre > jvm

    代码
    

    1)war (web项目) / tar.gz
    2) 修改成和测试服务器匹配的地址 (localhost / 127.0.0.1 / 测试服务器)

    有什么弊端:
    1.项目的发布过程比较麻烦 (很多公司在用)

    在本地打war, 上传到tomcat(webapps) ,启动tomcat, 查看日志是否启动正常
    【运维部门】
    互联网项目功能测试和性能测试通过可以上线 (夜深人静的时候上线) —》
    00:00 —》 00:40 —》 1:30 —》 2:10
    服务器到开发手中。

    2. Maven的热部署, (比较多)
    3. Jenkins/hudson(持续集成工具) (分布式的大项目使用【7,8】)【面试的亮点】

    远程连接别人的mysql服务器:

    一个应用占用唯一的端口号 (所以很据端口号可以确认唯一的应用)

    去公司: 给一个数据库的ip, 用户名,密码 【90%以上的问题都是可以搜索引擎解决的 】

    部署到服务器的项目不能正常访问?
    1)tomcat启动报错 (查看日志 logs目录 tail -100f 日志文件)
    2)修改tomcat端口号 (conf目录 server.xml )[端口占用]
    3)启动成功tomcat但是还是不能访问。(telnet ip 端口) ,防火墙拦截
    4)修改防火墙(1. 开通端口(vi /etc/sysconfig/iptables
    [-A INPUT -p tcp -m state --state NEW -m tcp --dport 8080:9090 -j ACCEPT]) 2.关闭防火墙(不建议使用))
    12.修改一个项目为域名访问

    13 问题解决

    1.mysql数据库连不上(虚拟机连不上本地的数据库) 【应用不可用问题的通用解决方案】
    定位问题: 1) ip对不对 (ipconfig)
    2) ping ip
    3) telnet ip 端口(telnet ip 3306 [不通就会有保存信息,然后搜索答案])

    INSERT INTO mysql.user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, Event_priv, Trigger_priv, Create_tablespace_priv, ssl_type, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, max_user_connections, plugin, authentication_string) VALUES (‘localhost’, ‘root’, ‘*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘’, ‘’, ‘’, ‘’, ‘0’, ‘0’, ‘0’, ‘0’, ‘’, ‘’);
    INSERT INTO mysql.user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, Event_priv, Trigger_priv, Create_tablespace_priv, ssl_type, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, max_user_connections, plugin, authentication_string) VALUES (’%’, ‘root’, ‘*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘N’, ‘N’, ‘N’, ‘’, ‘’, ‘’, ‘’, ‘0’, ‘0’, ‘0’, ‘0’, ‘’, NULL);

    2.tomcat 自带的页面 (默认访问ROOT)

    3.tomcat启动问题
    查看日志,具体问题具体分析

    4.安装jdk和tomcat等软件
    Tar.gz ln -s 源文件地址{/usr/java-1.7.079} 引用地址 /usr/java

    1. 客户端连接不上服务器
      1.确定虚拟机的网络模式

    2.确定服务器的ip
    Ifconfig

    3…看本机的vm8

    看网段是否是服务器一致
    如果网段不一致,就进行修改ipv4

    15.通过域名访问项目

    1. 效果: www.bwie.com
    2. 去掉端口
      将项目的访问端口号,修改为80, 因为http的默认端口号是80
      3.去项目名
      1)maven
    org.apache.tomcat.maven tomcat7-maven-plugin 2.2 / 80 2)tomcat中的修改

    问题反思(敲代码)
    Day1
    1)
    问题:搭建ssm框架,有问题(详细描述)
    反思结果:框架运行原理不清楚
    是否解决:
    没有解决的原因:
    2)
    Day2

    Bootstrap学习
    http://www.ibootstrap.cn/ (在线编辑器)
    学习新技术的步骤:
    1.了解是什么【】
    2.能干什么 [解决项目中的问题]
    3.需要安装环境就安装环境
    4.下载官方文档(中文)
    5.下载一个小demo (运行)
    6.涉及到的专业名词
    7.跟着文档去应用 【看效果】
    8.融合到项目中应用
    9.遇到的问题 (经验)
    10,和其他技术的对比


    1.2011年, twitter工程师研发 ,基于 html5、 css3的 bootstrap
    2.开发响应式的前端
    3.文档
    4.Demo
    5.专业名词
    5.1 响应式
    支持
    不支持:
    5.2 Containers
    用.container包裹页面上的内容即可实现居中对齐
    5.3栅格系统
    通过下表可以详细查看Bootstrap的栅格系统如何在多种屏幕设备上工作的。

    列偏移:offset
    

    嵌套列:div的嵌套
    列排序:push
    5.4排版
    标题


    小标题

    ...

    灰色

    ...

    蓝色

    ...

    绿色

    ...

    浅蓝色

    ...

    黄色

    ...

    红色 5.5表格 table-striped 条纹状 table-bordered 边框 table-hover 鼠标悬停 table-condensed 锁紧表格 给表格的行或单元格加颜色:

    将任何.table包裹在.table-responsive中即可创建响应式表格 响应式表格
    5.6表单
    格式:form role=“form”
    .form-group 将label和前面提到的这些控件包裹在.form-group中可以获得最好的排列。

    5.7按钮
    5.8图片
    6.bootstrap-table插件

           AngularJS
    

    1.是什么
    AngularJS[1] 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。AngularJS有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等等。
    AngularJS 通过 指令 扩展了 HTML,且通过 表达式 绑定数据到 HTML
    要理解AngularJS,第一件要做得事情就是要明白这是一个根本上就和jQuery不一样的工具。jQuery是一个库而AngularJS是一个框架。使用库是指,你的代码决定什么时候从库中调用一个特定的方法;使用框架则是,你实现了一些回调方法,到了特定的时候框架会去调用这些方法。
    2.能干什么
    AngularJS 使得开发现代的单一页面应用程序(SPAs:Single Page Applications)变得更加容易。
    AngularJS 把应用程序数据绑定到 HTML 元素。
    AngularJS 可以克隆和重复 HTML 元素。
    AngularJS 可以隐藏和显示 HTML 元素。
    AngularJS 可以在 HTML 元素"背后"添加代码。
    AngularJS 支持输入验证。

    MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入
    3.对比

    4.demo运行

    5.指令
    ng-app 指令告诉 AngularJS,

    元素是 AngularJS 应用程序 的"所有者"。
    ng-model 指令把输入域的值绑定到应用程序中。
    ng-bind 指令把应用程序变量 绑定到某个段落的 innerHTML。
    ng-controller 控制器
    ng-click 点击事件
    ng-init 初始化数据 【e.g : ng-init=“name=‘zhangsan’; ”】
    ng-repeat 做循环 【复制html标签】

    $rootScope 可作用于整个应用中

    6.过滤器

    7.service服务

    Svn
    分清客户端和服务端
    客户端:就是自己电脑安装的小乌龟【eclipse的插件】
    服务端:公司的统一放代码的机器

    向服务器提交项目
    1)Eclipse

    2)小乌龟

    将服务器项目检出到本地
    1)Eclipse

    2)小乌龟

    当把项目导入到eclipse发现不能和svn直接交互

    更新别人提交的代码到本地
    1)Eclipse
    更新

    2)小乌龟
    更新
    分支的合并
    1)Eclipse

    2)小乌龟

    在实际工作中的使用规范
    1)提交流程:提交代码先执行更新,【原因是:要获取服务器最新的代码版本】
    2)上线流程:【多个需求并行开发的时候需要打分支,上线时需要将分支合并到主干,主干上线完成打tag】
    合并操作是在本地完成的,需要将合并的结果提交到svn上
    主干上线后打一个tag [历史的上线版本都放在tags中]
    –6.20上线 【基本购物流程,分支】–》上线的是合并后的主干—》tag
    –6.25上线 【促销,分支】 —》把主干线上成功后的代码合并到分支上,进行测试,测试成后,合并到主干进行上线tag
    3)为避免冲突,在开发代码的时候,要分工明确,一个人一个模块,不要出现两个人同时修改一个文件的情况(对于公共的代码,修改是需要提前和小组成员告知)

    1)Eclipse

    2)小乌龟

    Svn回滚到某一个版本

    Svn的冲突解决办法
    冲突产生的原因: 多个人同时修改同一个文件,并且修改了同一个位置,前一个人提交成功,后一个人在更新的时候就会产生冲突

    如何解决:1)选择编辑冲突 2)然后找到相应的提交人,商量完成后将冲突标记为已解决

    Nginx
    作用:
    将用户过来的请求,根据自身的负载均衡策略,将请求分发到不同的web服务器上

    虚拟主机:
    可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响的。
    其实就是配置多个server, 一个server就是一个虚拟主机

    负载均衡和反向代理
    Rewrite
    rewrite语法格式及参数语法说明如下:
    rewrite [flag];
    关键字 正则 替代内容 flag标记

    关键字:其中关键字error_log不能改变
    正则:perl兼容正则表达式语句进行规则匹配
    替代内容:将正则匹配的内容替换成replacement
    flag标记:rewrite支持的flag标记
    

    flag标记说明:
    last #本条规则匹配完成后,继续向下匹配新的location URI规则
    break #本条规则匹配完成即终止,不再匹配后面的任何规则
    redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
    permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

    server {
        listen       80;
        server_name  www.1512e.com;//访问的域名
        rewrite ^/(.*)$ http://www.admin.com permanent;//跳转的域名
    
        location / {
            proxy_pass http://product_server;
            index  index.html index.htm;
        }
    
        }
    

    当增加代理服务器时,web服务器获取真实ip
    业务场景: 之前做过一个考试系统,随着学校的发展,学校人数增多,并发量也越来越大
    我们之前开发的是一个单一应用的架构。为了更快的解决问题,我们给考试系统做了一个集群。加上集群后,发现我们检测恶意破坏的代码就出了问题。我们的代码里面之前是用request.getRemoteAddr()这个方法取获取用户真实ip的,加了nginx集群的时候发现获取的ip全部是nginx的ip,之后再nginx加了一个realip的模块解决了这个问题。

    Nginx 添加–with-http_realip_module模块
    Nginx添加模块
    1.查看nginx有哪些模块
    2.找到nginx安装目录()
    1)./configure --with-http_realip_module
    2)make [不能执行make install 否则就重新安装了]
    3. 到objs的目录中获取nginx的命令,将其拷贝到执行的目录
    4. 到执行目录进行测试(./nginx -V)
    Nginx做日志的定时(crontab )切割
    一天一个文件
    通过定时任务执行脚本进行切割
    看懂项目需要具备的能力
    1.框架的数据交互流程(页面–>后台–>db(传给其他模块))
    前台发送数据到后台:
    1)http的请求协议和组成
    2)前台是如何发送一个http【ajax,form表单,location.href ,a标签,angularjs里面的$http】
    3) http如何携带参数到后台
    普通方式: http://www.bwie.com?name=zhangsan&age=18
    restful风格: http://www.bwie.com/zhangsan/18
    将参数方到请求头
    后台如何接收,处理参数【java】
    1.servlet [接收参数]【web交互的规范】
    2.servlet / struts / struts2 / springmvc / 自己封装的框架 [不同的框架有不同接受参数的方式]
    3.处理参数,执行业务逻辑【事务1.spring [注解方式,xml]】
    有可能会调用其他模块【httpclient, duubo, springcloud】
    4.数据要落地—>存放到数据库【mysql , oracle ,db2, mongodb, redis等等 】
    框架的整体运行流程

    小技能:
    熟练:
    1.postman
    2.debug(1.前台 2.后台)
    3.swagger
    1.适合restful风格的接口,使用的一个前后台交互的在线接口管理工具
    使用步骤:
    4.利用eclipse/idea快速看明白项目的结构

    全局搜索Ctrl+H

    后台断点查看数据

    5.转化json jsonview 或者使用在线:https://www.json.cn/
    6.前台断点

    查看一个比较长的表达式里面的值,直接选中就可以了。

    Git的使用
    图形化的客户端程序(1.小乌龟 2. SourceTree)
    1)安装
    先安装git.exe ----》 再安装 小乌龟----》配置小乌龟,git的路径

    2)服务端工具使用gitlab
    https://blog.csdn.net/gx_1_11_real/article/details/79406427

    小乌龟和gitlab交互需要配置秘钥(配置) <–老员工

    视频教程:
    链接: https://pan.baidu.com/s/1TaWahcunFVWLJLarRDmmpw 密码: stc9 idea
    链接: https://pan.baidu.com/s/1FXpqPyePGbWPF4EeVp0KXQ 密码: qqpk git\

    Springboot
    链接: https://pan.baidu.com/s/12CzSWmEGS4YVyCV3kB8MOQ 密码: eyg5
    代码:https://github.com/JeffLi1993/springboot-learning-example
    1)为什么学习
    Springboot是一个约定由于配置的,去xml化的,一个框架。内部集成了很多插件
    ,集成到项目的时候,直接导入依赖,添加配置,就可以写代码。非常方便
    2)怎么使用
    Springboot和jsp页面整合
    Springboot和mybatis整合
    Springboot如何控制事物
    Springboot整合spring data jpa(去xml)
    没有使用spring data jpa,和数据库交互的过程
    之前数据库的表和实体类之间的关系是通过xml方式关联的
    Sql是在xml配置文件里面写的,通过mapper接口里面的方法名和xml配置文件里面的id进行关联,从而找到要执行的sql
    使用spring data jpa和数据库交互
    代码中的实体类和数据库的表通过注解关联
    Sql可以通过注解实现,但是spring data jpa基本的查询都具备了

    3)

    Springdatajpa
    多表查询,
    1)返回自定义的Vo对象(写sql语句)
    返回Object[]。
    在利用我们项目封装好的工具类进行转换(工具类内部利用反射将构造方法进行实例化转为我们的vo对象) //分页 模糊

    //nativeQuery=true 使用原生sql进行查询
    @Query(value = “SELECT g.ID,g.ActivityName,GROUP_CONCAT(gt.GoodsCode) as GoodsCode,GROUP_CONCAT(gt.GroupBuysPrice) as GroupBuysPrice”
    + " FROM groupbuys g LEFT JOIN groupbuysdetails gt ON g.ID = gt.GroupbuysId WHERE g.ActivityName LIKE %?3% GROUP BY g.ID limit ?1,?2",nativeQuery=true)
    List<Object[]> getList(int startIndex,int pageSize,String name);

    2)使用hql写@ManyToOne

    3)可以自己去new一个返回的vo,,但是也算hql的范畴
    @Query(“select new com.project.user.dto.UserVO(count(u),name) from User u group by u.name”)
    public List findCountGroupByName();

    团购
    Redis
    设计表 【】
    Springboot【】
    Easyui
    Nginx上线
    业务

    项目建表通用方法
    1)查询:—》多表查询 —》vo --json–》页面

    1. 添加 一对一【两张表】
      一对多,
      多对一【两张】

    多对多【把数据添加到中间表】

    1. 修改 一对一【两张表】 一对多,多对一【两张】 多对多【中间表】
    2. 删除 一对一【两张表】 一对多,多对一【两张】 多对多【中间表】

    资源检索
    代码:
    Github
    码云
    最代码
    找视频
    https://www.lthack.com
    https://www.mukedaba.com
    http://www.sobaidupan.com/ 检索百度网盘资源

    文件上传
    前端可能会传两种格式:
    3)form 表单需要设置 enctype=“multipart/form-data” 属性 ,
    input type=”file”
    4)base64字符串
    后台springmvc接受文件参数
    1)public String pictureUpload(MultipartFile uploadFile) 2)public String pictureUpload(String uploadFileStr)

    如何在后台获取项目路径下的文件地址
    String servletPath = request.getSession().getServletContext().getRealPath("/images");

    Freemarker
    1.了解是什么()
    2.能干什么 [解决项目中的问题]
    1)后台提供数据,渲染到前台的模板中【jsp】 (p2p)[jsp]
    2)生成html静态页面 (商城)【页面静态化提高并发】

    3.下载官方文档(中文)
    4.下载一个小demo (运行)
    5.涉及到的专业名词
    6.跟着文档去应用 【看效果】
    7.融合到项目中应用
    8.遇到的问题 (经验)
    9,和其他技术的对比

    企业项目Debug方法
    效果出不来,一定要去找日志,根据日志定位问题

    1.一边debug,一边画流程图 (只要屡清楚,数据的交互流程)

    2.debug方法(前端,后台debug, 远程debug)

    1 )前端点击,一个发送到后台请求的按钮。
    

    2)F12查看请求路径
    3)根据请求路径到后台进行全局搜索(ctrl+h) 可以*做通用匹配

    网站安全
    1.加密
    对称加密
     DES: 已破解,不再安全,基本没有企业在用了
     AES: 最常用的对称加密算法, 密钥建立时间短、灵敏性好、内存需求低
     IDEA: 常用的电子邮件加密算法

    非对称加密
    RSA算法
    通过加密解决的问题:
    1)防止篡改 ----》签名机制 (支付)
    2)防止数据被别看到 ----》 (登录,聊天记录)
    数字摘要(唯一性和单向性)
    将任意长度的消息变成固定长度的短消息, 常用的消息摘要算法包括 HASH (MD5 、SHA1 、SHA256)

    多环境部署
    Springboot直接写多个配置文件,然后在主配置文件进行设置

    Maven项目-maven-profile:
    https://www.cnblogs.com/0201zcr/p/6262762.html

    dubbo
    1.dubbo的重试机制
    dubbo默认会重试两次,如果针对于写的接口,有可能数据执行成功,但是响应失败,这样dubbo也会进行重试,这样就会导致数据,重复添加或重复修改(比如重复扣减库存)

    对接第三方

    对接方式:(natapp,ngrok[内网穿透])
    当官网申请对接的账号
    1)找到官网 (api文档 和demo)
    将跑通的demo项目
    –git/svn—>导入到ide开发工具—》运行项目(测试环境)-- 捋清楚项目和项目之间的调用关系

    移植到自己的项目中
    ----》在哪个项目,哪个包,哪个类里面开发
    ----》看看别人的代码(码云,github)【选择java语言】
    ----》把交互的流程屡清楚

    3)联调

    {
    “message”:“ok”,
    “state”:“0”,
    “status”:“200”,
    “condition”:“F00”,
    “ischeck”:“0”,
    “com”:“yuantong”,
    “nu”:“V030344422”,
    “data”:[
    {
    “context”:"上海分拨中心/装件入车扫描 ",
    “time”:“2012-08-28 16:33:19”,
    “ftime”:“2012-08-28 16:33:19”,
    },
    {
    “context”:"上海分拨中心/下车扫描 ",
    “time”:“2012-08-27 23:22:42”,
    “ftime”:“2012-08-27 23:22:42”,
    }]
    }

    1邮件
    2.短信
    3.支付
    4.物流
    B简历的规范:
    1.最近两个项目,(重点是最近做的这个项目)
    2.主要负责的模块(自己一定要体验一遍)—》【用咱们学过的技术去实现,网盘和论坛】
    (1)体验
    (2)技术实现 (表设计,redis)
    (3)遇到了什么问题,怎么解决的
    (4)项目整体的架构图
    (5)项目的人员划分
    【后端:10 前端:4 运维:2 测试: 3 项目经理:1 产品经理:1】
    (6)网站的域名

    • 7
      点赞
    • 0
      评论
    • 21
      收藏
    • 打赏
      打赏
    • 扫一扫,分享海报

    ©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

    打赏作者

    Faith^(阿浩)

    你的鼓励将是我创作的最大动力

    ¥2 ¥4 ¥6 ¥10 ¥20
    输入1-500的整数
    余额支付 (余额:-- )
    扫码支付
    扫码支付:¥2
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值