一、编写helloworld程序
从helloworld开始,在JQuery库中,$为JQuery的简写形式。
<html>
<head>
<script src="../jquery-1.3.1.js" type="text/javascript"></script>
<script type="text/javascript">
//其中$(document).ready(function(){}),可以简写为$(function(){});
$(document).ready(function(){ //dom加载完毕后执行,类似于window.onload
alert('helloworld !');
});
</script>
</head>
<body><body>
</html>
二、$(document).ready与window.onload比较。
1、执行时机,window.onload为必须等待网页所有内容加载完毕后(包括图片)后才能执行。
而$(document).ready则在网页DOM结构绘制完毕后就执行,可能内容没有加载完毕。
2、编写个数,window.onload不能进行多次编写,后面编写的将覆盖前面编写的。$(document).ready可以进行多次编写。
每次都能够执行。
解决方法:
1、修改ext-all.css,找到.x-grid3-header-offset,修改为.x-grid3-header-offset{padding-left:1px;/*width:10000px;*/width:auto;}
2、在grid中加入下面代码:
复制代码 代码如下:
monitorResize: true,
doLayout: function() {
this.setSize(Ext.get(this.getEl().dom.parentNode).getSize(true));
Ext.grid.GridPanel.prototype.doLayout.call(this);
}
转http://www.fengfly.com/plus/view-165078-1.html
今天在做JAVASCRIPT的时候,发现老是出现”未结束的字符串常量”.
自己找了下应该是传参数的时候,有特殊字符引起的.网上也找了下,也有好多出现这种情况.做下总结,以方便以后查阅.
1.JAVASCRIPT引用时,使用的字符语言不一致.
比如:<script type=”text/javascript” src=”xxx.js” charset=”UTF-8″>.xxx.js文件内部使用的是GB2312的格式,外面调用使用的是UTF-8,所以文件内部部分特殊字符因为格式不一致,出现乱码,造成此原因.
2.JAVASCRIPT输出HTML字符时,前后标记不匹配.
这种比较常见,往往在输出字符串时,出现单引号(’)或双引号(”)不配对,或者是在document.write()的时候,没有正确输出单引号(’)或双引号(”)
3.参数内出现HTML标记语言或包含换行符
我今天所遇到的是这种情况.因为我所得到的数据以参数形式传给一函数,结果该数据里包含换行符,造成了此错误.
如:一般测试时只使用单行的数据,是正常的,未出现这个错误,.
当测试时使用多行数据,并使用回车链换行,就出行了此错误.因为里面包含了换行符
对于第3种情况,我的解决方法是:不直接将该数据以参数形式传递,而是先将其赋值在一个隐藏的文本内,需要调用的函数里只需读取该文本里的内容即可.
转 http://www.javaeye.com/topic/400721
Weblogic和hibernate3异常:ClassNotFoundException: org.hibernate.hql.ast.HqlToken
2009年08月25日 星期二 12:37
在做项目的时候,我用weblogic跑了一下自己的程序(开发一直在tomcat下),发现出现了这样的问题,
ClassNotFoundException: org.hibernate.hql.ast.HqlToken ,郁闷了半天,在tomcat下没有任何错误,为何到weblogic就有问题了呢?
在百度和google上搜了好久,换了n个关键词,才搜到原因如下:
原因:
Hibernate3.0 采用新的基于ANTLR的HQL/SQL查询翻译器,在Hibernate的配置文件中,hibernate.query.factory_class属性用来选择查询翻译器。
(1)选择Hibernate3.0的查询翻译器:
hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory
(2)选择Hibernate2.1的查询翻译器
hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory
为了使用3.0的批量更新和删除功能,只能选择(1)否则不能解释批量更新的语句,当使用的时候出现了不支持条件输入中文的情况。
选择(2)可以支持输入中文,但没法解释批量更新语句了
在hibernate3中需要用到antlr,然而这个包在weblogic.jar中已经包含了antrl类库,就会产生一些类加载的错误,
无法找到在war或者ear中的hibernate3.jar。
出现这个错误之后,antlr会调用System.exit(),这样weblogic就会中止服务。
原来是冲突了,解决方法也很简单,就是添加
<prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory
</prop>
这个属性后,就可以解决这个问题了。
有一个人的博客上写的也是也这个方法,不过他的org.hibernate.hql.classic.ClassicQueryTranslatorFactory写错了,
害的我以为这个方法不能用了,结果看看了,是他上面写错了,下面的是正确的,郁闷的是我拷贝的是上面的,最总还是被我发现了。
转 http://hi.baidu.com/lei55022033/blog/item/b20ad52c8c9f7ae58b139940.html
|
1.什么是数据库事务,以及作用?
数据库事务:
事务是由相关操作构成的一个完整的操作单元,在一个事物内,数据的修改一起提交或撤销,如果发生故障或系统错误,
整个事物也会自动撤销。
优点:
把逻辑相关的操作分成了一个组
在数据永久改变前,可以预览数据变化
能过保证数据的读一致性
1. 介绍
1)DOM(JAXP Crimson解析器)
DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。
2)SAX
SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。
选择DOM还是选择SAX? 对于需要自己编写代码来处理XML文档的开发人员来说, 选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。
DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。
SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
3)JDOM http://www.jdom.org/
JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。正在考虑通过“Java规范请求JSR-102”将它最终用作“Java标准扩展”。从2000年初就已经开始了JDOM开发。
JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。
JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”(根据学习曲线假定为20%)。JDOM对于大多数Java/XML应用程序来说当然是有用的,并且大多数开发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在XML中无意义的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习DOM或JDOM接口都更有意义的工作。
JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。
4)DOM4J http://dom4j.sourceforge.net/
虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过DOM4J API和标准DOM接口具有并行访问功能。从2000下半年开始,它就一直处于开发之中。
为支持所有这些功能,DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然DOM4J付出了更复杂的API的代价,但是它提供了比JDOM大得多的灵活性。
在添加灵活性、XPath集成和对大文档处理的目标时,DOM4J的目标与JDOM是一样的:针对Java开发者的易用性和直观操作。它还致力于成为比JDOM更完整的解决方案,实现在本质上处理所有Java/XML问题的目标。在完成该目标时,它比JDOM更少强调防止不正确的应用程序行为。
DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用DOM4J。
2.. 比较
1)DOM4J性能最好,连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J.
2)JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM。虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。
3)SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
3. 四种xml操作方式的基本使用方法
xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<Result>
<VALUE>
<NO DATE="2005">A1</NO>
<ADDR>GZ</ADDR>
</VALUE>
<VALUE>
<NO DATE="2004">A2</NO>
<ADDR>XG</ADDR>
</VALUE>
</Result>
1)DOM
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class MyXMLReader{
public static void main(String arge[]){
long lasting =System.currentTimeMillis();
try{
File f=new File("data_10k.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(f);
NodeList nl = doc.getElementsByTagName("VALUE");
for (int i=0;i<nl.getLength();i++){
System.out.print("车牌号码:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
}
}catch(Exception e){
e.printStackTrace();
}
2)SAX
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
public class MyXMLReader extends DefaultHandler {
java.util.Stack tags = new java.util.Stack();
public MyXMLReader() {
super();
}
public static void main(String args[]) {
long lasting = System.currentTimeMillis();
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
MyXMLReader reader = new MyXMLReader();
sp.parse(new InputSource("data_10k.xml"), reader);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒");}
public void characters(char ch[], int start, int length) throws SAXException {
String tag = (String) tags.peek();
if (tag.equals("NO")) {
System.out.print("车牌号码:" + new String(ch, start, length));
}
if (tag.equals("ADDR")) {
System.out.println("地址:" + new String(ch, start, length));
}
}
public void startElement(String uri,String localName,String qName,Attributes attrs) {
tags.push(qName);}
}
3) JDOM
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
public class MyXMLReader {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File("data_10k.xml"));
Element foo = doc.getRootElement();
List allChildren = foo.getChildren();
for(int i=0;i<allChildren.size();i++) {
System.out.print("车牌号码:" + ((Element)allChildren.get(i)).getChild("NO").getText());
System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
}
} catch (Exception e) {
e.printStackTrace();
}
}
4)DOM4J
import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;
public class MyXMLReader {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
File f = new File("data_10k.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(f);
Element root = doc.getRootElement();
Element foo;
for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {
foo = (Element) i.next();
System.out.print("车牌号码:" + foo.elementText("NO"));
System.out.println("车主地址:" + foo.elementText("ADDR"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
转自:http://blog.chinaunix.net/u/25176/showart_379827.html
定制的Spring Security(Acegi)的并发会话过滤器(ConcurrentSessionFilter)的编码过程
Wed, 10/29/2008 - 08:33 — Fuller
上一帖述及使用ConcurrentSessionFilter限制同帐号登录多次的方法,同帐号多次登录限制是运行系统必需的功能,所以作者对其深入测试,在上一帖中也列举了Spring Security的ConcurrentSessionFilter和ConcurrentSessionControllerImpl类的几个限制。做一下简单的总结,下面假设同时使用DigestProcessingFilter和辅助类:
- 如果exceptionIfMaximumExceeded = true,即第二个发起的会话被禁止,如果一个用户重新启动浏览器,再次登录失败,因为前一个会话没有超时,被当成了多次登录。
- 如果exceptionIfMaximumExceeded = false,如果两个人使用同一个帐号登录,将出现交互将对方踢出去的现象,实际上并没有禁止任何人登录,只是每次要先将另一个人踢下去。
需求
我想使用exceptionIfMaximumExceeded = true,同时允许同一个用户在同一台机器上连续登录多次,我采取了编写定制的ConcurrentSessionController实现类的方法。
原理
ConcurrentSessionController是一个接口,有两个需要实现的方法:checkAuthenticationAllowed()和registerSuccessfulAuthentication(),Spring Security提供了一个实现类ConcurrentSessionControllerImpl,经过分析缺省的实现类,发现方法allowableSessionsExceeded()处理多次并发会话,在SecurityRegistry中保存每个会话的信息,主要是用户帐号对应的会话ID(sessionId)和最后发起时间,在并发发生时,从SecurityRegistry中取出关于某个用户帐号的所有会话,如果exceptionIfMaximumExceeded = false,找到最早一个会话,将其释放掉,腾出空间给新会话,如果exceptionIfMaximumExceeded = true,将发出一个异常。
所以,需要改进allowableSessionsExceeded(),如果exceptionIfMaximumExceeded = true让程序判断客户地址,如果同一个IP,则允许登录,将最早的会话释放掉,如果不是同一个IP在发出异常。
在SecurityRegistry中,用户帐号信息存在一个对象中,名字是principal,当前是一个Object对象,实际上只是存了一个字符串,所以需要扩展principal,写一个定制的类(我的类含有两个属性:username和userip),里面保存客户IP信息。allowableSessionsExceeded()只是使用SecurityRegistry,SecurityRegistry中的内容是由registerSuccessfulAuthentication()方法写入的,所以,在该方法中需要将原来的pricipal对象替换成定制的Principal类的对象。同时checkAuthenticationAllowed()方法也要修改,因为这个方法要查询SecurityRegistry,查询条件替换成定制的Principal类的对象。
注意事项
定制的Principal类要实现equals()和hashCode()和toString()三个方法,在equals()方法中只要username相同就表示两个对象相同,而在hashCode()中只需要将username的hashcode计算在内,因为SecurityRegistry是以principal为关键字的Map容器,这两个方法决定了对Map的查询。toString()方法可以根据自己的需要写,我只是将username输出。
测试
将定制的ConcurrentSessionController对象编制(wire)到应用系统中,经过测试,能够达到预想目的。
存在的问题
原来想省点劲,只要继承ConcurrentSessionControllerImpl并重载上述三个方法就行了,但是不知道为什么securityRegistery属性一直注入不了,一气之下,写了一个直接实现ConcurrentSessionController接口的新类。实际上也不是从头写,将ConcurrentSessionControllerImpl代码改吧该吧即可,用不了几分钟,这就是开源的好处。
转自 http://www.gooseeker.com/cn/node/517
/*********************
* 四舍五入到小数点后两位
燃料子系统有很多数据都要求是固定的格式,并要求四舍五入,一般都是number(12, 2),
如果画面出现数据: 3.1230032..此类可以用myRound(arg1, arg2)处理。
例:
var num = 3.1260032;
var result = myRound(num, 2); // result = 3.13
若num = 1,则结果为1.00
*********************/
/*
* 四舍五入到指定位数
*
* num 要处理的数字
* n 小数点后几位
*/
function myRound(num,n){
var dd=1;
var tempnum;
for(i=0;i<n;i++){
dd*=10;
}
tempnum=num*dd;
// 如果参数非数字,将值置为0
// modified by liyj 2008/6/16 PM
if (tempnum+""=="NaN") {
return formatnumber(0,n);
}
tempnum=Math.round(tempnum);
return formatnumber(tempnum/dd,n);
}
/*
* 格式化数字
*
* value 数值
* num 位数
*/
function formatnumber(value, num) {
var a, b, c, i;
a = value.toString();
b = a.indexOf(".");
c = a.length;
if (num == 0) {
if (b != -1) {
a = a.substring(0, b);
}
} else {
if (b == -1) {
a = a + ".";
for (i = 1; i <= num; i++) {
a = a + "0";
}
} else {
a = a.substring(0, b + num + 1);
for (i = c; i <= b + num; i++) {
a = a + "0";
}
}
}
return a;
}