#
以前在使用 js 日历时,没有使用过 jQuery Datepicker,今天第一次使用发现非常的好用。使用时需要将日历文字显示为中文,打开前边的链接在文章底部就可以看到将 jQuery Datepicker 文字显示为中文的方法,在http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/可以看到各种版本的语言,中文文件内容如下:
jQuery(function($){
$.datepicker.regional['zh-CN'] = {
closeText: '关闭',
prevText: '<上月',
nextText: '下月>',
currentText: '今天',
monthNames: ['一月','二月','三月','四月','五月','六月',
'七月','八月','九月','十月','十一月','十二月'],
monthNamesShort: ['一','二','三','四','五','六',
'七','八','九','十','十一','十二'],
dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
dayNamesMin: ['日','一','二','三','四','五','六'],
weekHeader: '周',
dateFormat: 'yy-mm-dd',
firstDay: 1,
isRTL: false,
showMonthAfterYear: true,
yearSuffix: '年'};
$.datepicker.setDefaults($.datepicker.regional['zh-CN']);
});
使用时引入该文件, jQuery Datepicker 就会显示简体中文,但为了tb网站性能,最好将它整合到一个 js 文件中。
$(document).ready(function() {
$("#sdate,#edate").datepicker();
});
使用时也可以添加其他的选项,如下所示,具体的可以参考 jQuery Datepicker 官方文档。
$(document).ready(function () {
$("#sdate,#edate").datepicker({
numberOfMonths: 2, //显示两个月
minDate: 0 //从当前日期起可选
});
});
本篇简单介绍了下 jQuery UI Datepicker 显示中文的方法,希望能对遇到这个问题又不太熟悉英文的朋友带来一点帮助
addinput.js
//======================
//功能:在表单中input file控件
//参数:parentID---要插入input file控件的父元素ID
// inputID----input file控件的ID,这个一定要和name保持一致的,否则会出问题
// maxNum --- 最大数量 0为不限制
//======================
function createInput(parentID,inputFileID, maxNum){
if (maxNum > 0) {
x=document.getElementsByName(inputFileID);
y=x.length;
if (y >= maxNum) {
alert('最多只允许添加' + maxNum + '个');
return false;
}
}
var parent=$G(parentID);//获取父元素
var div=document.createElement("div");//创建一个div容器tb用于包含input file
var x=parseInt(Math.random()*(80-1))+1;
var divName=inputFileID+x.toString();//随机div容器的名称
div.name=divName;
div.id=divName;
var aElement=document.createElement("input"); //创建input
aElement.name=inputFileID;
aElement.id=inputFileID;
aElement.type="text";//设置类型为file
aElement.className = "dynInputLen";
var delBtn=document.createElement("input");//再创建一个用于删除input file的Button
delBtn.type="button";
delBtn.value=" ";
delBtn.className = "btn_del";
delBtn.onclick=function(){ removeInput(parentID,divName)};//为button设置tbonclick方法
div.appendChild(aElement);//将input file加入div容器
div.appendChild(delBtn);//将删除按钮加入div容器
parent.appendChild(div);//将div容器加入父元素
}
//============================
//功能:删除一个包含input file的div 容器
//参数:parentID---input file控件的父元素ID
// DelDivID----个包含input file的div 容器ID
//============================
function removeInput(parentID,DelDivID){
var parent=$G(parentID);
parent.removeChild($G(DelDivID));
}
//通过元素ID获取文档中的元素
function $G(v){return document.getElementById(v);}
在html里引入addinput.js文件.html代码如下:
<div id="div_zc" class="dynInput"> |
|
<input name="zhuancheng[]" type="text" id="zhuancheng" value="" maxlength="50" /> |
|
</div> |
|
<div style="clear:both;margin-top:10px; padding-left:5px;"> |
|
<input type="button" onClick="createInput('div_zc','zhuancheng[]', 3)" name="button" id="button" value="+ 添加(限3条)" class="btn_add"> |
可以设定最多可以添加多少个input,如果设置为0的话,则表示不限制数量。
在网上,看到一个问题 “什么是全局变量?”说实话,这个问题我想了一会儿。觉得有二义性,可能大部分人会说,只要是在堆栈外面定义的 就是全局。 我觉得,全局这个概念,我想反问提问者,是线程全局?进程全局? 好吧,我今天想说说后者的。其实,在写hook的时候,大家都知道,进程需要共享dll中的全局变量。没错,就是它,我觉得被进程共享的 才叫全局。
- #pragma comment (linker, "/SECTION:GlobalValue,RWS")
-
- #include <iostream>
-
- #pragma data_seg("GlobalValue")
- int g_iCnt = 1000;
- #pragma data_seg()
-
- int PlusShow()
- {
- return printf("PlusShow %d",++g_iCnt);
- }
-
- int Show()
- {
- return printf("Show %d",g_iCnt);
- }
-
- int main(int argc)
- {
- if(argc < 2)
- {
- return Show();
- }
-
- PlusShow();
- getchar();
- return 0;
- }
#pragma comment (linker, "/SECTION:GlobalValue,TBRWS")
#include <iostream>
#pragma data_seg("GlobalValue")
int g_iCnt = 1000;
#pragma data_seg()
int PlusShow()
{
return printf("PlusShow %d",++g_iCnt);
}
int Show()
{
return printf("Show %d",g_iCnt);
}
int main(int argc)
{
if(argc < 2)
{
return Show();
}
PlusShow();
getchar();
return 0;
}
其实 不同段放的 不仅仅是变量。可以是函数 或者对象,非常灵活。看你自己怎么用了:)
- @charset "utf-8";
-
- /* =Reset default browser CSS. Based on work by Eric Meyer:http://meyerweb.com/eric/tools/css/reset/index.html
- -------------------------------------------------------------- */
- html, body, div, span, applet, object, iframe,
- h1, h2, h3, h4, h5, h6, p, blockquote, pre,
- a, abbr, acronym, address, big, cite, code,
- del, dfn, em, font, ins, kbd, q, s, samp,
- small, strike, strong, sub, sup, tt, var,
- dl, dt, dd, ol, ul, li,
- fieldset, form, label, legend,
- table, caption, tbody, tfoot, thead, tr, th, td { margin:0; padding:0;}
- :focus { outline:0;}
- ol, ul { list-style:none;}
- h1, h2, h3, h4, h5, h6 { font-size:100%; font-weight:normal;}
- /* tables still need 'cellspacing="0"' in the markup */
- table { border-collapse:separate; border-spacing:0;}
- caption, th, td { font-weight:normal; text-align:left;}
- blockquote:before, blockquote:after,
- q:before, q:after { content:'';}
- blockquote, q { quotes:'' '';}
- a img { border:0;}
- article, aside, details, figcaption, figure,
- footer, header, hgroup, menu, nav, section { display:block;}
-
- /* =Structure
- ----------------------------------------------- */
- body { font:12px/1.5 'Microsoft yahei', Tahoma, Geneva, sans-serif; color:#666; background:#d5d8dd;}
- a { text-decoration:none; color:#4a5566;}
- a:hover { text-decoration:underline; color:#3061b0;}
- .area { width:960px; margin:auto;}
- .pt { padding-top:20px; !important;}
- .mb { margin-bottom:20px !important;}
- .clearfix:after { content:'.'; display:block; height:0; clear:both; visibility:hidden; font-size:0;}
- .clearfix { min-height:1%;}
- .red { color:#c33;}
- .tright { text-align:right;}
- .dis { display:none !importantb;}
-
- /* = Layout
- ----------------------------------------------- */
- /* header */
-
-
- /* body */
-
-
- /* footer */
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import java.util.Date;
-
- public class A {
- public static void main(String[] args) throws ParseException{
- Date d1 = Calendar.getInstance().getTime();
- String s1 = new SimpleDateFormat("yyyy"+"-"+"MM"+"-"+"dd HH" + ":" + "mm" + ":" + "ss").format(d1);
- System.out.println("s1==="+stb1);
-
- String time = "2011-08-13 14:42:43";
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- Date dd= sdf.parse(time.toString());
- String ss = new SimpleDateFormat("yyyy"+"-"+"MM"+"-"+"dd HH" + ":" + "mm" + ":" + "ss").format(dd);
- System.out.println("ss==="+ss);
-
- int i = d1.compareTo(dd);
- if(i<0){
- System.out.println("d1更早");
- }else if(i==0){
- System.out.println("d1一样");
- }else{
- System.out.println("dd更早");
- }
-
- }
- }
1.将jdbc操作改成批处理 addBatch(); //添加批处理
2.使用PreparedStatement
代码:
eg:
- Connection conn = DBUtils.getInstance().getConnetion();
-
- conn.setAutoCommit(false );
-
- PreparedStatement pstmt = null;
-
- try
-
- pstmt = conn.preparedStatement("insert into test1(a,b) vlaues (?,?)");
-
- pstmt.clearBatch();
-
- for(int i = 0; i<100000;i++){
-
- pstmt.setInt(1,i);
-
- pstmt.setString(2,"value"+i);
-
- pstmt.addBatch();
-
- if(i % 10000){
-
- pstmt.executbeBatch();
-
- }
-
-
-
- }
-
-
-
-
-
- pstmt.executeBatch();
-
-
-
- conn.commit();
-
- } catch(Exception e) {
-
- conn.rollback();
-
- } finally {
-
- conn.setAutocommit(true);
-
- }
数组有四种定义的方式
使用构造函数:
var a = new Array();
var b = new Array(8);
var c = new Array("first", "second", "third");
或者数组直接量:
var d = ["first", "second", "third"];
属性
Array只有一个属性,就是length,length表示的是数组所占内存空间的数目,而不仅仅是数组中元素的个数,在刚才定义的数组中,b.length的值为8
<script>
var a = new Array("first", "second", "third")
a[48] = "12"
document.write(a.length)
//显示的结果是49
</script>
数组的length属性是可写的,这是一个非常有意思的属性,我们可以通过这种方法来截取数组
<script>
var a = new Array("first", "second", "third")
delete a[1]
document.write(a.length)
//显示的结果是3,说明即使删除也无法改变数组的长度
var a = new Array("first", "second", "third")
a.length = 1
document.write(a.length)
//显示的结果是1,说明只剩下一个元素了
</script>
方法
这里并没有包括IE和FF并不兼容的一些方法:
toString():把数组转换成一个字符串
toLocaleString():把数组转换成一个字符串
join():把数组转换成一个用符号连接的字符串
shift():将数组头部的一个元素移出
unshift():在数组的头部插入一个元素
pop():从数组尾部删除一个元素
push():把一个元素添加到数组的尾部
concat():给数组添加元素
slice():返回数组的部分
reverse():将数组反向排序
sort():对数组进行排序操作
splice():插入、删除或者替换一个数组元素
toString()方法,toLocaleString()方法的作用类似,FF下的作用是完全相同的,IE的话如果元素是字符串,会在“,”后面加上一个空格,如果元素是数字,会扩展到两位小数,两者都会改变字符串的length属性,所以考虑到兼容性,尽量不要使用toLocaleString()方法。
<script>
var a = new Array(1, 2, 3, [4, 5, [6, 7]])
var b = a.toString() //b为字符串形式的 "1, 2, 3, 4, 5, 6, 7"
var c = new Array(1, 2, 3, [4, 5, [6, 7]])
var d = c.toLocaleString() //d为字符串形式的 "1, 2, 3, 4, 5, 6, 7"
//toString()方法和toLocaleString()方法都可以拆解多维数组
</script>
join()方法将数组中的所有元素转换成字符串,然后连接起来,这刚好和String的split()方法是一个相反的操作。join()默认是使用“,”作为分隔符,当然你也可以在方法中指定分隔符
<script>
var a = new Array("first", "second", "third")
var s = a.join("...")
document.write(s)
//显示的结果是“first...second...third”
</script>
pop()方法可以从数组尾部删除若干个元素,push()方法把一个元素添加到数组的尾部,这两个方法刚好是两个相反的操作。两个都是对原来的数组进行操作,但是要注意push()方法返回的是新的数组的长度,而pop()方法则返回被删去的那个元素。
<script>
var a = new Array(1, 2, 3)
var b = a.push(4,5,[6,7]) //a为[1, 2, 3, 4, 5, [6, 7]] b为6 注意tbpush()方法不会帮你打开一个数组
var c = new Array(1, 2, 3, 4, "first")
var d = c.pop() //c为[1, 2, 3, 4] d为字符串形式的"first"
</script>
shift()方法可以从数组头部删除一个元素,unshift()方法把若干元素添加到数组的头部,这两个方法刚好是两个相反的操作。两个都是对原来的数组进行操作,但是要注意unshift()方法返回的是新的数组的长度,而shift()方法则返回被删去的那个元素。
<script>
var a = new Array(1, 2, 3)
var b = a.unshift(4,5,[6,7]) //a为[4, 5, [6, 7], 1, 2, 3] b为6 注意unshift()方法不会帮你打开一个数组,还有就是被插入数值的顺序
var c = new Array("first", 1, 2, 3, 4)
var d = c.shift() //c为[1, 2, 3, 4] d为字符串形式的"first"
</script>
concat()方法可以返回一个在原有数组上增添了元素的数组,元素用“,”分隔,元素中如果有数组,将被展开并继续添加,但不支持多维数组形式的展开添加
<script>
var a = new Array("first", "second", "third")
s = a.concat("fourth",["fifth", "sixth"],["seventh", ["eighth", "ninth"]])
document.write(s[7])
//显示的结果是“eighth, ninth”,说明“eighth, ninth”是以数组的形式被添加了进去,此是s的值为["first", "second", "third", "fourth", "fifth", "sixth", "seventh", ["eighth", "ninth"]]
</script>
slice()方法返回数组的一个片断,或者说是子数组。slice()的参数表示字数组的始末位置,如果只有一个参数,就表示从该处开始一直取到最后,如果参数出现负数,则表示倒数的某个位置。slice(start,end) //表示数组从从下标为start(包含这个)的地方开始到end(不包含这个)
<script>
var a = new Array(1, 2, 3, 4, 5)
var b = a.slice(3) //b为[4, 5]
var c = a.slice(-3) //c为[3, 4, 5]
var d = a.slice(1,-1) //d为[2, 3, 4]
var e = a.slice(-3,-1) //e为[3, 4]
</script>
reverse()方法将数组反向排序,他并不创建和返回一个新的数组,而是在原有的数组上进行操作
<script>
var a = new Array("first", "second", "third")
a.reverse()
document.write(a)
//显示的结果是“third,second,first”,这时候数组的顺序已经颠倒了
</script>
sort()方法的作用是对数组进行排序,这是一个非常奇特的方法,我不知道当初创作他的人是出于懒惰还是聪明,这是一个让我印象深刻的方法。
sort()方法的参数是一个有两个参数,并且有返回值的函数,如果返回的值大于零,则说明前一个参数比后一个参数大,等于零则相等,小于零说明前一个参数比后一个小,而相对小的那个参数将出现在排序的前列。
sort()方法直接在数组上进行操作,同时也返回值,但是两者似乎是等价的。sort()方法默认是用字母的顺序进行排序
<script>
var a = new Array(33, 4, 111, 543)
a.sort(way)
function way(x, y){
if (x % 2 ==0)
return 1;
if (x % 2 !=0)
return -1;
}
//排序的结果是使奇数在前偶数在后
</script>
splice()方法的作用是插入、删除或者替换一个数组元素,他tb不光会在原有的数组上进行修改,还会返回被处理掉的内容,因此这是一个功能强大,但是不容易使用的方法,splice()方法用前两个参数进行定位,余下的参数表示插入部分。
<script>
var a = new Array(1, 2, 3, 4, 5)
var b = a.splice(2) //a为[1, 2] b为[3, 4, 5]
var c = new Array(1, 2, 3, 4, 5)
var d = c.splice(2,2) //c为[1, 2, 5] d为[3, 4]
var e = new Array(1, 2, 3, 4, 5)
var f = f.splice(-4,2) //e为[1, 4, 5] f为[2, 3]
var g = new Array(1, 2, 3, 4, 5)
var h = g.splice(-2,-2) //第二个参数表示长度,因此负数在此无效
var i = new Array(1, 2, 3, 4, 5)
var j = i.splice(2,2,"first","second","third") //i为[1, 2, "first", "second", "third", 5] j为[3, 4] 后面部分会自动前后移动,以保持数组的连续性
var k = new Array(1, 2, 3, 4, 5)
var l = k.splice(2,2,["first","second"],"third") //k为[1, 2, ["first", "second"], "third", 5] l为[3, 4] splice()方法不会展开数组,只直接写入
</script>
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import org.w3c.dom.Document;
import org.w3c.dom.DOMException;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
/***
* @author xuechong
* 6/11/2010 16:58
* DomXMLString.java
* 概述:纯java方式访问远程WebService接口返回的xml格式的数据保存在本地
*/
public class DomXMLString{
private static String SERVICES_HOST = "www.webxml.com.cn";
//远程WebService接口url
private static String NETDATA_URL = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getRegionProvince";
//访问远程WebService接口返回的xml格式的数据保存在本地的绝对路径
private static String LOCAL_PC_SAVEFILE_URL = "E:dataTest/netDataToLocalFile.xml";
private DomXMLString(){}
public static void main(String[] args) throws Exception{
Document document = getProvinceCode(NETDATA_URL);
helloOK(document, LOCAL_PC_SAVEFILE_URL);
}
/*返回一个Document对象*/
public static Document getProvinceCode(String netXMLDataURL){
Document document = null;
DocumentBuilderFactory documentBF = DocumentBuilderFactory.newInstance();
documentBF.setNamespaceAware(true);
try{
DocumentBuilder documentB = documentBF.newDocumentBuilder();
InputStream inputStream = getSoapInputStream(netXMLDataURL); //具体webService相关
document = documentB.parse(inputStream);
inputStream.close();
}catch(DOMException e){
e.printStackTrace();
return null;
}catch(ParserConfigurationException e){
e.printStackTrace();
return null;
}catch (SAXException e){
e.printStackTrace();
return null;
}catch(IOException e){
e.printStackTrace();
return null;
}
return document;
}
/*返回InputStream对象*/
public static InputStream getSoapInputStream(String url){
InputStream inputStream = null;
try{
URL urlObj = new URL(url);
URLConnection urlConn = urlObj.openConnection();
urlConn.setRequestProperty("Host", SERVICES_HOST); //具体webService相关
urlConn.connect();
inputStream = urlConn.getInputStream();
}catch(MalformedURLException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
return inputStream;
}
/*访问远程(WebService)xml数据后返回的xml格式字符串并生成为tb本地文件*/
public static void helloOK(Document document, String savaFileURL){
TransformerFactory transF = TransformerFactory.newInstance();
try{
Transformer transformer = transF.newTransformer();
DOMSource source = new DOMSource(document);
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "YES");
PrintWriter pw = new PrintWriter(new FileOutputStream(savaFileURL));
StreamResult result = new StreamResult(pw);
transformer.transform(source, result);
System.out.println("生成xml文件成功!");
}catch(TransformerConfigurationException e){
System.out.println(e.getMessage());
}catch(IllegalArgumentException e){
System.out.println(e.getMessage());
}catch(FileNotFoundException e){
System.out.println(e.getMessage());
}catch(TransformerException e){
System.out.println(e.getMessage());
}
}
}
在应用程序开发过程中,使用的最多的数据类型就是字符串 。在Java语言平台中也是如此。为此掌握字符串的处理技巧,无疑是一位数据库管理员必须要掌握的技能。笔者这里就给大家介绍如何利用字符串连接来解决一些实际的问题。
一、 字符串连接概述。
在编写应用程序的时候,我们往往需要将多个字符串连接起来,来完成特定的功能。如现在有两个字符串变量,分别为名字(变量名为name)和年龄(变量名为age)。现在需要在屏幕上输出“我的名字是某某,年龄多少”这个字符串。这个语句该如何写呢?可以写为“我的名字是”+name+“,年龄为”+age。也就是说,在Java语言中,可以通过+号将多个字符串(包括变量)连接成一个字符串。在屏幕上打印出来或者将其赋值给一个新的字符串变量。在进行这个字符串连接的时候,大家需要注意一点。也许有些程序员以前学过其他的开发语言,如SQL语言等等。不同的语言采用的字符串连接字符是不同的。如在SQL中采用的就是||符号。有时候,在开发应用程序的时候,开发人员可能会混淆。如在利用JAVA语言开发应用程序,在代码中需要加入SQL语句从数据库中查询数据。此时就有可能在JAVA代码中和SQL代码中都要用到字符串连接的情况(SQL代码中要将多个字段的内容连接为一个字段)。由于两个代码所采用的连接符号不同,所以可能会搞错。
二、 利用字符串连接解决分行问题。
在JAVA开发平台中,可以利用+号将多个字符串合并为一个字符串。不过在实际工作中,这个合并功能往往还可以帮助系统开发人员解决一些棘手的问题。如根据语法规定,JAVA代码中一句相连的字符串不能够分开在两行中书写。这是什么意思呢?如现在有一个字串比较长,为“我的名字叫萝卜,今年29岁,在宁波工作”。如果将这个字符串写在同一行的话,那么这一行会很长,从而影响代码的阅读。但是,笔者希望其在屏幕上输出或者保存在文件中时,则是在同一行。在这种情况下,该如何处理呢?
确实,这是应用程序开发人员在程序开发过程中经常遇到的一个问题。因为在书写代码时,一个好的程序开发人员应该兼顾到其代码的美观,这有助于程序开发人员阅读代码。毕竟有时候需要多个程序开发人员一同完成某个任务。而不能够只完成某个特定的功能就可以了。此时,为了代码的美观与更好的阅读性,有经验的程序开发人员往往会利用这个+号连接字符来处理这个分行的问题。
由于对于长的字符串,JAVA代码不能够分为两行来写。否则的话,系统就会提示语法错误。遇到这种情况时,为了提高阅读性,我们往往要求程序开发人员把他们分为两行,同时利用加号将他们连接起来。如下所示:
“我的名字叫萝卜,今年29岁,”+
“在宁波工作”
也就是说,应用程序开发人员可以使用+号将两个字符串连接起来,然后在+号处换行,从而将两个字符串连接起来。此时,JAVA编译器会认为这是合法的,允许程序开发人员采用这个技巧来对字符串进行合理的分行。所以说,利用字符串连接可以有效的解决分行问题。
三、 利用字符串连接来实现数据类型的自动转换。
在各种开发语言中,都有各种各样的数据类型。有时候为了满足特定的需要,要对他们进行数据类型的转换。如需要将数字类型的数据转换为字符串类型的数据;再如将某个字符串“2432”转换为数值类型的数据。在JAVA语言的开发平台中,数据类型的转换有两种方式,分别为隐式转换与显示转换。一般情况下,从低级数据类型向高级类型的转换,系统会自动进行转换,而不需要程序员进行任何的手工操作或者指定。这个从低级数据类型向高级数据类型的转换,就叫做隐式转换。在对数据类型进行转换的时候,程序开发人员需要遵守严格的规则,否则的话容易出现错误。如从低精度数据类型向高精度数据类型转换的时候,则永远不会发生溢出,通常情况下都会成功。而如果把高精度数据类型转换为低精度数据类型的话,则就会发生溢出错误,从而导致部分信息丢失,甚至无法正常转换。
不过在JAVA开发平台中,除了以上这两种转换方式外,还有一种数据类型的转换方法。就是如果某个字符串和某个变量一起(这个变量可能是数值型的数据或者是日期型的数据)利用+号连接起来时,系统会自动对这个变量进行转换,会将其转换为字符串数据类型,然后再与原先的字符串连接起来。
也就是说,字符串也可同其他基本数据类型进行连接。如果将字符串同这些数据类型进行连接时(如数值型的数据),会将这些数据直接转换成字符串。如上面那个例子中“我的名字是”+name+“,年龄为”+age这个字符串,age这个变量为数值型的数据,而其他为字符串的数据。现在程序开发人员就可以利用这个+号将不同数据类型的字符串连接起来。不过最后的数据类型都会字符串的数据类型。即系统会先将变量age转换为字符型数据,然后再跟其他字符串数据类型进行连接。那么在后台中,这到底是如何实现呢?如果在利用+号来进行连接的时候,如果某个变量不是字符串的数据类型,则系统回自动调用一个toSring方法,将非字符串的数据类型转换成字符串的数据类型,再进行合并。由于这个过程是系统自动完成的,所以程序开发人员需要特别的注意。一般来说,只要将+号运算符的一个操作数是字符串,编译器就会将另一个操作数转换成字符串形式。所以程序开发人员应谨慎地将其他数据类型与字符串相连,以免得到意想不到的结果。如将这tb个利用+号连接起来的内容,如果其中有个操作数是字符型数据的话,那么将其赋值给数值型的变量时,就会导致莫名其妙的问题。这种问题很可能存在。因为这个+号,除了可以连接字符串,还可以用来对数值型的数据进行四则运法运算。所以,在进行四则运法运算时,要确保各个操作数都是数值型的。否则的话,这个后果就可想而知了。
另外需要再提一句的是,如果在进行加法运算时,需要注意其数据类型的隐式转换。如现在有三个操作数,其中两个操作数其小数点保留两位;另外一个操作数其小数点保留为1位。而最后赋值给一个变量,其保留小数位数3位。这就是一个涉及到不同精度的数据类型的数值型数据转换问题。那么最终的结果是什么呢?笔者这里卖个关,大家若想知道结果的话,可以回去编个程序测试一下。有时候,笔者告诉你们答案,读者并不一定记得住。所以,笔者在这里就点倒为止。
总之一句话,+号这个连接符号,不仅可以连接各个字符串,而且还用来完成分行与数据类型的隐式转换。为此笔者建议,各个程序开发人员需要注意这方面细节,一定能够获得不少的收获。
对于J2EE,我们知道当开发应用时,在架构设计阶段的决定将对应用的性能和可扩展性产生深远的影响。现在当开发一个应用项目时,我们越来越多地注意到了性能和可扩展性的问题。应用性能的问题比应用功能的不丰富问题往往更为严重,前者会影响到所有用户,而后者只会影响到碰巧使用该功能的那些用户。
作为应用系统的负责人,一直被要求"要少花钱多办事"----用更少的硬件,更少的网络带宽,以及更短的时间完成更多的任务。J2EE通过提供组件方式和通用的中间件服务是目前首选的最优方式。而要能够构建一个具有高性能和可扩展性的J2EE应用,需要遵循一些基本的架构策略。
缓存(Caching)
简单地说,缓存中存放着频繁访问的数据,在应用的整个生命周期中,这些数据存放在持久性存储器或存放在内存中。在实际环境中,典型的现象是在分布式系统中每个JVM中有一个缓存的实例或者在多个JVM中有一个缓存的实例。
缓存数据是通过避免访问持久性存储器来提高性能的,否则会导致过多的磁盘访问和过于频繁网络数据传输。
复制
复制是通过在多台物理机器上创建指定应用服务的多个拷贝来获得整体更大吞吐效率。理论上看,如果一个服务被复制成两个服务,那么系统将可处理两倍的请求。复制是通过单一服务的多个实例的方式从而减少每个服务的负载来提高性能的。
并行处理
并行处理将一个任务分解为更为简单的子任务,并能够同时在不同的线程中执行。
并行处理是通过利用J2EE层执行模式的多线程和多CPU特点来提高性能。
tb与使用一个线程或CPU处理任务相比,以并行方式处理多个子任务可以使操作系统在多个线程或处理器中进行分配这些子任务。
异步处理
应用功能通常被设计为同步或串行方式。异步处理只处理那些非常重要的任务部分,然后将控制立即返回给调用者,其他任务部分将在稍后执行。
异步处理是通过缩短那些在将控制返回给用户之前必须处理的时间来提高性能的。虽然都做同样多的事情,但是用户不必等到整个过程完成就可以继续发出请求了。
资源池
资源池技术使用的是一套准备好的资源。与在请求和资源之间维持1:1的关系的不同,这些资源可被所有请求所共享。资源池的使用是有条件的,需要衡量下面两种方式的代价:
A、维持一套可被所有请求共享资源的代价
B、为每个请求都重新创建一个资源的代价
当前者小于后者时,使用资源池才是有效率的。
希望通过本文介绍的是J2EE中的五个核心策略,对你有帮助。