自己每天总结的一些小知识 随时更新
1. 常用命令
netstat –a 查看所有的监听端口
netstat –an |find /i “listening/established”>c:\result.txt将监听/通信端口结果保存到c盘
-a 显示所有连接和监听端口
-n 以数字形式显示地址和端口号。 此选项一般与 -a选项组合使用
-o 显示与每个连接相关的所属进程 ID。
开始 运行netstat
listening表示处于侦听状态 即是开放
established表示建立连接
time-wait表示结束连接,曾经有过访问,但是已经结束了
关闭某个端口
关闭某个端口方法先netstat –ao 查看端口所在的pid,再tasklist查看pid所对应的的进程,再通过任务管理器关闭该进程
tasklist查看pid所对应的的进程
mstsc/-console 打开远程桌面
ipconfig 查看ip
2. background:url(../images/my_19.jpg) 这里的两个点是什么路径?
在相对路径中./表示本文件所在的文件夹,../表示上一级../../表示上上一级的文件夹
3. document.createElement()的用法
document.createElement()是在对象中创建一个对象,要与appendChild() 或 insertBefore()方法联合使用。其中,appendChild() 方法在节点的子节点列表末添加新的子节点。insertBefore() 方法在节点的子节点列表任意位置插入新的节点
4. chrome开发者工具
5. wordPress
WordPress 是一种使用 PHP 语言开发的 Blog 引擎,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的 Blog。也可以认为 WordPress 就是一个个人信息发布平台。
6. 原子性
数据库事务:一个原子事务要么完整执行,要么干脆不执行。 这意味着,工作单元中的每项任务都必须正确执行。如果有任一任务执行失败,则整个工作单元或事务就会被终止。即此前对数据所作的任何修改都将被撤销。如果所有任务都被成功执行,事务就会被提交,即对数据所作的修改将会是永久性的。
7. 裸机备份和热备份区别
exp/imp是“拍照留念”
archivelog mode的物理backup是“录像记录”。
拍照只能是单点的,而“录像记录”允许你看到录像期间的任何一点
8. 页面打开和关闭时js加载的函数
< body onload = " SetupLeak() " onunload = " BreakLeak() " >
9.
js中给dom对象添加属性
X<div id="test"
class="hello"></div>
var test = document.getElementById("test");
test.adang = "adang";
alert(test.adang);
我们会发现,已经给这个id为test的DOM元素添加了一个叫做adang的属性了,然后在js中,可以调用这个属性。我在写js的时候经常用到这种方法,可以很方便地对某个dom对象添加一些特殊的数据,感觉DOM对象就像一个很好用的容器,可以放一堆数据进去。
script
type="text/javascript">
window.onload=function(){
var test = document.getElementById("test");
alert(test.adang);
}
</script>
<body>
<div id="test" adang="adang"></div>
</body>
</html>
=====================================================
这次把扩展的属性写到了html标签上。IE下正常输出adang,FF下输出的是undefined。
但是很奇怪的,如果使用DOM提供的方法getAttribute(""),无论是在IE下,还是FF下,都可以得到我们写在标签中的自定义属性。
所以,为了兼容,我们要使用getAttribute("")来获取自定义的标签属性的值。
10. sql中的执行顺序
(1).FROM 子句, 组装来自不同数据源的数据
如left join on 先将两个表按照条件组成一个表,然后再进行where条件筛选
(2).WHERE 子句, 基于指定的条件对记录进行筛选
(3).GROUP BY 子句, 将数据划分为多个分组
(4).使用聚合函数进行计算
(5).使用 HAVING 子句筛选分组
(6).计算所有的表达式
(7).使用 ORDER
BY 对结果集进行排序
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
11. 显示游标和隐式的区别
隐式游标:查询单行记录。
Oracle自动在后台使用的游标,用户不参与任何操作!所以对客户是隐藏的不显示的!
显示游标:查询多行记录。
在PL/SQL如何返回进行多行记录并族行进行读取,
在F:\数据库\基础知识\oracle显式和隐式游标.htm里面介绍了什么时候使用游标可以不打开关闭的情况
12. spring源代码分析
BeanFactory:Bean实例被IOC容器进行管理,有它自己的生命周期—>和普通java对象的区别
- Spring中Assert的使用
Typically used to validate method arguments rather than configuration properties 通常用来验证方法参数
详细用法可可参见F:\java学习\spring\Assert.docx
- ServletContext HtppSession HttpRequest HtppResponse
容器初始化 ServletContext
每个登录用户对应一个HtppSession
每次请求对应一个HttpRequest,HttpResponse
13. elipse泛型报错解决方法
首先将"Compiler compliance level”设置成1.5以上
然后将installed JRES换成1.5的()
14. JDK和JRE的区别 餐厅 vs 厨房+餐厅
JDK和JRE的区别,JDK包含了JRE和其他的一些类库,且多了server端的虚拟机
如果安装了jdk,会发现电脑上有两套JRE。JDK其实已经包括了JRE。
在jsk外层的bin里面包含有javac等lib里面包含有开发用的工具类tools.jar等
jdkJRE
server与client里面的jvm.dll这就是真正的jvm.dll所在(JVM), 在运行由jvm.cfg决定默认java.exe调用的jvm.dll,在jvm.cfg里面
-server KNOWN
-client KNOWN server排在前面就默认用server的jvm
client和server中的jvm.dll区别
%JAVA_HOME%/jre/bin/client/jvm.dll
%JAVA_HOME%/jre/bin/server/jvm.dll
Jvm动态库有client和server两个版本,分别针对桌面应用和服务器应用做了相应的优化,client版本加 载速度较快,server版本加载速度较慢但运行起来较快。
让Tomcat 使用Server版本的jvm吧 在开始菜单 tomcat5 ->tomcat config的java属性中 有一项 jvm路径 指向server目录下的jvm就行了。
15. 怎么将多余的电脑内存当成虚拟硬盘
详见http://itbbs.pconline.com.cn/diy/15907840.html
16. 为什么eclipse不设置jdk也能打开
eclipse是出了名的自动化,他本身集成有JDK。
其实所谓环境变量就是一个路径,让程序在编译时能够通过这一变量找到java存在的路径。
所以一般要配置环境变量。
而eclipse自己带有JDK,编译时调用JDK是从它自带的JDK里调用,路径都是固定好的,所以就不存在配置环境变量的问题了。
假如你自己装了JDK,需要在命令提示行里编译你写的java文件,或者使用editplus编辑编译,则需要配置环境变量。
17. 关于java的反射及类加载的过程 class的获取
看了熔岩的博客http://lavasoft.blog.51cto.com/62575/15433/
深入研究class类,获取class的三个方法,我觉得不是很认同
首先 ClassName.class.getDeclareFields();//类似这种方法可以得到本类(不包括继承的字段)的字段,
但是并不会将类加载到jvm中,我的理解是他只是简单的获取这个类的字节码文件
其次,这个Class.forName(“完整类名”),这个才会加载类
最后,那个getClass()方法必须首先创建出来对象才可行 或者ClassName.class.getClass();跟第一个类似
直接 ClassName.class.getClass();类似这种,获取类的字段,方法,构造器,是不会加载类的
方法列表
Method |
.invoke(obj,Object[]args) |
从中调用底层方法的对象/用于方法调用的参数 静态方法可以省略obj |
返回方法处理结果 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
类加载
早上犯2的问题。SqlMapClientDaoSupport的实现类里面大量调用了getSqlMapClientTemplate()这个方法来获得ibatis的curd操作,然后我反编译了这个SqlMapClientDaoSupport类,发现这个方法是 public final修饰的,我就想了不是除了静态方法,别的方法不是不能在别的方法内部调用吗?尼玛,搞错了,只有main方法内部,在没有创建实例的情况下,才只能调用静态方法。
只有实例才能调用非静态方法,你调用这个实例的某个方法A,自然也能再A里面调用这个实例的方法B
18. 动态代理
virtual method invocation虚拟方法调用
public interface InvocationHandler
InvocationHandler is the interface implemented by the invocation handler of a proxy instance.
Each proxy instance has an associated invocation handler. When a method is invoked on a proxy instance, the method invocation is encoded and dispatched to the invokemethod of its invocation handler.//调用处理器是一个被一个调用处理的代理实例实现的接口。每个代理实例都关联一个调用处理器,当一个方法被一个代理实例反射调用时,就会被其invoke方法处理
1.对于有通过接口定义业务方法的类,如何动态创建代理实例
Proxy provides static methods for creating dynamic proxy classes and instances, and it is also the superclass of all dynamic proxy classes created by those methods.
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
第二个传入的参数interfaces,代理实现的接口列表
通过如上方法创建一个代理,在代理里面传入 调用处理器,目标对象的接口
所以这个目标对象必须是接口的实现,且可以将目标对象传入处理器
1. 创建目标类target
2. 创建InvocationHandler实现类,即处理器handler,可以传入target
3. 由Proxy静态方法创建target的代理实例,需要传入target的所有接口及handler
4. 当代理实例执行方法时,handler就会调用年invoke方法
在invoke方法里面通过传入的targret,及执行方法和参数来进行,方法反射执行,及aop逻辑
2.对于没有通过接口定义业务方法的类,如何动态创建代理实例
Cglib动态代理
具体实例见F:\workspace\Test\src\com\spring\aop\proxy\CglibProxy.java
- 创建Cglib代理类实现MethodInterceptor接口,在代理类interceptor(。。。)里面实现实现处理逻辑
- 然后由代理类获得代理实例,当代理实例执行方法时就会执行代理类里面的interceptor()方法
19. 堆栈问题
堆栈问题详见我的博客http://www.cnblogs.com/javahuang/articles/3054400.html
20. ibatis的sql中什么时候需要用到 <![CDATA[ ]]>
< > & 这三个符号的时候
21. equals == “”及null
今天extjs从前台穿过来的数据 我debug发现其值为””,然后我们头给改成了 ==null,给哥改错了
我给改成了.equals(“”),才最终跑起来
22. eclipse打开报错
修改方法:eclipse.ini 将 -Xmx512m 改小
23. spring配置文件中id和name区别
一般bean都是对应的id,bean里面的property对应的就是name
24. ServletContext和ApplicationCcontext
一个是整个web容器,一个是spring容器,其中后者包含在前者里面
25. synchronized关键字
private final Map singletonCache = new HashMap();
synchronized (this.singletonCache) {
sharedInstance = this.singletonCache.get(beanName);
}
我的理解是synchronized关键字对这个map加锁,进行同步操作
26. 将当前对象放入属性构造器
public class XmlBeanFactory extends DefaultListableBeanFactory {
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
}
27. elipse安装插件
将下载的插件jar包直接放入eclipse下面的plugins目录下面
28. eclipse是怎么编译的
eclipse中,无论是java文件还是xml文件等等,假如你给classes目录中的编译文件删掉了,只需要将src随便修改下,按ctrl+s就会自动重新编译
29. java路径问题
http://www.cnblogs.com/javahuang/archive/2013/05/28/3103760.html
eclipes默认的当前目录就是你的工程目录
相对于当前用户目录的相对路径System.getProperty("user.dir")返回的路径,项目的根路径
我们使用的相对路径,应该使用相对于当前classpath的相对路径
this.getClass().getClassLoader().getResourceAsStream("com/Book.xml") 这个相对路径是相对于当前的classpath
获取当前classpath的绝对路径获取方法
System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));//类加载器的路径
System.out.println(ParseTest.class.getClassLoader().getResource(""));//得到当前classpath的绝对路径
我的理解:右键-项目-JavaBuildPath-Source-Default output folder这个路径就是当前的classpath路径
.代表当前目录..代表当前目录的上级目录
InputStream input = this.getClass().getClassLoader().getResourceAsStream("Book.xml");
这个book.xml是放在当前的classpath下面的(classes目录下面)我的理解是类加载器会到classpath下面加载类,所以相对路径默认的就是这个classpth
30. 加载类的两种方法ClassLoaderhttp://www.ibm.com/developerworks/cn/java/j-lo-classloader/
类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class
类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()
方法就可以创建出该类的一个对象。实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载的。
ClassLoadUtil.class.getClassLoader().loadClass(String classname);获得类加载器然后加载类
Class.forName(String classname,boolean initialize,ClassLoader classLoader) 类名、是否初始化该类、使用的类加载器
31. String的方法
String.sunString(index);//返回的是从index开始的子字符串
source.contains(dest);//返回的是source里面里否含有dest
source.lastIndexOf(str,fromIndex);//从fromindex处开始反向搜索str第一次出现位置的索引值
32. 接口
为什么电脑主板上还要有内存插槽,显卡插槽?多浪费机箱空间啊? 直接用电烙铁把显卡和内存的引脚一根一根焊到主板上不就得了。 如果你焊错位置了,说明你焊工不好。 每次拆装的的时候再继续用电烙铁。 请专家们指教
就像吃饭一样,你实现了吃饭的功能,具体你是怎么吃得,系统不管,系统只需要知道你想吃饭就行了。
public class JMSMessageListenerServlet extends HttpServlet implements ServletContextListener{
public void contextInitialized(ServletContextEvent arg0) {
}}
你实现了这个ServletContextListener,在ServletContext创建的时候就会调用这个初始化方法,并且能够获得ServletContext
33. Serializable,Cloneable
Serializable接口
http://blog.csdn.net/yakihappy/article/details/3979373
我们有时候将一个java 对象变成字节流的形式传出去或者从一个字节流中恢复成一个
java 对象,例如,要将java 对象存储到硬盘或者传送给网络上的其他计算机,这个过程
我们可以自己写代码去把一个java 对象变成某个格式的字节流再传输,但是,jre 本身
就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java
帮我们做,要被传输的对象必须实现serializable 接口,这样,javac 编译时就会进行特
殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。需要被序列化
的类必须实现Serializable 接口,该接口是一个mini 接口,其中没有需要实现的方法,
implements Serializable只是为了标注该对象是可被序列化的。
例如,在web 开发中,如果对象被保存在了Session 中,tomcat 在重启时要把Session
对象序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统
进行网络传输或通过rmi 等远程调用,这就需要在网络上传输对象,被传输的对象就必
须实现Serializable接口。
Clobeable接口
标记接口,
假设x是一个非空对象,应该有:
x.clone()!=x 为true,就是说他们不是同一个对象.
x.clone().getClass()==x.getClass() 为true,他们是同一个类型Class.
x.equals(x.clone()) 为true,逻辑上应该相当.
ShadowClone和DeepClone,都是调用super.clone(),但是后者做了强制类型转换
34. XML的解析
SAX JDOM DOM DOM4J
sax解析SimpleAPI for xml
思路:首先写业务类(处理器),需要继承处理器或者实现相应的处理接口,加载XMLReader驱动,得到解析器,将处理器注册到解析器上,然后解析器解析xml的时候就会触发相应处理器上面的方法
解析器:XMLReaderreader=XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser")
ContentHandler 是SAX最重要的接口,包含全系列方法。
我们使用的时候只需要继承DefaultHandler,该类为4个接口提供了接口实现类
SAXParser和XMLReader
http://docs.oracle.com/javase/1.5.0/docs/api/org/xml/sax/XMLReader.html. take a look at the link for XML reader and have a look athe following link for sax parser.http://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/parsers/SAXParser.html.
Using different parser's depends on what you want your parser to do. If your modifying, deleting contents in xml you can use W3C Dom parser. If you just want to parse and get elements you can use SAX parser. There are a few out there. So it really depends on what you want.
还有一个区别是 XMLReader可以直接parse(uri) SAXParser必须得带上parse(inputStream,defaultHandler);带上事件处理器
DOM解析
解析器 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
- Document document = builder.parse(inputStream); --获得整个dom树
- Element element = document.getDocumentElement(); --获得元素
- NodeList bookNodes = element.getElementsByTagName("book");由元素名获得节点
- Element bookElement = (Element) bookNodes.item(i);--遍历节点,得到每个子节点
- bookElement.getAttribute("id")—得到元素节点的属性
- NodeList childNodes = bookElement.getChildNodes();--获取元素的所有子节点
- childNodes.item(j).getFirstChild().getNodeValue() --获取节点的文本值
JDOM解析
- SAXBuilder builder = new SAXBuilder();
- org.jdom.Document doc = builder.build(new File("F:/xmltest.xml"));
- Element foo = doc.getRootElement();
- List allChildren = foo.getChildren();
JDOM使用起来比较简单是对DOM的封装,返回的对象一般都是java的collection,
区别:sax解析是从文档开始,解析每个元素开始和结束,元素中间文本内容的时候都会触发相应的解析方法
dom解析先将整个xml全部加载,组成一颗dom树
35. StringBuffer和StringBuilder的区别
StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,只是
StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因
此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程
不安全的。
StringBuffer 始于 JDK 1.0
StringBuilder 始于 JDK 1.5
从 JDK 1.5 开始,带有字符串变量的连接操作(+),JVM 内部采用的是
StringBuilder 来实现的,而之前这个操作是采用 StringBuffer 实现的。
StringBuffer.append(char[],offset,len);//将字符数组从index=offset开始的len个字符插入到StringBuffer中
//the characters to be appended; the index of the first char to append; the number of chars to append
36. left outer join和 left inner join区别
left outer join 等价于left join
lef inner join是将两个表相匹配的记录出现在结果表中
37. 清掉firefox页面缓存(修改js刷新)
在FireFox 的地址栏目输入:about:config
network.http.use-cache
设置为false
在弹出的界面中找到如下项目:
browser.cache.check_doc_frequency
缺省设置为3,改为1
Set how often to check accuracy of cached documents 设定检查是否需要更新缓存文档的频率
0 : Once per session 每个进程一次 每次启动Firefox时检查
1 : Each time 每次访问此页时检查
2 : Never 不检查
3 : When appropriate/automatically 自动
38. oracle外键
外键约束是表级约束
constraint 约束名foreign key(约束字段名)references 关联表名(关联字段名)
on delete cascade--级联删除,主表删除,从表跟着删除
on delete set null--主表数据删除,关联数据置空
39. oracle函数
decode/to_char函数 decode(biz.biz_type, 1, entity.msgtitle||'['||to_char(oper.created_time,'yyyy-MM-dd HH24:mi:ss')||']', entity.msgtitle) as msgtitle
40. varhchar,char,varchar2
在oralce中,例如name char(默认的长度是1)固定长度
varchar2(22)这个是可变长度,最大长度为22
oracle中不能直接用varchar和varchar2
41. session
Ibatis和Hibernate中的Session含义类似,均是代表了数据库的一个会话。在一个会话中,可以操作数据库。
而servlet中的session代表的是一个HTTP会话。它隐含了“面向连接”和/或“保持状态”这样两个含义,也可以理解为一类用来在客户端与服务器之间保持状态的存储结构,可以在session中存放相关会话数据
42. 类
匿名内部类 http://blog.csdn.net/liuzhidong123/article/details/6561521
new 父类构造器(参数列表)|实现接口()//匿名内部类实现一个接口或者继承一个类
{
//匿名内部类的类体部分
}
关于匿名内部类还有如下两条规则:
1)匿名内部类不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建内部类的对象。因此不允许将匿名内部类
定义成抽象类。
2)匿名内部类不等定义构造器,因为匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义实例初始化块,
通过实例初始化块来完成构造器需要完成的事情。
如果匿名内部类需要访问外部类的局部变量,则必须使用final修饰符来修饰外部类的局部变量
43. 线程Thread
多个线程同时调用同一个实例的方法,只要不共享这个实例的成员变量,不发生同步问题,各自完成各自的操作
对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式:访问串行化,对象共享化。而ThreadLocal采用了“以空间换时间”的方式:访问并行化,对象独享化。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响
当多个线程使用同一个实例的成员变量,ThreadLocal的做法是将成员变量放到ThreadLocal里面,并可以通过initialValue()初始化值。
然后可以通过set()和get()方法直接获取值。。。当多个线程同时使用该变量时,每个线程都会得到该变量的副本,所以相互之间是不会受到影响的。
用户可以根据自己需要,将一些非线程安全的变量以ThreadLocal存放
Service-Oriented Architecture 面向服务架构
ThreadLocal其实就是实例的成员变量可以初始化值,当多个线程同时使用这个实例时,使用的是这个成员变量的副本,所以每个线程对这个变量副本进行操作时,不影响其他线程
44. HTPP报文
accept:接收什么类型的响应
cookie
referer:请求是从哪个url传过来的
cache-control:请求希望相应返回的内容在客户端缓存的时间
- //获取指定名称的报文头属性的值
- java.lang.String getHeader(java.lang.String name)
- //获取报文头中的Cookie(读取Cookie的报文头属性)
- Cookie[] getCookies() ;
- //获取客户端本地化信息(读取 Accept-Language 的报文头属性)
- java.util.Locale getLocale()
- //获取请求报文体的长度(读取Content-Length的报文头属性)
- int getContentLength();
响应报文
- 1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急...
- 2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
- 3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
- 4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
- 5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等
相应报文头有个ETag属性,补充Cache-Control,如果这个ETag没有发生变化,那么浏览器可以直接从缓存获取输出,如果变化了,则可以从服务器从新获取输出页面。
45. 建立自己的异常处理类
创建一个类继承Throwable或者其子类
添加构造方法
public class MySecondException extends Throwable {
public MySecondException() {
super();
}
public MySecondException(String msg) {
super(msg);
}
public MySecondException(String msg, Throwable cause) {
super(msg, cause);
}
public MySecondException(Throwable cause) {
super(cause);
}
}
例如在项目中
public FrameworkAuthenticationException(String description,
Throwable rootException)
{
this(AUTHENTICATION_SESSION_LOST, description, rootException);
}
FrameworkException extends RuntimeException
只需要在定义的异常类中一直super(…)到FrameException就能抛出带有异常代码额异常描述的异常
最终目的是给这个FrameworkException的如上三个成员变量赋值
这个地方不知道是为什么
只要在异常类中重写toString方法,就可以自定义最终显示页面上的异常信息
46. 存储过程中的匿名块和命名块
使用declare或begin关键字开头的叫匿名块,每次使用均需要进行编译,不能存储在数据库中且不能被其他PL/SQL调用。而你所谓的存储过程,存储函数,触发器等叫命名块,一经编译后面就可直接调用,且可以存储在数据库中,被其他PL/SQL 调用。
47. 存储过程游标
create or replace procedure getcur(p_rc out sys_refcursor)
is
begin
open p_rc for 'select * from item';
end getcur;
sys_refcursor这个是oracle自带的返回游标的类型。
--Fetch游标
--使用的时候必须要明确的打开和关闭
declare
--类型定义
cursor c_job
is
select empno,ename,job,sal
from emp
where job='MANAGER';
--定义一个游标变量
c_row c_job%rowtype;
begin
open c_job;
loop
--提取一行数据到c_row
fetch c_job into c_row;
--判读是否提取到值,没取到值就退出
--取到值c_job%notfound 是false
--取不到值c_job%notfound 是true
exit when c_job%notfound;
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
end loop;
--关闭游标
close c_job;
end;
declare
CURSOR
c_dept(p_deptNo number)
is
select * from emp where emp.depno=p_deptNo;
r_emp emp%rowtype;
begin --for in loop就不需要明确打开和关闭游标
for r_emp in c_dept(20) loop
dbms_output.put_line('员工号:'||r_emp.EMPNO||'员工名:'||r_emp.ENAME||'工资:'||r_emp.SAL);
end loop;
end;
fetch
48. 存储过程
在java代码中,PreparedStatement需要单个执行插入,executeUpdate().,executeQuery()
存储过程要用CallableStatement,,prepareCall(…),cs.rege….(index,type);
create or replace proname(…)
is
begin
….
end proname;
49. JDBC全解析
注册驱动,构造连接
具体的实例见我写的JDBC操作实例
statement每次执行sql语句,相关数据库都要执行sql语句的编译
preparedstatement是预编译得, preparedstatement支持批处理
statement执行update必须有参数
preparedStatement在创建时已经预编译了,没有参数
ResultSet能获得结果集的元数据,能够进行各种指针操作,假如在语句中设置了type和Concurrency可以在结果集中进行更新和插入操作
CallableStatement能够进行存储过程的执行
游标
ResultSet()结果集,可以看成结果的集合,rs.next();等每个函数可以看做是对游标的操作,rs既能操作游标上下移动,又能对当前游标对应的记录进行操作,而且能够进行修改和插入、删除操作 注意:对游标进行删改操作时,必须设定(如果数据库记录改动了,不反映到rs里面;能用rs更新数据库中的表面;),同时取结果集的sql必须明确字段,不能用select*from(此sql默认结果集只读)conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
50. JVM内存结构和6大区域
PC Register(PC寄存器) 记录当前线程执行字节码的行号(线程私有)
JVM栈 线程私有,保存基本类型变量及对象的指针 -Xss
堆(Heap)JVM用来存储对象实例以及数组值的区域 -Xms(JVM可申请的最小heap内存) -Xmx(最大)
方法区域(MethodArea) 方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息 持久代XX:PermSize(最小)-XX:MaxPermSize
运行时常量池(RuntimeConstant Pool)类中的固定的常量信息、方法和Field的引用信息等 空间从方法区分配
本地方法堆栈(NativeMethod Stacks)JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。
51. 用notepad++格式化xml
插件xmlTools,Pretty print(XML only - with line breaks) Ctrl+Alt+Shift+B
52. Collections
常用的方法,
53. 锁
wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对像都有wait(),notify(),notifyAll()的功能。因为都个对像都有锁,锁是每个对像的基础,当然操作锁的方法也是最基础了。
wait():
等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则编译可以通过,但运行时会收到一个异常:IllegalMonitorStateException。
调用任意对象的 wait() 方法导致该线程阻塞,该线程不可继续执行,并且该对象上的锁被释放。
notify():
唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
调用任意对象的notify()方法则导致因调用该对象的 wait()方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。
notifyAll():
唤醒所有等待的线程,注意唤醒的是notify之前wait的线程,对于notify之后的wait线程是没有效果的。
1.有synchronized的地方不一定有wait,notify
2.有wait,notify的地方必有synchronized.这是因为wait和notify不是属于线程类,而是每一个对象都具有的方法,而且,这两个方法都和对象锁有关,有锁的地方,必有synchronized。
54. CVS
Concurrent Version System版本控制系统
55. RMI
RMI说白了,就是提供了一种远程的方法调用。 这种调用简单方便,可以传递复杂java对象。现在流行的j2ee中的EJB的底层实现技术就是RMI,EJB的调用就是经过封装的,更高级的RMI调用。
- 定义一个远程接口的接口,该接口中的每一个方法必须声明它将产生一个RemoteException异常。
2、定义一个实现该接口的类。
3、使用RMIC程序生成远程实现所需的残根和框架。
cd到classpath目下到rmic classname 如果有包名记得带包名
4、创建一个服务器,用于发布2中写好的类。
5. 创建一个客户程序进行RMI调用。
6、启动rmiRegistry并运行自己的远程服务器和客户程序。
JRMP(java远程消息交换协议) java remote message protocol
一、RMI(远程方法调用)的组成
一个正常工作的RMI系统由下面几个部分组成:
·远程服务的接口定义
·远程服务接口的具体实现
·桩(Stub)和框架(Skeleton)文件
·一个运行远程服务的服务器
·一个RMI命名服务,它允许客户端去发现这个远程服务
·类文件的提供者(一个HTTP或者FTP服务器)
·一个需要这个远程服务的客户端程序
56. oracle删除用户和表空间
对于单个user和tablespace 来说, 可以使用如下命令来完成。
步骤一: 删除user
drop user ×× cascade
说明: 删除了user,只是删除了该user下的schema objects,是不会删除相应的tablespace的。
步骤二: 删除tablespace
DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES;
--删除空的表空间,但是不包含物理文件
drop tablespace tablespace_name;
--删除非空表空间,但是不包含物理文件
drop tablespace tablespace_name including contents;
--删除空表空间,包含物理文件
drop tablespace tablespace_name including datafiles;
--删除非空表空间,包含物理文件
drop tablespace tablespace_name including contents and datafiles;
--如果其他表空间中的表有外键等约束关联到了本表空间中的表的字段,就要加上CASCADE
CONSTRAINTS
drop tablespace tablespace_name including contents and datafiles CASCADE
CONSTRAINTS;
57. Servlet中的response和request
javax.servlet.http.HttpServletResponse
response.addHeader("Pragma", "no-cache");向已存在的消息头添加值
response.setIntHeader("c-result-status", resultStatus);向消息头中新添加属性
58. web项目导入jar包
新建了web项目通过右键build path导入jar包能正常编译,但是当我部署到tomcat里面就报错classNotFoundException,打开tomcat部署目录,发现在web-info/lib下面没有我导入的jar包
里面eclipse引用library (即我build path的jar包)是为了编译代码生成WEB-INF/classes里面的class文件使用,使用eclipse j2ee IDE时,会将WEB-INF/lib中所有的lib自动加入到library中,而我bp的jar包不会到lib里面,所以需要手动拷贝
struts2需要导入的基础jar包
struts2-core-2.0.6.jar
xwork-2.0.4.jar
ognl-2.6.11.jar
freemarker-2.3.8.jar
commons-logging-1.0.4.jar
59. web.xml全解
url-pattern
精确路径匹配 /test /* /test会匹配前面
最长路径匹配 /test/* /test/a/* /test/a/会匹配后面
扩展匹配 *.action
路径映射以”/’开头和以”/*”结尾的
以”*.”开头拓展映射
“/” 是用来定义default servlet映射的
剩下的都是用来定义详细映射的。比如: /aa/bb/cc.action
/*.action 无法判定是路径映射还是拓展映射 是指url-pattern包含/*.action的
/hello.action是可以的 /hello.*是不行的 /*/*也是不行的*只能出现一次 /test/*/haha/*也不行
如果同时配置了struts2和servlet,且url-pattern 为/*对所有连接进行拦截,那么servlet配置url-pattern就没有作用,可以指定struts2的url-pattern或者指定struts2的load-on-startup
|-- Context Path --|-- Servlet Path -|--Path Info--|
http://www.myserver.com /mywebapp /helloServlet /hello
|-------- Request URI ----------------------------|
60. 修改java文件不重启tomcat的方法
<Context docBase="E:\apache-tomcat-6.0.14\webapps\abs" path="/abs" reloadable="false" source="org.eclipse.jst.j2ee.server:abs"/></Host>
61. struts2
<package name="com.cdb" extends="struts-default,
继承之后能使用struts-default里面定义的拦截器
struts.xml 为Struts 2的核心配置文件。struts.xml文件主要负责管理应用中的Action映射,以及该Action包含的Result定义等。
struts.xml中主要配置Struts项目的一些全局的属性,用户请求和响应Action之间的对应关系,以及配置Action中可能用到的参数,以及处理结果的返回页面。还包括各种拦截器的配置等。
AOP 栈结构,1.执行失败,返回resultCode给上层拦截器返回2.执行成功,返回invocation.invoke(),继续调用下一个拦截器3.如果已经到最内层action,执行action,返回resultCode,依次返回给拦截器返回 如果将R=invocation.invoke()写在result之前,那么R之前代码在执行action之前执行,R之后代码在执行action之后执行 PreResultListener 用法有待研究 |
struts-default.xml里面定义了一系列的拦截器
62. ibatis
spring集成ibatis
- 配置dataSource
- 配置sqlMapClient(dataSource configLocation lobHandler)
注:lobHandler必须配置,否则会报错;confiLocation里面的ibatis配置文件必须有sql-map的配置
见17类加载
SqlMapClientTempleate这个类是ibatis的真正具体curd操作类,该类已经存在setSqlMapClent()方法,这个类需要SqlMapClient,所以在spring配置时,需要在其实现类里面注入属性SqlMapClient,SqlMapClientTemplate的实现类就能通过getSqlMapClientTemplat()得到SqlMapClientTemplate来进行相应的curd操作
public final void setSqlMapClient(SqlMapClient sqlMapClient)
{
if (!(this.externalTemplate))
this.sqlMapClientTemplate.setSqlMapClient(sqlMapClient);
},然后通过这个方法得到这个类,进行相应的curd操作
public final SqlMapClientTemplate getSqlMapClientTemplate()
{
return this.sqlMapClientTemplate;
}
所以需要配置好这个SqlMapClient,这个类需要注入如下3个属性,缺一不可,否则应用启动时会报错
需要在SqlMapClientTemplate的实现
ibatis中的SqlMapClient继承了SqlMapTran和SqlMapExecutor,后者包含curd方法
SqlMapClientTemplate是spring的方法,其CURD归根到底还是调用SqlMapExecutor的方法
com.ibatis.sqlmap.client.SqlMapClient 这个是ibaisd的接口,继承了SqlMaoExecutor和SqlMapTransactionManager接口
我理解的resultClass和resultMap
前一段一直对ibatis的queryForList很迷茫,想想
63. spring
org.springframework.core.io.Resource
加载文件资源
Spring 定义了一个 org.springframework.core.io.Resource 接口,Resource 接口是为了统一各种类型不同的资源而定义的,Spring 提供了若干 Resource 接口的实现类,这些实现类可以轻松地加载不同类型的底层资源,并提供了获取文件名、URL 地址以及资源内容的操作方法。
访问文件资源
假设有一个文件地位于 Web 应用的类路径下,您可以通过以下方式对这个文件资源进行访问:
- 通过 FileSystemResource 以文件系统绝对路径的方式进行访问;
- 通过 ClassPathResource 以类路径的方式进行访问;
- 通过 ServletContextResource 以相对于Web应用根目录的方式进行访问。
注解
@scope等价于scope属性 @PostConstruct等价于init-method @PreDestroy等价于destory-method
@
Spring中BeanFactory与ApplicationContext的差别
后者是前者功能的拓展,如我今天使用的@autowire在前者一直报空指针异常。。。
ApplicationContext ctx = new ClassPathXmlApplicationContext("sayLanguage.xml");
64. spring整合srruts2
大概思路是:在web.xml里面配置struts2的fliter,配置spring的监听器,初始化spring容器
在spring配置文件中,可以用<context:component-scan base-package="com.yyl.rp,com.rp.yyl" />,该配置会扫描com.yyl.rp和com.rp.yyl下面的所有类,如果有类似service注解,就会将其初始化成spring容器的一个bean。当一个请求到达web容器时,创建了一个action实例,如果在action容器里面存在@Autowire注解,那么此时如果有插件spring-struts2-plugin.jar,该插件的作用是从spring容器中取得autowire类型对应的bean给它注入到action实例里面。
65. log4j.properties
log4j.rootLogger = [ level ] , appenderName1 定义根Logger,所有>=level级别的日志都会被输出
#set logger level and assign appenders
log4j.rootLogger=DEBUG, stdout, A1
#log4j.rootLogger=ERROR, A1
log4j.logger.JMSLOG=ALL, JMSLOG
log4j.appender.A1=org.apache.log4j.RollingFileAppender
log4j.appender.A1.file=e:/abs_logs/abs_log-
log4j.appender.A1.MaxFileSize=10MB
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss.SSS}[%c]-[%p] %m%n
66. HTML中标签
link 标签是单独出现的
属性
href -- 指定需要加载的资源(CSS文件)的地址URI
media -- 媒体类型,参见CSS教程
rel -- 指定链接类型 告诉浏览器你link进来的是个样式表文件
rev -- 指定链接类型
type -- 包含内容的类型,一般使用type="text/css"
meta
<meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词。
<meta> 标签位于文档的头部,不包含任何内容。<meta> 标签的属性定义了与文档相关联的名称/值对。
<meta http-equiv="Content-Type" content="html/json; charset=utf-8" />
HTML中td元素的nowrap属性表示禁止单元格中的文字自动换行。
<p><span style="color:red;font-family:楷体">呵呵</span></p>p是段落
<table align=”left/right/center”> table位于左中右测试结果http://www.w3school.com.cn/tiy/t.asp?f=html_table_align2
67. oracle执行计划 sql优化
A update sta_ctrt a set a.loan_quty_type_cd=(select nvl(b.identlevel,0) identlevel from etr.etr_loan b where a.ctrt_no=b.loan_no) where exists(select 1 from etr.etr_loan c where a.ctrt_no=c.loan_no); |
B merge into sta_ctrt a using etr.etr_loan b on (a.ctrt_no=b.loan_no) when matched then update set a.loan_quty_type_cd=nvl(b.identlevel,13); |
A
Bmerge的语法是用表b中的每条记录来跟表a进行匹配,如果满足了就执行then操作
rownum 伪字段
1 Oracle executes your query. 执行query
2 Oracle fetches the first row and calls it row number 1. 将查询出来的第一行rownum设置为1
3 Have we gotten past row number meets the criteria? If no, then Oracle discards the row, If yes, then Oracle return the row.
判断rownum是否符合条件,如果符合则返回该行,否则丢弃
4 Oracle fetches the next row and advances the row number (to 2, and then to 3, and then to 4, and so forth).
将下一行的rownum+1
5 Go to step 3.
所以where rownum>n rownum=n返回的数据一直会为空 (n>1)
可以select * from(select rownum,a.* from tablename a) b
rowid在整个row的生命周期内是唯一的。
在Oracle的逻辑存储中,表空间由各种类型的段(Storage)组成,而段则由区(extent)组成,区是段分配存储的单位。当建立一个表段时,Oracle为该段分配初始区,如果之后由于数据的插入,初始区装满后,将继续分配下一个区。
68. java回调函数
a实现某个接口,b预留了该接口,创建b对象,将a放进去,执行b的方法,相当于执行a的
69. try catch finally
如果在try里面发生了异常,在异常开始的地方终止运行,然后执行finally里面的代码。
如果在try和finally里面都有return的话,先执行try里面的代码,然后执行finally里面的代码,最后返回值为finally里面的return
if()else if(){}else if(){}else{},如果第一个if语句满足了,后面的else都不会执行