1、Java编译器在对源文件编译前,会先把源文件转换为unicode编码,因为这个原因,我们在编译时一定要把源文件用的是什么编码方式正确无误的”告诉”编译器。
例如:我们的源文件是以UTF-8的方式保存的,而在编译时却把它当作是用GBK方式保存的,这样编译器就会按照GBK->Unicode的编码转换方法对源文件进行转换,然后再编译,这样当然会出错,实际上编译器应当按照UTF-8->Unicode的编码转换方法来对源文件进行转换。
a.对于控制台程序,编译器会把源文件看作是由系统默认的编码类型来编码的(系统默认的编码类型取决于在控制面板区域设置里的配置,中文win2k下通常是GBK),也可以使用-encoding参数来设置,如:javac -encoding UTF-8,这样编译器就会把源文件看作是用UTF-8编码的(这只是告诉编译器源文件的编码类型,而不是对源文件转码)。在各种语言的平台上只要在编译用时-encoding指定与源文件的编码相同的编码方式,就不会存在国际化的问题了。
b.对于JSP,编译器则会根据设定的字符集来判断JSP文件使用的是什么编码方式,进而将其转换成unicode后进行编译;若JSP中未指定,编译器则会把JSP文件看作是按照系统默认的编码来保存的。在JSP2.0里新增了一个指令来通知编译器这个源文件所使用的编码方式。
2、在处理输入输出时,注意设置输入流和输出流的编码类型与用户输入时和输出设备显示时采用的编码方式一致。
由于JRE在处理输入输出时会将输入或输出的内容进行编码转换,对于输入会转换为unicode后再送入,因此要正确的匹配实际输入内容的编码方式和告知JRE的编码方式,对于输出,会由unicode转换为其他的编码再送出程序,因此要正确匹配输出设备显示时用的编码方式和告知JRE的编码方式。
例如:程序中设置输入流的编码是new InputStreamReader(System.in,"GB2312");而程序运行后用户输入时用了繁体中文的输入法,输入了BIG5编码的内容,这样JRE把BIG5编码的内容当作GB2312的进行了GB2312->unicode的编码转换,这样转换后的结果显然不是用户想要输入的内容了。
默认情况下,JRE会把输入输出的内容当作是按照系统默认编码方式编码的。
3、在Servlet中,除了一定要把源文件用的是什么编码方式正确无误的”告诉”编译器外,还要注意实际提交的URL数据、表单数据的编码格式和request中声明的编码格式一致。
客户端浏览器在通过表单和URL提交数据时,容器和JVM会将request中的数据看作是按照request所声明的编码方式来编码的,将数据由这种编码方式转换为unicode后再送入servlet(实际上容器会先将request中的数据转为一种中间编码方式,具体根据容器的配置而定,再由JVM由这种中间方式转换为unicode,通常这种中间格式是ISO)。servlet输出的unicode数据会由容器根据response中声明的编码方式进行转换,再送到客户端浏览器上。
在接收客户端输入时,用request.setCharacterEncoding()声明请求中数据的编码方式。
在向客户端输出时用response.setContentType("text/html;charset=");声明响应的数据的编码方式,告知浏览器以哪种编码方式显示。
4、在JSP中,由于JSP本就会被JSP编译器编译为servlet来运行,因此情况与servlet相同。
这两个JSP指令声明了请求和响应的编码方式。
只要确保URL参数或表单中数据的编码方式和所声明的编码方式一致,再通过告知JSP编译器本JSP文件采用的编码方式及含有哪种字符,即可解决JSP的字符编码问题。
这里是一个具体的例子:
现在因为浏览器对UTF-8的支持,我们可以通过在源文件、请求、响应中都使用unicode编码方式,来轻松达到处理国际化和字符编码问题的目标。
以我们使用的tomcat4.1.2为例,过程如下:
1、编写JSP页面时:在每个JSP页面在页首都要增加一行:
在编辑JSP页面时,一定要确保JSP文件以unicode的方式保存,目前几乎所有的编辑器都有以unicode编码保存或将文件内容转换成unicode的功能。
2、增加一个用来声明request的CharacterEncoding的类SetCharacterEncodingFilter.java;
SetCharacterEncodingFilter的这个类主要的作用就是:把request在从页面刚提交到server端的时候的encoding声明为我们想要的encoding,通过调用request的方法setCharacterEncoding (String encoding) 来改变,这样可以使request的从客户端传过来的时候,按我们在web.xml (在第二点可以讲到) 中配置的encoding来对提交的数据编码。
3、修改web.xml文件,配置一个filter来过滤全部url请求,通过第二步中的类,声明所有url请求的编码类型未UTF-8。
在web.xml文件中加上以下这段:
posted @
2007-11-03 16:43 jadmin 阅读(53) |
评论 (0) |
编辑 收藏
今天看到有个网友写到“打字速度是程序员的命根子”的文章(调侃),引发俺进一步想,到底什么才是程序员的命根子。
首先,程序员(初级)的主要<strong class="kgb" onmouseover="isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u5DE5_u4F5C";KeyGate_ads.ShowGgAds(this,"_u5DE5_u4F5C",event)" style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; cursor: hand; color: #0000ff; padding-top: 0px; border-right-width: 0px; text-decoration: underline" onclick="javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BwSwaDzAsR-a0H5ng6wPbwfy5CfqdyzOqkOW0A8CNtwGQvwUQARgBIIS04gcoFDgAUMSai7j4_____wFgnfHcgdAFoAH64sT8A6oBCjIwMDAwMjQxMjeyAQ1uZXdzLmNzZG4ubmV0yAEB2gEraHR0cDovL25ld3MuY3Nkbi5uZXQvbi8yMDA3MTEwMS8xMTAxNTIuaHRtbKkCLOcQc7QAgj7IAuL2oQGoAwHoA_EC9QMABAAA&num=1&adurl=http://www.chinahr.com/%3Fprj%3Dfa%26g%3D22&client=ca-pub-0892797939732602");GgKwClickStat("工作","chinahr.com","afc","2000024127");" onmouseout="isShowGg = false;InTextAds_GgLayer="_u5DE5_u4F5C"">工作是什么:根据<strong class="kgb" onmouseover="isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u8BBE_u8BA1";KeyGate_ads.ShowGgAds(this,"_u8BBE_u8BA1",event)" style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; cursor: hand; color: #0000ff; padding-top: 0px; border-right-width: 0px; text-decoration: underline" onclick="javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BYxtWDzAsR-a0H5ng6wPbwfy5CZaR2y2es9SAA8CNtwGQvwUQEBgQIIS04gcoFDgAUMnCw4D-_____wFgnfHcgdAFqgEKMjAwMDAyNDEyN7IBDW5ld3MuY3Nkbi5uZXTIAQHaAStodHRwOi8vbmV3cy5jc2RuLm5ldC9uLzIwMDcxMTAxLzExMDE1Mi5odG1sqQIs5xBztACCPsgC7qPNAqgDAegD8QL1AwAEAAA&num=16&adurl=http://www.team-top.com/&client=ca-pub-0892797939732602");GgKwClickStat("设计","www.team-top.com","afc","2000024127");" onmouseout="isShowGg = false;InTextAds_GgLayer="_u8BBE_u8BA1"">设计写代码;写文档;修改bug;功能测试;简单逻辑设计。
如果只是看这些工作内容的话,程序员的命根子是什么呢?
1:基础编码能力。这个能力其实不需要大学本科学历的,技校,自学,或者专业<strong class="kgb" onmouseover="isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u57F9_u8BAD_u673A_u6784";KeyGate_ads.ShowGgAds(this,"_u57F9_u8BAD_u673A_u6784",event)" style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; cursor: hand; color: #0000ff; padding-top: 0px; border-right-width: 0px; text-decoration: underline" onclick="javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BkCTxDzAsR-a0H5ng6wPbwfy5CZSctS342cKABcCNtwGQvwUQChgKIIS04gcoFDgAUJHV_foEYJ3x3IHQBaoBCjIwMDAwMjQxMjeyAQ1uZXdzLmNzZG4ubmV0yAEB2gEraHR0cDovL25ld3MuY3Nkbi5uZXQvbi8yMDA3MTEwMS8xMTAxNTIuaHRtbIACAakCLOcQc7QAgj7IAoS-twOoAwHoA_EC9QMABAAA&num=10&adurl=http://www.whpx.net/%3Fw%3Dgoog&client=ca-pub-0892797939732602");GgKwClickStat("培训机构","www.whpx.net","afc","2000024127");" onmouseout="isShowGg = false;InTextAds_GgLayer="_u57F9_u8BAD_u673A_u6784"">培训机构都可以学到。
2:打字速度。
当然,其他诸如“责任心”等不需赘述。综合来看,打字还真的是程序员的命根子,至少是两条腿中的一条。
但是很明显,“打字是程序员的命根子”很多人都不认同,原因很简单,我们做的其实不仅仅是程序员(初级)的工作,而是兼作高级程序员,甚至UI、DB、系统设计师,测试<strong class="kgb" onmouseover="isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u5DE5_u7A0B_u5E08";KeyGate_ads.ShowGgAds(this,"_u5DE5_u7A0B_u5E08",event)" style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; cursor: hand; color: #0000ff; padding-top: 0px; border-right-width: 0px; text-decoration: underline" onclick="javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BpgJSDzAsR-a0H5ng6wPbwfy5CY_v6izj8rLWAsCNtwGgjQYQEhgSIIS04gcoFDgAUMjeixlgnfHcgdAFqgEKMjAwMDAyNDEyN7IBDW5ld3MuY3Nkbi5uZXTIAQHaAStodHRwOi8vbmV3cy5jc2RuLm5ldC9uLzIwMDcxMTAxLzExMDE1Mi5odG1sqQIs5xBztACCPsgCl8itA6gDAegD8QL1AwAEAAA&num=18&adurl=http://www.gz-benet.com/&client=ca-pub-0892797939732602");GgKwClickStat("工程师","www.gz-benet.com/","afc","2000024127");" onmouseout="isShowGg = false;InTextAds_GgLayer="_u5DE5_u7A0B_u5E08"">工程师。
这就是为什么我们觉得“打字速度”只是我们工作中极小的一部分了。
中国的专业分工并不细致,特别是在这个新兴的行业里。10年前程序员还是绝对的白领,高级技术<strong class="kgb" onmouseover="isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u4EBA_u5458";KeyGate_ads.ShowGgAds(this,"_u4EBA_u5458",event)" style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; cursor: hand; color: #0000ff; padding-top: 0px; border-right-width: 0px; text-decoration: underline" onclick="javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BJw-yDzAsR-a0H5ng6wPbwfy5Cfmbxi3v-OHCAcCNtwGgnAEQBRgFIIS04gcoFDgAUL3Z9Mj8_____wFgnfHcgdAFoAHHlpP_A6oBCjIwMDAwMjQxMjeyAQ1uZXdzLmNzZG4ubmV0yAEB2gEraHR0cDovL25ld3MuY3Nkbi5uZXQvbi8yMDA3MTEwMS8xMTAxNTIuaHRtbIACAagDAegD8QL1AwAEAAA&num=5&adurl=http://www.weaver.com.cn/solutions/HRM.asp&client=ca-pub-0892797939732602");GgKwClickStat("人员","www.weaver.com.cn","afc","2000024127");" onmouseout="isShowGg = false;InTextAds_GgLayer="_u4EBA_u5458"">人员。现在的程序员也就是个蓝领,工资顶多算是中等,辛苦却能排高等。做个纯粹的程序员似乎看不到前途。并且业届里有句老话“程序员不过三十”,吃的还是一碗青春饭。这不是纯粹的抱怨,事实如此。
国外情况可能稍有不同。40岁的程序员也大有人在,不少人就喜欢这个工作,不像我们,必须得做的更高尚一点才能扬眉吐气。这也不能怪我们不够专业,不够踏实,行业特点、社会大环境、价值观等等决定了我们的选择----必须做的“高级”一点。
说道做的高级一点,那就是作设计师,作项目经历,作老板。
如果相作这些,仅仅编码和打字就远远不够了。我们中的大多数都在朝这个方向努力吧。学着设计,学着关系业界走向,学着创新。学习之路没有止境,但是打字速度却有止境。
记得有篇文章说,人的职业生涯大体可以这样分(大意如此):
兴奋期:刚入行(或者刚开始一份新工作),2-3个月。
疲劳期:3-6个月,甚至更长。很多人在这个极端出局。
成长期:安全度过疲劳期之后,可能需要几年
成熟期:熟练掌握行业要领,开始置身于行业里思考。
…..
为了不出局,既需要努力,也需要要不断的学习和充实自己。
所以,我们这种程序员(复合型)的命根子是什么?答案是:学习、思考和努力。
每天都学习一些新技术,不断充实自己。不要以为vs2008仅仅是个beta版就和我没关系,不要觉得SmartPhone还远,对于新技术不敏感,很难走很远。这个,是成长期必不可少的。
思考是一切进步的积石。出了思考工作范围之内的,也可以思考整个行业的走向。把自己融入到行业里面才能想得到更深更透彻。等到能思考到创行业之新了,也就离功成名就不远了。这也就是进入成熟期的保证。
而对于刚入行的年轻人,多思考也能让自己尽快度过疲劳期,不至于在这个阶段出局。
然后再加上努力,还有什么事情是做不到的呢。
共勉吧。
posted @
2007-11-03 16:26 jadmin 阅读(121) |
评论 (0) |
编辑 收藏
最近装了个 Oracle,突然发现每次访问http://localhost:8080/ 都要求输入什么XDB的用户、口令
确实不知道输入什么,不输又报错误,上网查了下,有两种解决办法:
方法1:
在安装Tomcat时设置其端口号为8081或其他,也可以在安装后找到conf目录下的server.xml文件,修改其端口号;
方法2:
重新建个oracle database -----database configration assistant-----创建新数据库new database 在安装过程中去掉关于XDB数据库选项.安装完毕就可以了。
posted @
2007-10-29 17:32 jadmin 阅读(343) |
评论 (0) |
编辑 收藏
1、使用索引来更快地遍历表。
缺省情况下建立的索引是非群集索引,但有时它并不是最佳的。在非群集索引下,数据在物理上随机存放在数据页上。合理的索引设计要建立在对各种查询的分析和预测上。一般来说:
a.有大量重复值、且经常有范围查询( > ,< ,> =,< =)和order by、group by发生的列,可考虑建立群集索引;
b.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;
c.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。索引虽有助于提高性能但不是索引越多越好,恰好相反过多的索引会导致系统低效。用户在表中每加进一个索引,维护索引集合就要做相应的更新工作。
2、在海量查询时尽量少用格式转换。
3、ORDER BY和GROPU BY使用ORDER BY和GROUP BY短语,任何一种索引都有助于SELECT的性能提高。
4、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
5、IN、OR子句常会使用工作表,使索引失效。如果不产生大量重复值,可以考虑把子句拆开。拆开的子句中应该包含索引。
6、只要能满足你的需求,应尽可能使用更小的数据类型:例如使用MEDIUMINT代替INT
7、尽量把所有的列设置为NOT NULL,如果你要保存NULL,手动去设置它,而不是把它设为默认值。
8、尽量少用VARCHAR、TEXT、BLOB类型
9、如果你的数据只有你所知的少量的几个。最好使用ENUM类型
10、正如graymice所讲的那样,建立索引。
以下是我做的一个实验,可以发现索引能极大地提高查询的效率:
我有一个会员信息表users,里边有37365条用户记录:
在不加索引的时候进行查询:
sql语句A:
select * from users where username like '%许%';
在Mysql-Front中的8次查询时长为:1.40,0.54,0.54,0.54,0.53,0.55,0.54 共找到960条记录
sql语句B:
select * from users where username like '许%';
在Mysql-Front中的8次查询时长为:0.53,0.53,0.53,0.54,0.53,0.53,0.54,0.54 共找到836条记录
sql语句C:
select * from users where username like '%许';
在Mysql-Front中的8次查询时长为:0.51,0.51,0.52,0.52,0.51,0.51,0.52,0.51 共找到7条记录
为username列添加索引:
create index usernameindex on users(username(6));
再次查询:
sql语句A:
select * from users where username like '%许%';
在Mysql-Front中的8次查询时长为:0.35,0.34,0.34,0.35,0.34,0.34,0.35,0.34 共找到960条记录
sql语句B:
select * from users where username like '许%';
在Mysql-Front中的8次查询时长为:0.06,0.07,0.07,0.07,0.07,0.07,0.06,0.06 共找到836条记录
sql语句C:
select * from users where username like '%许';
在Mysql-Front中的8次查询时长为:0.32,0.31,0.31,0.32,0.31,0.32,0.31,0.31 共找到7条记录
在实验过程中,我没有另开任何程序,以上的数据说明在单表查询中,建立索引的可以极大地提高查询速度。
另外要说的是如果建立了索引,对于like '许%'类型的查询,速度提升是最明显的。因此,我们在写sql语句的时候也尽量采用这种方式查询。
对于多表查询我们的优化原则是:
尽量将索引建立在:left join on/right join on ... +条件,的条件语句中所涉及的字段上。
多表查询比单表查询更能体现索引的优势。
11、索引的建立原则:
如果一列的中数据的前缀重复值很少,我们最好就只索引这个前缀。Mysql支持这种索引。我在上面用到的索引方法就是对username最左边的6个字符进行索引。索引越短,占用的 磁盘空间越少,在检索过程中花的时间也越少。这方法可以对最多左255个字符进行索引。
在很多场合,我们可以给建立多列数据建立索引。
索引应该建立在查询条件中进行比较的字段上,而不是建立在我们要找出来并且显示的字段上
12、一往情深问到的问题:IN、OR子句常会使用工作表,使索引失效。如果不产生大量重复值,可以考虑把子句拆开。拆开的子句中应该包含索引。
这句话怎么理解决,请举个例子
例子如下:
如果在fields1和fields2上同时建立了索引,fields1为主索引
以下sql会用到索引
select * from tablename1 where fields1='value1' and fields2='value2'
以下sql不会用到索引
select * from tablename1 where fields1='value1' or fields2='value2'
13.索引带来查询上的速度的大大提升,但索引也占用了额外的硬盘空间(当然现在一般硬盘空间不成问题),而且往表中插入新记录时索引也要随着更新这也需要一定时间.
有些表如果经常insert,而较少select,就不用加索引了.不然每次写入数据都要重新改写索引,花费时间; 这个视实际情况而定,通常情况下索引是必需的.
14.我在对查询效率有怀疑的时候,一般是直接用Mysql的Explain来跟踪查询情况.
你用Mysql-Front是通过时长来比较,我觉得如果从查询时扫描字段的次数来比较更精确一些.
posted @
2007-10-25 10:55 jadmin 阅读(74) |
评论 (0) |
编辑 收藏
我们知道 XML+XSLT就可以直接输出到支持XML的浏览器上,如IE 5.0以上,但是,我们还要考虑到有不少浏览器不直接支持XML,在这种情况下,我们需要在服务器上进行转换成html输出到浏览器,这种临时过渡办法恐怕要在一段时间内一直要使用.
使用Jsp 加上tablib标识库,我们可以完成这种转换。
著名open source项目组jakarta.apache.org推出的系列标识库中,就有这个功能的tanglib:http://jakarta.apache.org/taglibs/doc/xsl-doc/intro.html
按照jakarta配置方法,有点繁琐,需要修改或定义Web.xml,本人经过摸索,使用下列相当简单的办法,就可以使Jsp能成功运行XSL这个标识库了。
xsl标识库有三个关键包:
posted @
2007-10-25 07:48 jadmin 阅读(92) |
评论 (0) |
编辑 收藏
JSTL包括四个标签库,即Core标签库、XML标签库、国际化与格式化标签库和SQL标签库,这里介绍SQL标签库
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
一.连接MySQL的几种方式
1.创建普通的数据源
<sql:setDataSource var="example" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/test"
user="root" password="" [scope="request"]/>
2.从JNDI名称空间中获得一个数据源
<sql:setDataSource var="example" dataSource="jdbc/bn" />
二.<sql:query>和<sql:update>(<sql:param>/<sql:dateParam>可以用于query和update)
<sql:query var="qurey" dataSource="${example}" sql="select * from dept />
<sql:query var="qurey2" dataSource="${example}">
select * from dept
</sql:query>
<sql:query var="qurey3" dataSource="${example}" [maxRows="20"] [startRow="1"]
[scope="request"]>
select * from dept where deptid=? and deptname=? and createtime=?
<sql:param value="1"/>
<sql:param>wuhui</sql:param>
<sql:dateParam>new Date()</sql:dateParam>
</sql:query>
<c:forEach var="row" items="${query.rows}"></c:forEach>//迭代
<sql:update var="update" dataSource="${example}" >
update dept set deptid=? and deptname=?
<sql:param value="1"/>
<sql:param>wuhui</sql:param>
update 处理增删改什么都可以,除了查询
</sql:update>
query和update语法基本一样
3.<sql:transaction>事务处理标签
<sql:transaction dataSource="example"
[isolation="read_committed|read_uncommitted|repeatable_read|serializable"]>
<sql:query>and<sql:update>语句
</sql:transaction>
posted @
2007-10-24 22:18 jadmin 阅读(87) |
评论 (0) |
编辑 收藏
本示例从sql2000的pubs数据库中的employee表取出first name、lname.
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>jstl连接SQL Server 2000数据库</title>
</head>
<body>
<h3>本示例从sql2000的pubs数据库中的employee表取出first name、lname</h3>
当然,运行本JSP页须机器已经安装了SQL Server 2000数据库<br>
<sql:setDataSource driver="com.microsoft.jdbc.sqlserver.SQLServerDriver" url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs" user="sa" password="pass"/>
<sql:query var="rs">
select * from employee
</sql:query>
<table border="1">
<tr align="center">
<td><strong>
first name</strong>
</td>
<td><strong>
last name
</strong></td>
</tr>
<c:forEach items="${rs.rows}" var="row">
<tr>
<td>
<c:out value="${row.fname}"></c:out>
</td>
<td>
<c:out value="${row.lname}"></c:out>
</td>
</tr>
</c:forEach>
</table>
<hr>
</body>
</html>
结果:
本示例从sql2000的pubs数据库中的employee表取出first name、lname
当然,运行本JSP页须机器已经安装了SQL Server 2000数据库
posted @
2007-10-24 21:15 jadmin 阅读(82) |
评论 (0) |
编辑 收藏
日期输入页面:
dateInput.jsp
<%@ page pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Currency Formatting</title>
</head>
<body>
<form method="post" action="doDateInput.jsp">
Please enter your birthday:
<select name="month">
<option value="01">January</option>
<option value="02">February</option>
<option value="03">March</option>
<option value="04">April</option>
<option value="05">May</option>
<option value="06">June</option>
<option value="07">July</option>
<option value="08">August</option>
<option value="09">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
<select name="day">
<c:forEach begin="1" end="31" var="day">
<option><c:out value="${day}"/></option>
</c:forEach>
</select>
<select name="year">
<c:forEach begin="1930" end="2003" var="year">
<option><c:out value="${year}"/></option>
</c:forEach>
</select>
<input type="submit" value="Submit" />
</form>
</body>
</html>
日期处理页面:
doDateInput.jsp
<%@ page pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Currency Formatting</title>
</head>
<body>
<fmt:parseDate
var="date"
parseLocale="zh_CN"
value="${param.year}-${param.month}-${param.day}">
</fmt:parseDate>
<fmt:formatDate value="${date}" dateStyle="full"/>
</body>
</html>
提交后,显示结果诸如1930年11月1日 星期六
如果日期输入是en_US格式,也就是做以下改动
<select name="month">
<option value="Jan">January</option>
<option value="Feb">February</option>
<option value="Mar">March</option>
<option value="Apr">April</option>
<option value="May">May</option>
<option value="Jun">June</option>
<option value="Jul">July</option>
<option value="Aug">August</option>
<option value="Sep">September</option>
<option value="Oct">October</option>
<option value="Nov">November</option>
<option value="Dec">December</option>
</select>
则日期处理页面也要做想应改动
<fmt:parseDate
var="date"
parseLocale="en_US"
value="${param.month} ${param.day}, ${param.year}">
注意逗号后有一个空格,因为英文的日期格式为"May 25, 1997"
</fmt:parseDate>
posted @
2007-10-24 20:11 jadmin 阅读(91) |
评论 (0) |
编辑 收藏
<%@ page contentType="text/html;charset=utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql"%>
<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jstl/xml" prefix="x"%>
URL相关的标签
<c:import>
语法1:资源的内容使用String对象向外暴露
<c:import url="url" [context="context"]
[var-"varName"][scope="{page|request|session|application}"]
[charEncoding="charEncoding"]>
optional body content for <c:param> subtags
</c:import>
语法2:资源的内容使用Reader对象向外暴露
<c:import url="url" [context="context"]
varReader="varReaderName"
[charEncoding="charEncoding"]>
body content where varReader is consumed by another action
</c:import>
例1:
<h3>绝对路径 URL</h3>
<blockquote>
<ex:escapeHtml>
<c:import url="http://127.0.0.1:8080/ch15/beimport.jsp"/>
</ex:escapeHtml>
</blockquote>
<h3>相对路径 URL</h3>
<blockquote>
<ex:escapeHtml>
<c:import url="beimport.jsp"/>
</ex:escapeHtml>
</blockquote>
<h3>encode:</h3>
<a href=<c:url value="beimport.jsp"><c:param name="userName" value="hellking"/></c:url>>--></a>
相当于<--jsp:include file=""/>
<c:import var="myurl" url="http://127.0.0.1:8080/ch15/beimport.jsp"/>
<c:out value="${myurl}"/>
<c:import var="myurl2" url="beimport.jsp"/>
<c:out value="${myurl2}"/>
</pre>
</blockquote>
<h3>传递参数到指定的URL</h3>
<blockquote>
<c:import url="beimport.jsp" charEncoding="gb2312">
<c:param name="userName" value="hellking"/>
</c:import>
<c:redirect>
把客户的请求重定向到另一个资源
语法1:没有BODY时.
<c:redirect url="value" [context="context"]/>
例1:
<c:url value="beimport.jsp" var="test"><c:param name="userName" value="hellking"/></c:url>
<c:redirect url="${test}"/>
语法2:在BODY中指定查询的参数.
<c:redirect url="value" [context="context"]/>
<c:param>subtags
</c:redirect>
例1:
<c:redirect url="beimport.jsp">
<c:param name="userName" value="hellking"/>
</c:redirect>
<c:url>
用于构造URL,主要的用途是URL重写.
语法1:No Body.
<c:url value="value" [context="context"]
[var="varName"][scope="{page|request|session|application}"]/>
例1:
<c:url value="beimport.jsp"/>
语法2:Body.
<c:url value="value" [context="context"]
[var="varName"][scope="{page|request|session|application}"]>
<c:param>subtags
</c:url>
例2:
<c:url var="myurl" value="beimport.jsp" scope="session">
<c:param name="userName" value="hellking"/>
</c:url>
<c:out value="${myurl}"/>
<c:param>
在<c:import>.<c:url>.<c:redirect>中添加请求的参数.
语法1:参数的值使用value属性指定.
<c:param name="name" value="value"/>
语法2:参数的值在标签的BODY中指定.
<c:param name="name">
parameter value
</c:param>
迭代标签
<c:forEach>
在一个包括一系列对象的Collection中迭代计算它的BodyContent,或者重复迭代固定的次数.
语法1:在Collection中迭代.
<c:forEach [var="varName"] items="collection"
[varStatus="varStatusName"] //这是迭代状态
[begin="begin"][end="end"][step="step"]>
body content
</c:forEach>
例1:迭代Collection
<table border=1>
<c:forEach var="users" items="${users}">
<tr>
<td><c:out value="${users.userName}"/></td>
<td><c:out value="${users.password}"/></td>
<td><c:out value="${users.age}"/></td>
</tr>
</c:forEach>
</table>
例2:other迭代
<%
int[] myIntArray=new int[]{1,2,3,4,5,65,34};
String[] myStringArray=new String[]{"I ","am ","a ","Java","fans"};
Vector v=new Vector();
v.add("this");
v.add("is");
v.add("myEnumeration");
v.add("!");
Enumeration myEnumeration=v.elements();
HashMap myNumberMap=new HashMap();
myNumberMap.put("hellking","23");
myNumberMap.put("guest","23");
myNumberMap.put("guest2","223");
myNumberMap.put("guest3","232");
request.setAttribute("myIntArray",myIntArray);
request.setAttribute("myStringArray",myStringArray);
request.setAttribute("myEnumeration",myEnumeration);
request.setAttribute("myNumberMap",myNumberMap);
%>
<h4>Array of primitives (int)</h4>
<c:forEach var="i" items="${myIntArray}">
<c:out value="${i}"/> ?
</c:forEach>
<h4>Array of objects (String)</h4>
<c:forEach var="string" items="${myStringArray}">
<c:out value="${string}"/><br>
</c:forEach>
<h4>myEnumeration (warning: this only works until myEnumeration is exhausted!)</h4>
<c:forEach var="item" items="${myEnumeration}" begin="0" end="5" step="1">
<c:out value="${item}"/><br>
</c:forEach>
<h4>Properties (Map)</h4>
<c:forEach var="prop" items="${myNumberMap}" begin="1" end="5">
<c:out value="${prop.key}"/> = <c:out value="${prop.value}"/><br>
</c:forEach>
<h4>String (Common Separated Values)</h4>
<c:forEach var="token" items="red,blue,green">
<c:out value="${token}"/><br>
</c:forEach>
语法2:迭代固定的次数.
<c:forEach [var="varName"]
[varStatus="varStatusName"]
begin="begin" end="end"[step="step"]>
body content
</c:forEach>
例1:
<c:forEach var="i" begin="1" end="10">
<c:out value="${i}"/> -->
</c:forEach>
例2:<h4>第二种迭代:1 to 10,step=3</h4>
<c:forEach var="i" begin="1" end="10" step="3">
<c:out value="${i}"/> -->
</c:forEach>
例3:迭代状态
<td><c:out value="${status.index}"/></td>
<td><c:out value="${status.count}"/></td>
<td><c:if test="${status.first}">
<b></c:if>
<c:out value="${status.first}"/></b></td>
<td><c:if test="${status.last}">
<i> </c:if>
<c:out value="${status.last}"/></i></td>
</tr>
<c:forTokens>
用于处理TokenString的迭代,可以指定一个或者多个分隔符.
语法:
<c:forTokens items="stringOfTokens" delims="delimiters"
[var="varName"]
[varStatus="varStatusName"]
[begin="begin"][end="end"][step="step"]
body content
</c:forTokens>
例:
<h4>使用 '|' 作为分割符</h4>
<c:forTokens var="token" items="blue,red,green|yellow|pink,black|white"
delims="|">
<c:out value="${token}"/> ©
</c:forTokens>
<h4>使用 '|'和',' 作为分割符</h4>
<c:forTokens var="token" items="blue,red,green|yellow|pink,black|white"
delims="|,">
<c:out value="${token}"/> ©
</c:forTokens>
<h4>使用 '-' 作为分割符</h4>
<c:forTokens var="token" items="blue--red--green--yellow--pink--black--white"
delims="--">
<c:out value="${token}"/> ©
</c:forTokens>
一般用途
输出
<c:out value="&{XXX}" default="这个值不存在">
设置一个变量
<c:set>
例:设置一个javaBean的属性<c:set value="hk2" target="${user}" property="userName"/>
删除某个变量或者属性
<c:remove var="${XXX}" [scope="{page|request|...}"]>
捕获由嵌套在它里面的标签抛出的异常
<c:catch [var="varName"]>
nested actions
</c:catch>
条件标签
<c:if>
语法1:无Body的情况
<c:if test="testCondition"
var="varName" [scope="{page|request|session|application}"]/>
例:
<c:if test="${user.age<18}">
对不起,你还的年龄过小,不能范围这个网页◎!
</c:if>
语法2:有Body的情况
<c:if test="testCondition"
var="varName" [scope="{page|request|session|application}"]>
body content
</c:if>
<c:choose> <c:when> <c:otherwise>
例:
<c:choose>
<c:when test="${user.age <=18}">
<font color="blue">
</c:when>
<c:when test="${user.age<=30&&user.age>18}">
<font color="red">
</c:when>
<c:otherwise>
<font color="green">
</c:otherwise>
</c:choose>
你的年龄是:<c:out value="${user.age}"/>
注意,它的Body内容只能由以下的元素构成:
空格.
0个或者多个<when>子标签,<when>必须在<otherwise>标签之前出现.
0个或者多个<otherwise>子标签.
数据库相关
QUERY标签
语法1 无SQL参数
<sql:query sql="sqlQuery"
var="varName"
[scope="{page|request|session|application}"]
[dataSource="dataSource"]
[maxRows="maxRows"]
[startRow="startRow"]>
SQL
</sql:query>
例1:
<sql:query var="query" dataSource="${example}">
SELECT * FROM contact
</sql:query>
<table border="1">
<c:forEach var="row" items="${qurey.rows}">
<tr>
<td>Name:<c:out value="${row[0]}"/></td>
<td>mobile:<c:out value="{row.mobile}"/></td>
</tr>
</c:forEach>
</table>
<hr>
例2:
<sql:query var="result" dataSource="mbq">
select code, curprice, openprice, highprice, lowprice, balanceprice, reservecount,totalamount,curamount, openamount,
closeamount, reservechange, totalmoney, buyprice1, sellprice1, buyamount1, sellamount1, buyprice2, sellprice2, buyamount2,
sellamount2, buyprice3, sellprice3, buyamount3, sellamount3, buyprice4, sellprice4, buyamount4, sellamount4, buyprice5,
sellprice5, buyamount5, sellamount5, outamount, inamount, time,yesterbalanceprice,closeprice from currentdata WHERE Code <>
'SYS' order by code
</sql:query>代码 现价 开盘 最高 最低 平均 订货量 成交量
<c:forEach var="row" items="${result.rowsByIndex}">${row[0]} ${row[1]} ${row[2]} ${row[3]} ${row[4]}
${row[5]} ${row[6]} ${row[7]}
</c:forEach>
语法2 有query参数
<sql:query sql="sqlQuery"
var="varName"
[scope="{page|request|session|application}"]
[dataSource="dataSource"]
[maxRows="maxRows"]
[startRow="startRow"]>
[<sql:param>""]
</sql:query>
例1:变量传入
<c:set var="aa">
GX0511A
</c:set>
<sql:query var="result" dataSource="mbq" sql="select * from currentdata WHERE code=? order by code">
<sql:param>
${aa}
</sql:param>
</sql:query>代码 现价 开盘 最高 最低 平均 订货量 成交量
<table border="1">
<c:forEach var="row" items="${result.rowsByIndex}">
<tr>
<td>Name: ${row[0]} </td><td>2:${row[1]}</td> <td>3:$10:02 2005-11-17{row[2]}</td>
</tr>
<tr>
<td>${row[3]}</td><td> ${row[4]}</td><td>${row[5]}</td><td>${row[6]}</td><td>${row[7]}</td>
</tr>
</c:forEach>
</table>
语法3 有query,且query在body中.
<sql:query var="varName"
[scope="{page|request|session|application}"]
[dataSource="dataSource"]
[maxRows="maxRows"]
[startRow="startRow"]>
query
[<sql:param>""]
</sql:query>
例1:值传入
<sql:query var="result" dataSource="mbq">
select * from currentdata WHERE code=? order by code
<sql:param value="GX0511A"/>
</sql:query>代码 现价 开盘 最高 最低 平均 订货量 成交量
<table border="1">
<c:forEach var="row" items="${result.rowsByIndex}">
<tr>
<td>Name: ${row[0]} </td><td>2:${row[1]}</td> <td>3:$10:02 2005-11-17{row[2]}</td>
</tr>
<tr>
<td>${row[3]}</td><td> ${row[4]}</td><td>${row[5]}</td><td>${row[6]}</td><td>${row[7]}</td>
</tr>
</c:forEach>
</table>
UPDATA标签
语法1
<sql:update sql="sqlUpdate"
[dataSource="dataSource"]
[var="varName"][scope="{page|request|session|application}"]/>
例1
<sql:update var="update2" sql="insert into users values('测试','9999',1,'test')"
dataSource="jdbc/quickdb2">
</sql:update>
语法2
<sql:update sql="sqlUpdate"
[dataSource="dataSource"]
[var="varName"][scope="{page|request|session|application}"]>
<sql:param>actions
</sql:update>
例1
<sql:update var="update2" sql="delete from users where username=?" dataSource="jdbc/quickdb2">
<sql:param value="测试"/>
</sql:update>
语法3
<sql:update [dataSource="dataSource"]
[var="varName"][scope="{page|request|session|application}"]>
update statement
optional<sql:param>actions
</sql:update>
例1
<c:set var="aa" value="测试"/>
<sql:update var="update2" dataSource="jdbc/quickdb2">
delete from users where username=?
<sql:param>
${aa}
</sql:param>
</sql:update>
TRANSACTION标签
<sql:transaction [dataSource="dataSource"]
[isolation=isolationLevel]>
<sql:query>and<sql:update>statements
</sql:transaction>
isolationLevel::="read_committed"|"read_uncommitted"|"repeatable_read"|"serializable"
注意:嵌套在它里面的<sql:query>和<sql:update>标签不用使用DataSource属性来另外指定数据源.
XML标签
<x:parse>
用于解析XML文档
语法1:解析由String或者Reader对象组成的XML文档.
<x:parse xml="XMLDocument"
{var="var" [scope="scope"]|varDom="var"[scopeDom="scope"]}
[systemId="systemId"]
[filter="filter"]/>
语法2:解析在Body中指定的XML文档.
<x:parse
{var="var" [scope="scope"]|varDom="var"[scopeDom="scope"]}
[systemId="systemId"]
[filter="filter"]>
XML Document to parse
</x:parse>
例1:
<c:set var="xmlText">
<a>
<b>
<c>
test1
</c>
</b>
<d>
test2
</d>
</a>
</c:set>
<x:parse var="myxml" xml="${xmlText}" />
<x:out select="$myxml/a/b/c"/>
<x:out select="$myxml//d"/>
<x:parse var="bookxml">
<books>
<book id="01">
<name>jsp 应用开发详解</name>
<price>59</price>
</book>
</books>
</x:parse>
<x:out select="$bookxml/books//name"/>
<x:out>
计算XPath表达式,并把结果返回给JspWriter对象进行输出
语法:
<x.out select="XpathExpression" [escapeXml="true|false}"]/>
例1:
<x:parse var="test">
<books>
<book id="01">
<name>jsp 应用开发详解</name>
<price>59</price>
</book>
</books>
</x:parse>
<x:out select="$test/books//name"/><br>
<x:out select="$test//name"/><br>
<x:out select="$test/books/book/name"/><br>
<x:out select="$test/books/book/price"/><br>
<x:set>
计算XPath表达式,并且把结果保存到某个范围的变量中.
语法:
<x:set select="XPathExpression"
var="varName"[scope="{page|request|session|application}"]/>
posted @
2007-10-23 19:13 jadmin 阅读(49) |
评论 (0) |
编辑 收藏
搭建的步骤:
1、下载、安装、注册editplus2。
2、修改几处设置,这是可选的。进入tools 》preferences》font,修改成大点的字体,小字累眼睛。在files选项卡里去掉创建备份文件,把Create backup file when saving前面的勾去掉。
3、加入Java工具,这是最主要的。
添加Java编译工具。在tools 》 configure user tools 》Add tool 》Program,在menu test 中输入“java编译”,command输入“javac”,Argument选择$(FilePath),Initial directory选择$(FileDir),再选上Capture output。点击Apply就ok了。
添加Java解释器。在tools 》 configure user tools 》Add tool 》Program,在menu test 中输入“java运行”,command输入“java”,Argument选择$(FileNameNoExt),Initial directory选择$(FileDir)。点击Apply就ok了。
添加当前文件目录下的Dos窗口。在tools 》 configure user tools 》Add tool 》Program,在menu test 中输入“cmd”,command输入“cmd”,Initial directory选择$(FileDir)。 点击Apply就ok了。
实现的效果就是:用editplus编辑一个Java源文件,然后按CTRL + 1,编译;CTRL + 2,运行;当一个文件有多个class,你想运行其中的某一个,CTRL + 3,跳出cmd窗口,已经指向当前目录了,然后手工输入就可以了。
4、修改Java文件模板。到editplus安装目录下,用记事本打开template.java文件,修改成你想要的新建Java文件的模板。这样每次从file 》 new 》java 创建的Java文件都是模板里的格式。
5、然后下载Java语法高亮文件java.stx,以及Java自动完成文件,java.acp。(这种自动完成没有eclipse那么智能、变态)
6、在editplus安装目录下面新建一个名为java.ctl的文本文件,内容为:
#TITLE=JavaCodeClip
#INFO
#SORT=y
重启editplus,在左上角的Cliptext的下拉列表中选择JavaCodeClip,点击add,然后可以添加常用的Java源代码片段。比如测试经常用的System.out.println();可以这样添加:在title里面输入print,在text body中输入System.out.println(^!); 其中^!的意思是双击在文件中插入代码之后,光标的位置。
posted @
2007-10-23 07:53 jadmin 阅读(52) |
评论 (0) |
编辑 收藏