第一天
运行
-
编译:javac -cp 目标目录 源文件的全路径(例如:javac -cp c:/java c:/java/test.java)
-
运行:java -cp class文件所在目录 类名称(例如:java -cp c:/java HelloWorld)
类与公开类
- 如果一个类是公开类,.java文件名字与公共类名字一致
- 一个.java文件只应该有一个公开类
生成帮助文档
- javadoc -d 目标文件 源文件(例如:javadoc -d c:/java/help c:java/Note.java)
- 在其文件夹内运行,可简化为: javadoc -d help Note.java
第二天
全局变量和局部变量的区别
全局变量(成员变量)可以不用初始化值,其默认值为0,局部变量必须初始化值。(即:局部变量必须先定义再赋值后使用)
面试题
- x += y与x = x + y不完全等价
- byte b = 0;
b =b + 1;不正确****b += 1;正确
以下哪一个数据类型不能作用在switch case语句当中:
A 枚举 B Sting C int D long E byte F char
选D
第三天
-
for一般应用于固定次数的循环,while一般应用于不固定次数的循环
-
使用lable可跳出多重循环
-
for循环增强(foreach),jdk1.5版本的遍历(迭代)
数组
- 数组所创建的内存空间只能存储相同类型的数据
- 数组所分配的内存空间是连续的
- 数组所分配的内存空间是不可扩充的
第四天
基本数据类型
byte short char int long float double boolean
类类型
Byte Short Character Integer Long Float Double Boolean
升序排列(使用元素自然的顺序排列)
Arrays.sort(数组名);
降序排列(自定义排列顺序)
Arrays.sort(数组名,Collections.reverseOrder());
reverseOrder为倒序
汉语排序
Collator.getInstance(Locale.CHINA);
数组拷贝
// 执行拷贝(原数组,从原数组的第n位取元素,目标数组,从目标数组的第n位开始装入,拷贝原数组多少位)
System.arraycopy(array, 0, newArray, 1, array.length);
第五天
线性结构的四大特征
有序的,连续的,随机访问的,插入和删除慢
函数的概念
函数是一个固定的程序段,它在可以实现固定运算的同时,带有一个入口和一个出口
函数的定义
方法+功能+动作
函数的语法
返回值类型 函数名 (函数类型 参数名称1,函数类型 参数名称2) {
函数体
}
命名规范
- 包名:所有单词中的字母均小写,例如:java.util
- 类名:所有单词的首字母大写,其他字母小写,例如:StudentService
- 变量名称和方法名称:第一个单词的首字母小写,其他所有单词首字母大写,例如:stuName
- 常量:所有单词的所有字母全部大写,单词和单词之间用下划线分隔,例如:PI,STU_SEX_MAN
第六天
第七天
面向对象
构造方法的意义:
给对象的数据(属性)进行初始化构造方法不用调用,一创建对象就执行
如果在一个类中没有定义构造方法,系统会默认给一个空参的构造方法,格式是:public 类名(){}
如果在一个类中定义了一个有参的构造方法,系统就不会默认再给空参的构造方法
有参的构造方法是为了给对象中的属性进行初始化,空参在不需要给属性进行初始化,但是还要创建对象的时候使用
面向对象的四大特征
抽象
- 对现实世界进行抽象,形成类
- 研究事物的静态特征
- 研究事物的动态特征
- 类的对象之间的转换(产生对象之后就可以调用属性和方法)
封装
- 提供构造方法
- 静态块(做类的初始化工作)
- 控制访问(private,default,protected,pubulic)(控制构造方法,控制属性的访问,控制方法的访问)
继承
在遵守控制访问的前提下,子类能继承父类当中的属性(静态特征)和方法(动态特征)
- 继承父类的属性(公开的和受保护的)
- 继承父类的方法(公开的和受保护的)
- 父子类在同一包当中,default也可以继承
多态
动态是指同一个动作,作用在相同或不同的对象之间拥有不同的解释.
-
重载,同一个类当中多态的体现(编译时多态)
-
重写,父子类当中多态的体现(运行时多态)
多态的机制:
-
声明父类型的引用指向具体子类型的一个实例
-
运行时才去绑定
-
运行时可变
第八天
第九天
父类方法加abstract的原因是跟子类表明自己不会(不能实现)这个方法,强制子类重写这个方法
接口本来就是抽象的,可省略abstract不写
第十二天
面试题
- StringBuilder 在多线程下不能保证数据的安全(没有同步),效率高
- StringBuffer 在多线程下不能保证数据的安全(同步),效率低
第十三天
面试题
- String str1 = “abc”;
- String str2 = new String(“abc”);
- Integer i1 = 128;
- Integer i2 = 128;
- String str3 = “a”;
- String str4 = “a”;
- System.out.println(str1.equals(str2));// true
- System.out.println(str1 == str2);// false
- System.out.println(i1 == i2);// false
- System.out.println(i1.equals(i2));// ture
- System.out.println(str3 == str4);// ture
- System.out.println(str3.equals(str4));// ture
类的调用公式
1.普通类的调用
类名称 变量名称 = new 类名称();
2.多态的调用
父类名称 变量名称 = new 子类名称();
抽象类名称 变量名称 = new 子类名称();
接口名称 变量名称 = new 子类名称();
3.内部类的调用
3.1 成员内部类
外部类名称.内部类名称 变量名称 = new 外部类名称().new 内部类名称();
3.2 静态成员内部类
外部类名称.内部类名称 变量名称 = new 外部类名称.内部类名称();
3.3 局部内部类
类名称 变量名称 = new 类名称();
3.4 匿名内部类
1.抽象类名称 变量名称 = new 抽象类名称(){
//重写抽象方法
};
2.接口名称 变量名称 = new 接口名称(){
//重写抽象方法
};
策略模式
定义了算法族,分别封装起来,让它们之间可以互相替换(利用到了多态),此模式让算法的变化独立于使用算法的客户
多态 ==> 面向接口编程 interface
工厂方法
一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的
第十四天
单例模式
对象创建型的模式,把创建对象的责任掌握在自己手中(往回拉)
官方定义:在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例
-
饿汉模式
- 无论这个实例有没有被外部使用,一律创建
- 例如:
private static OnlineUser onlineUser = new OnlineUser();
- 例如:
- 无论这个实例有没有被外部使用,一律创建
-
懒汉模式
- 啥时候用啥时候创建
- 例如:
private static OnlineUser onlineUser;
- 例如:
- 啥时候用啥时候创建
迭代器模式
提供一种方法顺序访问一个聚合(集合)对象中的各种元素,而又不暴露该对象的内部表示
官方定义:当你需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。另外,当需要对聚集有很多种方式遍历时,可以考虑去使用迭代器模式。迭代器模式为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口
多态的实现方式
实体类实现(entity)
class IntArray implements Iteerator<Integer> {//重写接口当中的抽象的方法}
1. new IntArray();
匿名类实现
class ? implements Iterator<Integer> {//重写接口当中抽象的方法}
2. new Iterator<Integer>(){//重写接口当中抽象的方法};
-
Iterable:
- Iterator iterator(); //抽象的
-
Iterator:
- boolean hasNext();
- boolean next();
面向对象(成员变量和局部变量的区别)
成员变量和局部变量:
成员变量所属于对象,要看是否是对象的特性,比如人,人的姓名,年龄等
局部变量所属于方法,要看方法执行的时候,是否需要,如果需要就定义,好处是方法运行后就消失
成员变量:
类中方法外(位置),堆内存(成员变量属于对象,对象进堆内存),有默认初始化值,
随着对象的调用而存在,随着对象的消失而消失
局部变量:
方法内定义或方法上声明(位置),栈内存(局部变量属于方法,对象进栈内存),没有默认初始化值,
随着方法的调用而创建,随着方法的调用完毕(弹栈)而消失
注意事项:
局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
构造方法和setXxx方法的区别 (构造方法Student s = new Student()😉
1.构造方法是用来给对象中的属性进行初始化的
2.setXxx是用来修改属性值的,在原对象的基础上
static
共性用静态,特性用非静态
第十五天
泛型的用法:
1.泛型可以声明在类上面,也可以声明在方法上面
2.一个类可以有多个泛型,一个方法也可以有多个泛型
3.类在实例化之前必须指明泛型的具体类型
4.使用extends表示子类,super表示父类,?表示通配符
第十六天
Comparable => 实现了此接口的类的元素,拥有自然的顺序
int comparaTo(T obj);
ComParator => 此比较器规定了元素自定义的顺序
int compare(T obj1, T obj2);
无限级分类
-
面向的对象
- 抽象
- 封装
- 继承
-
双链表
-
递归
第十七天
- HashSet无序
- 所有的set当中的元素都不能重复,只能放一份儿
HashiSet中庸
面试题
1.下面哪个集合类能保证以FIFO的顺序取出对象?
A java.util.List
B java.util.LinkedHashSet
C java.util.HashSet
D java.util.TreeSet
选B
解析:
A List是接口
C 无序的
D 不是先进先出,是按照元素自然的顺序输出,或者加上排序器自定义顺序输出
2.HashSet,LinkedHashSet,TreeSet的区别
- 顺序:HashSet无序,LinkedHashSet有序(先进先出),TreeSet有序(自然顺序,自定义顺序)
- 能否放null值:
- Hash和LinkedHashSet能且只能放一个null值
- TreeSet当中只有一个元素的时候,能放null值,大于一个的时候不可以放(会比较,产生空指针异常)
3.ArrayList比LinkedList寻址(访问)快
错:缺少随机两个字,应该是随机寻址快
4.List是有序的
错:List是接口,方法全是抽象的,可以说List的子类全是有序的
5.Set是无序的
错:Set是接口,它的子类,HashSet是无序的,LinkedHashSet和TreeSet是有序的
6.List, Set, Map是否继承了Collection接口?
错:Map没有继承
7.Collection和Collcetions的区别?
Collection是接口,是集合类当中顶层接口,
Collections是类,类中定义了很多跟集合类有关的静态方法
8.Set怎样去重复
Set当中的位置由hashCode()决定,
去重需要两个方法:int hashCode();和 boolean equals()
去重的保留:都只保留最后一个
第十八天
Map中的key决定了Entry的位置
单线程选择HashMap(无序,快),多线程选择Hashtable(有序,不会出错)
Set与Map的关系:
Set是一个特殊的Map,只有key,没有value的Map
第十九天
-
线程2种实现方法:
- 1.java.lang.Thread为java中的线程类,也就是说在java中实现线程要继承Thread
- 2.实现java.lang.Runnable接口
-
线程的状态
- 1.创建
- 2.就绪(可调用)
- 3.运行
- 4.等待/睡眠,阻塞
- 5.死亡
-
要保证锁定一定会被释放,就必须将unLock()放到finally{}中
异常捕捉格式:
try{
//可能产生异常的代码段
}catch(异常类型1 e){
//处理异常
}catch(异常类型2 e){
//处理异常
} finally{
//无论有无异常都将执行的代码(任何情况都会执行)
}
-
try/catch:
-
一个try语句可以跟多个catch语句。
-
catch异常时,先捕捉子类异常,再捕捉父类异常。否则会编译无法通过,报无法到达的捕捉块错误。
-
try,catch,finally必须紧跟,中间不能写除了注释之外的任何代码。
-
catch不能和finally同时省略。
-
throw和throws的区别
throw(抛出异常),用于向上抛异常,作用在catch语句当中。
throws(声明方法体会抛出哪些异常),用于声明方法体所抛出的异常,作用在方法上面。
throws :
1.throws(声明方法体会抛出哪些异常),用于声明方法体所抛出的异常,作用在方法上面。
2.throws子句中同时可以指明多个异常,之间用逗号隔开。
3.如果声明了要抛出的异常,则本方法可以不处理,而由调用者处理。
4.throws在向上抛的时候,可以向上抛抽象的异常(异常子类的父类)。
5.若代码显式向上throw 异常时,则必须显式声明throws异常。
第二十天
-
字符流:
read()
1.返回字符对应的ascii码(>=0)
2.当读取到末尾的时候,返回-1read(char[] chars)
1.返回读取的字符数
2.当读取到文件末尾时返回-1 -
字节流:
read()1.返回的int(byte) [0,255]
2.当读取到文件末尾时返回-1
read(byte[] b)
1.返回读取的字节数
2.当读取到文件末尾时返回-1
-
InputStream:
我们把能够读取一个字节序列的对象称为输入流;Java中用java.io.InputStream来描述输入流基类 -
OuputStream:
我们把能够写入一个字节序列的对象称为输出流。java.io.OuputStream来描述输出流的基类
第二十一天
int强转byte:
重复的:直接拿走
溢出的:int型取反加一得出byte型
int byte(取反加一)
Data:byte char short int long float double String
四个地址的区别:
192.168.1.100 => 路由器给分配的IP
127.0.0.1 => 本机的IP
localhost => 域名
http://www.baidu.com => 万维网给的域名
第二十二天
使用sql语句的优点:
可以复用,不用再手动创建
#进入数据库
数据定义语言DDL(Data Definition Language):用于创建对象,如:create table,alter table,drop table,create view,rename
数据操纵语言DML(Data Manipulation Language):如insert into,update,delete,select
当字段的值当中出现了单引号’时,用单引号’对单引号’进行转译,与Java中的\转译类似
- 算术运算符 + - * / 优先级:
- 乘和除的运算优先级高于加和减
- 优先级相同的运算符是从左到右进行运算的
- 可以使用小括号强制语句做出有限运算,并使语句运算顺序更为清晰
- 日期计算,也可以使用+ -,单位为天(如:select sysdate + 1 from dual)
连接运算符||或concat(arg1, arg2)
比较运算符<,>,<=,>=,=,!=,<>,is,is not,in,not in,between,like,any,all
like(包含):匹配运算符,只能用在字符串中
in:匹配列表值
–% 通配符 匹配0个或无数个任意字符
–_ 通配符 匹配0个或1个任意字符
添加数据
BEGIN
FOR i in 1..50
loop
INSERT into t_stu values(seq_stu.nextval,'学生' || i,i,'001' || i,'',0,i,1);
end loop;
END;
导出数据
-
用户
创建用户名和密码
creat user ORACLE(用户名) identified by oracle(密码);
为用户授予dba权限
grant dba to ORACLE with admin option; -
对象(表,序列,存储过程,触发器,同义词,视图…)
工具==>导出用户对象 -
存储数据
工具==>导出表
笛卡儿积
{1,2} * {3,4,5}
{13,14,15,23,24,25}
union与union的区别:
union去重,稍微慢一点儿
表合并的前提条件:
总列数一样,列类型一样,列名一样
–查询所有的学生,并按导师分组,显示每个组里面的平均年龄,最大学号,最晚入学日期,并显示导师的姓名,性别,年龄
–MAX(t.teacher_sex),MAX(t.teacher_age),因为是同一个老师,所以性别唯一,取一个就行,用随便一个组函数就行,比如max或min
SELECT AVG(s.stu_age),MAX(s.stu_code),MAX(s.stu_entry_date),t.teacher_id teacher_id,MAX(t.teacher_sex),MAX(t.teacher_age)
FROM t_student3 s
LEFT JOIN t_teacher3 t ON t.teacher_id = s.teacher_id
GROUP BY t.teacher_id;
七周三天
properties:键值对都是字符串的Map
标识符无效:表名或列名错误
Exception in thread “main” java.lang.ExceptionInInitializerError的原因:
一般是路径错了
ORA-01747: user.table.column, table.column 或列说明无效
sql语句格式不正确
七周五天
Integer的值可以为null,int的值不可以为null.
九周一天
JavaScript
通过字符串进行属性或方法的访问的时候创建的字符串对象是临时生成的,用完就会自动丢弃,原来的字符串并不会产生改变。
九周三天
-
String的正则表达式匹配有两个
- matches(String regex):通知此字符串是否匹配给定的正则表达式,参数regex用来匹配此字符串的正则表达式 返回:当且仅当此字符串匹配给定的正则表达式时,才返回 true
- search(regexp):如果成功,搜索返回字符串中正则表达式的索引。否则,它返回- 1
正则表达式
[]自带或含义,()表示组或优先
十周二天
构造函数和原型方式各自的的缺陷:
构造函数:getXXX方法一样,每次定义多余
原型方式:静态属性XX都一样,太极端
眼睛看不到的值:
disabled selected checked readonly [true,false]
十周四天
XXX();和onXXX的区别:
submit(): 执行提交
onsubmit: 执行提交完成后,还要执行什么
十一周一天
基本选择器的复合选择器之间用逗号隔开,取并集
属性选择器的复合选择器之间直接连接,不能有任何符号或空格,取交集
regxp.exe()与regexp.test()的区别
RegExpObject.exec(string):exec() 方法用于检索字符串中的正则表达式的匹配。检索字符串中指定的值。返回找到的值(该值是从0开始,然后加1(因为是区间)),并确定其位置
RegExpObject.test(string):test() 方法用于检测一个字符串是否匹配某个模式。检索字符串中指定的值。返回 true 或 false
三种页面初始化方法
1.window.onload = function(){};
2.$(document).ready(function(){});
3.$(function(){});
十一周三天
j2ee javaee Java企业版应用
j2se javase Java标准版应用
十二周一天
重定向:添加,修改,保存,删除
查询:查询
1.存在主键外键(引用完整性约束)
1.1 删除教师时,同时删除教师所带的学生
1.2 删除教师时,把教师所带的学生的teacher_id设置为null
在数据库里设置
2.不存在主键外键
2.1 删除教师时,同时删除教师所带的学生
2.2 删除教师时,把教师所带的学生的teacher_id设置为null
在代码中设置
十二周二天
request.ContextPath = /项目名称
session会话对象:
作用于更广
三次握手,第三次开始正式的功能
保持时间为30分钟,但是关掉浏览器就直接销毁
取根目录:
链接里写${pageContext.request.contextPath}
重定向里写request.getContextPath
请求转发里不用写,直接在开始加/
page = PageContext
request = HttpServletRequest
response = HttpServletResponse
session = HttpSession(request.getSession();)
application = ServletContext
config = ServletConfig
SQL知识点
按照伪序列rownum排序:
select page2.* from (select page1.*,rownum rn from (select s.* from T_STUDENT s order by s.stu_id) page1) page2 where rn between ? and ?
起始位置=(当前页号 - 1) * 每页个数 + 1
结束位置=当前页号 * 每页个数
总结知识点
1.unicode中文码%xx%xx%xx,为什么是六位?
2.get请求是在head里,post请求是在body里
十四周三天
不建外键的原因:
环境多,导表麻烦
适合放在缓存中的情况:
访问量大,更新次数少,网页缓存一般放在application中
缓存的弊端:
服务器重新启动,才能更新数据,这样太麻烦,所以直接更新缓存,不用重新启动服务器
MyEclipse错误:
Failed to initialize end point associated with Protocolhandler [“http-apr-80”] (Socket bind failed:):
因为MyEclipse异常退出,tomcat未停止,占用80端口,这时如果再启动tomcat会出现此错误。
控制台error:
无法转换为内部表示:可能是变量的数据类型转换不匹配(比如将Integer转换为String)
java.lang.IllegalArgumentException: attempt to create saveOrUpdate event with null entity(尝试用空实体创建saveOrUpdate事件)异常的易被忽略的原因:
就是在Action的代码里面缺少实体类的set方法
servelt的4个步骤:
1.接收参数
2.调模型层
3.转发参数
4.做响应:请求转发(或重定向)
Hibernate:
三个步骤:
1.注册驱动
2.执行连接 ==》打开会话
3.编译sql
4.执行sql
5.从游标中遍历数据 ==》save/update/delete/select
6.关闭游标,statement,连接 ==》关闭会话
Hibernate中FetchMode.JOIN FetchMode.SELECT FetchMode.SUBSELECT介绍
@Fetch(FetchMode.JOIN) 会使用left join查询 只产生一条sql语句
@Fetch(FetchMode.SELECT) 会产生N+1条sql语句
@Fetch(FetchMode.SUBSELECT) 产生两条sql语句 第二条语句使用id in (……)查询出所有关联的数据
Struts
struts基本流程:
1.view:填写正确的控制器连接(eg:/empl/list)
2.struts.xml:定义正确的/namespace/active,和要转发的视图(eg:/pages/employee/list.jsp)或要重定向的控制器
3.Controller:定义需要调用的方法
struts原理:
struts的本质是一个过滤器,将别的控制器(里面所有的请求)都拦截到自己的控制器里。
可做面试题:
el表达式:${[‘jiao’]}
p
a
r
a
m
[
′
a
′
]
与
{param['a']}与
param[′a′]与{param.a}:
[]里的引号不能省,表示常量,去掉就变成从四大作用域中取a的值
左连接与左外连接,没有区别,
save,update与saveOrUpdate:
没有区别,saveOrUpdate更方便
杂烩集锦:
delete:
只设置了id,别的属性没有怎么删的,为甚么不删除员工,因为sql语句:delete from Table where id=?
集合:
Collection包含List,Set,所以尽量用Colletion,包容性好
自增increment不能用于多线程
接口中的修饰符不写默认是public
匿名类在类里执行时的事件一般在做开始,相当于缓存的时间
sql语句:
select TEACHER_ID, TEACHER_NAME, TEACHER_AGE, ``TEACHER_SEX, TEACHER_CODE, COLLEGE_ID, TEACHER_LOGO,
ATTACHMENT_PATH, ATTACHMENT_NAME from ORACLE.T_TEACHER
where (TEACHER_NAME like '%' || '') or (1=1) or ``(teacher_name = '' || '%')
‘%’ || ‘’ : 做(字符串)与运算,变成’%’(即teacher_name like ‘%’),其中三个括号里的值都是true
数据库翻页查询公式:
select pager2.* from (
select pager1.*,rownum rn from (
select * from 表名 order by 列名
)pager1
)pager2
where rn between (pageNo - 1) * (pageCount) + 1 and (pageNo) * (pageCount)
数据库循环插值公式:
declare
i number;
begin
for i in 1..50
loop
insert into 表名 (列名,......)
values(列名的值,.....);
end loop;
end;
集合中的参数使用了注解就不能使用默认的名字。
数组越界String index out of range: -1
length,length(),size()详解及区别:
length属性:用于获取数组长度。
length()方法:用于获取字符串长度。
size()方法:用于获取泛型集合有多少个元素。
什么时候用size()?什么时候用length?什么时候用length()?
String类有length的方法,
数组有length的属性,
集合(List)有size的方法
为什么控制器Controller没有spring的标识:
因为spring扫描控制器是在spring—mvc.xml里,在web.xml启动时才被spring启用,只有在applicationContext.xml里才会自动加上spring标识
一对多,多对多,更新时:
先全删除以前(旧)的,再添加现在应有(新)的,
Spring
error:
Class’org.springframework.orm.hibernate3.LocalSessionFactoryBean’ not found:没有加Spring 3.1 Persistence Libraries(spring 持久化包).
applicationContext.xml流程:
1.控制器引用Service
2.Service引用dao
3.dao引用session工厂
4.session工厂引用数据源
5.数据源查数据库
spring的xml3中注入方式:
1.xml注入
2.自动注入(byName,byType)
3.注解注入
error:
Exception in thread “main” org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ‘userController’ is defined
文件命名空间,文件位置
byName与byType的区别:
byName: beans配置属性default-autowire:“byName” 按照bean的名称(唯一id), 自动装配property
byType: beans配置属性default-autowire:“byType” 按照bean的class类型, 自动装配property(前提是session的default-autowire属性是no),byType配置不能有两个bean引用的class中有一样的类型的属性,否则报错
使用注解装配步骤:
1.包内加注解:
@Controller,申请控制器
@Service,申请service
@Repository,申请dao,数据仓库
@Autowired,自动注入
2.applicationContext.xml配置:
命名空间:
xmlns:context="http://www.springframework.org/schema/context"
schema:
xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
3.告诉spring那些类有注解:
applicationContext.xml下配置:
<context:component-scan base-package="要扫描的包含注解的包名(eg:com.oracle.model)" />
切面编程三个知识点:切面,切点,通知。
反转是由spring给的。
autoWired按照byType,byName
运行时绑定与运行时可变?
运行时才绑定,运行时才变出来,但可以是任何代理,代理可以不一样,所以是可变
没有ioc就没有aop?
因为有了控制反转(eg:IUserDao userDao),才能有切面编程(运行时绑定,运行时可变)
SSH:
因为ssh,struts和spring会因为控制器而冲突,发生空指针异常,所以需要引struts 2 spring Liability来解决
SSM:
Mapper.xml配置中的符号#和$:
# 使用了预编译
$ 未使用预编译
运行时绑定和可变:
运行时绑定:运行时才会绑定了一个代理
运行时可变:运行时可以有多个代理插入
连接池:
连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
连接池主要的优点有:
1.减少连接创建时间
虽然与其它数据库相比 GBase 提供了较为快速连接功能,但是创建新的 JDBC 连接仍会招致网络和 JDBC 驱动的开销。如果这类连接是“循环”使用的,使用该方式这些花销就可避免。
2.简化的编程模式
当使用连接池时,每一个单独的线程能够像创建了一个自己的 JDBC 连接一样操作,允许用户直接使用JDBC编程技术。
3.受控的资源使用
如果用户不使用连接池,而是每当线程需要时创建一个新的连接,那么用户的应用程序的资源使用会产生非常大的浪费并且可能会导致高负载下的异常发生。
数据库连接池的主要操作如下:
(1)建立数据库连接池对象(服务器启动)。
(2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。
(3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。
(4)存取数据库。
(5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。
(6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。
ssm遇到的问题:
认识spring配置的注解:mvc:annotation-driven
/表示不拦jsp
/*拦所有的文件
struts:多例模式,有成员变量,来一次请求,实例化(new)一次
spring:单例模式(只实例化一次),没有成员变量,
监听:在servlet初始化的时候,才发起请求,读controller
控制器里的方法上的参数Integer stuId:
写在参数里的参数是aop代理controller接收了参数
java反射:
getMethod:必须是public才能找到
getDeclaredMethod 声明过就能找到
method.getParameterAnnotations():获得方法的参数的注解[][]
method.getAnnotations():获得方法的注解[]
文件的位置关系:
WebRoot下的文件可以随意访问,这里一般放公共的东西,e
WebRoot/WEB-INF下的文件不可以随便访问,这里面放的是配置的文件,只能控制器带着进去
为什么做重定向:
请求转发直奔最后一个环节,没有暴露在互联网下,需要通过查询控制器查到数据,再到视图
list.jsp=》controller(XX)=>list=>list.jsp
重定向:
“redirect:list”:正确
“forward:list”:带参数,错误
“student/list”:直奔视图,错误
面试题:
jquery对象$()转dom对象:
$()[0]
$().get(0)
dom对象转jquery对象$():
$(dom)
mybatis 配置文件报错:"Referenced file contains errors(file:/D:/config/ mybatis-3-mapper.dtd):
Widow=>MyEclipse=>Files and Editors=>XML=>XML Catalog=>add…
添加的是mybatis\org\apache\ibatis\builder\xmlmybatis-3-mapper.dtd
@JsonIgnore:方法和变量上都可以标注
service和IService一样,为什么要创建两个?
因为aop需要执行切面编程,aop就是接口service的子类,所以创建IService的意义就在这
保存角色信息步骤:(没有设置,报错为无效列类型111)
1.保存角色
xml配置:
使用生成主键useGeneratedKeys=“true”,主键列keyColumn=“role_id”,对应的对象属性keyProperty=“roleId”
2.设置(保存)权限 2.1删除旧权限,2.2保存新权限
拦截的问题:
优先走具体的路径(eg:.js,/images/),再走抽象的路径(/)
打开二级缓存:
1.xxMapper.xml中的mapper下,加上
2.xx.java实现序列化接口
Session缓存:
将信息放到session缓存中,直接登录时查一次