★单例Singleton
懒汉式:
代码:
public class Singleton {
private static Singleton instance = null;
private Singleton() {};
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton ();
}
return instance;
}
}
饿汉式:
代码:
public class Singleton {
private static Singleton instance = new Singleton ();
private Singleton() {};
public static synchronized Singleton getInstance() {
return instance;
}
}
------------------------------------------------------------------------------------------------------------------
★写出几个常见的异常
NullPointerException
IndexOutOfBoundsException
ArrayIndexOutOfBoundsException
ClassNotFoundException
FileNotFoundException
ClassCaseException
NumberFormatException
NoSuchMethodException
IOException
SQLException
HibernateException
------------------------------------------------------------------------------------------------------------------
★组合,聚合,关联
代码:
public class User {
private String name;
private Address addr;
public void setAddr(Address addr) { //普通关联
this.addr = addr;
}
public User(Address addr) { //聚合
this.addr = addr;
}
public User(String city, String zipCode) { //组合
addr = new Address(city, zipCode);
}
}
public class Address {
private String city;
private String zipCode;
public Address(String city, String zipCode) {
this.city = city;
this.zipCode = zipCode;
}
}
继承关系: is a
整个类图共用一张表
每个子类关系一张表
每个类一张表
关联关系:
普通关联:use a 7(种),单双项
聚合:has a
组合:has a
------------------------------------------------------------------------------------------------------------------
★主动方,从动方
对于一对一关系,主动方为关系拥有方(外键)
对于一对多关系,主动方永远是一的一方
对于多对一关系,主动方永远是多的一方
对于一对多或多对一,外键永远在多的一方
对于多对多关系,哪一方都可以作为主动方(自己选择)
mappedBy在双向关系中必须设置,设置在非外键拥有方(若有中间桥表(有默认的设置),主动方或从动方中设置都可以)
cascade(DML都是对主动方进行操作,级联到从动方),及fetch设置在主动方
对于多对多关系,不管是单向还是双向,自动都会引入中间表
------------------------------------------------------------------------------------------------------------------
★AJAX核心代码,异步
代码:
var xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
xmlHttp.open("POST", "p2.jsp", true);
xmlHttp.onreadystatechange = function(){
alert(xmlHttp.readyState);
if(xmlHttp.readyState == 4) {
alert(xmlHttp.responseText);
}
}
xmlHttp.send();
------------------------------------------------------------------------------------------------------------------
★排序
1.冒泡法(BubbleSort)
代码:
public class BubbleSort {
public static void sort(int[] data) {
int t = 0;
for(int i = 0; i < data.length; i++) {
for(int j = data.length - 1; j > i; j--) {
if(data[j] < data[j-1]) {
t = data[j];
data[j] = data[j-1];
data[j-1] = t;
}
}
}
}
public static void main(String[] args) {
int[] test = {5, 8, 6, 7, 4, 2, 9, 3, 1};
sort(test);
for(int i = 0; i < test.length; i++) {
System.out.print(test[i] + " ");
}
}
}
2.快速排序()
代码:
public class QuickSort {
public void sort(int[] data) {
quickSort(data, 0, data.length-1);
}
private void quickSort(int[] data, int i, int j) {
int pivotIndex = (i+j)/2;
swap(data, pivotIndex, j);
int k = partition(data, i-1, j, data[j]);
swap(data, k, j);
if((k - i) > 1) {
quickSort(data, i , k-1);
}
if((j - k) > 1) {
quickSort(data, k+1 , j);
}
}
private int partition(int[] data, int l, int r, int pivot) {
do {
while(data[++l] < pivot);
while((r != 0) && data[--r] > pivot);
swap(data, l, r);
} while(l<r);
swap(data, l, r);
return l;
}
private void swap(int[] data, int i, int j) {
int t = 0;
t = data[i];
data[i] = data[j];
data[j] = t;
}
public static void main(String[] args) {
int[] test = {5, 8, 6, 7, 4, 2, 9, 3, 1};
QuickSort qs = new QuickSort();
qs.sort(test);
for(int i = 0; i < test.length; i++) {
System.out.print(test[i] + " ");
}
}
}
快速排序的伪代码。
/ /使用快速排序方法对a[ 0 :n- 1 ]排序
从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点
把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点
递归地使用快速排序方法对left 进行排序
递归地使用快速排序方法对right 进行排序
所得结果为l e f t + m i d d l e + r i g h t
------------------------------------------------------------------------------------------------------------------
★事务
原子性:一个事务包含多个操作,要么同时成功,要么同时失败.
一致性:比如银行转帐,要保证2个帐户的余额总和不变.
隔离性:事务中的操作不能影响其他事务的操作.
持久性:一个事务中的操作,要么被丢弃,要么被持久化到数据库.
原子性,一致性,持久性通过日志文件来保证.隔离性通过锁机制来保证.
隔离级别:0,1,2,4,8 隔离级别越高性能越低
oracle,mysql默认的隔离级别是2 不允许脏读
脏读:读到了别人没有提交的数据.
不可重复读:两次读到的同一条数据结果不一致. DML
幻影读:两次读到的记录条数不一致. DDL
DCL:Data Controlling Language 数据控制语句
DDL:Data Definition Language 数据定义语句
DML: Data Manipulate Language 数据操作语句
------------------------------------------------------------------------------------------------------------------
★分页查询
代码:
select * from (
select rownum rw,a1.* from (
select * from s_dept order by id
) a1
) a2
where a2.rw between 8 and 10;
------------------------------------------------------------------------------------------------------------------
★JDBC六大步骤:
代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TestJDBC {
public static void main(String[] args) {
Connection con = null;
Statement stm = null;
ResultSet rs = null;
try {
//1.注册驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
System.out.println("--注册驱动失败,请检察是否加入了相关的驱动包到classpath--");
e.printStackTrace();
}
try {
String url = "jdbc:oracle:thin:@192.168.0.206:1521:tarena";
String user = "asd0803";
String passwd = "asd0803";
String sql = "select * from yanght_user";
//2.获取数据库的连接
con = DriverManager.getConnection(url, user, passwd);
//3.创建SQL的执行环境
stm = con.createStatement();
//4.执行SQL
rs = stm.executeQuery(sql);
//5.处理结果集
//注:结果集刚创建时指向第一行的前一个位置
while(rs.next()) {//如果有下一行则返回TRUE
int id = rs.getInt(1);
String name = rs.getString(2);
String pwd = rs.getString(3);
String status = rs.getString(4);
System.out.println(id + "/t" + name + "/t" + pwd + "/t" + status);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
//6.释放资源
if(rs != null) {
rs.close();
rs = null;
}
if(stm != null) {
stm.close();
stm = null;
}
if(con != null) {
con.close();
con = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
------------------------------------------------------------------------------------------------------------------
★网络,IO Socket编程
代码:
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8888); //端口号要大于1000;1000以内系统端口
System.out.println("服务端已启动");
while(true) {
Socket s = ss.accept(); //接受 端口8888上的数据,如果没有数据过来,程序阻塞
InputStream is = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String con = "";
while((con = br.readLine()) != null) {
System.out.println(con);
}
br.close();
}
}
}
public class TCPClient {
public static void main(String[] args) throws UnknownHostException, IOException{
while(true) {
Socket s = new Socket("127.0.0.1", 8888);
OutputStream os = s.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
InputStream is = System.in;
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String str=br.readLine();
bw.write(str);
bw.close();
}
}
}
------------------------------------------------------------------------------------------------------------------
★CRUD(增查改删)
CRUD是一个数据库技术中的缩写词,它代表创建,读取,更新和删除操作。
C:Create new records
R:Retrieve existing records
U:Update existing records
D:Delete existing records
------------------------------------------------------------------------------------------------------------------
★OOA,OOD,OOP,AOP
OOA: Object-Oriented Analysis:面向对象分析方法
OOD: Object-Oriented Design: 面向对象设计
OOP: Object-Oriented Programming:面向对象编程
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程
------------------------------------------------------------------------------------------------------------------
★封装,继承,多态
封装 (encapsulation)
隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别.
封装 (encapsulation)
封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过 外部接口,一特定的访问权限来使用类的成员。
封装的大致原则
1把尽可能多的东西藏起来.对外提供简捷的接口.
2把所有的属性藏起来.
“继承”(Inheritance)
java语言中不支持多重继承,是通过接口实现多重继承的功能。
如果一个类A继承自另一个类B,就把这个A称为"B的子类",而把B称为"A的父类"。
继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。
在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能
多态(Polymorphism)
运行时多态:重载(Overloading)
编译时多态:重写(Overriding)
------------------------------------------------------------------------------------------------------------------
★Struts、spring、Hibernate
框架简化开发过程,提供公共服务和便利的工具
spring 是一个业务层框架
struts 是表现层框架
hibernate 是持久层框架
------------------------------------------------------------------------------------------------------------------
★JavaBean
按着Sun公司的定义,JavaBean是一个可重复使用的软件组件。实际上JavaBean是一种Java类,通过封装属性和方法成为具有某种功能或者处理某个业务的对象,简称bean。由于javabean是基于java语言的,因此javabean不依赖平台,具有以下特点:
1. 可以实现代码的重复利用
2. 易编写、易维护、易使用
3. 可以在任何安装了Java运行环境的平台上的使用,而不需要重新编译。
一般来说,实现了如下3条规范的java类我们就称之为javabean,最广义的规范只有第1条,必须具备无参构造器,狭义的是5条规范..我忘记了后2条~
规范:
1.无参构造器
2.setter/getter方法
3.实现serializable接口
4.
5.
------------------------------------------------------------------------------------------------------------------
★EJB, RMI/IIOP、JNDI、JMS、JTA 、JAF
EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。
JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。
JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。
JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。
RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。
------------------------------------------------------------------------------------------------------------------
★关于SSH架构的简单总结
Struts、spring、Hibernate在各层的作用
1)struts 负责 web层.
ActionFormBean 接收网页中表单提交的数据,然后通过Action 进行处理,再Forward到对应的网页。 在struts-config.xml中定义, ActionServlet会加载。
2)spring 负责业务层管理,即Service(或Manager).
1. service为action提供统计的调用接口,封装持久层的DAO,。
2.可以写一些自己的业务方法。
3.统一的javabean管理方法
4.声明式事务管理
5.集成Hiberante
3)Hiberante,负责持久化层,完成数据库的crud操作
hibernate 为持久层,提供 OR/Mapping。
它有一组 .hbm.xml文件和 POJO,是跟数据库中的表相对应的。然后定义DAO,这些是跟数据库打交道的类,它们会使用PO。
在struts+spring+hibernate的系统中,
对象的调用流程是:jsp-> Action-> Service ->DAO ->Hibernate。
数据的流向是 ActionFormBean接受用户的数据,Action 将数据从 ActionFromBean 中取出,封装成VO或PO, 再调用业务层的Bean类,完成各种业务处理后再forward。而业务层Bean收到这个PO对象之后,会调用DAO接口方法,进行持久化操作。