又碰到servlet 输出中文乱码的问题,恼火。研究了一下,有了新的发现和认识。
原始代码:
java 代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter pw = response.getWriter();
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
pw.print("中文");
}
无论把3、4两句改成gbk还是utf-8,页面访问到的一律是??
一怒之下用wpe抓包,发现无论设为utf-8还是gbk抓到的均为
HTTP 代码
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 2
Date: Thu, 08 Mar 2007 06:04:55 GMT
??
说明3、4两句没起作用,检查代码,尝试把2和三四顺序调整,乱码问题解决。
检查api文档,发现说明如下
PrintWriter getWriter() throws IOException
Returns a PrintWriter object that can send character text to the client. The PrintWriter uses the character encoding returned by getCharacterEncoding(). If the response's character encoding has not been specified as described in getCharacterEncoding (i.e., the method just returns the default value ISO-8859-1), getWriter updates it to ISO-8859-1.
推断getWriter()返回的PrintWriter使用的charactor encoding是在这个函数返回时即已确定的,但到底是返回的PrintWriter内部属性还是运行时的控制,未找到依据。
查看 tomcat中setCharacterEncoding方法的实现时发现如下代码:
java 代码
public void setCharacterEncoding(String charset) {
if (isCommitted())
return;
// Ignore any call from an included servlet
if (included)
return;
// Ignore any call made after the getWriter has been invoked
// The default should be used
if (usingWriter)
return;
coyoteResponse.setCharacterEncoding(charset);
isCharacterEncodingSet = true;
}
其中usingWriter 标志为getPrinteWriter方法中设定,可见其控制逻辑为一旦返回了PrintWriter,本函数即不再生效。但是上述的推断没有进一步的证据。
同时我们发现只有usingWriter标志,却没有usingOutputStream标记。猜测使用ServletOutputStream 输出不受此限制,经测试写出如下代码。
java 代码
ServletOutputStream out = response.getOutputStream();
out.print("中文");
//情况1:正常,浏览器按utf-8方式查看
//response.setContentType("text/html; charset=utf-8");
//情况2:浏览器缺省按简体中文查看,手动设为utf-8方式查看正常
//response.setCharacterEncoding("utf-8");
说明:这种方式不仅不需要在调用getOutputStream()之前设定字符集,甚至在print输出后设定都有效。
查看setCharacterEncoding API文档,进一步发现:
Calling setContentType(java.lang.String) with the String of text/html and calling this method with the String of UTF-8 is equivalent with calling setContentType with the String of text/html; charset=UTF-8.
原来只需要用response.setContentType("text/html; charset=utf-8"); 设定就ok,不需要两次调用。进一步
This method can be called repeatedly to change the character encoding. ......If the character encoding has already been set by setContentType(java.lang.String) or setLocale(java.util.Locale), this method overrides it.
可反复设置,相互覆盖,据此写出如下测试代码
java 代码
//情况1:正常,浏览器按utf-8方式查看
response.setContentType("text/html; charset=gbk");
response.setCharacterEncoding("utf-8");
//情况2:正常,浏览器按简体中文方式查看
//response.setContentType("text/html; charset=utf-8");
//response.setCharacterEncoding("gbk");
PrintWriter pw = response.getWriter();
pw.print("中文");
结论:
1.在servlet中输出中文,如果采用PrintWriter方式,需要在调用getPrintWriter()之前调用setContentType 或者 setCharacterEncoding;采用ServletOutputStream方式,不受此限。
2.setContentType 和 setCharacterEncoding两方法中设定characterEncoding的方法对服务器效果一致,不需要反复调用。在输出文本内容时,采用response.setContentType("text/html; charset=utf-8");似乎更为方便。
标签: MVC-C
detail:
http://community.csdn.net/Expert/TopicView3.asp?id=5675034
标签: MVC-C
Jquery是继prototype之后又一个优秀的Javascrīpt框架 -|yytcpt 发表于 2007-1-8 9:51:00
Jquery是继prototype之后又一个优秀的Javascrīpt框架。对prototype我使用不多,简单了解过。但使用上jquery之后,马上被她的优雅吸引住了。有人使用这样的一比喻来比较prototype和jquery:prototype就像Java,而jquery就像ruby.实际上我比较喜欢java(少接触Ruby 罢了)但是jquery的简单的实用的确有相当大的吸引力啊!在项目里我把jquery作为自已唯一的框架类包。使用其间也有一点点心得,其实这些心得,在jquery的文档上面也可能有讲,不过还是记下来,以备忘罢。
一,找到你了!
还记得$()这个东西吧?prototype还是DWR都使用了这个函数代替document.getElementById()。没错,jquery也跟风了。为达到document.getElementById()的目的,jquery是这样写的:
代码
var someElement = $("#myId");
看起来比其他两个框架的要多了一个#,好,看看下面的用法:
代码
$("div p");(1)
$("div.container")(2)
$("div #msg");(3)
$("table a",context);(4)
在prototype里看过这样的写法吗?第一行代码得到所有<-div>标签下的
元素。第二行代码得到class 为container的<-div>元素,第三行代码得到<-div>标签下面id为msg的元素。第四行代码得到context为上下文的table里面所有的连接元素。
如果你熟悉CSS,Xpath,你会觉得这些写法很眼熟!对了。正是。看出奥妙了吧。jquery就是通过这样的方式来找到Dom对象里面的元素。跟CSS的选择器相类似。
二,Jquery对象?
jquery提供了很多便利的函数,如each(fn),但是使用这些函数的前提是:你使用的对象是Jquer对象。使一个Dom对象成为一个Jquery对象很简单,通过下面一些方式(只是一部分):
代码
var a = $("#cid");(1)
var b = $("
hello
");(2)var c = document.createElement("table"); var tb = $(c);
三,代替body标签的onload
这个惯例,也许是除了$()之外,用得最多的地方了。下面一段代码:
代码
$(document).ready(function(){
alert("hello");
});(1)
<-body onload="alert('hello');">(2)
上面两段代码是等价的。但代码1的好处是做到表现和逻辑分离。并且可以在不同的js文件中做相同的操作,即$(document).ready (fn)可以在一个页面中重复出现,而不会冲突。基本上Jqeury的很多plugin都是利用这个特性,正因为这个特性,多个plugin共同使用起来,在初始化时不会发生冲突。
不管怎么说,这个惯例可以分离javascrīpt与HTML。推荐使用。
四,事件机制
我大量使用的事件可能就是button的onclick了。以前习惯在input 元素上写onclick = "fn()",使用jquery可以使javascrīpt代码与html代码分离,保持HTML的清洁,还可以很轻松地绑定事件,甚至你可以不知道“事件”这个名词。
代码
$(document).ready(function(){
$("#clear").click(function(){
alert("i am about to clear the table");
});
$("form[0]").submit(validate);
});
function validate(){
//do some form validation
}
五,同一函数实现set&get
代码
$("#msg").html();
$("#msg").html("hello");
上面两行代码,调用了同样的函数。但结果却差别很大。
第一行是返回指定元素的HTML值,第二行则是将hello这串字符设置到指定元素中。jquery的函数大部分有这样的特性。
六,ajax
这是一个ajax横行的时代。多少人,了不了解ajax的都跟着用上一把。呵。使用jquery实现ajax同样简单异常
代码
$.get("search.do",{id:1},rend);
function rend(xml){
alert(xml);
} (1)
$.post("search.do",{id:1},rend);
function rend(xml){
alert(xml);
} (2)
$("#msg").ajaxStart(function(){
this.html("正在加载。。。。");
});(3)
$("#msg").ajaxSuccess(function(){
this.html("加载完成!");
});(4)
这些都是较常用的方法,get和post用法一样。第一个参数是异步请求的url,第二个为参数,第三个回调方法。
3,4的方法会在指定的Dom对象上绑定响应ajax执行的事件。当然,jquery的AJAX相关的函数不仅是这些,有兴趣可以去研究再多。
七,渐入淡出
代码
$("#msg").fadeIn("fast");
$("#msg").fadeOut("slow");
没错,上面两行代码已经分别实现了一个id为Msg的jquery对象的渐入和淡出。做一个像Gmail一样的动态加载通知条,用jquery就那么简单。两个函数接受的参数除了快慢等,还可以接收整型,作为渐入或淡出的完成时间,单位为MS。
八,plugin
这也是一个插件的时代。
jquery插件给我的感觉清一色的清洁,简单。如Jtip,要使用它的功能,只需要在你的元素的class上加上Jtip,并引入jtip.js及其样式即可以了。其他事情插件全包。我喜欢jquery的一个重要原因是发现她已经有了很多很好,很精彩的插件。
写得很烂。可能大家看不出jquery的好处。嗯,光听是没用的,试用一下吧。你会发觉很有趣。
暂时告一段落吧。待有新的发现再来分享。
加一些Jquery的资源:
http://www.visualjquery.com/index.xml 很好的API查询站点
http://jquery.com/demo/thickbox/ 知道lightBox吧,看看Jquery是怎样实现相同的东西
http://www.codylindley.com/blogstuff/js/jtip/ Jtip,实用的提示工具
http://jquery.com/plugins/ 很多牛的插件。
http://15daysofjquery.com/jquery 的15天教程
标签: MVC-V
觉得只用insertAdjacentElement比较复杂,就又写了一个
var i=1;
var j=1;
var m=0;
function add(name,postion)
{
if(name=="file"){
m=i;
i++;
}else{
m=j;
j++;
}
var oInputdiv=document.createElement("div");
oInputdiv.id='div'+name+m;
var oInputfile=document.createElement('
var oInputdel=document.createElement('
var oInputtext0=document.createTextNode("上报国办:");
var oInputtext1=document.createTextNode("转发专家:");
var oInputtext2=document.createTextNode("通报领导:");
//id用于oInput1删除,name用于controller识别,value用于controller读取
var oInputcheckbox0=document.createElement('
var oInputcheckbox1=document.createElement('
var oInputcheckbox2=document.createElement('
document.getElementById(postion).insertAdjacentElement('AfterEnd',oInputdiv);
document.getElementById('div'+name+m).appendChild(oInputfile);
document.getElementById('div'+name+m).appendChild(oInputtext0);
document.getElementById('div'+name+m).appendChild(oInputcheckbox0);
document.getElementById('div'+name+m).appendChild(oInputtext1);
document.getElementById('div'+name+m).appendChild(oInputcheckbox1);
document.getElementById('div'+name+m).appendChild(oInputtext2);
document.getElementById('div'+name+m).appendChild(oInputcheckbox2);
document.getElementById('div'+name+m).appendChild(oInputdel);
}
function del(id)
{
id.removeNode(true);
}
显然用节点appendChild更方便。
标签: MVC-V
觉得只用insertAdjacentElement比较复杂,就又写了一个
var i=1;
var j=1;
var m=0;
function add(name,postion)
{
if(name=="file"){
m=i;
i++;
}else{
m=j;
j++;
}
var oInputdiv=document.createElement("div");
oInputdiv.id='div'+name+m;
var oInputfile=document.createElement('
var oInputdel=document.createElement('
var oInputtext0=document.createTextNode("上报国办:");
var oInputtext1=document.createTextNode("转发专家:");
var oInputtext2=document.createTextNode("通报领导:");
//id用于oInput1删除,name用于controller识别,value用于controller读取
var oInputcheckbox0=document.createElement('
var oInputcheckbox1=document.createElement('
var oInputcheckbox2=document.createElement('
document.getElementById(postion).insertAdjacentElement('AfterEnd',oInputdiv);
document.getElementById('div'+name+m).appendChild(oInputfile);
document.getElementById('div'+name+m).appendChild(oInputtext0);
document.getElementById('div'+name+m).appendChild(oInputcheckbox0);
document.getElementById('div'+name+m).appendChild(oInputtext1);
document.getElementById('div'+name+m).appendChild(oInputcheckbox1);
document.getElementById('div'+name+m).appendChild(oInputtext2);
document.getElementById('div'+name+m).appendChild(oInputcheckbox2);
document.getElementById('div'+name+m).appendChild(oInputdel);
}
function del(id)
{
id.removeNode(true);
}
显然用节点appendChild更方便。
标签: MVC-V
做了一个insertAdjacentElement的方法,以便controller能够读得到file中的路径。
var i=1;
var j=1;
var m=0;
function add(name,postion)
{
if(name=="file"){
m=i;
i++;
}else{
m=j;
j++;
}
if(name=="file"){
m=i;
i++;
}else{
m=j;
j++;
}
var oInput=document.createElement('《input type="file" name="'+name+m+'" id="file" size="10">');
var oInput1=document.createElement('《input type="button" name="del'+i+'" onclick="del('+name+m+'),del(this),del('+name+'shangbao'+m+'),del('+name+'zhuanfa'+m+'),del('+name+'tongbao'+m+'),del('+name+'div_shangbao'+m+'),del('+name+'div_zhuanfa'+m+'),del('+name+'div_tongbao'+m+')" value="删除" class="css_button">');
//id用于oInput1删除,name用于controller识别,value用于controller读取
var oInputcheckbox=document.createElement('《input type=" checkbox" id="'+name+'shangbao'+m+'" name="'+name+'_Shangbao" value="'+name+m+'">');
var oInputcheckbox1=document.createElement('《input type="checkbox" id="'+name+'zhuanfa'+m+'" name="'+name+'_Zhuanfa" value="'+name+m+'">');
var oInputcheckbox2=document.createElement('《input type="checkbox" id="'+name+'tongbao'+m+'" name="'+name+'_Tongbao" value="'+name+m+'">');
var oInputdiv=document.createElement("div");
oInputdiv.id=name+'div_shangbao'+m;
oInputdiv.innerHTML="上报国办";
var oInputdiv1=document.createElement("div");
oInputdiv1.id=name+'div_zhuanfa'+m;
oInputdiv1.innerHTML="转发专家";
var oInputdiv2=document.createElement("div");
oInputdiv2.id=name+'div_tongbao'+m;
oInputdiv2.innerHTML="通报领导";
document.getElementById(postion).insertAdjacentElement('AfterEnd',oInputcheckbox2);
document.getElementById(postion).insertAdjacentElement('AfterEnd',oInputdiv2);
document.getElementById(postion).insertAdjacentElement('AfterEnd',oInputcheckbox1);
document.getElementById(postion).insertAdjacentElement('AfterEnd',oInputdiv1);
document.getElementById(postion).insertAdjacentElement('AfterEnd',oInputcheckbox);
document.getElementById(postion).insertAdjacentElement('AfterEnd',oInputdiv);
document.getElementById(postion).insertAdjacentElement('AfterEnd',oInput1);
document.getElementById(postion).insertAdjacentElement('AfterEnd',oInput);
}
标签: MVC-V
Windows XP里有我们常用到的工具如磁盘清理程序等等,那么它们到底叫什么名字,又躲在硬盘
的哪个地方呢?笔者这就把它们挖掘出来,以后大家再用这些工具的时候就不用一步一步地去找地方了,直
接点击“开始→运行”,再输入程序名就OK了。
1.磁盘清理大师——cleanmgr
用来自动地释放出一部分硬盘空间,并会智能化地进行删除操作。
2.剪贴板查看器——clipbrd
Windows XP中的剪贴板查看器程序较原先Windows 9X/Me的旧版本多出了共享功能,
通过设置权限允许其他网上用户将该剪贴板装入使用。
3.控制面板启动器——control
快速启动控制面板。
4.Windows XP的诊断医生——drwtsn32
Drwtsn32是一个程序错误调试器。运行后会获得并记录系统中程序错误的信息,并创建一个文本文
件drwtsn32.log ,提供错误原因的详细说明,并给出解决问题的建议性操作。
5.DVD播放器——dvdplay
Windows XP提供的一个“免费”的DVD播放器,也就是Windows Media Play
er。
6.自解压文件制作工具——lexpress
利用Iexpress可制作两种自解压文件,一种是标准自解压文件,另一种是安装程序式自解压文件。
7.备份工具——ntbackup
Windows XP中内置的备份工具。
8.IP地址侦测器——nslookup
通过这个IP侦测工具ping就可以轻而易举地得到它们的真正IP地址。
9.注册表编辑器增强版——regedt32
用来修改注册表设置的高级工具。
10.Windows升级程序——wupdmgr
联上网后,可以通过此程序进行Windows的自动升级。
11.共享文件夹设置工具——shrpubw
它的作用与右击一文件夹,选择“共享”基本上等价。
12.Microsoft签字验证工具——sigverif
所谓“签署的文件”,就是被授予Microsoft数字签署的文件。该签署表明,该文件是原始文件的
一模一样的副本。通过microsoft签字验证工具,我们可在计算机上查找已签署和未签署的文件,
也可查看签署文件的身份验证,以确认该文件还没有被篡改。
13.音量控制程序——sndvol32
平时双击任务栏上的小喇叭就会出现的音量控制程序。
14.任务管理器——taskmgr
使用任务管理器可快速查看正在运行的程序的状态,或终止已停止响应的程序,也可以查看CPU和内存使
用的情况。
15.远程连接程序——telnet
Windows自带的纯中文界面的远程连接程序。
16.系统文件检查器——sfc
使用Windows难免会出现系统文件损坏或丢失的毛病,而如果为了几个小小的文件就去重装系统,又
显得稍微麻烦了一些。通过系统文件检查器Sfc.exe,一切都会变得非常简单。
以上16个程序都在系统盘的WINDOWS\SYSTEM32文件夹下。
==================================================================================
17.文件转移向导——migwizWINDOWS\SYSTEM32\usmt文件夹下
通过它,我们就可以实现系统状态的备份与恢复。
18.系统配置程序——msconfigwindows\pchealth\helpctr\binarie
s文件夹下
和Windows中的系统配置程序一样,通过这个程序,我们可对系统的一般、system.ini、
win.ini、boot.ini、服务和启动项目进行修改。
标签: Windows
function preceping(){
var url = "<%=request.getContextPath()%>/quxian/preCeping.shtml?tp=changyetouzi";
var form = Form.serialize('frmId');
var myAjax = new Ajax.Updater('zongfen',url, {method: 'get', parameters: form});
}
注意prototype的版本
标签: MVC-C
ClassPathResource s=new ClassPathResource("beans.xml")
XmlBeanFactory x=new XmlBeanFactory(s);
//根路径指定->class文件夹开始找beans.xml
ClassPathXmlApplicationContext cx=new ClassPathXmlApplicationContext("beans.xml");
//根路径指定->class文件夹开始找beans.xml
ApplicationContext c=new FileSystemXmlApplicationContext("beans.xml");
//根路径指定->项目根路径 开始找beans.xml
标签: MVC-C
public interface AfterReturningAdvice extends Advice {
void afterReturning(Object returnValue, Method m,Object[] args, Object target) throws Throwable;
}
AfterReturningAdvice直接继承自Advice介面,afterReturning()当中传入的引数有目标方法的返回值、方法实例、引数、与目标物件,afterReturning()方法传回void,若您要中止接下来的应用程式流程,丢出例外是唯一的方式。
标签: MVC-C
1 SQL语句中怎么去掉字段内容右边的空格? SQL SERVER中的是RTRIM( ),ORACLE中呢?
-------------
用法差不多:
SQL> select ltrim(' dfs'),rtrim('dfsdf '),trim(' df df '),ltrim('1112121','1') from dual;
LTRIM('DFS') RTRIM('DFSDF') TRIM('DFDF') LTRIM('1112121','1')
------------ -------------- ------------ --------------------
dfs dfsdf df df 2121
2 SQL SERVER中截取字段内容内容,例如SUBSTRING( fieldname, 1, 2),ORACLE中怎么做?
-------------
用法一样,函数名是substr( fieldname, 1, 2)
3 SQL SERVER中比较日期 select * from table where fieldname>'2005-01-01' ,ORACLE中这样写不行,该怎么写呢?
fieldname是date类型的话,select * from table where fieldname> date '2005-01-01'或者
select * from table where fieldname>to_date('2005-01-01','yyyy-mm-dd')
declare @a varchar(8000)
set @a='aaaa bbb'
select left(@a,charindex(' ',@a)-1)
---测试----
aaaa
declare
i integer:=1;
j integer:=1;
k integer:=1;
cursor c1 is
select t.id,replace(t.name,' ')as realname from bjpuserinfo t where t.name like '% %' and t.accounttype='qiye';
begin
for rec in c1 loop
update bjpuserinfo set name=rec.realname where id=rec.id;
update awardarchive set qiyename=rec.realname where qiyeid=rec.id;
update qiyeinfo set unitname=rec.realname where id=rec.id;
end loop;
end;
标签: MVC-V
下面是正则表达式的一些示例:
| 表达式 | 匹配 |
|---|---|
| /^\s*$/ | 匹配空行。 |
| /\d{2}-\d{5}/ | 验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。 |
| /<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/ | 匹配 HTML 标记。 |
下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为:
| 字符 | 说明 |
|---|---|
| \ | 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,“n”匹配字符“n”。“\n”匹配换行符。序列“\\”匹配“\”,“\(”匹配“(”。 |
| ^ | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与“\n”或“\r”之后的位置匹配。 |
| $ | 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与“\n”或“\r”之前的位置匹配。 |
| * | 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配“z”和“zoo”。* 等效于 {0,}。 |
| + | 一次或多次匹配前面的字符或子表达式。例如,“zo+”与“zo”和“zoo”匹配,但与“z”不匹配。+ 等效于 {1,}。 |
| ? | 零次或一次匹配前面的字符或子表达式。例如,“do(es)?”匹配“do”或“does”中的“do”。? 等效于 {0,1}。 |
| {n} | n 是非负整数。正好匹配 n 次。例如,“o{2}”与“Bob”中的“o”不匹配,但与“food”中的两个“o”匹配。 |
| {n,} | n 是非负整数。至少匹配 n 次。例如,“o{2,}”不匹配“Bob”中的“o”,而匹配“foooood”中的所有 o。'o{1,}' 等效于 'o+'。'o{0,}' 等效于 'o*'。 |
| {n,m} | m 和 n 是非负整数,其中 n <= m。至少匹配 n 次,至多匹配 m 次。例如,“o{1,3}”匹配“fooooood”中的头三个 o。'o{0,1}' 等效于 'o?'。注意:您不能将空格插入逗号和数字之间。 |
| ? | 当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。“非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。例如,在字符串“oooo”中,“o+?”只匹配单个“o”,而“o+”匹配所有“o”。 |
| . | 匹配除“\n”之外的任何单个字符。若要匹配包括“\n”在内的任意字符,请使用诸如“[\s\S]”之类的模式。 |
| (pattern) | 匹配 pattern 并捕获该匹配的子表达式。可以使用 $0...$9 属性从结果“匹配”集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用“\(”或者“\)”。 |
| (?:pattern) | 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用“或”字符 (|) 组合模式部件的情况很有用。例如,与“industry|industries”相比,“industr(?:y| ies)”是一个更加经济的表达式。 |
| (?=pattern) | 执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,“Windows (?=95| 98| NT| 2000)”与“Windows 2000”中的“Windows”匹配,但不与“Windows 3.1”中的“Windows”匹配。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。 |
| (?!pattern) | 执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,“Windows (?!95| 98| NT| 2000)”与“Windows 3.1”中的“Windows”匹配,但不与“Windows 2000”中的“Windows”匹配。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。 |
| x| y | 与 x 或 y 匹配。例如,“z| food”与“z”或“food”匹配。“(z| f)ood”与“zood”或“food”匹配。 |
| [xyz] | 字符集。匹配包含的任一字符。例如,“[abc]”匹配“plain”中的“a”。 |
| [^xyz] | 反向字符集。匹配未包含的任何字符。例如,“[^abc]”匹配“plain”中的“p”。 |
| [a-z] | 字符范围。匹配指定范围内的任何字符。例如,“[a-z]”匹配“a”到“z”范围内的任何小写字母。 |
| [^a-z] | 反向范围字符。匹配不在指定的范围内的任何字符。例如,“[^a-z]”匹配任何不在“a”到“z”范围内的任何字符。 |
| \b | 匹配一个字边界,即字与空格间的位置。例如,“er\b”匹配“never”中的“er”,但不匹配“verb”中的“er”。 |
| \B | 非字边界匹配。“er\B”匹配“verb”中的“er”,但不匹配“never”中的“er”。 |
| \cx | 匹配由 x 指示的控制字符。例如,\cM 匹配一个 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样,则假定 c 就是“c”字符本身。 |
| \d | 数字字符匹配。等效于 [0-9]。 |
| \D | 非数字字符匹配。等效于 [^0-9]。 |
| \f | 换页符匹配。等效于 \x0c 和 \cL。 |
| \n | 换行符匹配。等效于 \x0a 和 \cJ。 |
| \r | 匹配一个回车符。等效于 \x0d 和 \cM。 |
| \s | 匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。 |
| \S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
| \t | 制表符匹配。与 \x09 和 \cI 等效。 |
| \v | 垂直制表符匹配。与 \x0b 和 \cK 等效。 |
| \w | 匹配任何字类字符,包括下划线。与“[A-Za-z0-9_]”等效。 |
| \W | 任何非字字符匹配。与“[^A-Za-z0-9_]”等效。 |
| \xn | 匹配 n,此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如,“\x41”匹配“A”。“\x041”与“\x04”&“1”等效。允许在正则表达式中使用 ASCII 代码。 |
| \num | 匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,“(.)\1”匹配两个连续的相同字符。 |
| \n | 标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。 |
| \nm | 标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获,那么 n 是反向引用,后面跟 m。如果前面的条件均不存在,那么当 n 和 m 是八进制数 (0-7) 时,\nm 匹配八进制转义码 nm。 |
| \nml | 当 n 是八进制数 (0-3),m 和 l 是八进制数 (0-7) 时,匹配八进制转义码 nml。 |
| \un | 匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (©)。 |
标签: MVC-V
/**//*
** ==================================================================================================
** 类名:CLASS_MSN_MESSAGE
** 功能:提供类似MSN消息框
** 示例:
---------------------------------------------------------------------------------------------------
var MSG = new CLASS_MSN_MESSAGE("aa",200,120,"短消息提示:","您有1封消息","今天请我吃饭哈");
MSG.show();
---------------------------------------------------------------------------------------------------
** 作者:ttyp
** 邮件:ttyp@21cn.com
** 日期:2005-3-18
** ==================================================================================================
**/
/**//*
* 消息构造
*/
function CLASS_MSN_MESSAGE(id,width,height,caption,title,message,target,action){
this.id = id;
this.title = title;
this.caption= caption;
this.message= message;
this.target = target;
this.action = action;
this.width = width?width:200;
this.height = height?height:120;
this.timeout= 150;
this.speed = 20;
this.step = 1;
this.right = screen.width -1;
this.bottom = screen.height;
this.left = this.right - this.width;
this.top = this.bottom - this.height;
this.timer = 0;
this.pause = false;
this.close = false;
this.autoHide = true;
}
/**//*
* 隐藏消息方法
*/
CLASS_MSN_MESSAGE.prototype.hide = function(){
if(this.onunload()){
var offset = this.height>this.bottom-this.top?this.height:this.bottom-this.top;
var me = this;
if(this.timer>0){
window.clearInterval(me.timer);
}
var fun = function(){
if(me.pause==false||me.close){
var x = me.left;
var y = 0;
var width = me.width;
var height = 0;
if(me.offset>0){
height = me.offset;
}
y = me.bottom - height;
if(y>=me.bottom){
window.clearInterval(me.timer);
me.Pop.hide();
} else {
me.offset = me.offset - me.step;
}
me.Pop.show(x,y,width,height);
}
}
this.timer = window.setInterval(fun,this.speed)
}
}
/**//*
* 消息卸载事件,可以重写
*/
CLASS_MSN_MESSAGE.prototype.onunload = function() {
return true;
}
/**//*
* 消息命令事件,要实现自己的连接,请重写它
*
*/
CLASS_MSN_MESSAGE.prototype.oncommand = function(){
//this.close = true;
this.hide();
window.open("http://www.baidu.com");
}
/**//*
* 消息显示方法
*/
CLASS_MSN_MESSAGE.prototype.show = function(){
var oPopup = window.createPopup(); //IE5.5+
this.Pop = oPopup;
var w = this.width;
var h = this.height;
var str = "
str += "
| " | " + this.caption + " | "" str += "× | "
| " str += "" str += " | " ||
str += "
oPopup.document.body.innerHTML = str;
this.offset = 0;
var me = this;
oPopup.document.body.onmouseover = function(){me.pause=true;}
oPopup.document.body.onmouseout = function(){me.pause=false;}
var fun = function(){
var x = me.left;
var y = 0;
var width = me.width;
var height = me.height;
if(me.offset>me.height){
height = me.height;
} else {
height = me.offset;
}
y = me.bottom - me.offset;
if(y<=me.top){
me.timeout--;
if(me.timeout==0){
window.clearInterval(me.timer);
if(me.autoHide){
me.hide();
}
}
} else {
me.offset = me.offset + me.step;
}
me.Pop.show(x,y,width,height);
}
this.timer = window.setInterval(fun,this.speed)
var btClose = oPopup.document.getElementById("btSysClose");
btClose.onclick = function(){
me.close = true;
me.hide();
}
var btCommand = oPopup.document.getElementById("btCommand");
btCommand.onclick = function(){
me.oncommand();
}
var ommand = oPopup.document.getElementById("ommand");
ommand.onclick = function(){
//this.close = true;
me.hide();
window.open(ommand.href);
}
}
/**//*
** 设置速度方法
**/
CLASS_MSN_MESSAGE.prototype.speed = function(s){
var t = 20;
try {
t = praseInt(s);
} catch(e){}
this.speed = t;
}
/**//*
** 设置步长方法
**/
CLASS_MSN_MESSAGE.prototype.step = function(s){
var t = 1;
try {
t = praseInt(s);
} catch(e){}
this.step = t;
}
CLASS_MSN_MESSAGE.prototype.rect = function(left,right,top,bottom){
try {
this.left = left !=null?left:this.right-this.width;
this.right = right !=null?right:this.left +this.width;
this.bottom = bottom!=null?(bottom>screen.height?screen.height:bottom):screen.height;
this.top = top !=null?top:this.bottom - this.height;
} catch(e){}
}
var MSG1 = new CLASS_MSN_MESSAGE("aa",200,120,"短消息提示:","您有1封消息","今天请我吃饭哈");
MSG1.rect(null,null,null,screen.height-50);
//MSG1.speed = 10;
//MSG1.step = 5;
//alert(MSG1.top);
MSG1.show();
//同时两个有闪烁,只能用层代替了,不过层不跨框架
//var MSG2 = new CLASS_MSN_MESSAGE("aa",200,120,"短消息提示:","您有2封消息","好的啊");
//MSG2.rect(100,null,null,screen.height);
//MSG2.show();
标签: MVC-V
今天要在javascript中将一个字符串里的所有的'!@#$',替换成',',结果发现只能替换掉一个,后来查了一下才回忆起来javascript中的replace只能替换掉第一个匹配项。
网上提供的方法主要有两种,一种为通过indexof查看是否还存在匹配项,然后写循环替换,这样也很好。
更好的方案是通过写正则表达式来解决这个问题,replace(/要匹配的字符串/g,要替换的字符串)
网上的帖子大都是互相转载的,居的例子都是一个replace(/\-/g,'!'),但是如果要匹配的字符串长度大于1,究竟怎样写呢。
其实很简单,如果需要匹配的字符串只是字母一类的,例如abcde,那就可以直接replace(/abcde/g,'!')
如果含有特殊字符,需要在特殊字符前面转义(在字符前面加上\),当然每个字符都转义也可以的。例如!@#$,就可以这样写replace(/\!\@\#\$/g,',')
标签: MVC-V
http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#getstarted
标签: MVC-V
//基本循环
declare
my Integer:=100;
begin
for my in 1..4 loop
dbms_output.put_line(my);
end loop;
dbms_output.put_line(my);
end;
//典型游标for 循环
set serveroutput on;
declare
cursor mycur(vartype number)is
select emp_no,emp_zc from cus_emp_basic
where com_no=vartype;
begin
for person in mycur(000627) loop
dbms_output.put_line('雇员编号:'||person.emp_no||',地址:'||person.emp_zc);
end loop;
end;
FOR r_emp IN (SELECT ename,salary
FROM emp
WHERE deptno=p_dept
ORDER BY ename) LOOP
declare
cursor c1 is
select name,id,password from bjpuserinfo where accounttype='qiye';
begin
for rec in c1 loop
dbms_output.put_line('单位名称:'||rec.name||' ,密码:'||rec.password);
FOR tmp in (select name,fullname,password from bjpuserinfo where accounttype='geren' and parentid=rec.id) loop
dbms_output.put_line('用户名:'||tmp.name||' ,姓名:'||tmp.fullname||' ,密码:'||tmp.password);
end loop;
dbms_output.put_line('==================================');
end loop;
end;
declare
i integer:=1;
j integer:=1;
k integer:=1;
cursor c1 is
select u.id,u.name from bjpuserinfo b,upunit u where u.id=b.upunitid group by u.name,u.id;
begin
for rec in c1 loop
dbms_output.put_line('');
dbms_output.put_line('受理机构'||k||':'||rec.name);k:=k+1;
dbms_output.put_line('');
for tmp in (select name,id,password from bjpuserinfo where accounttype='qiye' and upunitid=rec.id) loop
dbms_output.put_line(' 单位'||i||':'||tmp.name||' ,密码:'||tmp.password);i:=i+1;
for tmp1 in (select name,fullname,password from bjpuserinfo where accounttype='geren' and parentid=tmp.id) loop
dbms_output.put_line(' 用户'||j||':'||tmp1.name||' ,姓名:'||tmp1.fullname||' ,密码:'||tmp1.password);
j:=j+1;
end loop;
j:=1;
end loop;
i:=1;
dbms_output.put_line('====================================================================');
end loop;
end;
标签: oracle
Create procedure procedue_name
[@parameter data_type][output]
[with]{recompile|encryption}
as
sql_statement
解释 output:表示此参数是可传回的.
with {recompile|encryption}
recompile:表示每次执行此存储过程时都重新编译一次
encryption:所创建的存储过程的内容会被加密
表book的内容如下
编号 书名 价格
001 C语言入门 $30
002 PowerBuilder报表开发 $52
实例1:查询表Book的内容
create proc query_book
as
select * from book
go
exec query_book
实例2:加入一笔记录到表book,并查询此表中所有书籍的总金额
Create proc insert_book
@param1 char(10),@param2 varchar(20),@param3 money,@param4 money output
with encryption ---------加密
as
insert book(编号,书名,价格) Values(@param1,@param2,@param3)
select @param4=sum(价格) from book
go
执行例子:
declare @total_price money
exec insert_book '003','Delphi 开发指南',$100,@total_price
print '总金额为'+convert(varchar,@total_price)
go
实例3:设有两个表为Product,Order,其表内容如下:
Product
产品编号 产品名称 客户订数
001 钢笔 30
002 毛笔 50
003 铅笔 100
Order
产品编号 客户名 客户订金
001 南山区 $30
002 罗湖区 $50
003 宝安区 $4
请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,
总金额=订金*订数,临时表放在存储过程中
代码如下:
Create proc temp_sale
as
select a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金 as总金额
into #temptable from Product a inner join Order b on a.产品编号=b.产品编号
if @@error=0
print 'Good'
else
print 'Fail'
go
标签: oracle
| 在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句。但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢?游标为我们提供了一种极为优秀的解决方案。
1.游标和游标的优点 我们知道关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where 子句来限制只有一条记录被选中。因此我们必须借助于游标来进行面向单条记录的数据处理。由此可见,游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。
2. 游标种类
--------------------------------------------------------------------------- 这里要做一个声明,我们所说的游标通常是指显式游标,因此从现在起没有特别指明的情况,我们所说的游标都是指显式游标。要在程序中使用游标,必须首先声明游标。
在PL/SQL中游标名是一个未声明变量,不能给游标名赋值或用于表达式中。 例:
在游标定义中SELECT语句中不一定非要表可以是视图,也可以从多个表或视图中选择的列,甚至可以使用*来选择所有的列 。 打开游标 使用游标中的值之前应该首先打开游标,打开游标初始化查询处理。打开游标的语法是:
cursor_name是在声明部分定义的游标名。 例:
关闭游标 语法:
例:
从游标提取数据 从游标得到一行数据使用FETCH命令。每一次提取数据后,游标都指向结果集的下一行。语法如下:
对于SELECT定义的游标的每一列,FETCH变量列表都应该有一个变量与之相对应,变量的类型也要相同。 例:
这段代码无疑是非常麻烦的,如果有多行返回结果,可以使用循环并用游标属性为结束循环的条件,以这种方式提取数据,程序的可读性和简洁性都大为提高,下面我们使用循环重新写上面的程序:
记录变量 定义一个记录变量使用TYPE命令和%ROWTYPE,关于%ROWsTYPE的更多信息请参阅相关资料。 记录变量用于从游标中提取数据行,当游标选择很多列的时候,那么使用记录比为每列声明一个变量要方便得多。 当在表上使用%ROWTYPE并将从游标中取出的值放入记录中时,如果要选择表中所有列,那么在SELECT子句中使用*比将所有列名列出来要安全得多。 例:
%ROWTYPE也可以用游标名来定义,这样的话就必须要首先声明游标:
带参数的游标 与存储过程和函数相似,可以将参数传递给游标并在查询中使用。这对于处理在某种条件下打开游标的情况非常有用。它的语法如下:
定义参数的语法如下:
与存储过程不同的是,游标只能接受传递的值,而不能返回值。参数只定义数据类型,没有大小。 另外可以给参数设定一个缺省值,当没有参数值传递给游标时,就使用缺省值。游标中定义的参数只是一个占位符,在别处引用该参数不一定可靠。 在打开游标时给参数赋值,语法如下:
参数值可以是文字或变量。 例:
游标FOR循环 在大多数时候我们在设计程序的时候都遵循下面的步骤: 1、打开游标 2、开始循环 3、从游标中取值 4、检查那一行被返回 5、处理 6、关闭循环 7、关闭游标 可以简单的把这一类代码称 伪暧糜谘 贰5 褂幸恢盅 酚胝庵掷嘈筒幌嗤 饩褪荈OR循环,用于FOR循环的游标按照正常的声明方式声明,它的优点在于不需要显式的打开、关闭、取数据,测试数据的存在、定义存放数据的变量等等。游标FOR 循环的语法如下:
下面我们用for循环重写上面的例子:
在游标FOR循环中使用查询 在游标FOR循环中可以定义查询,由于没有显式声明所以游标没有名字,记录名通过游标查询来定义。
游标中的子查询 语法如下:
可以看出与SQL中的子查询没有什么区别。 游标中的更新和删除 在PL/SQL中依然可以使用UPDATE和DELETE语句更新或删除数据行。显式游标只有在需要获得多行数据的情况下使用。PL/SQL提供了仅仅使用游标就可以执行删除或更新记录的方法。 UPDATE或DELETE语句中的WHERE CURRENT OF子串专门处理要执行UPDATE或DELETE操作的表中取出的最近的数据。要使用这个方法,在声明游标时必须使用FOR UPDATE子串,当对话使用FOR UPDATE子串打开一个游标时,所有返回集中的数据行都将处于行级(ROW-LEVEL)独占式锁定,其他对象只能查询这些数据行,不能进行UPDATE、DELETE或SELECT...FOR UPDATE操作。 语法:
在多表查询中,使用OF子句来锁定特定的表,如果忽略了OF子句,那么所有表中选择的数据行都将被锁定。如果这些数据行已经被其他会话锁定,那么正常情况下ORACLE将等待,直到数据行解锁。 在UPDATE和DELETE中使用WHERE CURRENT OF子串的语法如下:
例:
|
标签: oracle
who命令
该命令主要用于查看当前在线上的用户情况。这个命令非常有用。如果用户想和其他用户建立即时通讯,比如使用talk命令,那么首先要确定的就是该用户确实在线上,不然talk进程就无法建立起来。又如,系统管理员希望监视每个登录的用户此时此刻的所作所为,也要使用who命令。
who命令的常用语法格式如下:
|
所有的选项都是可选的,也就是说可以单独使用who命令。不使用任何选项时,who命令将显示以下三项内容:
login name:登录用户名;
terminal line:使用终端设备;
login time:登录到系统的时间。
如果给出的是两个非选项参数,那么who命令将只显示运行who程序的用户名、登录终端和登录时间。通常这两个参数是“am i”,即该命令格式为:“who am i”。
下面对who命令的常用参数进行说明。
-m 和“who am i”的作用一样,显示运行该程序的用户名。
-q,--count 只显示用户的登录帐号和登录用户的数量,该选项优先级高于其他任何选项。
-s 忽略。主要是用于和其他版本的who命令兼容。
-i,-u,--idle 在登录时间后面显示该用户最后一次对系统进行操作至今的时间,也就是常说的“发呆”时间。其中“.”符号代表该用户在前1秒仍然处于活动状态;“old”则表示该用户空闲已经超过了24小时。
-w,-T--mesg,--message,--writable 和-s选项一样,在登录帐号后面显示一个字符来表示用户的信息状态:
+:允许写信息;
-:不允许写信息;
?:不能找到终端设备。
--help 在标准输出上显示帮助信息。
--version 在标准输出上显示版本信息。
下面介绍who命令的一些基本用法。
如果需要查看在系统上究竟有哪些用户,可以直接使用who命令。
[例17] 查看登录到系统的用户情况
|
标签: linux
《A HREF="PageName.htm" onclick="javascript:location.replace(this.href); event.returnValue=false; "》
标签: MVC-V
1.CSS将从基础开始建设直到全面替代传统web设计方法。W3C组织创建的CSS技术将替代HTML的表格、font标签、frames以及其它用于表现的HTML元素。
2.提高页面浏览速度。使用CSS方法,比传统的web设计方法至少节约50%以上的文件尺寸。
3.缩短改版时间。只要简单的修改几个CSS文件就可以重新设计一个有成百上千页面的站点。
4.强大的字体控制和排版能力。CSS控制字体的能力比糟糕的FONT标签好多了,有了CSS,我们不再需要用FONT标签或者透明的1 px GIF图片来控制标题,改变字体颜色,字体样式等等。
5.CSS非常容易编写。你可以象写html代码一样轻松地编写CSS。
6.提高易用性。使用CSS可以结构化HTML,例如:
标签只用来控制段落,heading标签只用来控制标题,table标签只用来表现格式化的数据等等。你可以增加更多的用户而不需要建立独立的版本。
7.可以一次设计,随处发布。你的设计不仅仅用于web浏览器,也可以发布在其他设备上,比如PowerPoint。
8.更好的控制页面布局。不用多说。
9.表现和内容相分离。将设计部分剥离出来放在一个独立样式文件中,你可以减少未来网页无效的可能。
10.更方便搜索引擎的搜索。用只包含结构化内容的HTML代替嵌套的标签,搜索引擎将更有效地搜索到你的内容,并可能给你一个较高的评价(ranking)。
作者:克里斯多佛 主页 http://www.christopherschmitt.com/
标签: MVC-V
// 特殊字符转为Html
public static String toHtml(String s){
if(s == null){
s = "";
return s;
}
s = Replace(s.trim(),"&","&");
s= Replace(s.trim(),"<","<");
s = Replace(s.trim(),">",">");
s = Replace(s.trim(),"\t"," ");
s = Replace(s.trim(),"\r\n","\n");
s = Replace(s.trim(),"\n","
");
s = Replace(s.trim()," "," ");
s = Replace(s.trim(),"'","'");
s = Replace(s.trim(),"\\","\");
return s;
}
/**
* ubb
*/
public static String toUbbHtml(String s){
if(s == null){
s = "";
return s;
}
s = Replace(s,"\n","
");
s = Replace(s," "," ");
s = Replace(s,"'","'");
s = Replace(s,"\\","\");
return s;
}
//逆
public static String unHtml(String s){
s = Replace(s,"
","\n");
s = Replace(s," "," ");
return s;
}
标签: MVC-C
public static String Replace(String source,String oldString,String newString){
StringBuffer output = new StringBuffer();
int lengthOfsource = source.length();//源字符串长度
int lengthOfold = oldString.length();//老字符串长度
int posStart = 0;//开始搜索位置
int pos;//搜索到的老字符串的位置
//source.indexOf(oldString,posStart)检索某子串在字符串postStart以后第一次出现的位置,如果未找到就返回一个-1。
while((pos = source.indexOf(oldString,posStart)) >= 0){//得到字符串的位置(eg:如果有
就执行,没有就跳出,不要处理。)
//将以posStart起始以pos-1结束之间的内容拷贝到另一个字符串中。因为posStar从0开始的。
output.append(source.substring(posStart,pos));//append方法将文本添加到当前StringBuffer对象内容的结尾。
output.append(newString);//替换成新字符串
posStart = pos + lengthOfold;//位置也变为找到了之后的位置,pos为得到第一次出现字符的位置,lengthold为字符的长度
}
if(posStart < lengthOfsource){
//source.substring(posStart)以lengthOfsource开始的字符串拷贝到列一个字符串中
output.append(source.substring(posStart));
}
//这个方法将其内容转换成一个可以被用于输出的字符串对象。它允许操作对应的文本用于输出或数据存储。
return output.toString();
}
标签: MVC-C
返回 String 对象内第一次出现子字符串的字符位置。
strObj.indexOf(subString[, startIndex])
参数
strObj
必选项。String 对象或文字。
subString
必选项。要在 String 对象中查找的子字符串。
starIndex
可选项。该整数值指出在 String 对象内开始查找的索引。如果省略,则从字符串的开始处查找。
说明
indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置。如果没有找到子字符串,则返回 -1。
如果 startindex 是负数,则 startindex 被当作零。如果它比最大的字符位置索引还大,则它被当作最大的可能索引。
从左向右执行查找。否则,该方法与 lastIndexOf 相同。
示例
下面的示例说明了 indexOf 方法的用法。
程序代码var str1 = "BABEBIBOBUBABEBIBOBU"
var s = str1.indexOf(str2);
return(s);
}
lastIndexOf 方法:
返回 String 对象中子字符串最后出现的位置。
strObj.lastIndexOf(substring[, startindex])
参数
strObj
必选项。String 对象或文字。
substring
必选项。要在 String 对象内查找的子字符串。
startindex
可选项。该整数值指出在 String 对象内进行查找的开始索引位置。如果省略,则查找从字符串的末尾开始。
说明
lastIndexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置。如果没有找到子字符串,则返回 -1。
如果 startindex 是负数,则 startindex 被当作零。如果它比最大字符位置索引还大,则它被当作最大的可能索引。
从右向左执行查找。否则,该方法和 indexOf 相同。
下面的示例说明了 lastIndexOf 方法的用法:
程序代码{
var str1 = "BABEBIBOBUBABEBIBOBU"
var s = str1.lastIndexOf(str2);
return(s);
}
substring 方法:
返回位于 String 对象中指定位置的子字符串。
程序代码"String Literal".substring(start, end)
参数
start
指明子字符串的起始位置,该索引从 0 开始起算。
end
指明子字符串的结束位置,该索引从 0 开始起算。
说明
substring 方法将返回一个包含从 start 到最后(不包含 end )的子字符串的字符串。
substring 方法使用 start 和 end 两者中的较小值作为子字符串的起始点。例如, strvar.substring(0, 3) 和 strvar.substring(3, 0) 将返回相同的子字符串。
如果 start 或 end 为 NaN 或者负数,那么将其替换为0。
子字符串的长度等于 start 和 end 之差的绝对值。例如,在 strvar.substring(0, 3) 和 strvar.substring(3, 0) 返回的子字符串的的长度是 3。
示例
下面的示例演示了 substring 方法的用法。
程序代码var ss; // 声明变量。
var s = "The rain in Spain falls mainly in the plain..";
ss = s.substring(12, 17); // 取子字符串。
return(ss); // 返回子字符串。
}
标签: MVC-V
一个是标准输出 一个是标准错误输出 在不同的容器,System.out.println() 和System.err.println()会输出 不同的文件中。
System.err.println()不能被重定向
System.out.println() 是标准输出 System.err.println() 是标准错误输出 默认情况下都是将结果输出到控制台,不过可以对其进行重定向从而改变其默认输出的方式。
标签: MVC-C
〈script>
function toBreakWord(intLen){
var obj=document.getElementById("strT");
var strContent=obj.innerHTML;
var strTemp="";
while(strContent.length>intLen){
strTemp+=strContent.substr(0,intLen)+"〈br>";
strContent=strContent.substr(intLen,strContent.length);
}
strTemp+=strContent;
obj.innerHTML=strTemp;
}
〈/script>
〈div id=strT>要控制的字符串。。。。〈/div>
〈script>
if(document.getElementById &&amp;amp; !document.all) toBreakWord(54);//每行54个字符换行
〈/script>
标签: MVC-V
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;
import java.util.Set;
public class Test {
public static void main(String[] args){
ArrayList arr = new Test().getRandom(10);
Iterator it = arr.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
public ArrayList getRandom(int num){
ArrayList randomNum = new ArrayList();
Random random = new Random();
int temp = 0;
for (int i = 0;i < num; i ++){
temp = random.nextInt(num);
int nums = temp + 1;
if (randomNum.indexOf(new Integer(nums)) == -1){
randomNum.add(new Integer(nums));
}else{
i -- ;
}
}
return randomNum;
}
}
标签: MVC-C
- 对于tomcat:
@echo off
set JAVA_HOME=E:\jdk1.6.0
set CATALINA_HOME=E:\tomcat-5.5.20
set path=%CATALINA_HOME%\bin\
catalina run
- 对于weblogic:
echo ╭══╮
echo ╭╯ΘΘ║
echo ╰⊙═⊙╯。oо○
cd D:\bea\user_projects\domains\bjpaward
d:
call D:\bea\user_projects\domains\bjpaward\startWebLogic.cmd
标签: Windows
1.属性类型- CDATA
属性值可以是任何字符(包括数字和中文)
2.属性类型-NMTOKEN / NMTOKENS
NMTOKEN是CDATA 的一个子集,表示属性值必须是英文字母、数字、句号、破折号、下划线或冒号(不能是中文!)。
其他详见:
http://www.cnblogs.com/anan/articles/294009.html
Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类。
Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线,一个是框图(bar),这是两种算法,可以使用Strategy实现。
这里以字符串替代为例, 有一个文件,我们需要读取后,希望替代其中相应的变量,然后输出.关于替代其中变量的方法可能有多种方法,这取决于用户的要求,所以我们要准备几套变量字符替代方案。
首先,我们建立一个抽象类RepTempRule 定义一些公用变量和方法:
| public abstract class RepTempRule{ protected String oldString=""; public void setOldString(String oldString){ this.oldString=oldString; } protected String newString=""; public String getNewString(){ return newString; } public abstract void replace() throws Exception; } |
在RepTempRule中有一个抽象方法abstract需要继承明确,这个replace里其实是替代的具体方法。我们现在有两个字符替代方案,
1.将文本中aaa替代成bbb;
2.将文本中aaa替代成ccc;
对应的类分别是RepTempRuleOne RepTempRuleTwo
| public class RepTempRuleOne extends RepTempRule{ |
| public class RepTempRuleTwo extends RepTempRule{ public void replace() throws Exception{ newString=oldString.replaceFirst("aaa", "ccc") System.out.println("this is replace Two"); } } |
至此我们完成了类图的设计和程序编制.调用如下:
| public class test{ ...... public void testReplace(){ //使用第一套方案进行替换. } ..... } |
实际整个Strategy的核心部分就是抽象类的使用,使用Strategy模式可以在用户需要变化时,修改量很少,而且快速。
Strategy和Factory有一定的类似,Strategy相对简单容易理解:
Strategy适合下列场合:
1.以不同的格式保存文件;
2.以不同的算法压缩文件;
3.以不同的算法截获图象;
4.以不同的格式输出同样数据的图形,比如曲线 或框图bar等。
if(str.indexOf("0")《str.length-1){
var sti=str.substring(str.indexOf("0")+1,str.length);
return parseInt(sti);
}else{
return parseInt(str);
}
标签: MVC-V
var url = "historydetail.shtml";
var pars = "detail="+modeId;
document.getElementById('a'+divId).innerText="loading......";
var myAjax = new Ajax.Updater(('a'+divId),url, {method: 'get', parameters: pars});
标签: MVC-V
- 复制table到剪切板
window.open ('<%=request.getContextPath()%>/common/print.jsp', 'newwindow', 'width=10000,height=10000,top=0, left=0, toolbar=no, menubar=no, scrollbars=yes, resizable=no,location=no, status=no')
- 粘贴
- 打印
document.all.WebBrowser.ExecWB(6,1);
标签: MVC-V
1.1 dojo.widget.LayoutContainer
dojo的布局通过LayoutContainer组件来进行管理,而且,在LayoutContainer容器里面的组件,必须具有layoutAlign属性(这个属性决定了这些组件的位置)!
LayoutContainer组件无法决定其包含的子组件的位置,只有子组件本身才能通过layoutAlign属性来定位自身。
LayoutContainer的重要属性:
l layoutChildPriority:表示在布局容器所包含的组件的时候,其优先顺序如何,有三个取值:none/top-bottom/left-right。
n none – 表示无优先顺序,其布局取决于子组件在HTML出现的先后顺序而决定。
n top-bottom – 上下布局优先,以layoutAlign=”top”和layoutAlign=”bottom”属性的子组件为优先,即先对具有这些属性的子组件进行布局,其次再到具有”left”和”right”属性的子组件布局
n left-right – 左右布局优先,与top-bottom刚好相反。
LayoutContainer当然也可以嵌套使用,但需要注意添加layoutAlign属性(被别的LayoutContainer包含的时候,需要这个属性来定位)
1.2 dojo.widget.SplitContainer
此容器也是用于布局,但功能与LayoutContainer不同的是,SplitContainer所布局分离出来的区块,可以通过显示边界来拖动,以便动态改变每个区域的大小。
重要的属性:
l orientation - 标识分隔的方向,默认取值是:horizontal,表示是水平方向分隔,取任何其它值都表示垂直分隔(但一般明确的标识垂直分隔的值是:vertical)
l sizerWidth – 分隔线的宽度,默认取值是15
l persist – 是否为本次会话保存当前调整的分隔位置。默认值为true。即如果当前会话不结束,那么客户端所调整的位置便一直有效!
l activeSizing – 是否在调整位置的时候,内容跟着动态变化。0表示不会跟着动态变化,直到鼠标释放之后,里面的内容才开始调整;1则反之。
SplitContainer所包含的组件,可以设置下列属性:
l sizeMin – 默认值为10,本组件在SplitContainer容器中可允许的最小宽度,即拖动缩小的时候,不能小于本值。
l sizeShare – 默认值为10,这个值的意思是本组件在容器中所占的宽度,请注意,这是一个相对值。比如,父容器有两个子组件,如果这两个子组件的sizeShare均设置为1(或均设置为其它任意相等的两个数值),意味着每个组件各占据50%的宽度。注意,在SplitContainer容器中的组件,你不能通过style=”width:XXpx”这样的style代码来设置宽度,将不会起作用。
1.3 dojo.widget.TabContainer
TAB标签的容器,在这个容器下面的组件,将会被显示成Tab标签的样子。
重要的属性:
l selectedTab – 指定哪个tab是初始化的时候被选中的tab,用id或widgetId来标识
l labelPosition – TAB标签的位置,可以取值top或bottom,当取值left或right的时候,显示有点怪异!
重要的方法:
l selectTab(tab,_noRefresh) -选择某个TAB
其它说明:
TAB容器一般会包含ContentPane组件,而且需要在子组件中指定label属性。作为TAB显示的label。
TAB容器所包含的子组件,如果它被选中,那么其selected属性为true,否则为false
1.4 dojo.widget.ContentPane
用来承载页面的内容。一般它会被加入到XXXContainer容器中。
下面是部分重要属性介绍:
l href – 远程加载的内容
l preload – 是否提前加载
l refreshOnShow – 在显示的时候是否刷新内容,如果里面有javascript脚本,也会重新执行
l executeScripts – 是否在加载的时候执行其中的javascript脚本
下面是部分重要方法介绍:
l setUrl – 设置远程加载的内容,当调用这个方法后,内容便被即时覆盖了!
onLoad – url被加载的时候调用(好像不太好用)
onUnLoad -
ContentPane继承自HtmlWidget,因此也具有它的一些方法和属性:
templateCssPath/ templatePath等
还有:onShow和onHide方法,这些方法在show或hide之后被调用,你可以通过dojo的event系统,编写自己的方法,来连接到这些方法上,以便提供更多额外的处理。
或者直接将onShow这样的方法添加到标签属性中(在IE中有点问题,刷新的时候也有可能会调用到这个方法!!!!!!)
例子连接:
http://www.topxp.org/?url=html/tech/4028813c0c730092010c7306162e0006.html
标签: MVC-V
jstl错误: According to TLD or attribute directive in tag file, attribute value does not accept any expressions
0 评论 发帖者 M 时间: 4.1.07近日学习spring,照抄tutorial程序,运行时碰见如下提示:According to TLD or attribute directive in tag file, attribute items does not accept any expressions。说白了意思就是tag中不接受任何的表达式。
因为原来程序我在别的机器上也试过是没有问题的,所以觉得非常奇怪。google了一下相关内容,虽然说法比较混乱,但也算是有点帮助,顺着方向仔细比对了一下文件,发现问题所在。就我所知,这个问题的主要原因,在于servlet/jsp版本的混乱。Example程序中用的是web.xml版本是2.3,所以core taglib的URI是http://java.sun.com/jstl/core。而我偷懒用Eclipse webtools生成的web.xml缺省是2.4,那么正确的URL应该是http://java.sun.com/jsp/jstl/core。就是在2.4的web app,core taglib的声明改成<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
就可以了。
标签: MVC-V
| public class Tee { public static void main(String[] args) { try { Object obj = new Float("23.45"); // obj的真实类型是Float Double dobj = (Double) obj; // 你在将真实类型为Float类型的的Object反造型成Double类型的对象,所以会有错。如果Double为Float的父类,则这行代码就会是正确的了 } catch (ClassCastException e) { System.out.println(e); } } } 如果需要转换可以把ojb造型成Float类型,取其doubleValue,然后用这个值新建一个Double对象 Object obj = new Float("23.45"); Double dobj = new Double(((Float) obj).doubleValue()); |
http://www.qqread.com/asp/2006/05/h919112012.html
标签: MVC-V
MySQL数据库的基本操作 [ 转载 ]
一、连接MYSQL
格式: mysql -h主机地址 -u用户名 -p用户密码
1、例1:连接到本机上的MYSQL。
首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -h localhost -u root -p+回车,也可以键入命令mysql -u root -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql>
2、例2:连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:
mysql -h110.110.110.110 -uroot -pabcd123
(注:u与root可以不用加空格,其它也一样)
3、退出MYSQL命令: exit (回车)
二、修改密码
格式:mysqladmin -u用户名 -p旧密码 password 新密码
1、例1:给root加个密码ab12。首先在DOS下进入目录mysqlbin,然后键入以下命令
mysqladmin -uroot -password ab12
注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。
2、例2:再将root的密码改为djg345。
mysqladmin -uroot -pab12 password djg345
三、增加新用户(注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符)
格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"
例1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL,然后键入以下命令:
grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";
但例1增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了,解决办法见例2。
例2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。
grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";
如果你不想test2有密码,可以再打一个命令将密码消掉。
grant select,insert,update,delete on mydb.* to test2@localhost identified by "";
下面来看看MYSQL中有关数据库方面的操作。注意:必须首先登录到MYSQL中,以下操作都是在MYSQL的提示符下进行的,而且每个命令以分号结束。
四、操作技巧
1、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。
五、显示命令
1、显示数据库列表。
show databases;
刚开始时才两个数据库:mysql和test。mysql库很重要它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
2、显示库中的数据表:
use mysql; //打开库,学过FOXBASE的一定不会陌生吧
show tables;
3、显示数据表的结构:
describe 表名;
4、建库:
create database 库名;
5、建表:
use 库名;
create table 表名 (字段设定列表);
6、删库和删表:
drop database 库名;
drop table 表名;
7、将表中记录清空:
delete from 表名;
8、显示表中的记录:
select * from 表名;
六、一个建库和建表以及插入数据的实例
drop database if exists school; //如果存在SCHOOL则删除
create database school; //建立库SCHOOL
use school; //打开库SCHOOL
create table teacher //建立表TEACHER
(
id int(3) auto_increment not null primary key,
name char(10) not null,
address varchar(50) default '南阳',
year date
); //建表结束
//以下为插入字段
insert into teacher values(','xuefeng','南阳理工,'1984-05-27');
insert into teacher values(','huifan','杞县高中','1985-07-23');
注:在建表中:
1.将ID设为长度为3的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主字段primary key。
2.将NAME设为长度为10的字符字段。
3.将ADDRESS设为长度50的字符字段,而且缺省值为'南阳'。
4.将YEAR设为日期字段。
如果你在mysql提示符键入上面的命令也可以,但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql,然后复制到c:\下,并在DOS状态进入目录\mysql\bin,然后键入以下命令:
mysql -u root -p 密码 <> maildb.sql
注释:将数据库mail_db备份到maildb.sql文件,maildb.sql是一个文本文件,文件名任取,打开看看你会有新发现。
九、恢复备份数据库
mysql -u root -p < maildb.sql
标签: MySQL