Loading...

java .net

2008年8月26日

最近在学习如何使用maven,做了一个demo(基于S2S整合),总结一下与大家分享,期待与大家讨论以期快速进步。

一、maven介绍

1、maven是什么

http://maven.apache.org/
官方解释:Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

2、使用maven有什么好处,解决什么问题

jar统一管理了:

如果建立了一个本地的jar仓库,那么所有人都是从仓库里面下载jar,拷贝项目时只需要copy几K的源码即可!其次,依然是仓库,使得每个人的jar版本都是一致的,不会出现因为版本不同,引起的莫名其妙的错误。
项目的自动化:

只需要mvn package命令,在eclipse里面,看run里面,只需要选择就行了!它会自动的从编译,测试开始,一直到打包,自动的运行,保证你的包没有问题。

我们在做多个不同的Java项目时,每个项目所用到的库文件基本都是大同小异的,通常的做法是每个项目下面都会复制一份这些库文件,甚至会把这些库文件都提交到vss上去,这样带来的问题不仅是增大了项目占用的硬盘空间,而且也使包管理很混乱。

我们可以这样查看jar包的依赖关系,是不是很爽?!
image

还可以单元测试覆盖率报表:

image

2、helloword

1、下载Maven 附件中的maven3.jar 解压到任意目录

2、安装eclipse插件m2eclipse

方式一:在线安装 更新地址是:http://m2eclipse.sonatype.org/sites/m2e
方式二:本地安装 help-->install new softeware-->add-->name填写maven-->archive..-->jar:file:/../m2e.zip!/-->ok
安装完成重启eclipse,在Window-->Preferences-->Maven下配置

image

禁用eclipse启动时更新maven index 主要是每次eclipse启动时都更新很烦人

image

添加自己的maven

3、新建maven项目

按照下图步骤

image

  • groupId定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联。譬如在googlecode上建立了一个名为myapp的项目,那么groupId就应该是com.googlecode.myapp.
  • artifactId定义了当前Maven项目在组中唯一的ID,groupId为com.googlecode.myapp的例子中,你可能会为不同的子项目(模块)分配artifactId,如myapputil、myappdomain、myappweb等。
  • version指定了项目当前的版本——1.0SNAPSHOT。SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。随着项目的发展,version会不断更新,如升级为1.0、1.1SNAPSHOT、1.1、2.0等。
  • name元素声明了一个对于用户更为友好的项目名称

点击Finish完成

4、maven项目结构

下图为基于maven项目结构,这里跟我们以前的项目结构很不一样,以前的项目结构约定俗成的只有两块 一个src 一个webRoot,当然这些都可以随意配置,比如WebRoot有的叫WebContent

image
这里maven倡导约定优于配置,maven的约定就是以下目录结构
src/main/java 下存放java类
src/main/webapp 下存放页面文件(需要手动创建)
src/main/resources 下存放资源文件
src/test/java 下存放单元测试代码
src/test/resources 下存放测试资源文件

5、添加jar包

只需维护pom.xml
比如添加struts2-core
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.0.11.2</version>
</dependency>

我在172.20.66.230上部署了一个maven仓库,访问地址http://172.20.66.230:8081/nexus/

maven会根据pom.xml中的配置访问230的仓库下载对应的jar source 以及doc,下载到哪?这要看maven3/conf/settings.xml 55:

<localRepository>F:/Maven3/repository</localRepository>

6、编写代码

附件中有一个struts2+spring 的demo,解压然后import eclipse

在项目名上右键 run as -->Run Configurations

image

按图配置,点击Run即可。浏览器中访问http://localhost:8080/MavenSSH/

Maven运行的生命周期

  • 复制src/main/resources资源文件到输出目录

  • 编译src/main/java下的源代码

  • 复制src/test/resources下的测试用资源文件到测试输出目录

  • 编译src/test/java下的测试用例

  • 运行测试用例

  • 打包生成

===========================

  • 以上是一个简单的例子,只是用它获取依赖的jar包 。maven还有很多诸如项目管理方面的功能,比如文档编制、发布管理、配置管理...

  • 第一个次运行项目会比较慢,因为要下载jar包。

  • MavenSSH.rar是一个struts2与spring集成的例子,页面用到了sitemesh div+css 也值得学习

  • 项目debug是运行在jetty(类似于tomcat的容器)中。

posted @ 2011-04-18 16:09 猪 阅读(1321) | 评论 (5)编辑 收藏

如果部署GAE时正在upload files时退出,下次部署时会报错

Another transaction by user is already in progress for this app and major version. That user can undo the transaction with appcfg.py's "rollback" command

 

找到eclipse中的GAE SDK目录

如:D:\eclipse\plugins\com.google.appengine.eclipse.sdkbundle.1.3.8_1.3.8.v201010161055\appengine-java-sdk-1.3.8\bin

 

执行命令

appcfg.cmd rollback 后面跟gae项目war所在目录

如 appcfg.cmd rollback D:/spring/eclipse_workspace/taobaoke/war

 

执行:

********************************************************
Warning: Future versions of the Dev App Server will require Java 1.6 or later. P
lease upgrade your JRE.
********************************************************
Reading application configuration data...
2010-11-15 9:34:23 com.google.apphosting.utils.config.AppEngineWebXmlReader read
AppEngineWebXml
信息: Successfully processed D:/spring/eclipse_workspace/taobaoke/war\WEB-INF/ap
pengine-web.xml
2010-11-15 9:34:23 com.google.apphosting.utils.config.AbstractConfigXmlReader re
adConfigXml
信息: Successfully processed D:/spring/eclipse_workspace/taobaoke/war\WEB-INF/we
b.xml
2010-11-15 9:34:23 com.google.apphosting.utils.config.AbstractConfigXmlReader re
adConfigXml
信息: Successfully processed D:/spring/eclipse_workspace/taobaoke/war\WEB-INF/cr
on.xml
Beginning server interaction for taokeapp...
0% Rolling back the update.
Success.
Cleaning up temporary files...

posted @ 2010-11-15 09:55 猪 阅读(420) | 评论 (0)编辑 收藏

在网上无意搜到一个用Ext实现的淘宝客,恩 ,咱用GWT做一个车轮

下了淘宝的 SDK for java就开干 参考API文档按部就班

在淘宝的沙箱里测试,很顺利,乘胜前进,到正式环境下测试

问题来了

invalid signature

网上搜了一通,有说时间戳不对,果不其然,GAE使用的是标准时间,整整差了8小时,遂在获得的当前时间上加了8小时,OK

invalid signature 可能的另一个原因是APP_KEY 或 APP_SERCET不正确,仔细检查

 

调用 taobao.item.get

 

1 TaobaoClient client=new DefaultTaobaoClient(TaobaokeConstant.SANDBOX_URL, TaobaokeConstant.APP_KEY, TaobaokeConstant.APP_SERCET);
2 ItemcatsGetRequest req=new ItemcatsGetRequest();
3 java.util.Calendar c=java.util.Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
4 c.add(Calendar.HOUR, 8);
5 req.setTimestamp(c.getTime().getTime()) ;
6 req.setParentCid(new Long(0));
7 ItemcatsGetResponse response=client.execute(req);
8 return response.getItemCats();

 

调用 taobao.taobaoke.items.get

 
1 TaobaoClient client=new DefaultTaobaoClient(TaobaokeConstant.SANDBOX_URL, TaobaokeConstant.APP_KEY,TaobaokeConstant.APP_SERCET);
2 TaobaokeItemsGetRequest req=new TaobaokeItemsGetRequest();
3 req.setFields("num_iid,title,nick,pic_url,price,click_url,commission,commission_rate,commission_num,commission_volume,shop_click_url,seller_credit_score,item_location,volume,taobaoke_cat_click_url,keyword_click_url");
4 req.setCid(Long.parseLong(cid));
5 req.setNick(TaobaokeConstant.NICK);
6 req.setSort("commissionRate_desc");
7 TaobaokeItemsGetResponse response=client.execute(req);
8 return response.getTaobaokeItems();
 
想用GAE JCache API 加入缓存以减轻压力,但屡试不行,从缓存中取 的时候报错
没找到原因
 
改用自己写的缓存,然后用App Engine Cron 服务管理缓存
 
corn.xml
 
1 <?xml version="1.0" encoding="UTF-8"?>
2 <cronentries>
3   <cron>
4     <url>/cron/recache</url>
5     <description>Repopulate the cache every 1 hours</description>
6     <schedule>every 1 hours</schedule>
7   </cron>
8 </cronentries>
posted @ 2010-10-21 11:33 猪 阅读(737) | 评论 (0)编辑 收藏
posted @ 2010-06-13 09:54 猪 阅读(429) | 评论 (0)编辑 收藏
     摘要: 01 var $j = jQuery.noConflict(); 02 //使用此方法验证所有text textarea 是否含有非法字符 03 $j(document).ready(function(){ 04    $j("input[type='text']").each(functio...  阅读全文
posted @ 2010-06-13 09:53 猪 阅读(2042) | 评论 (1)编辑 收藏
一个喜欢coding的程序员,工作在北京,从事java web 开发,喜欢JavaScript,平时关注技术新闻,试用各种新框架、新语言,学海无涯,有时也迷茫
平时没事翻翻编程思想、浏览各位同行的blog,将各种实际中的技巧、方法拿来养眼,并用到自己的项目中感受快乐
头儿的评价:不管遇到什么难题,都会钻窟窿盗洞把它解决掉

求职简历
posted @ 2010-05-19 14:58 猪 阅读(278) | 评论 (0)编辑 收藏
Compiling module com.capinfo.cdss.gwt.olap.Olap
Compiling 12 permutations
Compiling permutation 0...
Compiling permutation 1...
Compiling permutation 2...
Compiling permutation 3...
Compiling permutation 4...
Compiling permutation 5...
Compiling permutation 6...
Compiling permutation 7...
Compiling permutation 8...
Compiling permutation 9...
Compiling permutation 10...
Compiling permutation 11...
Compile of permutations succeeded
Linking into D:\spring\workspace\fusionchart\war\olap.
Link succeeded
Compilation succeeded -- 291.925s

在#.gwt.xml中添加支持Firefox
<!-- User Agent -->
<set-property name="user.agent" value="gecko1_8" /> 
编译的确变得很快,但IE中果真不好使
posted @ 2010-05-19 10:19 猪 阅读(1154) | 评论 (1)编辑 收藏
GWT设置UncaughtExceptionHandler 以捕获为捕捉的异常,这gwt在host mode编译后的JavaScript如果出现错误,No errors in Hosted Mode and Compiled localy, but deployed to tomcat yields in errors
这是恼人,加上UncaughtExceptionHandler起码有一丝线索
GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
    public void onUncaughtException(Throwable throwable{
        String text = "Uncaught exception: ";
        while (throwable != null{
            StackTraceElement[] stackTraceElements = throwable
                    .getStackTrace();
            text += throwable.toString() + "\n";
            for (int i = 0i < stackTraceElements.lengthi++) {
                text += "    at " + stackTraceElements[i] + "\n";
            }
            throwable = throwable.getCause();
            if (throwable != null{
                text += "Caused by: ";
            }
        }
        System.err.print(text);
        text = text.replaceAll(" ", " ");
        Window.alert("系统错误:"+text);
    }
});
posted @ 2010-05-19 10:18 猪 阅读(363) | 评论 (0)编辑 收藏
java.lang.IllegalStateException:Should only call onDetach when the widget is attached to the browser's document

这个异常是在com.google.gwt.user.client.ui.Widget protected void onDetach() 方法抛出的
当页面重新加载或离开页面时会执行这个方法
如果系统没有正常初始化,会有这个异常
郁闷的是No errors in Dev Mode but Compiled localy and deployed to tomcat in errors
posted @ 2010-05-19 10:18 猪 阅读(503) | 评论 (0)编辑 收藏

private void showWaitMess(Frame window){
    final MessageBox box = MessageBox.wait("等待", "正在查询数据,请稍后...", "查询中...");
    final Element frame = window.getElement();
    final Timer t = new Timer() {
        @Override
        public void run() {
            if (ready(frame)) {
                this.cancel();
                box.close();
            }
        }
    };
    t.scheduleRepeating(100);
}
private native boolean ready(Element frame)/*-{
    return frame.contentWindow.document.readyState=="complete";
}-*/;
posted @ 2010-05-19 10:15 猪 阅读(290) | 评论 (0)编辑 收藏
又涨见识了
IE8报下面错误,而且是我的机器不报,同事的机器报,试了4台,两个报,两个不报,IE版本都一样,没想明白
解决:1、查看是否有未关闭的html标签,比如<table>而没有</table> (我就是这个原因)
2、是否在页面未加载完前js代码操作了body里的元素,将相关js代码移到</body>后面



网页错误详细信息

用户代理: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)
时间戳: Wed, 14 Apr 2010 08:33:56 UTC


消息: HTML Parsing Error: Unable to modify the parent container element before the child element is closed (KB927917)
行: 0
字符: 0
代码: 0
URI:  


http://support.microsoft.com/kb/927917
posted @ 2010-05-19 10:11 猪 阅读(1847) | 评论 (0)编辑 收藏

       本来系统是由JSP+润乾报表做的,做出一版来给人家客户演示,人家觉得体验不够,也没不够绚丽,要求回去返工,主要是因为他们看过他们兄弟部门的一个类似系统,要求向那个系统靠拢,可殊不知人家那是.net做的C/S,交互体验当然好了。

      面临一个抉择,换.net平台做winform,然后用sql server Analysis Services 的现成组件,这要技术上肯定可行,但是需要购买一堆微软的东西,钱啊。

      正好以前看过一些GWT的资料,以及基于GWT的开源框架,它的界面效果倒是可以满足客户的要求,遂毛遂自荐,想试试用GXT实验是否能实现要求的功能和效果,同时也有其他同事考察了SAP的BI,水晶E表,IBM的Cognos,结果因功能实现不够或者商务问题搁浅

      好像春节后没多久就开始搞GWT,现在终于实现了(或是变相实现了)要求的功能、满足了客户的意见,很有成就感,期间经历了两次重构,现在采用的GXT提供的MVC模型,底层数据访问是通过调用润乾报表API,将润乾报表运算结果转化为一个List,然后交给GXT在页面展现。

      页面功能上,GXT挺全面,Grid列排序,隐藏显示特定列,树形展开收缩,用open chart封装的统计图表,数据钻取,列标题分组,拖拽形式动态设置列维度、行维度以实现灵活查询,将灵活查询行列维度保存起来供以后随时打开,将结果到处Excel、PDF、Word,动态设置查询条件的显示隐藏,动态的进度条提示等等

      接下来还要融入GIS,实现报表到地图,地图到报表。

      值得注意的是所有这些功能都是在一个窗口中完成的,实现了菜单、维度定义、报表、统计图功能的融合,不用客户点来点去,一步了然。

posted @ 2010-05-19 10:11 猪 阅读(450) | 评论 (0)编辑 收藏

OLAP(On_line Analytical Processing联机分析处理) 和 OLTP(On_line Transaction Processing联机事务处理)

OLTP:On_line Transaction Processing 联机事务处理 ,以业务处理为主

OLAP:On_line Analytical Processing     联机分析处理,则是专门为支持复杂的分析操作而设计的,侧重于对决策人员和高层管理人员的决策支持

posted @ 2010-05-19 10:05 猪 阅读(310) | 评论 (0)编辑 收藏
因为客户不满意界面设计,人家看中了兄弟单位用的系统的样子,可他却不知那时cs程序,要想用bs做成那样的效果还是先天不足,就这样开始了GWT GXT的探索,一边摸索一边用GXT重写这个系统
现在想想 经历了三个阶段
刚开始是demo阶段,因为不知道路走不走的通,全面摸索GXT能实现的效果,也没注意模块的规划,甚至就一个类
而后发现还是能走通的,就开始添砖加瓦,发现代码越加越乱,决心重构,定义了多个包,多个类负责不同的功能模块,定义了一些Panel,一下子清晰多了,也遇到了不同模块间互相调用的问题,自己想当然的办法就是在一个类中声明每个模块作为属性,就像一个总管,每个屋子的钥匙我都有了,也认识到了这样的缺点,一些模块中的事件不等不在这个主管中定义
现在Now,用一天时间再次改写,仿照Gxt中的例子Explorer
1、将各个模块定义成com.extjs.gxt.ui.client.mvc.View,View中必须实现方法handleEvent(AppEvent event),负责处理发给自己的事件
2、为每个View定义com.extjs.gxt.ui.client.mvc.Controller,每个Controller中包含View,在这里定义View要处理的事件
3、在Dispatcher中注册每个Controller

这样,每个View各司其职,他们各自有各自的功能,会接收为他们定义的所有事件并处理,发送事件Dispatcher.forwardEvent(appEvent);

感觉这次改写后 速度还没有改写前的快,现在每次操作url会自动添加Hash,想把它去掉,一直没找到根结
posted @ 2010-05-19 09:55 猪 阅读(603) | 评论 (0)编辑 收藏
Gwt中调用panel的setUrl方法嵌入一个网页
在网页加载过程中加入wait
在页面中加入javascript
var ready = false; 
$j(document).ready(function(){
ready = true; 
});//这里用了jquery

然后再java中声明
public native boolean ready(Element frame)/*-{
return frame.contentWindow.ready?true:false;
}-*/;

然后在设置Frame的url时
olapFrame = centerCp.setUrl(GWT.getHostPageBaseURL()
+ com.google.gwt.http.client.URL.encode("jsp/showOlap.jsp?dim="
+ dims + "&dimname=" + colLabels + ""));
final MessageBox box = MessageBox.wait("等待", "正在查询数据,请稍后...", "查询中...");
final Element frame = olapFrame.getElement();
final Timer t = new Timer() {
@Override
public void run() {
if (ready(frame)) {
this.cancel();
box.close();
}
}
};
t.scheduleRepeating(100);
posted @ 2010-05-19 09:54 猪 阅读(476) | 评论 (0)编辑 收藏
organize imports应该是ctrl+shift+o的操作
add import导入指定的类
organize imports导入所有需要导入的类,并且如果有些import是没用的,那么eclipse会自动删除
posted @ 2010-03-03 22:07 猪 阅读(1283) | 评论 (0)编辑 收藏
Gwt中调用panel的setUrl方法嵌入一个网页
在网页加载过程中加入wait
在页面中加入javascript
var ready = false;
$j(document).ready(function(){
ready = true;
});//这里用了jquery

然后再java中声明
public native boolean ready(Element frame)/*-{
return frame.contentWindow.ready?true:false;
}-*/;

然后在设置Frame的url时
olapFrame = centerCp.setUrl(GWT.getHostPageBaseURL()
+ com.google.gwt.http.client.URL.encode("jsp/showOlap.jsp?dim="
+ dims + "&dimname=" + colLabels + ""));
final MessageBox box = MessageBox.wait("等待", "正在查询数据,请稍后...", "查询中...");
final Element frame = olapFrame.getElement();
final Timer t = new Timer() {
@Override
public void run() {
if (ready(frame)) {
this.cancel();
box.close();
}
}
};
t.scheduleRepeating(100);
posted @ 2010-03-03 22:07 猪 阅读(221) | 评论 (0)编辑 收藏
javascript 调用java代码
//调用JAVA静态方法
//规则: @全路径类名::静态方法名(方法签名)(传入参数)
//@com.capinfo.cdss.gwt.olap.client.ui.PartOlapCenterTab::saveOlapState

(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava

/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)

(saveName,dims,rowDims,colDims,sql,colLabels,expandInfo,hideInfo,exp,field,remark);
//调用JAVA非静态方法
//规则:实例对象.@全路径类名::方法名(方法签名)(传入参数)
//this.@com.capinfo.cdss.gwt.olap.client.ui.PartOlapCenterTab::saveOlapState

(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava

/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)

(saveName,dims,rowDims,colDims,sql,colLabels,expandInfo,hideInfo,exp,field,remark);


//调用JAVA的非静态属性
//规则:实例对象.@全路径类名::属性名
//var field=this.@com.capinfo.cdss.gwt.olap.client.ui.PartOlapCenterTab::field;

参考:http://java.sun.com/j2se/1.4.2/docs/guide/jni/spec/types.html#wp16432
http://yonglin4605.javaeye.com/blog/568045
http://yonglin4605.javaeye.com/blog/564829
posted @ 2010-03-03 22:06 猪 阅读(649) | 评论 (0)编辑 收藏
在*.gwt.xml中加入 显示中文
<inherits name="com.google.gwt.i18n.I18N"/>
<extend-property name="locale" values="zh" />
在页面中加入
<meta name="gwt:property" content="locale=zh" >
posted @ 2010-03-03 21:44 猪 阅读(513) | 评论 (0)编辑 收藏
调用panel的setUrl方法嵌入一个网页
要访问这个网页中的js变量 var abc
setUrl返回一个Frame

public native void jsGetVar(Element element)/*-{
var abc = element.contentWindow.abc;
//element.contentWindow.document.getElementById("name");访问element
}-*/;

调用 jsGetVar(frame.getElement());

参考:http://tailorcai.javaeye.com/blog/186897
posted @ 2010-03-03 21:44 猪 阅读(394) | 评论 (0)编辑 收藏
在网上搜索了很多部署gwt到tomcat的blog,吸取了大家的经验,又发现一些问题,总结一下
我是用的Google Plugin for Eclipse ,跟用gwt的sdk编译有点点不一样
1、在gwt项目右键Google > GWT Compile,就会在项目中的war中得到编译后的文件
To run the application as JavaScript in what GWT calls "production mode", compile the application by right-

clicking the project and choosing Google > GWT Compile.
参考:http://code.google.com/webtoolkit/usingeclipse.html#compiling
2、将war中这些文件复制到tomcat webapp/应用 目录下
看一下WEB-INF\classes是不是有相应的class文件,要是没有用eclipse编译后复制过来
3、这样就需要gwt-user.jar了
url中也不需要?gwt.codesvr=172.20.66.140:9997这样的参数了
4、打开tomcat访问相应html可能什么都出不来,或者访问数据库时出错,查看gwt编译时控制台输出,是不是跟web.xml中配的

Servlet mapping是不是对应,
比如
Linking into D:\spring\workspace\fusionchart\war\olap.
Link succeeded
Compilation succeeded -- 92.640s
我的web.xml原来是
<servlet-mapping>
<servlet-name>olap</servlet-name>
<url-pattern>/com.capinfo.cdss.gwt.olap.Olap/olap</url-pattern>
</servlet-mapping>
要改成
<servlet-mapping>
<servlet-name>olap</servlet-name>
<url-pattern>/olap/olap</url-pattern>
</servlet-mapping>
相应html中原来是
<script type="text/javascript" language="javascript" src="com.capinfo.cdss.gwt.olap.Olap/com.capinfo.cdss.gwt.olap.Olap.nocache.js"></script>
改成
<script type="text/javascript" language="javascript" src="olap/olap.nocache.js"></script>
还没闹清楚为什么会这样
跟eclipse自动编译有关?高人告知啊
posted @ 2010-03-03 21:43 猪 阅读(673) | 评论 (1)编辑 收藏
ext-gwt 设置日期格式

DateField date = new DateField();
date.setPropertyEditor(new DateTimePropertyEditor("yyyy-MM-dd"));
posted @ 2010-03-03 21:43 猪 阅读(570) | 评论 (0)编辑 收藏
如果要去掉此提示,打开SQL 2008 在最上面 工具-〉选项-〉左侧有个 设计器-〉表设计器和数据库设计器 -> 阻止保存要求重新创建表的更改(右侧) 把钩去即可

参考:http://www.cnblogs.com/ajayumi/archive/2009/04/08/1431429.html
posted @ 2010-03-03 21:42 猪 阅读(735) | 评论 (0)编辑 收藏
连接Sql Azure
微软早就公布Sql Azure可以使用了,今天切身体验了一下,方法看下面链接
http://blogs.msdn.com/sqlcrd/archive/2009/12/28/sql-azure.aspx

测试asp.net连接时,启动项目报错:
Windows Azure Tools: Failed to initialize the Development Storage service. Unable to start Development Storage.

Failed to start Development Storage: the SQL Server instance ‘localhost\SQLExpress’ could not be found.   Please configure the SQL Server instance for Development Storage using the ‘DSInit’ utility in the Windows Azure SDK.
解决方法:
go to the "Windows Azure SDK Command Prompt"
执行:
DSInit /sqlInstance:. /forceCreate

再次重新启动,惊喜,报一堆这样的错误:

命名空间“http://schemas.microsoft.com/developer/msbuild/2003”中的“PropertyGroup”。 的子元素
命名空间“http://schemas.microsoft.com/developer/msbuild/2003”中的“ServiceHostingSDKInstallDir”。
无效。应为可能元素的列表: 命名空间“http://schemas.microsoft.com/developer/msbuild/2003”中的“Property”。。   

C:\Program Files\MSBuild\Microsoft\Cloud Service\v1.0\Microsoft.CloudService.targets    9    6    杂项文件

闹了半天是因为刚才
开着"Windows Azure SDK Command Prompt"
关了就OK了
posted @ 2010-03-03 21:42 猪 阅读(342) | 评论 (0)编辑 收藏
今天上班发现访问公司局域网里的计算机共享不好使了,输入正确的用户名密码,也提示不正确,差点就还原系统了,最后Google到了方法: WIN7电脑上开始 search 输入sec , 打开local security policy, 找到security settings\local policies\Network Security: LAN Manager authentication level, the default vaule 是 not defined. 改为"Send NTLM response only"后即可. 参考:http://bbs.pcbeta.com/thread-511161-1-1.html
posted @ 2010-03-03 21:41 猪 阅读(1716) | 评论 (0)编辑 收藏
http://www.infzm.com/content/39708 一直比较喜欢南方周末,不像一些报纸媒体报喜不报忧,想南方为追求事实真相的记者致敬!!! 另发句牢骚:对北京的除雪工作甚是不满,要政府干啥吃的
posted @ 2010-01-08 11:32 猪 阅读(229) | 评论 (0)编辑 收藏
余年已七十有余,一朝怛化,揆诸生寄 死归之理,一切无所 萦怀,惟我瞻四方,蹙国万里,民穷财尽,实所痛心,生平不喜多言,往日曲突徒薪之谋,国人或不尽省记,今则本识途之验,为将死之鸣,愿我国人静听而力行 焉!则余生虽死犹生,九原瞑目矣。国虽微弱,必有复兴直道,亦至简单。 勿因我见而轻起政争,勿尚空谈而不顾实践,勿兴不急之务而浪用民财,勿信过激言行之说而自摇邦本。讲外交者,勿忘巩固国防;司教育者,勿忘 保存国粹;治家者,勿弃国有之礼教;求学者,勿鹜时尚之纷华。 本此八勿,以应万有,所谓自力更生者在此,转弱为强者亦在此矣。余生平不事生产,后人宜体我乐道安贫之意,丧葬力崇节简,殓以居士服,毋以荤腥馈祭。
好一个 勿兴不急之务而浪用民财

引自:时寒冰 -- 腾讯博客 http://shihanbing.qzone.qq.com
posted @ 2010-01-08 11:31 猪 阅读(236) | 评论 (0)编辑 收藏

java.lang.InstantiationException

在Struts creating form bean的时候遇到这个异常

在form bean 中加一个无参的构造函数就Ok了

posted @ 2009-12-29 12:19 猪 阅读(616) | 评论 (0)编辑 收藏

惊闻诸如赶集网\263这类网站上的租房信息都被中介代理买断了,只有他们能看到,天理何在阿
在这发一个,气死我了

自己的房子出租

房屋信息:出租西三旗桥东南角常秀家园南北通透三居住房一套,面积80平米,6层的6层。三室为正规三室无隔断,主卧朝阳20平左右,有阳台,2次卧朝北面积10平左右。
房屋装修为中装,新刷白墙,房间整洁干净,设施齐全。天然气入户,电热水器,上网方便。
房屋周边信息:小区周边交通设施方便,有二十几趟公交车,下楼小区门口就有运通103、运通109、运通118三趟公交始发。
离小区步行5分钟的公交站有919、307、315、345、379、393、398、407、618、625、670、629、753、810、819、运通117等N趟四通八达
的公交车,其中的919大站快车,919区间等八达岭高速的直达车,在上班高峰时间直达三环马甸只需不到半小时时间。919大站
快车一站直达起家豁子(换乘10号线地铁)3站德胜门站(换乘地铁2号线)。小区离13号线城铁龙泽站仅2站地公交。周边商业圈发达并正在迅速崛起中,购物及吃饭都很方便
,京客隆、超市发、肯德基、烤鸭店、老家肉饼、苏宁电器、购物中心、24小时药店……环绕周边应有尽有。
出租条件:房屋觅有正当职业,无不良嗜好的有为青年出租,希望生活习惯良好,收入稳定,长期出租,可整租也可单租,全天看房。中介勿扰,谢谢~
联系方式:13810428318 QQ 122088025

做编程的劳苦兄弟优惠


这有图
http://beijing.koubei.com/fang/detail-rent-r38c4e1aede9546588a7150079255ec2d.html
posted @ 2009-12-02 14:15 猪 阅读(201) | 评论 (0)编辑 收藏

request.getInputStream() 和 request.getReader()不能同时调用,否则会引发java.lang.IllegalStateException异常。

API中有写:

getInputStream

public ServletInputStream getInputStream()
throws java.io.IOException
Retrieves the body of the request as binary data using a ServletInputStream. Either this method or getReader() may be called to read the body, not both.
Returns:
a ServletInputStream object containing the body of the request
Throws:
java.lang.IllegalStateException - if the getReader() method has already been called for this request
java.io.IOException - if an input or output exception occurred
posted @ 2009-10-19 13:48 猪 阅读(3041) | 评论 (0)编辑 收藏

eclipse中如果选中一个变量,则在本源文件中高亮显示相同的变量

Window->Preferences,在type filter text 中输入Mark Occurrences

在Java-Editor-Mark Occurrences中将Mark occurrences of the selected element in the current file.选中OK即可

posted @ 2009-10-17 20:41 猪 阅读(1333) | 评论 (0)编辑 收藏
下午头儿出去了,这周一口气粘帖复制了14个Action20个jsp,没什么技术含量,完全是粘帖复制,我在等待什么?
posted @ 2009-10-17 20:40 猪 阅读(195) | 评论 (0)编辑 收藏

工作快三年了,一直没有用到spring,做的几个项目全部基于struts+hibernate,昨天忙完手头的活儿,自己建了个struts+spring+hibernate的demo,能用MyEclipse自动生成的全部自动生成,表映射、pojo、SessionFactory、applicationContext.xml、struts-config.xml都自动生成了,弄了两个jsp,一个add,一个view

运行发现,spring未被加载,原因找来找去找不到,最后还是看了以前写的一篇blog,可能存在重复jar包,有冲突,确实发现Myeclipse自动键入的jar包好多好多,而且有的有重复,捣鼓出以前做的例子,复制lib里面的jar包,果然OK了,实现了增查。

spring确实是个好东西,强大、强大。

Google SSH整合的例子,发现都是Struts2SpringHibernate了,俺还struts1呢,out了

posted @ 2009-10-17 20:39 猪 阅读(304) | 评论 (0)编辑 收藏
转自:http://pengjiayou.com/blog/fedora-10-auto-install-scripts
easyLife 是另一款和 autoten 类似的软件,是刚刚才发现的,不过其官方网站打不开,需翻墙解决,我找到了它的下载页面,在 sf.net 上,请直接点击这里下载最新的 easylife-1.1-1.fc10.noarch.rpm 。

easyLife 允许你配置 Fedora 10 的各软件,只需用鼠标点击就搞定了!它的主要特性如下:

  • 为你系统中的常规用户添加 sudo 命令
  • 自动安装 Flash Player 插件
  • 安装各种 Codecs (视频、音频解码库等)
  • 安装额外字体
  • 安装 Livna 软件仓库以安装其它额外及非免费软件
  • 安装 Skype
  • 为 Firefox 安装 Sun Java 和 Sun Java Plugin 插件
  • 用 system-switch-java 整合 Sun Java
  • 安装 Adobe Raeder
  • 安装其他软件等
用esayLife安装来Flash Player 挺好用,真的是省了很多事,可能对我这个Linux初学者不是啥好事
posted @ 2009-10-16 17:56 猪 阅读(275) | 评论 (0)编辑 收藏
google app engine对String长度有限制,里面中有个com.google.appengine.api.datastore.Text类型以替换长String,但是换了com.google.appengine.api.datastore.Text后不能向数据库保存了,就单单这个字段不能保存,看数据库列中就没有这个字段,google中找到 说要在字段前加@Enumerated,但是在我这也不好使,后来又找到要加
@Persistent(serialized="true", defaultFetchGroup="true") 
    private Text text;
//    private String text;
恩,这下好使了
posted @ 2009-10-16 17:54 猪 阅读(482) | 评论 (1)编辑 收藏
开发中遇到这个异常:
NestedThrowablesStackTrace:
Attempt was made to manually set the id component of a Key primary key. If you want to control the value of the primary key, set the name component instead.
org.datanucleus.exceptions.NucleusUserException: Attempt was made to manually set the id component of a Key primary key. If you want to control the value of the primary key, set the name component instead.


原来的修改代码是这样些的:
public void attachDirty(UrlTarget instance) {
        PersistenceManager pm = null;
        try {
           
            pm = PMF.get().getPersistenceManager();
            UrlTarget ut = (UrlTarget) pm.getObjectById(UrlTarget.class, instance.getId());
            ut.setName(instance.getName());
            ut.setRemark(instance.getRemark());
            ut.setUrl(instance.getUrl());
           pm.makePersistent(ut);
        } catch(Exception ex){
            ex.printStackTrace();
        }finally {
            if(pm != null)pm.close();
        }
       
    }

public UrlTarget findById(Long id) {
        PersistenceManager pm = PMF.get().getPersistenceManager();
        try{
            return (UrlTarget) pm.getObjectById(UrlTarget.class, id);
        }catch(Exception ex){
            ex.printStackTrace();
        }finally {
            pm.close();
        }
        return null;
    }
在利用findById方法得到对象后修改,但是findById中pm已经关闭,这就是错误的原因了
posted @ 2009-10-14 18:01 猪 阅读(408) | 评论 (0)编辑 收藏

来自http://net.zdnet.com.cn/network_security_zone/2008/0519/869835.shtml

一.简介

vi是unix世界中最通用的全屏编辑器,linux中是用的是vi的加强版vim,vim同vi完全兼容,vi就是"visual interface"的缩写。它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制,这是其它编辑程序所没 有的。

  vi不是一个排版程序,它不象Word或WPS那样可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。

  vi没有菜单,只有命令,且命令繁多。只要在命令行上键入vi就可进入vi的编辑环境。vi有三种状态:命令模式,文本输入模式和末行模式。键入vi回车后首先进入vi的命令模式。

在命令模式下用户输入的任何字符都被Vi当作命令加以解释执行,如果用户要将输入的字符当作是文本内容时,则首先应将Vi的工作模式从命令模式切换到文 本输入模式。在命令模式下,按一下"a"("A")键或者”i” ("I")或者"o"("O")键,即进入插入态文本输入模式。按"a"键,插入到当前光标的后面;按"i"键,在当前光标处插入;按"A"键,在当前光 标所在行的最后插入;按"I"键,在当前光标所在行的开头插入。在文本输入模式下,按Esc键,即回到命令模式。

末行模式也称ex转义模式。Vi有一个专门的“转义”命令,可访问很多面向行的Ex命令。在命令模式下,用户按“:”键即可进入末行模式下,此时Vi会 在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个“:”作为末行模式的提示符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编 辑缓冲区的内容写到文件中等)。末行命令执行完后,Vi自动回到命令模式。

  例如:

  :1,$s /A/a/g

  则从文件第一行至文件尾将大写A全部替换成小写a。

  若在末行模式下输入命令过程中想转换的到命令模式,可按键,或用退格键将输入的命令全部删除之后,再按一下退格键,即可使Vi回到命令模式下。

  如果要从命令模式转换到编辑模式,可以键入命令a或者i;如果需要从文本模式返回,则按Esc键即可。在命令模式下输入“:”即可切换到末行模式,然后输入命令。

Vi中的许多命令都要用到行号及行数等数值。若编辑的文件较大时,自己去数是非常不方便的。为此Vi提供了给文本加行号的功能。这些行号显示在屏幕的左 边,而相应行的内容则显示在行号之后。 需要说明的是,这里加的行号只是显示给用户看的,它们并不是文件内容的一部分。

  当用Vi建立一个新文件时,在进入Vi的命令中也可以不给出文件名,当编辑完文件需要保存数据时,再由用户指定文件名。

进入Vi时,用户不仅可以指定一个待编辑的文件名,而且还有许多附加操作。如果希望在进入Vi之后,光标处于文件中特定的某行上,可在Vi后加上任选 项+n,其中n为指定的行数。例如 键入命令:vi +3 example.txt后,光标将位于文件example.txt中的第3行上。

  二.vi常用的命令

  1.插入(Insert)命令

  Vi提供了两个插入命令:i 和 I命令

  (1)i命令

  插入文本从光标所在位置前开始,并且插入过程中可以使用键删除错误的输入。此时Vi处于插入状态,屏幕最下行显示“--INSERT--”(插入)字样。

  例1,有一正在编辑的文件,如下所示:

  Welcome to vi world!Come on!

  ~

  ~

  光标位于第一个“!”上,需在其前面插入:

  This is an example!

  使用i命令,并输入相应文本后,屏幕显示如下:

  Welcome to vi world This is an example!!Come on!

  ~

  ~

  由此例可以看到,光标本来是在第一个“!”处,但是由于是从光标所在位置前开始插入,所以这个“!”就被挤到了新插入的文本之后。

  (2)I命令

  该命令是将光标移到当前行的行首,然后在其前插入文本.

  2.光标移动操作在屏幕上移动

全屏幕文本编辑器中,光标的移动操作无疑是最经常使用的操作了。用户只有熟练地使用移动光标的这些命令,才能迅速准确地到达所期望的位置处进行编辑。

Vi中的光标移动既可以在命令模式下,也可以在文本输入模式下,但操作的方法不尽相同。

(1)在文本输入模式下,可直接使用键盘上的四个方向键移动光标。

(2)在命令模式下,有很多移动光标的方法。不但可以使用四个方向键来移动光标,还可以用h、j、k、l这四个键代替四个方向键来移动光标,这样可以避免 由于不同机器上的不同键盘定义所带来的矛盾,而且使用熟练后可以手不离开字母键盘位置就能完成所有操作,从而提高工作效率。

3.在屏幕上移动

Vi提供了三个关于光标在全屏幕上移动并且文件本身不发生滚动的命令。它们分别是H、M和L命令。

(1)H命令

该命令将光标移至屏幕首行的行首(即左上角),也就是当前屏幕的第一行,而不是整个文件的第一行。利用此命令可以快速将光标移至屏幕顶部。若在H命令之前 加上数字n,则将光标移至第n行的行首。值得一提的是,使用命令dH将会删除从光标当前所在行至所显示屏幕首行的全部内容。

(2)M命令

该命令将光标移至屏幕显示文件的中间行的行首。即如果当前屏幕已经充满,则移动到整个屏幕的中间行;如果并未充满,则移动到文本的那些行的中间行。利用此 命令可以快速地将光标从屏幕的任意位置移至屏幕显示文件的中间行的行首。例如,在上面屏幕显示的情况下(不论光标在屏幕的何处),在命令模式下,输入命令 M之后,光标都将移到add这一行的字母a上。同样值得一提的是,使用命令dM将会删除从光标当前所在行至屏幕显示文件的中间行的全部内容。

(3)L命令

当文件显示内容超过一屏时,该命令将光标移至屏幕上的最底行的行首;当文件显示内容不足一屏时,该命令将光标移至文件的最后一行的行首。可见,利用此命令 可以快速准确地将光标移至屏幕底部或文件的最后一行。若在L命令之前加上数字n,则将光标移至从屏幕底部算起第n行的行首。同样值得一提的是,使用命令 dL将会删除从光标当前行至屏幕底行的全部内容。

4.编辑命令

让我们看看最简单也是最常用的编辑过程:没有人不犯错误。所以迟早你会碰到修改你输入的文本的时候。实际上花在字处理上的大多数时间是修改而不是输入新的东西。因此,你要知道如何方便地修改就很重要。

(1)x--删除一个字符

删除文字的最简单的方式是用x。这个命令的结果是光标所处的字符的消失,后面的文字左移动。如果你删除的字符是一行最后的一个字符,那么光标将向左移动一个,这样光标就不会停留在不存在的字符的下面了。假如没有任何文字了,喇叭就叫。

(2)d--删除对象

这个命令的右边还要有一定的文字对象。文字对象就是一块文字。他右边接的就是在控制光标移动的那些字符。例如 w 表示向前一个单词,那么 dw 将删除下一个单词。5w 表示前进5个单词,那么 d5w 将删除他们。

(3)dd--删除一行

最常用的 d 系列命令之一。和前面一样, 5dd 将删除 5 行

(4)D--整个删除

大写形式的 D 用来删除从光标到行尾。和 d$ 一样效果。

(5)u--恢复

要后悔吗?他不仅仅撤消删除,还撤消你所有的编辑工作。

(6).--重复

重复编辑工作。

5.退出Vi

当编辑完文件,准备退出Vi返回到shell时,可以使用以下几种方法之一。

(1)在命令模式中,连按两次大写字母Z,若当前编辑的文件曾被修改过,则Vi保存该文件后退出,返回到shell;若当前编辑的文件没被修改过,则Vi直接退出, 返回到shell。

(2)在末行模式下,输入命令 :w Vi保存当前编辑文件,但并不退出,而是继续等待用户输入命令。在使用w命令时,可以再给编辑文件起一个新的文件名。

例如:w newfile

此时Vi将把当前文件的内容保存到指定的newfile中,而原有文件保持不变。若newfile是一个已存在的文件,则Vi在显示窗口的状态行给出提示信息:

File exists (use ! to override)

此时,若用户真的希望用文件的当前内容替换newfile中原有内容,可使用命令

:w! newfile

否则可选择另外的文件名来保存当前文件。

(3)在末行模式下,输入命令 :q 系统退出Vi返回到shell。若在用此命令退出Vi时,编辑文件没有被保存,则Vi在显示窗口的最末行显示如下信息:

No write since last change (use ! to overrides)

提示用户该文件被修改后没有保存,然后Vi并不退出,继续等待用户命令。若用户就是不想保存被修改后的文件而要强行退出Vi时,可使用命令:q! Vi放弃所作修改而直接退到shell下。

(4)在末行模式下,输入命令 :wq Vi将先保存文件,然后退出Vi返回到shell。

(5)在末行模式下,输入命令 :x 该命令的功能同命令模式下的ZZ命令功能相同。

来自:http://net.zdnet.com.cn/network_security_zone/2008/0519/869835.shtml

posted @ 2009-10-14 17:54 猪 阅读(253) | 评论 (0)编辑 收藏
posted @ 2009-08-05 10:00 猪 阅读(1350) | 评论 (4)编辑 收藏
因为最近比较闲 有点不思进取 也没什么问题要写了
今天不错,发现一个,恩,感觉不错
做了一个上传Excel并解析数据然后入库的功能,里面涉及到是否是日期格式的判断
之前是这么写的(深谙这么写是不好的,但以为它是可靠的)

private boolean checkDate(String content) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            sdf.parse(content);
            return true;
        } catch (Exception e){
            return false;
        }
    }

现在发现问题了,对于“2008-06-23asdf”这种情况是返回true的,哈哈,看来是孤陋寡闻了,基础不扎实了,看API上这样讲:

在默认情况下,进行的分析是不严格的:如果输入的形式不是此对象的格式化方法使用的形式,但仍可作为日期进行分析,则分析将获得成功。客户机可能通过调用 setLenient(false) 来强调严格遵守该格式。


按照API说法,将代码改成
private boolean checkDate(String content) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            sdf. setLenient(false);
            sdf.parse(content);
            return true;
        } catch (Exception e){
            return false;
        }
    }

运行结果“2008-06-23asdf”这种情况还是返回true的,但“2008-13-23”这种情况是返回false的
最后改进程这种写法,可以适应"yyyy-MM-dd""yyyy-M-d""yyyy-MM-d""yyyy-M-dd"

private boolean checkDate(String content) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
        try {
            sdf.setLenient(false);
            content = content.replaceAll("-0", "-");
            Date d = sdf.parse(content);
            String s = sdf.format(d);
            return content.equals(s);
        } catch (Exception e){
            return false;
        }
    }

参考资料http://www.99inf.net/SoftwareDev/Java/52734.htm
              http://blog.163.com/everlee@126/blog/static/263574220089822631229/

当然也可以用正则表达式做到。
posted @ 2009-07-13 17:11 猪 阅读(2169) | 评论 (1)编辑 收藏
昨天就发现这个问题,用firefox没问题,我的chrome谷歌浏览器是3.0.182.3
提示 yahoo邮箱无法加载
按照提示 清楚缓存也没有用


Yahoo! 邮箱无法加载

Loading Yahoo! Mail failed due to a client side error

您可以尝试对您的防火墙进行设置,并且禁用“屏蔽广告”。如果这个方法仍不凑效,请联系我们的客服

posted @ 2009-06-03 12:26 猪 阅读(811) | 评论 (1)编辑 收藏
建一个文本文件,命名为proxy.pac
用文本编辑器打开 输入:
function FindProxyForURL(url,host){ if(dnsDomainIs(host, ".blogspot.com")){ return "PROXY google.cn:80"; } }

保存后,在FireFox-工具-选项-高级-网络选项卡-设置-选自动代理配置URL ,在文本框中输入file:///C:/proxy.pac
OK,可以访问blogger了。

别的代理
https://soproxy.appspot.com/
http://proxy-12345.appspot.com/
posted @ 2009-06-03 12:26 猪 阅读(597) | 评论 (0)编辑 收藏
posted @ 2009-06-03 12:25 猪 阅读(504) | 评论 (0)编辑 收藏
貌似已经跟我没啥关系的六一儿童节,忙活了一天,签字画押,我勇敢的加入房奴大军了...
一下子从小康生活回归到了解放前,呜呜~~~~(>_<)~~~~
拿着一大堆票据、一大把钥匙回到家倒头便睡,累死了
预祝房奴生活开开心心。
posted @ 2009-06-03 12:25 猪 阅读(207) | 评论 (0)编辑 收藏
想参考一下roller的设计思路,遂又捡起roller,刚开始是看roller4.0,磨叽了半天时间,因为对struts2不熟悉,转而搞了个 roller3.0,还好都运行起来了,之中发现下载的源码竟然不全,如果不引用roller的jar包的话会报错,缺几个package里的类,累的我 还要反编译,不知道我是走弯路了还是怎么着,总算运行起来了,改了log4j的配置让日志在控制台输出,昨晚下班刚弄到这儿,接着捣鼓
posted @ 2009-06-03 12:24 猪 阅读(241) | 评论 (0)编辑 收藏
突然想起来写blog也好长时间了,可以追溯到3年前,一开始是在msn space,后来搬家到baidu,那时候对baidu还是很支持的,后来感觉baidu进步有点慢啊,完了还出来一些绯闻
接着就有些不安分了,到处搬家哈哈,csdn、javaeye、博客大巴、yo2、blogjava、blogger,哦天,真的不少,现在csdn、 javaeye、博客大巴、yo2已经荒了,blogger这几天还被和谐了很郁闷,就剩blogjava和baidu了,现在在捣鼓在GAE上弄个java写的blog,已经糊弄上去了,凑合能添加文章,一有空就修改一下代码往上面更新一下,现在在研究怎么静态化和上传图片
posted @ 2009-06-03 12:24 猪 阅读(217) | 评论 (0)编辑 收藏
好几天了,发现无法打开我的google blogger,难道被传说中的和谐了?!我刚刚搬家到blogger啊,还没玩儿几天呢
posted @ 2009-06-03 12:23 猪 阅读(417) | 评论 (1)编辑 收藏
private void buttonToExcel_Click(object sender, EventArgs e)
{

    SaveFileDialog saveFileDialog = new SaveFileDialog();
    saveFileDialog.Filter = "Execl files (*.xls)|*.xls";
    saveFileDialog.FilterIndex = 0;
    saveFileDialog.RestoreDirectory = true;
    saveFileDialog.CreatePrompt = true;
    saveFileDialog.Title = "Export Excel File To";
    saveFileDialog.ShowDialog();
    Stream myStream;
    myStream = saveFileDialog.OpenFile();
    StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));
    string str = "";
    try
    {
        //写标题
        for (int i = 0; i < this.dataGridView3.ColumnCount; i++)
        {
            if (i > 0)
            {
                str += "\t";
            }

            str += this.dataGridView3.Columns[i].HeaderText;
        }
        sw.WriteLine(str);
        //写内容
        for (int j = 0; j < this.dataGridView3.Rows.Count; j++)
        {
            string tempStr = "";
            for (int k = 0; k < this.dataGridView3.Columns.Count; k++)
            {
                if (k > 0)
                {
                    tempStr += "\t";
                }
                tempStr += this.dataGridView3.Rows[j].Cells[k].Value + "";
            }
            sw.WriteLine(tempStr);
        }

        sw.Close();
        myStream.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }

    finally
    {
        sw.Close();
        myStream.Close();
    }    
    MessageBox.Show("OK");
}
posted @ 2009-06-03 12:23 猪 阅读(1145) | 评论 (0)编辑 收藏
今早看到一则新闻:出处http://www.infoq.com/cn/news/2009/05/vs2010-beta1
昨日,Soma在其博客上宣布Visual Studio 2010和.NET 4.0的Beta 1已经可以通过MSDN订阅下载了。
过去的几个月里,我们已经初步了解了Visual Studio 2010和.NET 4.0的一系列新特性。和上次发布的CTP版本不同,这次的Beta 1是以安装包形式发布的,而非VPC镜像。这样我们就可以自己下载安装,一睹为快了,不过大家最好还是安装到虚拟机中。
在Visual Studio 2010的产品站点上,我们可以了解到VS 2010给我们带来的革新:
  • 加强的用户体验:VS2010带来了新用户界面,让工作更专注。
  • 便捷的SharePoint开发:对SharePoint开发更完善的支持,让SharePoint开发不再痛苦。
  • 应用程序生命周期管理(ALM):把项目角色更紧密地集成到整个应用程序生命周期中。
  • 更佳的Web应用开发:对JavaScript的加强,Silverlight开发的完整支持,更容易部署。
  • 云应用程序开发:集成Azure开发包,无缝进行云应用程序的开发。
  • 数据库支持:对IBM DB2和Oracle更好的支持。
  • 并行编程:从运行时到IDE都对并行编程提供了很好的支持。
  • 更高的生产力:代码上下文可帮助理解现存代码,对C++开发体验的提升,Windows 7的支持,Office开发支持的加强。
下面一些有用的链接,可让大家获取更多关于Visual Studio 2010和.NET 4.0的信息:PressPass:Visual Studio 2010公开 eWeek:Quest Tool for Oracle Database Developers InformationWeek:微软详述了Visual Studio 2010和.NET 4.0 Channel 9:Visual Studio 2010 来自Jono Wells的Twitter更新

我开始接触.net是Visual Studio 2003和.net1.1,不由感叹技术更新之快,之后微软出了很多新名词:WPF、WCF、Silverlight、Linq等等,真是抓瞎了,学不过来,现在都2010了
posted @ 2009-06-03 12:22 猪 阅读(256) | 评论 (0)编辑 收藏
经常遇到javascript 缺少对象的错误,无外乎调用的js方法未定义,名字写错了,之类,今儿遇到的郁闷的
我在页面中加了一个注释 ,注意结束标签--和>之间有个空格,结果未起作用,结果可想而知,找了半天才找到
posted @ 2009-04-23 20:39 猪 阅读(3242) | 评论 (1)编辑 收藏
通过简单修改,将blogger原有标签widget改成标签云形式
修改html模板
找到
<b:loop values='data:labels' var='label'>
..........
</b:loop>
<b:loop>标签之间的内容改成:
<b:if cond='data:blog.url == data:label.url'>
  <span expr:dir='data:blog.languageDirection'>
    <font expr:size='data:label.count'><data:label.name/></font>
  </span>
<b:else/>
  <a expr:dir='data:blog.languageDirection' expr:href='data:label.url'>
    <font expr:size='data:label.count'><data:label.name/></font>
  </a>
</b:if>
<span dir='ltr'>(<data:label.count/>)</span>
OK啦 看看效果吧
posted @ 2009-04-22 15:45 猪 阅读(294) | 评论 (0)编辑 收藏
早就注意到google blogger 首页文章不能只显示摘要,而是全部显示
google了几个网页提供的方法,官方的方式是在文章中加一个span,让当在首页显示时span隐藏,这种方式只适合以后新增文章,以前的旧文章均没有加入这个span,就不好使
想到blogger这么高度自定义,那么用jquery实现吧
经过一个晚上的实验,终于出结果了

修改html模板,在<head>下面加入
<b:if cond='data:blog.pageType != "item"'>
   <script src='http://www.google.com/jsapi'/>
       <script type='text/javascript'>
            google.load('jquery', '1.3.2');
       </script>
       <script language='javascript' src='http://www.reindel.com/truncate/jquery.truncate.js' type='text/javascript'/>
       <script type='text/javascript'>
       $(function() {
           $("div[class='post-body entry-content']").truncate( 500, {
               chars: /\s/,
               trail: [ " ( <a href='#' class='truncate_show'>more</a> . . . )", " ( . . . <a href='#' class='truncate_hide'>less</a> )" ]
           });
       });
       </script>
       </b:if>

经测试,IE7中会提示:是否停止运行脚本?此页面的脚本造成Internet Explorer 运行速度减慢,如果继续运行,您的计算机将可能停止响应

这个.truncate的第一个参数设的大小也有关系,这里设了500

在FireFox3和Google Chrome中没有什么提示,速度还挺快,但会有显示问题,因为应用的jquery.truncate框架有浏览器兼容问题

posted @ 2009-04-22 12:49 猪 阅读(461) | 评论 (0)编辑 收藏
    截止到今天下午,中午把自己的应用部署到了Google app engine,用了一周的时间啊,真是费劲周折
    好长时间了,听说Google出了个Google App Engine - Google Code,说是可以让用户上传自己的应用,但是只支持python,当时就想什么

时候支持java啦啊,上个月看新闻就听说Google app engine 要开始支持java啦,哈哈,喜,到时候把我的写的blog传上去,哈哈
    上周,终于知道了Google app engine终于开始宣布支持java了,哈哈呼呼,动手,到官网一看,没有支持java的动静啊,

对,英文页面,哈哈,看来中文的还是慢一拍啊
    首先到注册一个,竟然还要手机号发注册码,Google了一下 说在手机号前加 86就OK了,填上手机号点按钮,呦,短信马

上就来啦,搞定,注册成功。
    这下下载SDK,还有eclipse插件,帮助文档只有英文的,配合Google工具栏的翻译功能,基本能看懂,哈哈,感觉一路下

来,英语水平有所上升啊,哈哈
    打开eclipse,装上插件,很轻松的建了第一个应用,插件自动生成了一个小实例,部署上去,惊叹于Google的GWT
    开始一直我原来写的blog程序,原来到处找免费的空间,jsp的空间不好找,先是找了http://www.eatj.com/,但是没24小

时(好像是)就会自动停止,必须手动重启服务,原来还坚持去上去看看,后来终于因为有一次很忙时间太长被注销了,接下来就听

说了http://www.stax.net/,跟Google的路子差不多,好像还更自定义些,继续使用着,搞java朋友可以去看看
    因为google app engine使用Google Account,原来的用户管理模块需要剔除,原来数据库使用的是mysql hibernate,现在

Google 使用JDO,数据库被封装了,还好,当初设计是采用了工厂模式,实现了数据库访问模块与业务处理模块的松耦合,很容易

配置数据库访问模块的更改,感受到好的设计真是为以后修改省很多事啊。
    接着说部署我的Google app engine,终于改好相关代码,准备上传了,噩梦开始了
    1、Unable to upload:
java.lang.IllegalStateException: cannot find javac executable based on java.home, tried “D:\Java\jdk1.6.0_13

\jre\bin\javac.exe” and “D:\Java\bin\javac.exe”
参考http://zhuyx808.javaeye.com/blog/370124
http://onlypython.group.javaeye.com/group/blog/366471
http://618119.com/archives/2009/04/12/148.html
    2、决定转战Linux..
    手上有四个版本的Linux,Ubuntu,Redhat,Fedora,openSUSE,都装过,后来感觉还是Fedora比较好用,我装的是

Fedora9,Fedora10正在下载中

以下Linux安装配置,仅限于在Fedora9上安装通过,资料都是通过Google搜索得来,感谢各位网友,网络的力量真是强大。

1、在VMware中装上Fedora9后,首先安装VMware-tools,方便与主机交互

首先需要下载相应的kernel-devel.rpm包进行安装
首先查看内核版本:uname -r一下,我的是2.6.25-14.fc9.i686,

所以下载kernel-devel-2.6.25-14.fc9.i686.rpm,然后运行rpm -ivh kernel-devel-2.6.25-14.fc9.i686.rpm 进行安装. 内核安

装完毕后,需要用这个命令确定内核 C header 的安装目录:ls -d /usr/src/kernels/$(uname -r)*/include

安装内核具体步骤如下:

[root@localhost ~]# uname -r
2.6.25-14.fc9.i686
[root@localhost ~]# rpm -q kernel-devel
package kernel-devel is not installed
[root@localhost ~]# cd /home
[root@localhost home]# wget ftp://rpmfind.net/linux/fedora/releases/9/Everything/i386/os/Packages/kernel-devel-

2.6.25-14.fc9.i686.rpm
[root@localhost home]# rpm -i kernel-devel-2.6.25-14.fc9.i686.rpm
[root@localhost home]# rpm -q kernel-devel
kernel-devel-2.6.25-14.fc9.i686

再安装gcc,否则安装VMware-tools时会提示:Setup is unable to find the "gcc" program on your machine. Please make

sure it
is installed. Do you want to specify the location of this program by hand?
[yes]

What is the location of the "gcc" program on your machine?

在命令行执行:yum install gcc


然后安装VMware Tools就行了,打开菜单“VM -> Install VMware Tools”,然后有光盘自动弹出,把里面的源代码拷贝出来.我的文

件是VMwareTools-6.5.0-xxxxx.tar.gz,我把它拷贝到/opt里.

安装 VMware TOOLS

          cd /opt

          tar -zxvf VMwareTools-6.5.0-xxxxx.tar.gz

          cd vmware-tools-distrib/

          ./vmware-install.pl

再一路安回车OK


2、由于在装载xorg-x11-drv-vmmouse驱动时的一个bug,在客户虚拟机的显示中,鼠标位置可能不正确。直到被更新前,在客户机

中添加Option NoAutoAddDevices到/etc/X11/xorg.conf文件的ServerFlags节中。如果需要,创建这个节:

Section "ServerFlags"
        Option      "NoAutoAddDevices"
EndSection


3、第一,安装JDK
第一,到http://java.sun.com下载最新JDK,当前本人下载的是jdk1.6.0_02!下载文件:jdk-6u2-linux-i586-rpm.bin.注意是

rpm.bin的!

第二,给下载回来的文件增加执行权限:chmod 755 jdk-6u2-linux-i586-rpm.bin.

第三,执行文件:./jdk-6u2-linux-i586-rpm.bin.

第四,执行文件产生一个rpm文件,可直接双击执行也可以在shell下执行:rpm -ivh jdk-6u2-linux-i586-rpm.

第五:配置环境变量,环境变量配置可在全局文件/etc/profile下修改,这样所有linux系统的用户都可以用JDK,如果只是特定的

用户用可修改/root/.bashrc文件,本人的修改为:

#java set
set JAVA_HOME=/usr/java/jdk1.6.0_02
export JAVA_HOME
export JRE_HOME=/usr/java/jre1.6.0_02
set JAVA_BIN=/usr/java/jre1.6.0_02
export JAVA_BIN

第五,当环境变量修改完后,重起系统,在shell下输入java,看是否输入相关JAVA帮助信息,如果有,说明已经安装成功!如果没有,

检查一下变量环境设置是否有误!

2,安装Eclipse,Eclipse不需要安装,只要解压缩就行了

运行Google app Engine不需要Tomcat
3,安装tomcat的方法跟安装eclipse的一样,也是下一个tar.gz的文件按安装eclipse方法和步骤就行了!进入tomcat/bin

下./startup.sh,如果在shell出现jdk的相关信息说明已经安装成功启动了,在firefox下打http://localhost:8080/出现tomcat页就

大成功了!

在以上的安装过程之中,出现了小插曲,就是tomcat找不到JDK,后来我又到JAVA网站下了一个JRE回来安装,并建JRE_HOME,重起

TOMCAT,成功了!


4、运行Google App Engine的应用,提示
** Unable to load Mozilla for hosted mode **
java.lang.UnsatisfiedLinkError:
/home/dhofmann/development/ide/gwt-linux-1.4.61/mozilla-1.7.12/libxpcom.so:
libstdc++.so.5: cannot open shared object file: No such file or directory
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
解决办法:
Search for stdc++5 in synaptic package manager (System->Administration->Synaptic) and then mark and install it. Or

use this console command:
yum install libstdc++.so.5

停止进程命令:
就是kill 比较不错,如果kill不了. 加上-9
如#kill -9 1778
注1778 为进程pid
pid可以通过ps aux|grep 服务名查得


启动Eclipse时,提示错误:

eclipse.buildId=M20090211-1700
java.version=1.6.0
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=linux, ARCH=x86, WS=gtk, NL=zh_CN
Command-line arguments: -os linux -ws gtk -arch x86

!ENTRY org.eclipse.ui.workbench 4 0 2009-04-18 02:12:18.085
!MESSAGE Widget disposed too early!
!STACK 0
java.lang.RuntimeException: Widget disposed too early!
    at org.eclipse.ui.internal.WorkbenchPartReference$1.widgetDisposed(WorkbenchPartReference.java:171)

在网上搜索得知:   
eclipse.ini文件加个参数
-vmargs
-Dorg.eclipse.swt.browser.XULRunnerPath=

在Fedora9中安装拼音输入法
保证Fedora 9联网的状态下
在application->system tools->terminal 应用程序->系统工具->终端
输入
su 回车
提示输入root密码
yum install scim 回车
系统会自动从一个镜uy像站点检索scim,并询问是否下载,选择y
下载完成后输入
yum install scim-pinyin 回车
提示和操作如上
然后输入
scim 回车
(笔者的电脑运行到starting SCIM后就没有反应了,不过没关系这时候可以按ctrl+c中断)
选择Fedora 9
System->Preference->Personal->Input Method
系统->首选项->个人->输入法
选择启用新特性,然后选择里面的SCIM,然后选择配置SCIM,
在进入后的界面中选择Global Set 全局设置,在这里设置激活热键即可,然后重新启动电脑,就可以在Fedora 9下面使用中文输入

法了 虽然有点麻烦 但毕竟fedora等众多linux桌面系统还很年轻,有很多不足之处。

参考资料:
http://www.5dlinux.com/article/6/2007/linux_9042.html
http://zhidao.baidu.com/question/62290384.html
http://www.linuxidc.com/Linux/2008-09/16011.htm
posted @ 2009-04-19 00:32 猪 阅读(6429) | 评论 (6)编辑 收藏
JavaScript写的小游戏 用了jquery

访问地址:http://liuspring315.googlepages.com/

posted @ 2009-04-02 10:56 猪 阅读(635) | 评论 (0)编辑 收藏
备案:
java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode


hibernate查询时报上面的异常,仔细检查hql写的有不对的地方,我就是把逗号,写成点.
posted @ 2009-03-31 13:27 猪 阅读(459) | 评论 (0)编辑 收藏
给你一个日期2009-01-01 00:00:00 获取这个月的最后一天。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date=null;
try {
    date = sdf.parse("2009-12-01 00:00:00");
} catch (ParseException e) {
    e.printStackTrace();
}
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
calendar.set(Calendar.DATE, calendar
        .getActualMaximum(Calendar.DATE));
Date d = calendar.getTime();
System.out.println(sdf.format(d));
posted @ 2009-03-31 13:23 猪 阅读(625) | 评论 (0)编辑 收藏

好久没写了,过了个年,过了七天猪的日子,吃了睡睡了吃中间偶尔看看电视,为假期准备了几个电影都没看,唉:-(忙,上了几天班了,怎么感觉这周过的这么慢呢,刚刚刚周四
昨儿看了一集struts2

总结几点

1、struts.xml中的package标签有个abstract="true"属性,如果为true,则这个package中不能有<action>标签,为true表示这个package为一个抽象package,就像java中的接口中不能有方法实现似的。

2、package标签还有个namespace属性,它关系到这个package中的action访问路径,默认是"",比如

<package name= "capinfo" extends= "struts-default" namespace="/hello">
<action name= "HelloWorld"
class= "com.capinfo.struts2.action.HelloWordAction" >
<result>/HelloWorld.jsp</result>
</action>
</package>

则jsp中则应为<form action="/hello/HelloWorld.action" method="post">,如果没有找到hello/HelloWorld.action则会寻找namespace为""的,也就是HelloWorld.action,如果再没有,就会抛出异常。

3、在struts1中可以有多个struts-config.xml的文件,只要在web.xml配置org.apache.struts.action.ActionServlet时加到config参数中,以逗号分隔,在struts2中也可以有多个struts.xml形式的文件,这次不需要修改web.xml了,在struts.xml中添加诸如
<include file=""/>就Ok了

4、关于struts各种参数的配置信息位于struts2-core.jar/org.apache.struts2/default.properties中,如果要修改里面的配置,有两种方式,一是在struts.xml中配置,例如<constant name="struts.devMode" value="true" />,二是在classess中建一个struts.properties,在里面配置比如struts.i18n.encoding=GBK,在struts2-core.jar/org.apache.struts2/default.properties中有一下这句注释,说明了struts.properties将覆盖default.properties中的配置

### Struts default properties
###(can be overridden by a struts.properties file in the root of the classpath)
###

就总结这么些先。

posted @ 2009-02-05 13:40 猪 阅读(312) | 评论 (0)编辑 收藏
前两天实践了关于拦截器的具体实现,说实话关于底层实现还没有看明白,看jdk的源码中的
public static Class<?> getProxyClass(ClassLoader loader,Class<?>... interfaces)
方法,好长啊
迂回一下,今儿看struts2的具体拦截器Interceptor怎么配置
配置可比自己写实现拦截器容易多了
1、首先写一个拦截器类,拦截器类有两只写法(目前俺知道的)
一种是显示com.opensymphony.xwork2.interceptor.Interceptor接口,com.opensymphony.xwork2.interceptor.Interceptor接口有三个方法destroy()、init()和String intercept(ActionInvocation actionInvocation),跟过滤器差不多
这里指出的是init初始化方法将在容器启动是调用这个方法。
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-15
* Time: 16:34:17
* To change this template use File | Settings | File Templates.
*/
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.ActionInvocation;

public class MyInterceptor implements Interceptor{

    public void destroy() {

    }

    public void init() {

    }

    public String intercept(ActionInvocation actionInvocation) throws Exception {

        System.out.println("test intercept begin");
        String result = actionInvocation.invoke();
        System.out.println("test intercept finish");
        return result;
    }
}

另一种就是继承com.opensymphony.xwork2.interceptor.AbstractInterceptor,这是个抽象类,并实现了com.opensymphony.xwork2.interceptor.Interceptor接口,分别实现了init和destroy方法,但什么都没做,继承AbstractInterceptor后,实现intercept方法就行了,
这里指出的是在intercept方法中执行actionInvocation.invoke();执行所拦截的action中的方法;
2、拦截器写完了剩下就是配置了,这里要用到struts.xml的组织结构<struts>中有<package>包的的概念,包与包之间可以继承extends,就像子类继承父类一样,子类将拥有父类的属性和配置,我们一般都继承extends="struts-default",而struts-default定义在struts2-core.jar 中的struts-default.xml中,struts-default包中定义了很多struts2提供的拦截器和拦截器栈(拦截器栈可以包含多个拦截器或拦截器栈),struts2的好多功能都是实现在这些拦截器中,其中有个<default-interceptor-ref name="defaultStack"/>标签定义了默认的拦截器,如果<action>配置中没有拦截器配置,那就调用默认拦截器,如果有拦截器配置,要么同时加上默认拦截器,要么在自己的package中加入设置默认拦截器的标签。
<package name="capinfo" extends="struts-default">
        <interceptors>
            <interceptor name="myInterceptor" class="com.test.interceptor.MyInterceptor">
            </interceptor>
        </interceptors>
        <action name="HelloWorld"
            class="com.capinfo.struts2.action.HelloWordAction">
            <result>/HelloWorld.jsp</result>
            <interceptor-ref name="myInterceptor"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
 
        <!-- Add your actions here -->
    </package>

posted @ 2009-01-16 16:08 猪 阅读(281) | 评论 (0)编辑 收藏
说是struts2的核心就是拦截器
先看看拦截器的实现
实现拦截器有这么几个东西构成
1、目标对象-将被拦截的对象,这个对象中的方法被调用是将被拦截
要求目标对象面向接口编程,首先要定义接口
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:37:23
* 面向接口编程
* 目标对象的接口
*/
public interface TargetInterface {
    public void doSomething();
}
目标对象实现
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:36:26
* 目标对象
*/
public class Target implements TargetInterface{
    public void doSomething(){
        System.out.println("do something");
    }
}

2、拦截器对象-里面包含在调用目标对象前或后要调用的方法
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:39:32
* 拦截器
*/
public class Interceptor {
    public void before(){
        System.out.println("before");
    }

    public void after(){
        System.out.println("after");
    }
}

3、处理器-处理器决定拦截器如何拦截目标对象
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:41:08
*/
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
* 处理器
* 在这里将目标对象Target和拦截器Interceptor联系在了一起
*/
public class MyHandler implements InvocationHandler{

    /**
     * 目标对象
     * 将来目标对象的方法将被注入interceptor
     */
    private Object object;

    /**
     * 拦截器
     * MyHandler负责将Interceptor这个拦截器注入到传入的目标对象object
     */
    private Interceptor interceptor = new Interceptor();

    public void setObject(Object object){
        this.object = object;
    }

    /**
     * 实现InvocationHandler接口的方法
     * @param o 在其上调用方法的代理实例
     * @param method 对应于在代理实例上调用的接口方法的 Method 实例
     * @param objects 包含传入代理实例上方法调用的参数值的对象数组
     * @return  从代理实例的方法调用返回的值
     * @throws Throwable
     */
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        Object result = null;
        interceptor.before();
        result = method.invoke(object,objects);
        interceptor.after();
        return result;
    }
}

4、代理对象-用于得到目标对象的代理对象
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:50:52
* 代理类
*/
import java.lang.reflect.Proxy;
public class MyProxy {
    /**
     * 返回obj的,处理器为MyHandler的代理对象
     * @param obj 目标对象
     * @return  目标对象的代理对象
     */
    public Object getProxy(Object obj){
        MyHandler myHandler = new MyHandler();
        myHandler.setObject(obj);
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(),myHandler);
    }
}

5、最后客户调用代码
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:55:45
* 客户调用
*/
public class Client {
    public static void main(String[] args){
        //目标对象
        TargetInterface target = new Target();
        //代理对象
        MyProxy myProxy = new MyProxy();
        //通过代理对象得到目标对象的代理
        TargetInterface proxy = (TargetInterface)myProxy.getProxy(target);
        //通过目标对象的代理调用目标对象的方法
        proxy.doSomething();
    }
}

//输出:
//before 
//do something
//after

将自己的理解写了注释,现在只理解到这个程度,像
Proxy.newProxyInstance
里面是怎么实现的,还没深入考究
继续努力

posted @ 2009-01-13 11:26 猪 阅读(283) | 评论 (0)编辑 收藏
关于类型转换还有一种写法:
public class ConverterPoint extends StrutsTypeConverter {

//    @Override
//    public Object convertValue(Map context, Object value, Class toType) {
//        if(Point.class == toType){
//            String[] params = (String[])value;
//            params = params[0].split(",");
//            Point point = new Point();
//            point.setX(Integer.parseInt(params[0]));
//            point.setY(Integer.parseInt(params[1]));
//            return point;
//           
//        }else if(String.class == toType){
//            Point point = (Point)value;
//            return "x=" + point.getX() + ",y=" + point.getY();
//        }
//        return super.convertValue(context, value, toType);
//    }

    @Override
    public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
        String[] params = arg1;//(String[])value;
        params = params[0].split(",");
        Point point = new Point();
        point.setX(Integer.parseInt(params[0]));
        point.setY(Integer.parseInt(params[1]));
        return point;
    }

    @Override
    public String convertToString(Map arg0, Object arg1) {
        Point point = (Point)arg1;
        return "x=" + point.getX() + ",y=" + point.getY();
    }

   
}

原来是继承ognl.DefaultTypeConverter类,现在改成继承org.apache.struts2.util.StrutsTypeConverter类了,看org.apache.struts2.util.StrutsTypeConverter的源码可知道org.apache.struts2.util.StrutsTypeConverter是个抽象类,并实现了ognl.TypeConverter,org.apache.struts2.util.StrutsTypeConverter中有两个要实现的方法一个convertFromString,一个convertToString,看方法名字就知道一个从字符串转换成Object,一个是将Object转换成String,这样好像更加清晰

另外还有一种全局转换的配置,就是建立一个统一的属性文件,文件名为xwork-conversion.properties,与struts.xml位于统一目录下,里面的配置改成了
com.test.struts2.data.Point=com.test.struts2.action.ConverterPoint
意思是所有com.test.struts2.data.Point类型的对象都要通过com.test.struts2.action.ConverterPoint来转换

posted @ 2009-01-08 13:30 猪 阅读(273) | 评论 (0)编辑 收藏

struts2局部类型转换

需求为:在页面的文本框输入一个x、y坐标,之间用","隔开,Action中有一个Point类型的属性,Point类里面有两个字段,分别是x,y,int型,要求当页面提交时将文本框中的字符串转换成Point对象,当Action返回到页面时将Point转换成字符串显示

1、首先做一个jsp用于输入和提交:point.jsp

<s:form action="Converter">
<s:textfield name="point" label="Point"></s:textfield>
<s:textfield name="point.x" label="Point.X"></s:textfield>
<s:textfield name="point.y" label="Point.Y"></s:textfield>
<s:submit label="submit"></s:submit>
</s:form>

2、再建一个用于显示的jsp-converter.jsp

<body>
<s:property value="point"/><br>
<s:property value="point.x"/><br>
<s:property value="point.y"/><br>
</body>

3、Action类 ConverterAction

public class ConverterAction extends ActionSupport{

private Point point;

public Point getPoint() {
return point;
}

public void setPoint(Point point) {
this.point = point;
}

public String execute()throws Exception {
return "success";
}
}

4、struts.xml

<action name="Converter"
class="com.test.struts2.action.ConverterAction">
<result name="success">/converter.jsp</result>
<result name="input">/point.jsp</result>
</action>

5、转换类 ConverterPoint

public class ConverterPoint extends DefaultTypeConverter {

@Override
public Object convertValue(Map context, Object value, Class toType) {
if(Point.class == toType){
String[] params = (String[])value;
params = params[0].split(",");
Point point = new Point();
point.setX(Integer.parseInt(params[0]));
point.setY(Integer.parseInt(params[1]));
return point;

}else if(String.class == toType){
Point point = (Point)value;
return "x=" + point.getX() + ",y=" + point.getY();
}
return super.convertValue(context, value, toType);
}


}

6、配置转换
在ConverterAction 类的同一目录下定义属性文件ConverterAction-conversion.properties,注意文件名,-conversion.properties为固定不变,ConverterAction为Action的名字,文件内容:

point=com.test.struts2.action.ConverterPoint

Ok了,这样就完工了

posted @ 2009-01-05 13:12 猪 阅读(283) | 评论 (0)编辑 收藏

前两天初步认识了一下struts2
今儿看来教程的第二三讲,搞清了一些前面的一些猜测或是疑问
1、struts2是不用<html:...>标签了,统一成了<s:...>
如下这样:
<s:form action="Converter">
<s:textfield name="point" label="Point"></s:textfield>
<s:submit label="submit"></s:submit>
</s:form>
显示效果:

注意到<s:textfield name="point" label="Point"></s:textfield>
中的label属性,它指定了文本框前面显示的内容,还自动加了冒号,哈哈,挺聪明的嘛,但是担心这样在复杂的页面设计中是不是好使。

哦对了,要想这么写,要在页面上方加上这个:<%@ taglib prefix="s" uri="/struts-tags" %>

2、Action
前面说的Action不再需要继承任何struts类,现在看来要失望了,为了方便起见还是建议集成ActionSupport类,目前觉得有用的是ActionSupport中定义了几个static的result name,比如SUCCESS、ERROR,原来的return "success";现在可以写成return super.SUCCESS;,将标识用的字符串常量定义成static的是一直提倡的,还有就是validate()方法,验证有错误可以调用addFieldError()方法,好像就是struts1 ActionForm里的东西,有所改进的是super.addFieldError("username", "username is null");将在页面中显示的效果为:错误信息"username is null"将在名字为"username"文本框的上面显示,这些如果能用ajax实现就好了。
对于Action解耦,可能在于它不再需要HttpServletRequest 、HttpServletResponse这样的容器运行时参数吧

Powered by Zoundry Raven

posted @ 2009-01-05 10:47 猪 阅读(291) | 评论 (0)编辑 收藏
今天第一次感觉到经济危机在我身边了,部门现在没有在做的项目了
经济危机中,赶紧为自己充充电,好到时候柳暗花明又一村,哈哈
学struts2
据说struts2基于webwork,基本上跟struts1没啥关系,如果有webwork的经验上手会很迅速
我没接触过webwork,就知道有这么个东西
今儿开始第一个struts
见过好多blog写有struts2的入门步骤,俺也写一个,为自己造个轮子,加深印象。
首先下载struts2的jar包,到http://struts.apache.org/,右上角有个struts2的链接,今天下到的是
struts2的2.0.14,昨天在javaeye上看到发布Struts2.1.3 发布了,只是主页还没看到,不止一次听大拿们说过不要追求新版本,哈哈
下载后的目录:app--struts的例子
              docs-doc文档
              lib-struts的jar包或依赖包
              src-源码
HelloWorld:

1、index.jsp
  耳目一新的是,不需要用到struts html标签,这只是猜测,或许例子过于简单?今天工作中还感觉struts1的html标签真是不好用,想加个class、maxlength、size都不好使,让我很是郁闷。希望在继续学习中真的能耳目一新。
struts的action惯例后缀名改成了.action,不再像struts1的.do了,说是延续到webwork的惯例。
下面的页面代码submit的时候将提交到login.action
index.jsp
<body>
  <form action="login.action" method="post">
      username:<input type="text" name="username"/>
      password:<input type="password" name="password"/>
      <input type="submit" value="submit"/>
  </form>
</body>
2、Action类
struts2的Action可是大进步,不用再继承任何类,实现了松耦合,它好像将struts1的ActionForm融合了进来,据说struts2不再用ActionForm,页面上对应的字段写在了Action中,struts2框架会自动调用get/set方法,在我印象里struts1中的Action对象不是线程安全的,会在不同线程间重用,所以谨慎在里面定义字段,在这看来struts2的Action不是这样的,只是猜测
package com.mystart.action;

public class LoginAction {

    private String username;
    private String password;
  
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
  
    public String execute() throws Exception{
        return "success";
    }
}

3、jsp、java类都定义了,现在要它们联系起来-struts配置文件
新的struts配置文件有个package包的概念,还没闹明白这个package的详细用法,有待继续深入
<action>标签有变化,type变成了class,path变成了name,struts1中name属性是制定ActionForm的,现在ActionForm没有了
forward变成了result,result的默认name=success

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">


<struts>
    <package name="struts" extends="struts-default">
        <action name="login" class="com.mystart.action.LoginAction">
            <result name="success">/result.jsp</result>
        </action>
    </package>

</struts>

4、最后启动struts2,配置web.xml
struts1的web.xml配置是放在<servlet>中,也就是是一个servlet
struts2变成了一个过滤器Filter
struts1中<url-pattern>被配置成拦截.do的链接
struts2变成了拦截所有链接 /*

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  
  <filter>
      <filter-name>struts2</filter-name>
      <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

以上是驴了个struts的视频教程,今儿看了第一节课,看完后做了一下总结,里面有一些自己的理解,有不对的地方请兄弟们指正,别光光说我是猪,猪也要进步啊,嘿嘿,每一步都有疑问,明天带着问题接着看下一节,睡觉去。
posted @ 2008-12-29 23:06 猪 阅读(2230) | 评论 (6)编辑 收藏
自定义Annotation
早就知道jdk5加了新特性Annotation,但是没研究过,前几天公司培训,有一部分是介绍jdk5新特性的,一个是注解一个泛型
今儿复习一下注解
    //用@Deprecated声明该方法不建议使用
    @Deprecated public void doSomething1(){
        Map map = new HashMap();
        map.put("some", "thing");
        System.out.println(map);
    }
   
    //用@SuppressWarnings声明不再进行类型检查
    @SuppressWarnings(value={"unchecked"})
    public void doSomething2(){
        Map map = new HashMap();
        map.put("some", "thing");
    }


写一个自定义注解先
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//要在运行时使用这个注解,必须声明成RUNTIME
Annotation分为三种级别:RUNTIME、CLASS、SOURCE
@Retention(RetentionPolicy.RUNTIME)
public @interface SomeAnnotation{
    String value();
    String name();
}

下面来使用这个自定义注解:
import java.lang.reflect.Method;
public class AnnotationTest {
   
    @SomeAnnotation(value="value1",name="name1")
    public void doSomething3(){
       
    }
   
    public static void main(String[] args){
   
        Class<AnnotationTest> c = AnnotationTest.class;
        try {
            //利用反射得到方法doSomething3
            Method method = c.getMethod("doSomething3");
            //查找doSomething3方法是否有SomeAnnotation的Annotation
            if(method.isAnnotationPresent(SomeAnnotation.class)){
                System.out.println("找到SomeAnnotation");
                //得到SomeAnnotation
                SomeAnnotation annotation = method.getAnnotation(SomeAnnotation.class);
                System.out.println("annotation.value="+annotation.value());
                System.out.println("annotation.name="+annotation.name());
            }else{
                System.out.println("没有找到omeAnnotation");
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

输出结果:
找到SomeAnnotation
annotation.value=value1
annotation.name=name1
posted @ 2008-12-28 16:47 猪 阅读(3821) | 评论 (6)编辑 收藏

遇到一个郁闷的问题 ,百思不得其解
到这里请大家分析分析

outtable 表中有四条记录 如下图

我按out_scrpno排序,为什么2008-1000不在第一行呢???

同样的问题,如下图

为什么会是2008-999呢 为啥不是2008-1000???

请大家帮忙是啥子原因,多谢,多谢


Powered by Zoundry Raven

ps:问题基本解决,感谢各位提示:

SELECT TOP 1 OUT_SCRPNO FROM OUTTABLE WHERE CHARINDEX('-',OUT_SCRPNO,6) = 0 ORDER BY CONVERT(int,REPLACE(out_scrpno,'-','')) DESC 另好像不该发到首页,请管理员包含,心切
posted @ 2008-12-19 22:00 猪 阅读(1122) | 评论 (7)编辑 收藏

因为要修改一个以前的老项目,老项目用的jdk是1.4版本,遂在项目右键Properties-Java Compiler中将Compiler compliance level 设成了1.4

以为万事大吉了呢,昨晚上因为Integer的一个方法发现了问题

Integer中有个方法valueOf

static Integer valueOf(int i)
返回一个表示指定的 int 值的 Integer 实例。
static Integer valueOf(String s)
返回保持指定的 String 的值的 Integer 对象。
static Integer valueOf(String s, int radix)
返回一个 Integer 对象,该对象中保持了用第二个参数提供的基数进行分析时从指定的 String 中提取的值。

其中valueOf(int i)

从以下版本开始:
1.5

也就是在1.5之前没有这个方法,但是在eclipse中却有这个方法的提示

找了半天,原来问题出在这,在Java Build Path 中Libraries 中jdk是1.5的,把它remove掉,添加一个1.4的就OK了

还是功力不够啊 充电 充电ing

posted @ 2008-12-04 15:02 猪 阅读(4423) | 评论 (1)编辑 收藏

下了个Hibernate视频教程听,虽然一年多以前跟老师学过Hibernate,但现在听听还是有很多收获的,发现自己的知识知道的都是些皮毛,用了很久的东西,知道怎么操作怎么用,但要说说它的所以然,摇摇头,呵呵

根据主键Id得到一个持久对象,Hibernate中有两个方法,一个get,一个load,他们两个参数相同,都返回一个Object

它们的区别:
执行get方法即时生成查询sql去查询数据库得到相应的pojo,如果数据库中没有相应记录,则返回null
执行load方法不会即时产生sql语句,而是在用到返回的对象时采取查询数据库,也就是load方法有默认的延迟加载,在执行load方法后返回的不是一个pojo对象,是pojo对象的一个代理(据说Hibernate是用代理的方式实现延迟加载的,这块还迷糊),如果数据库中没有相应记录,load方法会抛出异常ObjectNotFoundException
看了一下我们用MyEclipse hibernate工具通过数据库生成的DAO类,它的findById方法是用的session.get()方法,这是即时获得pojo对象,如果是load方法,在执行完load后如果关闭了session,那在接下来用到这个pojo对象时恐怕会报session已关闭的错误。
还有就是这两个方法的第二个参数id,它必须是实现了java.io.Serializable接口,也就是可序列化的。

今天好像是立冬,冬天到了,抓紧时间充充电,明天接着学...

posted @ 2008-11-07 10:15 猪 阅读(1978) | 评论 (2)编辑 收藏

学习Linux,装了个VMware,在上面装了个红帽4
前辈建议用host-only连接方式,好处是与host建立一个私有的网络,跟外界没有关系,A private network shared with the host
在这种方式下Linux如何上网呢

1、首先,安装VMware后windows下会多出两块虚拟网卡,VMware Network Adapter VMnet1(为host-only方式用)和VMware Network Adapter VMnet8(为NAT方式用),将这两块网卡的IP都设为自动获取。

2、将window上自己的网卡设为共享

3、进入Linux,应用程序-系统设置-网络

选中eth0,点编辑,做如下配置

完成后点确定,然后点击激活,OK,打开firefox试试看

posted @ 2008-11-06 15:19 猪 阅读(912) | 评论 (0)编辑 收藏

下了个Linux的视频教程

学了几个命令记录下来

其中对于Linux名字的解释挺有意思,Linux is not unix,:-D

Linux中认为所有的硬件,所有的设备都是文件,文件分为字符文件,和块设备(就是二进制的),它将所有的设备都放在dev目录中

cd / 访问根目录
ls 显示目录中的文件列表
cd dev 访问dev目录
mkdir my 创建目录my
rmdir my 删除目录my
mount /dev/cdrom /mnt/my 将cdrom挂载到my目录
nmount /dev/cdrom 解除挂载
whoami  显示当前用户
pwd     显示当前所在目录

posted @ 2008-11-05 17:00 猪 阅读(218) | 评论 (0)编辑 收藏
     摘要: 原文:http://bbs.80nian.net/thread-428-1-1.html 百度的popup.js这个文件中的弹出层方法挺好用的,但是,有些时候,发现在Mozilla Firefox浏览器下弹出层不能正常使用,具体表现为:层不能移动,一起停在页面左下角,遮罩层不能完全遮罩页面。     解决方案:删除被调用页面中的“<!DOCTY...  阅读全文
posted @ 2008-10-28 13:20 猪 阅读(1078) | 评论 (0)编辑 收藏
//将给定日期增加NumDay个月
    function addDate(dtDate,NumDay){
        var date = new Date(dtDate);
        var lIntval = parseInt(NumDay);
        date.setMonth(date.getMonth() + lIntval);
        return date.getYear() +'-' + (date.getMonth()+1) + '-' +date.getDate();
    }

addDate("2008-01-01".replace(/-/g, "\/"),2);


=======================================
// addDate("5",5,"2004/12/1 00:00:00")
function addDate(type,NumDay,dtDate){
   var date = new Date(dtDate)
type = parseInt(type) //类型
lIntval = parseInt(NumDay)//间隔
switch(type){
   case 6 ://年
date.setYear(date.getYear() + lIntval)
break;
case 7 ://季度
date.setMonth(date.getMonth() + (lIntval * 3) )
break;
case 5 ://月
date.setMonth(date.getMonth() + lIntval)
break;
case 4 ://天
date.setDate(date.getDate() + lIntval)
break
case 3 ://时
date.setHours(date.getHours() + lIntval)
break
case 2 ://分
date.setMinutes(date.getMinutes() + lIntval)
break
case 1 ://秒
date.setSeconds(date.getSeconds() + lIntval)
break;
default:
   
}
return date.getYear() +'-' + (date.getMonth()+1) + '-' +date.getDate()+ ' '+ date.getHours()+':'+date.getMinutes()+':'+date.getSeconds()
}
posted @ 2008-10-26 18:37 猪 阅读(1234) | 评论 (0)编辑 收藏
DWR不能识别以
Class c = Class.forName(ClassName);
方式产生的对象,
它被是别为java.lang.Class
posted @ 2008-10-23 17:34 猪 阅读(603) | 评论 (0)编辑 收藏
随机快速排序算法:
还没怎么整明白,有点晕
Java语言:
import java.util.*;
public class Test {


    int[] x = {3,7,5,6,4,9,8,1};
    int comps = 0;
    void quicksort(int l, int u)
    {
        int i, m;
        if (l >= u) return;
        swap(l, getRandom(l, u));
        m = l;
       
        comps += u - 1;
        for (i = l+1; i <= u; i++){
            //comps++;
            if (x[i] < x[l])
                swap(++m, i);
        }
        swap(l, m);
        quicksort(l, m-1);
        quicksort(m+1, u);
    }
   
    void swap(int a,int b){
        int temp = x[a];
        x[a] = x[b];
        x[b] = temp;
    }
   
    int getRandom(int min,int max){ 
          return (int)(Math.random()*(max-min+1)) + min;
          //Math.round(Math.random()*(Max-Min)+Min);
    }
   
    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(Arrays.toString(t.x));
        t.quicksort(0,t.x.length - 1);
        System.out.println(t.comps);
        System.out.println(Arrays.toString(t.x));
    }
   

}


posted @ 2008-10-23 17:24 猪 阅读(1723) | 评论 (4)编辑 收藏

好久没写了
中间过了个十一,在家混沌过了好几天

回来转眼上了一星期班了,忙的屁滚尿流
一年前的系统要增加两个大功能,200多个报表要挨个修改,报表校验的页面效果客户又提出了新建议,一个字 改

从昨天晚上开始捣鼓到现在终于解决了一个问题,心情好了些,上来写写,哈哈

这两天用了baidu 百度空间中的弹出窗口js,感觉不错,很强大,很好很简单的解决了好几个问题,界面友好度以及美化也好多了,以前都是硬邦邦window.open();

有兴趣的朋友搜索"百度 popup"就好了,已经有人给出了注释,强大。

最有意思的是用javascript获取和设置style

DOM标准引入了覆盖样式表的概念,当我们用document.getElementById("id").style.backgroundColor 获取样式时 获取的只是id中style属性中设置的背景色,如果id中的style属性中没有设置background-color那么就会返回空,也就是说如果id用class属性引用了一个外部样式表,在这个外部样式表中设置的背景色,那么不好意思document.getElementById("id").style.backgroundColor 这种写法不好使,如果要获取外部样式表中的设置,需要用到window对象的getComputedStyle()方法,代码这样写window.getComputedStyle(id,null).backgroundColor
但是兼容问题又来了,这么写在firefox中好使,但在IE中不好使
两者兼容的方式写成
window.getComputedStyle?window.getComputedStyle(id,null).backgroundColor:id.currentStyle["backgroundColor"];
如果是获取背景色,这种方法在firefox和IE中的返回值还是不一样的,IE中是返回"#ffff99"样子的,而firefox中返回"rgb(238, 44, 34) "
值得注意的是:window.getComputedStyle(id,null)这种方式不能设置样式,只能获取,要设置还得写成类似这样id.style.background="#EE2C21";

参考:
JavaScript权威指南
http://bokee.shinylife.net/blog/article.asp?id=817
http://book.csdn.net/bookfiles/679/10067921329.shtml

posted @ 2008-10-10 14:49 猪 阅读(4334) | 评论 (1)编辑 收藏

早上,
上班,
公司楼下等电梯,
旁边站一男子,
微微发福,
个不高,
遂俯视,
手拿车钥匙(大大的那种带遥控的那种明显汽车钥匙),
另一手拿一大块手机(智能的手写的那种),摆弄着
肩背笔记本,
崭新崭新的,
顿生羡慕,
羡慕ing,
往上看,
面色红润,
一看就是吃了早饭了,
再往上,
短发,
1/3白色,
遂心想:嗯,等我也这些白头发了,
我也背这些装备,
呵呵,咧嘴......

posted @ 2008-09-25 19:20 猪 阅读(1232) | 评论 (4)编辑 收藏

今天发现一个好东西

Url Rewrite Filter

它可以实现url重写,从而隐藏实际的url,同时使url看起来更美观,简单

最令人兴奋的是它一下解决了一值在寻找的blog用户访问自己的空间的问题

比如http://hi.baidu.com/liuspring 就显示我的空间

1、下载Url Rewrite Filter

2、在项目的web.xml配置过滤器

XML语言:
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>debug</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


3、将urlrewrite-2.6.0.jar放入lib文件夹
4、新建urlrewrite.xml文件置于WEB-INF目录
5、配置urlrewrite.xml

XML语言: 临时自用代码@代码发芽网
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN"
"http://tuckey.org/res/dtds/urlrewrite2.6.dtd">

<!--

Configuration file for UrlRewriteFilter
http://tuckey.org/urlrewrite/

-->
<urlrewrite>
<rule>
<from>^/([a-z]+)/?$</from>
<to type= "forward" >/blogView.do?go=$1</to>
</rule>

<rule>
<note> 这是一个通用请求url rewrite</note>
<from>^/([a-z0-9A-Z_]+)/([a-z0-9A-Z_]+)/?$</from>
<to type= "forward" >/$2.do?go=$1</to>
</rule>


<outbound-rule>
<note>
The outbound-rule specifies that when response.encodeURL is called (if you are using JSTL c:url)
the url /rewrite-status will be rewritten to /test/status/.

The above rule and this outbound-rule means that end users should never see the
url /rewrite-status only /test/status/ both in thier location bar and in hyperlinks
in your pages.
</note>
<from>/rewrite-status</from>
<to>/test/status/</to>
</outbound-rule>

</urlrewrite>




url匹配使用正则表达式的规则,
实验中发现一个问题,就是必须把里面的正则表达式用小括号括起来,在正则表达式中叫分组
不然会报异常:
java.lang.IndexOutOfBoundsException: No group 2
哈哈,前几日还费劲的自己写Servlet重写url呢,原来这有现成的,更加觉得自己现在的水平遇到的问题网上的前辈们早都遇到过了,一定要站在巨人的肩膀上,少走弯路啊。


把我的servlet贴在这,呵呵,参考自blojsom

Java语言: 临时自用代码@代码发芽网
package com.capinfo.servlet;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.capinfo.util.PageConstraint;
import com.capinfo.util.PigBlogUtil;


import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/**
*
* @author Administrator
*
*/
public class PigBlogServlet extends HttpServlet {

protected Log _logger = LogFactory.getLog(PigBlogServlet.class);



/**
* Initialize
*
* @param servletConfig {@link ServletConfig}
* @throws ServletException If there is an error initializing
*/
public void init(ServletConfig servletConfig) throws ServletException {
super.init(servletConfig);
}

/**
* Handle requests made to
*
* @param httpServletRequest {@link HttpServletRequest} request
* @param httpServletResponse {@link HttpServletResponse} response
* @throws ServletException If there is an error serving the request
* @throws IOException If there is an error serving the request
*/
protected void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {


// Make sure that we have a request URI ending with a / otherwise we need to
// redirect so that the browser can handle relative link generation
// if (!httpServletRequest.getRequestURI().endsWith("/")) {
// StringBuffer redirectURL = new StringBuffer();
// redirectURL.append(httpServletRequest.getRequestURI());
// redirectURL.append("/");
// if (httpServletRequest.getParameterMap().size() > 0) {
// redirectURL.append("?");
// redirectURL.append(PigBlogUtil.convertRequestParams(httpServletRequest));
// }
//
// if (_logger.isDebugEnabled()) {
// _logger.debug("Redirecting the user to: " + redirectURL.toString());
// }
//
// httpServletResponse.sendRedirect(redirectURL.toString());
//
// return;
// }



// Check for an overriding id
String blogId = httpServletRequest.getParameter(PageConstraint.GO);
if (PigBlogUtil.checkNullOrBlank(blogId)) {
String blogIdFromPath = PigBlogUtil.getBlogFromPath(httpServletRequest.getPathInfo());
if (blogIdFromPath == null) {
blogId = PageConstraint.GO1;
} else {
blogId = blogIdFromPath;
}
}

if (PigBlogUtil.checkNullOrBlank(blogId)) {
httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND, "Blog ID not specified");

return;
}
StringBuffer redirectURL = new StringBuffer();

//redirectURL.append(httpServletRequest.getContextPath());
System.out.println(httpServletRequest.getRequestURI());
if(httpServletRequest.getRequestURI().indexOf("/blog/") > -1 && httpServletRequest.getRequestURI().indexOf(".jsp") == -1 ){
if(!httpServletRequest.getRequestURI().endsWith("/") && httpServletRequest.getRequestURI().indexOf(".do") > -1){
redirectURL.append(httpServletRequest.getRequestURI().substring(httpServletRequest.getRequestURI().lastIndexOf("/"), httpServletRequest.getRequestURI().length()));

}else if(httpServletRequest.getRequestURI().indexOf("/blog/") == -1){

}else{
redirectURL.append("/blogView.do");

}
redirectURL.append("?go=");
redirectURL.append(blogId);

httpServletRequest.getRequestDispatcher(redirectURL.toString())
.forward((ServletRequest)httpServletRequest, (ServletResponse)httpServletResponse);
//httpServletResponse.sendRedirect(redirectURL.toString());
}else{
httpServletRequest.getRequestDispatcher(httpServletRequest.getRequestURI())
.forward((ServletRequest)httpServletRequest, (ServletResponse)httpServletResponse);
//httpServletResponse.sendRedirect(httpServletRequest.getRequestURI());
}
System.out.println(redirectURL.toString());
return;


}

/**
* Take out of service
*/
public void destroy() {
super.destroy();

if (_logger.isDebugEnabled()) {
_logger.debug(" destroyed");
}
}
}






 

posted @ 2008-09-24 18:04 猪 阅读(4743) | 评论 (4)编辑 收藏

培训最后一天,报表~

感觉普元的报表有点水晶的味道,弄了个分组报表,又建数据源又建数据集有设行分组,列分组的,赶紧挺麻烦,没有用润乾好使,虽然润乾工作量也挺大

看来老板要贴了心上普元了,接下来可能要实战了,不知道啥样,现在有两点困难;

1\、普元报的错误,无从下手,不知道哪出的毛病,比如有时在展现层的毛病,而在逻辑处理层报错,摸不着头脑啊。

2、普元的构件不熟悉,据说有1000多个构件,不像java api一样按照功能分的包,它是按层分的包,业务逻辑层构件、运算层构件、展现层构件。要实现一个功能怎么能知道构件包里有没有现成的,恐怕这只能慢慢熟悉那些构件库了

3、觉得普元的报表系统不怎么样,至少没有什么让人耳目一新的,工作流系统还挺强,对工作流不熟悉,不敢说什么,然后就是可维护性,可扩展性,可能一直是自己写代码的,看不见代码总觉得不踏实最然功能实现了并以更迅速的

4、听头儿说这是未来软件开发的趋势,听得我直郁闷,未来开发就是这么托构件然后用连线一拉基本完事儿了吗?!得,要不我还是转行做小买卖去吧,呜呜,总的来说,觉得这种模式对程序员个人的发展没多大好处,核心代码都被封装好了,不知道什么是类,对象,方法,面向对象,也能轻而易举做软件工程师了,呵呵,工程师以后不值钱喽。

自己的一点感觉,胡侃一通,不知道合不合乎逻辑,在前面的blog里有朋友留言说"千万别被普元忽悠了",哈哈,不知道那位兄弟的理由是什么,想多听听大家的意见,望广留言,多谢多谢多谢!!!

posted @ 2008-09-18 21:01 猪 阅读(1825) | 评论 (6)编辑 收藏

例子1:Entity的格式

<root>

<data>

<myEntity>

<myField1>1234</myField1>

<myField2>This is demo</myField2>

</myEntity>

</data>

</root>

例子2:EntityList的格式为

<root>

<data>

<list length=2>

<myEntity name="test1">

<myField1>1234</myField1>

<myField2>This is demo</myField2>

</myEntity>

<myEntity name="test2">

<myField1>2345</myField1>

<myField2>This is demo</myField2>

</myEntity>

<list>

</data>

</root>

通过Xpath来访问数据,比如

/root/data /myEntity将访问到例子1中的<myEntity>实体

/root/data/myEntity/ myField1 将访问到例子1中的myField1,结果为1234

/root/data/list/myEntity[@name="test1"]将访问例子2中的<myEntity name="test1"> 实体

/root/data/list/myEntity[@name="test1"]/myField1将访问例子2中的myField1,值为1234

posted @ 2008-09-18 13:48 猪 阅读(424) | 评论 (0)编辑 收藏

第四天还没来得及写呢,现在已经是第五天了呵呵

昨天临时以前的项目要改写东西,听的断断续续

还是一些关于工作流的知识,只是更加复杂一下,跟着文档一个劲儿的复制黏贴

也不知道所以然

据说下午还要考试,晕

posted @ 2008-09-18 11:19 猪 阅读(366) | 评论 (0)编辑 收藏
     摘要: 今天接着培训普元EOS讲rishWeb和工作流上午实现了一个在一个table中实现增删改查,有个控件datacell,一下子就把我搞蒙了, 一个劲儿的复制黏贴,也不知道哪是哪,看起来好像类似与那个.net中的那个DataGrid,关键是还不大明白那些输入输出参数应该以什么套路配置。应该是在开始的时候就配置输入输出参数,但是又是如何跳回到jsp的呢,<datacell:datacell ...  阅读全文
posted @ 2008-09-16 18:22 猪 阅读(1719) | 评论 (0)编辑 收藏
一直苦恼与不能实现广域网的版本控制,终于发现Google code就提供这种服务,它使用Subversion来控制版本,下了一个TortoiseSVN 1.5.1
装上,捣鼓了半天终于上传上Google code了,哈哈。有成就感
这两天有搞了个eclipse插件subclipse,运行起来以后无论commit还是update都提示错误:

Attempted to lock an already-locked dir

通过搜索,解决办法是 执行clearup操作,就好了
记录在这,Subversion还要继续研究

posted @ 2008-09-15 21:24 猪 阅读(1542) | 评论 (0)编辑 收藏

今天剖析了昨天三下两下生成的增删改查的代码(能看到的代码也仅仅限于jsp页面中的一些标签),其他的要看的话都是xml,要用EOS的设计器看才是类似于流程图的东西

感觉看不到亲切的java代码很不爽,呵呵

然后练习自定义运算逻辑,这下自己写类了呵呵,eos能够由向导自动生成类和方法体,就像Myeclipse中新建struts的action一样,发现eos的方法都是静态的,都是返回一个int整型值,参数列表也都是Document doc, BizContext param,看起来只有方法名可以自定义了,呵呵!

之前说过普元这套东西都是用xml格式传递参数的,这里就是从param中获取xml,然后拆解每个要用到的节点,来获取传入的参数,然后经过处理后把返回值再放到xml节点中,好费劲。

然后是handler,为了灵活的加入新的处理,可以在一个业务逻辑的前后加入多个handler,跟一般的过滤器写法没什么差别。

然后是jsp Tag自定义,也是继承了javax.servlet.jsp.tagext.TagSupport,没有普元的东西

再然后是复杂查询,多表查询,他是创建一个查询实体,就是视图啦

一天下来对普元EOS了解的多了些,它以方法为单位作为构成构件,以达到重用的目的,各个层之间以xml格式作为联系,开发人员基本上已图形化开发,不接触底层技术,给程序员的门槛降低了(大学生就业更难了呵呵),开发系统开始工业化,把零件装起来,螺丝拧上就OK了

可能经历实际开发了,会有多一些不一样的感触吧

还是没闹明白难道这就是所谓SOA吗???

posted @ 2008-09-11 21:16 猪 阅读(3458) | 评论 (6)编辑 收藏

想找个离线发布blog的工具,折腾了一晚上

大家评论说Zoundry不错,就下载下来安装了,如何配置成为了一个问题,我有多个blog想同时更新

下面搜集了几个blog配置的地址,供参考

blogjava

http://www.blogjava.net/yourblog/services/metaweblog.aspx

bloggers

https://www.blogger.com/feeds/default/blogs (不稳定,有时成功有时不成功,可能是太和谐了)

blogbus

http://rpc.blogbus.com/blogger

csdn blog

http://blog.csdn.net/youraccount/services/MetaBlogApi.aspx

Powered by Zoundry Raven

posted @ 2008-09-11 11:48 猪 阅读(475) | 评论 (1)编辑 收藏

普元EOS,面向构件的开发

公司要购进普元的EOS开发工具,组织为期5天的培训

为了今天的培训我把我的笔记本系统都重装了,折腾了半天装数据库,装EOS,装EOS补丁,不知道干嘛不做一个集成了补丁的安装包

安装过程中要配置数据库,要初始化数据库,会向数据库中自动建好多表,然后安装成功后可以在服务控制台管理。

首先做了个HelloWorld

界面就是这样的


首先新建一个构件包(面向构件的开发嘛),每个构建包下有页面构件page,展现逻辑构件pr,业务逻辑构件biz,数据逻辑构件data等等。

我的理解就是每个构件就相当于分层架构中的一层,page就是jsp页面,prStrutsactionbizspringbean,datahibernate的映射,普元在这之上又进行了封装,以前我们在各个层之间传递数据通常由一个DTO数据传递对象,而普元在各个层用xml来传递,普元把普遍通用的实现逻辑处理都封装成了构件,我们只要调用构件就行了。

       之后又来了复杂点有刺激的,通过向导实现对一个单表的增删改查,向导跟vs.net中的那个数据连接,数据适配器拖到页面上选择表,选择字段,就自动生成了增删改查,只是vs.net中可以看到生成的C#的代码,而普元生成的只是一堆xml


原来一天未必能完成的事,现在十分钟做完,能傻瓜的都傻瓜了,真的也要下岗了。

哦,对了,这些和SOA怎么联系上呢?

posted @ 2008-09-10 17:47 猪 阅读(4576) | 评论 (7)编辑 收藏
要提供给客户一个下载xml文件备份的功能
思路确定了
生成xml
在服务器指定目录创建文件
取得文件路径,弹出下载框

Java语言:
01 <%@ page contentType="text/html;charset=UTF-8" language="java"%>
02 <%@ page import="java.io.*" %>
03 <%
04      String pathurl = (String)request.getAttribute("pathurl");
05      if(pathurl !=null && !pathurl.equals("")){
06    
07             String addressReport = application.getRealPath("/")+"saveFiles"+File.separator+pathurl;
08             //String addressReport = PageConstraint.XML_PATH_SEND+pathurl;
09            addressReport = addressReport.replace(File.separator,File.separator+File.separator);
10           
11           //   设置响应头和下载保存的文件名 
12           response.setContentType("APPLICATION/OCTET-STREAM;charset=UTF-8"); 
13           response.setHeader("Content-Disposition"
14           "attachment;   filename=\""   +   pathurl   +   "\""); 
15           
16           //   打开指定文件的流信息 
17           java.io.FileInputStream   fileInputStream   = 
18           new   java.io.FileInputStream(addressReport); 
19           
20           写出流信息 
21           int   i; 
22           while   ((i=fileInputStream.read())   !=   -1)   { 
23               out.write(i); 
24           }
25    
26           fileInputStream.close(); 
27           out.close();
28           
29     }
30   %>

这么写在jsp文件中的代码,开始试验没有问题,但是如果xml中有中文,就会是乱码,xml文件是使用utf8生成的,猜想可能是在流读取的时候编码不对,于是在网上搜得了下面这样的写法,通过InputStreamReader设置了编码UTF-8
测试成功

Java语言:
01 <%@ page contentType="text/html;charset=UTF-8" language="java"%>
02 <%@ page import="java.io.*" %>
03 <%
04      String pathurl = (String)request.getAttribute("pathurl");
05      if(pathurl !=null && !pathurl.equals("")){
06    
07             String addressReport = application.getRealPath("/")+"saveFiles"+File.separator+pathurl;
08             //String addressReport = PageConstraint.XML_PATH_SEND+pathurl;
09            addressReport = addressReport.replace(File.separator,File.separator+File.separator);
10           
11           //   设置响应头和下载保存的文件名 
12           response.setContentType("APPLICATION/OCTET-STREAM;charset=UTF-8"); 
13           response.setHeader("Content-Disposition"
14           "attachment;   filename=\""   +   pathurl   +   "\""); 
15           
16           //   打开指定文件的流信息 
17           java.io.FileInputStream   fileInputStream   = 
18           new   java.io.FileInputStream(addressReport); 
19           
20           //   写出流信息 
21           //int   i; 
22           //while   ((i=fileInputStream.read())   !=   -1)   { 
23           //out.write(i); 
24           //}
25    
26           //fileInputStream.close(); 
27           //out.close();
28          
29           InputStreamReader   reader=new   InputStreamReader(fileInputStream,"UTF-8"); 
30           int   i=0
31           while((i=reader.read())!=-1){ 
32               out.write(i);
33
34           }
35           reader.close(); 
36           fileInputStream.close();
37           out.close(); 
38     }
39   %>


总结:还是对java的流相关只是掌握不清啊,不能熟练运用
posted @ 2008-09-05 12:49 猪 阅读(915) | 评论 (0)编辑 收藏
一哥们在学C#,同时学的是sqlServer2005,是啊,我接触C#那会儿才.net1.1,现在都3.x了
让我帮忙调式一下程序,而我的机器尚没有sql05,只有sql2000,期间听说过05和2000可以同时安装,装吧,要不没法附加他那2005的数据库,费了好大劲装好了,开始附加数据库,但是死活附加不上去,错误提示:执行Transact_SQL语句或批处理时发生了异常。未能在sysindexes中找到数据库ID 9 对象ID 1 对应的行,请对sysindexes运行DBCC CHECKTABLE


按照提示,执行 DBCC CHECKTABLE 还是没有效果
遂在google上搜,有网友遇到这个问题是因为同时装了sql2000,卸载了2000重装sql2005就成功了
晕,这下功夫耗大了
卸载吧,同学提供了一个干净卸载的工具来卸载,早就知道卸载sql2000卸不干净,重装会出问题,于是采用此工具
“微软的Windows_Installer_清理实用工具msicuu2”
可谁知道,这东西帮了倒忙,好像得先运行卸载程序,再运行这个“微软的Windows_Installer_清理实用工具msicuu2”可以帮忙将注册表之类的垃圾清理掉,但是我直接运行了这个“微软的Windows_Installer_清理实用工具msicuu2”,结果sql2000还在并且可以运行,在控制面板卸载,提示 找不到D:\Program Files\Microsoft SQL Server\MSSQL\Uninst.isu
晕,这是干啥的啊
接着google
找到一网友的播客http://www.anywolfs.com/liuhui/article.asp?id=257,提出了解决办法,用之,终于可以卸载了
接着卸载sql2005,哎,等等,现在是不是可以附加了呢,试,.....还是不行,呵呵
卸载吧
哦?从控制面板貌似sql05也卸载不了了,卸了好几次也没反应啊,倒是不报错

试了好几次,貌似选哪个都不好使,点下一步,一会儿窗口就自己消失了
啊,啊啊,晕,先睡觉,明儿再搞定05
谁位大哥遇到过,提示一下啊......

posted @ 2008-09-04 22:43 猪 阅读(1335) | 评论 (3)编辑 收藏

今天开发中遇到一个奇怪的hibernate错误
我的数据库中一个表中有个字段名叫id,但是它并不是主键
用hibernate映射后为

XML语言:
1 <id name="apprId" type="java.lang.Long">
2     <column name="APPR_ID" precision="11" scale="0" />
3     <generator class="assigned" />
4 </id>
5 <property name="Id" type="java.lang.Long">
6     <column name="ID" precision="11" scale="0" />
7 </property>
而我当执行这样的hibernate的HQL的时候
SQL语言:
1 from RcUApprInfo as model where model.Id = ?

hibernate解析成sql语句竟然是
SQL语言:
1 select ...... from rc_u_appr_info where as model where model.APPR_ID = ?

跟踪了好几遍,都是这样

在确定自己的代码没问题后,想到可能是hibernate理解错了
于是将Id改成了别的名
再试,竟然没问题了
难道hibernate将凡是叫Id的都认为成主键??不解 不解
posted @ 2008-09-04 16:33 猪 阅读(1291) | 评论 (7)编辑 收藏

早上上班来,打开电脑,看到一则最新消息,google发布自己的浏览器了

9月3日消息 9月3日凌晨,谷歌中国与全球同步推出其开源浏览器Google Chrome测试版,中文名为谷歌浏览器.
         下载地址为:http://www.google.com/chrome

 

记得前几天还看见csdn上新闻说google澄清不会出浏览器跟IE竞争,晕,现在成现实了,google的所有服务差不多用了个遍,这个也不例外,下了一个,惊讶下载文件竟然只有几百K,开始安装才知道也是采用windows live那样的安装方式,还要下载一通。

终于安装完啦,打开


第一感觉很简单,把所有空间都给了页面显示,就像IE按了F11一样,因为在公司是使用代理上网,纳闷的是我也没有配置代理居然一下就能上网,于是打开选项查找,有个设置代理的按钮,点击打开的竟然是IE的选项窗口,google的浏览器调用IE的internate选项,这不是成了遨游?

posted @ 2008-09-03 14:59 猪 阅读(232) | 评论 (0)编辑 收藏

引用:面向服务的体系结构(service-oriented architecture,SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。

今天公司组织了一个SOA培训,请的普元公司的工程师来的,按工程师的话说SOA是一种方法,这种方法已经由来已久了也算,在欧美国家早就用这种方法来开发标准的软件系统,那是不是能成为SOA是一种方法呢,呵呵
培训中,工程师演示了普元的产品,他们的一个开发工具EOS包含了AppFream,Report,RishWeb,WorkFlow,软件开发的各个层面都覆盖到了,俺的个娘啊,感觉就是要是这些东西用起来还要我们这些程序员干嘛,只要项目经理就行了,项目经理跟客户确认好需求,然后用普元的工具一通拖拽画出流程图,完了,这就完工了,流程图画出的同时我们的应用也能运行了,看效果吧,呵呵
貌似,做测试的也可以下岗了,因为每一步都是自动生成的,并且可以监控每一步的运行情况。
半天的培训下来,突然有种危机感,如果总经理真的决定在我们部门推行这个EOS系统,那我们岂不是离下岗不远啦?
程序员真不如民工喽。。。

自己的一点点理解 ,功力尚浅,呵呵,欢迎拍砖
posted @ 2008-09-02 23:01 猪 阅读(1435) | 评论 (7)编辑 收藏

遇到一个棘手的问题,即便是给td限定的宽度,但是如果里面的内容是连续的,IE就认为是一个单词,不会换行,瞎聪明,google了一通,用css把问题解决了,css这玩意太强了,收藏一下,控制td换行的css样式:style="word-wrap:break-word;word-break:break-all;"

1<table width="100%" border="0" cellspacing="1" cellpadding="0">       
2 <tr>
3  <td width="25%" style="word-wrap:break-word;word-break:break-all;"  valign="bottom" >
4  abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc</td>
5 </tr>
6</table>
posted @ 2008-09-02 09:38 猪 阅读(4169) | 评论 (2)编辑 收藏

忙里偷闲
一直想写一个blog程序
架子打起来了,用struts1.2+hibernate

如何为用户的url做转向,比如http://www.blogjava.net/liuspring,怎样转向属于liuspring的文章、留言、评论啊等等,简单的说就是liuspring的页面,
这个问题可把我难住了(功力太浅),于是google上搜开源的blog系统,看他们的源码,首先下的roller,费了好大劲把系统配起来了,运行起来那个高兴,接下来晕了,新版本是struts2,还没研究过,看了一下好像struts2能很容易实现我要的,可是我用的是1.x啊,接着搜,Pebble,blojsom DLOG4Jmyblog,都试用了,其中blojsom使用了一个servlet,在里面解析URI,比如请求的地址是/blog/spring/,那么就被解析成/blogView.do?go=spring,以这个地址转向,从而被struts的控制器接收。
这里得用(并且redirectURL必须是相对路径,用完整路径好像还不行,在我这报404错误)
1httpServletRequest.getRequestDispatcher(redirectURL.toString())
2            .forward((ServletRequest)httpServletRequest, (ServletResponse)httpServletResponse);
不能用
1httpServletResponse.sendRedirect(redirectURL.toString());
因为这样是使IE重定向,请求的URL也随之改变,这个圈儿就转不下去了。

又建立了一个过滤器,用以判断session中的用户是否是当前访问的博客的管理员,比如访问/blog/spring/,判断session中保存的用户是否是spring,然后往request,setAttribute中放一个标示,标示是否具有管理员权限,在jsp页面中获取这个参数以决定是否显示后台管理连接。
到这里,最基本,最挠头的问题暂时解决了,感觉肯定有更加方便、更加精妙、更加简单的方法,只是功力还没涉到那么深,哪位博友看到了不胜赐教,接下来还要攻克的,如何产生静态html页面,如何rss......
posted @ 2008-09-01 21:38 猪 阅读(1250) | 评论 (2)编辑 收藏

① 完全匹配

    <url-pattern>/test/list.do</url-pattern>

② 目录匹配

    <url-pattern>/test/*</url-pattern>

③ 扩展名匹配

    <url-pattern>*.do</url-pattern>

servlet-mapping的重要规则:

☆ 容器会首先查找完全匹配,如果找不到,再查找目录匹配,如果也找不到,就查找扩展名匹配。

☆ 如果一个请求匹配多个“目录匹配”,容器会选择最长的匹配。

posted @ 2008-09-01 14:13 猪 阅读(5801) | 评论 (0)编辑 收藏

几乎每天都在,只是好久都是只看不写了,看看谁来过了,回访一下,看看谁留言了,回复一下,看看访问量多少了
呵呵,瞅瞅下面的一篇到现在足有两个多月了,时间过得好快啊
最近一段时间,事儿真的很多,公司的事不算忙了,所以也没什么技术问题写一写,一直想弄个blog,还没弄起来,家里有很多事忙
上周末回了趟家,正好赶上下雨,庆幸买上了火车票,还有坐,倒霉的还没赶上火车,到火车站停止检票了,在麦当劳蹲了一宿
凌晨4:30上车,开始闹肚子,哎呦,一直到家,一宿没睡,还闹肚子,我太坚强了,呵呵
想点招,赚钱,极度缺钱
为什么baidu空间不能用windows live writer这样的客户端写blog呢,落伍了啊

posted @ 2008-08-27 14:13 猪 阅读(100) | 评论 (0)编辑 收藏

试用windows live writer 发blog

我的操作系统是win2003。整体google了半天才装了个e文版,凑合试试 哈哈

posted @ 2008-08-27 12:09 猪 阅读(120) | 评论 (0)编辑 收藏
一直讨厌看电视剧,大都又臭又长
向来只是吃饭的时候,有时候看电视,也总是遥控器不离手,不停的换台
无意中看了会儿 八兄弟~~觉得还不错
讲的是咱老百姓的事儿
讽刺~幽默~
生活~就是不停的迈一道道的坎啊


讲话了,要当就当棍
posted @ 2008-08-26 22:07 猪 阅读(123) | 评论 (0)编辑 收藏
刚整明白一个,呵呵,笨
hibernate save的时候必须启用事务,也就是必须
beginTransaction();
然后
commit();
要不然不会insert

看孙卫琴.精通Hibernate:Java对象持久化技术详解上讲
调用save方法后,hibernate并不会立即insert,而是保存在缓存里,等清理缓存时再insert
什么时候清理缓存呢?
1、事务commit();
2、find方法(hibernate3被废)
3、显示调用flush();
而为什么不用事务,只是在save();后直接显示调用flush();还是没有insert呢?
参考csdn的一个帖子http://topic.csdn.net/u/20080603/19/d6918606-3a62-43a4-b63d-cd292242bbc6.html
因为数据源的问题
真正的原因是数据源conn默认的提交方式,hibernate不管这件事,大部分开源数据源都是默认false的

我试了hibernate的默认连接池,和tomcat中配的连接池用使用事务都没有insert。
下面这段代码能够insert可以说明一些问题
    public static void main(String[] args) throws Exception {
SessionFactory sf
=HibernateSessionFactory.getSessionFactory();
Session session
=sf.openSession();
System.out.println(session.connection().getAutoCommit());
session.connection().setAutoCommit(
true);
User u
=new User();
u.setName(
"aaa");
session.save(u);
}

}
而commit和flush的区别就是commit先flush再提交,而flush没有提交
而在close的时候,孙卫琴.精通Hibernate:Java对象持久化技术详解上讲的是hibernate会清空缓存,一个清理,一个清空,一字之差,呵呵
posted @ 2008-08-26 22:07 猪 阅读(782) | 评论 (0)编辑 收藏
因为一直想写个自己的blog,用什么架构呢,遂驱使着在网上搜索有什么开放源码的blog程序,roller4.0,貌似挺有名,但资料不多,蒸腾了两天才把系统跑起来
看在OpenSource的介绍:

              Roller Weblogger

这个weblogging 设计得比较精巧,源代码是很好的学习资料。它支持weblogging应有的特性如:评论功能,所见即所得HTML编辑,TrackBack,提供页面模板,RSS syndication,blogroll管理和提供一个XML-RPC 接口。

很好的学习资料,哈哈,那就学习学习吧
不过到现在也没看出个什么门道来
系统用了struts2 不熟,struts1还行
用了JPA,不熟,确切的说刚知道这东西
用了velocity,没用过
....还有很多没见过的名词,狂晕
打了个断点跟了几圈,就晕了
呵呵
posted @ 2008-08-26 22:07 猪 阅读(295) | 评论 (1)编辑 收藏

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <title>Google AJAX Language API - Hello World</title>
    <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">

    google.load("language", "1");

    function initialize(str) {
      var text = document.getElementById("text").value;
      google.language.detect(text, function(result) {
        if (!result.error && result.language) {
   google.language.translate(text, result.language, str,
                             function(result) {
     var translated = document.getElementById("translation");
     if (result.translation) {
       translated.innerHTML = result.translation;
            }
          });
        }
      });
    }
    google.setOnLoadCallback(initialize);

    </script>
</head>
<body>
    <input type="text" name="text" value="你好,很高��到你。"/>
<input type="button" value="汉译英" onclick="javascript:initialize('en')"/>
<input type="button" value="英译汉" onclick="javascript:initialize('zh')"/>
    <div id="translation"></div>
</body>
</html>

posted @ 2008-08-26 22:07 猪 阅读(145) | 评论 (0)编辑 收藏

【程序1】
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
【程序2】
题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,
则表明此数不是素数,反之是素数。
【程序3】
题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。
1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
【程序4】
题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n <> k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
【程序5】
题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
1.程序分析:(a> b)?a:b这是条件运算符的基本例子。
【程序6】
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。
【程序7】
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
1.程序分析:利用while语句,条件为输入的字符不为 '\n '.
【程序8】
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
1.程序分析:关键是计算出每一项的值。
【程序9】
题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程 找出1000以内的所有完数。
【程序10】
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
【程序11】
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。
【程序12】
题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
【程序13】
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析:
【程序14】
题目:输入某年某月某日,判断这一天是这一年的第几天?
1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
【程序15】
题目:输入三个整数x,y,z,请把这三个数由小到大输出。
1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x> y则将x与y的值进行交换,然后再用x与z进行比较,如果x> z则将x与z的值进行交换,这样能使x最小。
【程序16】
题目:输出9*9口诀。
1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
【程序17】
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
1.程序分析:采取逆向思维的方法,从后往前推断。
【程序18】
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。
【程序19】
题目:打印出如下图案(菱形)
*
***
******
********
******
***
*
1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for循环,第一层控制行,第二层控制列。
【程序20】
题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
1.程序分析:请抓住分子与分母的变化规律。
【程序21】
题目:求1+2!+3!+...+20!的和
1.程序分析:此程序只是把累加变成了累乘。
【程序22】
题目:利用递归方法求5!。
1.程序分析:递归公式:fn=fn_1*4!
【程序23】
题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。
【程序24】
题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
【程序25】
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
【程序26】
题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母。
1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。
【程序27】
题目:求100之内的素数
【程序28】
题目:对10个数进行排序
1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换, 下次类推,即用第二个元素与后8个进行比较,并进行交换。
【程序29】
题目:求一个3*3矩阵对角线元素之和
1.程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
【程序30】
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
1. 程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。
【程序31】
题目:将一个数组逆序输出。
1.程序分析:用第一个与最后一个交换。
【程序32】
题目:取一个整数a从右端开始的4~7位。
程序分析:可以这样考虑:
(1)先使a右移4位。
(2)设置一个低4位全为1,其余全为0的数。可用~(~0 < <4)
(3)将上面二者进行&运算。
【程序33】
题目:打印出杨辉三角形(要求打印出10行如下图)
1.程序分析:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

【程序34】
题目:输入3个数a,b,c,按大小顺序输出。
1.程序分析:利用指针方法。
【程序35】
题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
【程序36】
题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
【程序37】
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
【程序38】
题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
【程序39】
题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)
【程序40】
题目:字符串排序。
【程序41】
题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
【程序42】
题目:809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
【程序43】
题目:求0—7所能组成的奇数个数。
【程序44】
题目:一个偶数总能表示为两个素数之和。
【程序45】
题目:判断一个素数能被几个9整除
【程序46】
题目:两个字符串连接程序
【程序47】
题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。
【程序48】
题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
【程序49】
题目:计算字符串中子串出现的次数
【程序50】
题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件 "stud "中。

有些是C语言的题~但要用JAVA做

转自:http://topic.csdn.net/u/20070514/12/45df0d84-e6f8-4cb4-b9ee-c5101e12c7d6.html

posted @ 2008-08-26 22:07 猪 阅读(763) | 评论 (1)编辑 收藏

1 追求女人你需要时间和金钱,因此:女人=时间×金钱

2 “时间就是金钱”,所以
时间=金钱

3 因此
女人=金钱×金钱=金钱的平方

4 “金钱是一切麻烦的根源”
金钱=麻烦的平方根

5 因此
女人=麻烦的平方根的乘方
女人=麻烦

危险物质数据表

元素:女人

符号:○+

发现者:亚当

原子量:接受值是55公斤,但据知可在45公斤到225公斤之间浮动

物理特性:

1。体表通常覆盖着粉底与化妆品构成的薄膜
2。毫无意义的沸腾-----毫无理由的结冰
3。以不同状态存在于自然界中,从纯净原材料到普通矿物质均有可能

化学特性:

1。极易与黄金、白金以及所有的贵重宝石发生反应
2。可能在没有任何理由及预警下会引起自发性严重爆炸
3。是人类已知的最强的金钱还原剂

用途:

1。高度装饰性,特别是摆在跑车中
2。对于疏解压力有很大的功效
3。非常有效的厨房清洁剂

危害:

1。将另一更优质样本置于旁边时会发青(指忌妒)
2。同时持有一个样本以上为违法,但数个样本可以在不直接接触的情形下保存在不同的场所

男人与女人争论获胜的可能性

绿字为约会期,蓝字为订婚期,黑字为婚姻期

横轴为年份,竖轴为获胜可能性的百分比


任务:去商场买条裤子

蓝线为男人,红线为女人
posted @ 2008-08-26 22:07 猪 阅读(150) | 评论 (0)编辑 收藏
对于这个系列里的问题,每个学Java的人都应该搞懂。当然,如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列。内容均来自于CSDN的经典老贴。

问题一:我声明了什么!

String s = "Hello world!";

许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:

String string = s;

我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。

问题二:"=="和equals方法究竟有什么区别?

==操作符专门用来比较变量的值是否相等。比较好理解的一点是:
int a=10;
int b=10;
则a==b将是true。
但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b将返回false。

根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是 false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。
对象内容的比较,正是equals方法做的事。

看一下Object对象的equals方法是如何实现的:
boolean equals(Object o){

return this==o;

}
Object 对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。同样也可以看出, Object的equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。

看一下一个极端的类:
Class Monster{
private String content;
...
boolean equals(Object another){ return true;}

}
我覆盖了equals方法。这个实现会导致无论Monster实例内容如何,它们之间的比较永远返回true。

所以当你是用equals方法判断对象的内容是否相等,请不要想当然。因为可能你认为相等,而这个类的作者不这样认为,而类的equals方法的实现是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合(HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是如何实现的。

问题三:String到底变了没有?

没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码:

String s = "Hello";
s = s + " world!";

s 所指向的对象是否改变了呢?从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为 String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:
public class Demo {
private String s;
...
public Demo {
s = "Initial Value";
}
...
}
而非
s = new String("Initial Value");
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。
上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。
至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即 StringBuffer。

问题四:final关键字到底修饰了什么?

final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。

引用本身的不变:
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//编译期错误

引用指向的对象不变:
final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //编译通过

可见,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。这很类似==操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。

理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象,不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final,意图使得它“永远不变”。其实那是徒劳的。

问题五:到底要怎么样初始化!

本问题讨论变量的初始化,所以先来看一下Java中有哪些种类的变量。
1. 类的属性,或者叫值域
2. 方法里的局部变量
3. 方法的参数

对于第一种变量,Java虚拟机会自动进行初始化。如果给出了初始值,则初始化为该初始值。如果没有给出,则把它初始化为该类型变量的默认初始值。

int类型变量默认初始值为0
float类型变量默认初始值为0.0f
double类型变量默认初始值为0.0
boolean类型变量默认初始值为false
char类型变量默认初始值为0(ASCII码)
long类型变量默认初始值为0
所有对象引用类型变量默认初始值为null,即不指向任何对象。注意数组本身也是对象,所以没有初始化的数组引用在自动初始化后其值也是null。

对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance属性在创建实例的时候初始化,static属性在类加载,也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不再次进行初始化。这个问题会在以后的系列中进行详细讨论。

对于第二种变量,必须明确地进行初始化。如果再没有初始化之前就试图使用它,编译器会抗议。如果初始化的语句在try块中或if块中,也必须要让它在第一次使用前一定能够得到赋值。也就是说,把初始化语句放在只有if块的条件判断语句中编译器也会抗议,因为执行的时候可能不符合if后面的判断条件,如此一来初始化语句就不会被执行了,这就违反了局部变量使用前必须初始化的规定。但如果在else块中也有初始化语句,就可以通过编译,因为无论如何,总有至少一条初始化语句会被执行,不会发生使用前未被初始化的事情。对于try-catch也是一样,如果只有在try块里才有初始化语句,编译部通过。如果在 catch或finally里也有,则可以通过编译。总之,要保证局部变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们的时候就初始化他们,如果不知道要出事化成什么值好,就用上面的默认值吧!

其实第三种变量和第二种本质上是一样的,都是方法中的局部变量。只不过作为参数,肯定是被初始化过的,传入的值就是初始值,所以不需要初始化。

问题六:instanceof是什么东东?

instanceof是Java的一个二元操作符,和==,>, <是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:

String s = "I AM an Object!";
boolean isObject = s instanceof Object;

我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的值为True。
instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类:

public class Bill {//省略细节}
public class PhoneBill extends Bill {//省略细节}
public class GasBill extends Bill {//省略细节}

在处理程序里有一个方法,接受一个Bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的Bill对象可能是两种中的任何一种,所以要用instanceof来判断:

public double calculate(Bill bill) {
if (bill instanceof PhoneBill) {
//计算电话账单
}
if (bill instanceof GasBill) {
//计算燃气账单
}
...
}
这样就可以用一个方法处理两种子类。

然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了:

public double calculate(PhoneBill bill) {
//计算电话账单
}

public double calculate(GasBill bill) {
//计算燃气账单
}

所以,使用instanceof在绝大多数情况下并不是推荐的做法,应当好好利用多态。
posted @ 2008-08-26 22:07 猪 阅读(108) | 评论 (0)编辑 收藏
困扰80后的十大烦恼,你有吗?


 1.成天泡在网上,又不知道做什么好。80后最常说的一句话是“无聊”,尽管他们在网络上聊天花去了大把的时间。

  建议:聊天作为一种基本交流方式,所要达到的目的是获得认同。网上聊天很难达到这种认同,所以越聊越无聊。学习和工作累了,玩一玩游戏没错,但是打怪练级那些游戏基本上是得不偿失的,费时间,伤身体,还花钱。可以玩一玩趣味性强的休闲游戏,比如《纸客帝国》之类,轻松幽默,带点无厘头的风格,很能消除疲劳。靠玩游戏来交流感情是不现实的,要交流感情最好还是找个人去咖啡吧,或者堡个电话粥吧。

  成天泡在网上

  2.浮躁,好预测未知妄下定论。对看过的电影和电视剧,会按耐不住向别人透露下一个情节或者结局。对不了解的事物,根据一丁点信息发表长篇大论的见解,并且多半是批判的。对权威毫无理由的不耐烦,但绝不公开挑战,只热衷于影响身边的几个人,并有得到认同的强烈欲望。一旦不能如愿,就不再发言,部分人会暴跳如雷,令旁人费解。

  建议:多出去旅行,多读书,多参加团体活动,多接触社会。世界的绝大部分真相在我们的视野之外,浮躁是个人修养浅薄的表现,人既是社会成员也是自然的组成部分,需要积淀对世界尽可能的多认识,才能达到意识的足够高度,才能让人看起来不那么浮躁。

  该干什么才好......


  3.瘦弱,不爱运动。对健壮的人心存嘲讽,对肌肉和力量心存恐惧。在审美上受日式漫画的影响,崇尚中性美和病态美。与第一点有一定关系,在身体的耐力、韧性和爆发力上,更热衷于后者。但是在受到刺激之后,又会表现出病态的固执。这样就表现为两个极端,一方面弱不禁风,另一方面又偶尔会有惊人之举。

  建议:健身,多进行户外运动。身体是人最接近自然的组成部分,一个健康强壮不容易被击倒的身体可以让我们终生收益。

  病态美其实一点都不美

  4.性格软弱,喜欢为自己的意志不坚定找理由。不喜欢通过沟通达到与外界的意见统一,而是表面妥协,内心强烈反感,表现为通常所说的叛逆。性格软弱表现在与异性相处方面就是易犯花痴,对异性的正常关怀想入非非。在弄清楚是怎么回事之后,即使真的喜欢对方,也不敢大胆追求,而是找个理由退缩。通常的理由是说自己不了解爱情,也不想了解。

  建议:堂而皇之的与人打一架,正儿八经的谈一次恋爱。从自然法则的角度考虑的,作为雄性动物,与同性生物打架和向异性求爱都是走向成熟的标志。

  性格决定命运,软弱往往会丧失自己的利益

  5.消极,拒绝长大。不喜欢被人说成熟,尤其不能容忍被人说是老男人。不耐烦与长辈讨论一些实际的问题,反感政治,厌恶参加长辈在场的应酬。要负责任的事情,会让他们觉得焦虑不安和无奈。

  建议:尝试了解父母的不易。也可以从哲学层面去了解索取和付出之间的辩证关系,就象课本里所说的权利和义务的关系。

  不喜欢成熟,其实是不负责的

  6.选择性自闭,对熟人唠叨不休,对陌生人一言不发。偏爱使用方言或者网络语言等非大众语言。吸烟,但是不敬烟。喝酒,但是不敬酒。不是他们感兴趣的话题,基本上很难交谈下去。多人参与讨论时,如果没有人邀请他发言,即使他已酝酿好发言稿,还是会选择沉默。

  建议:这些其实都是在沟通上遇到的困难。建议扩大知识面,扩大社交圈,改变与人交谈的方式,勇敢表达自己的见解,努力将自己的观点传达并影响其他人。获得认同后就会产生激励,反复几次,就可以走出自闭。

  要多多与人群沟通,不要自闭

  7.习惯熬夜,25岁之前通宵次数明显较多。有时候为了“合理安排时间”,干脆用通宵来减少熬夜次数。实际上下半夜都在打瞌睡。

  建议:与第5点相同,熬夜其实就是自闭在作怪。有熬夜习惯的人,白天就找到了关门睡觉的理由,避免了外界的骚扰。或者白天虽然没有在家睡觉,因为精神上萎靡不振,能造成“外界不关我事”的错觉,也能达到抵制外界骚扰的目的。建议立刻改变作息时间,打开心扉。

  经常熬夜会损害美丽的容颜

  8.毫无理由的高傲。觉得别人不可能了解自己,并以此作为对别人不屑的理由。不愿意听别人的建议,也听不进。这种高傲连他们自己都不知道为什么。

  建议:由于时代因素,80后的自尊更为脆弱,从心理上就更趋向于自我保护,表现为对外界不信任。建议多了解一些社会规则,不管在什么场合,只要你在规则之内,你就是安全的,可以自由表达自己的存在价值。

  不要高傲,比你强的人有很多

  9.做事不按计划,讨厌按部就班,永远不知道钱花到哪里去了。以同时看多部小说,守多部漫画为荣。喜欢同时着手几件事,忙得焦头烂额是他们喜欢的状态,尽管这些事情只要合理安排是完全可以按部就班轻松完成的。

  建议:欲速则不达这个道理就不用说了吧。学会制定计划,可以避免紧急情况下全面崩盘的风险。

  怎么钱又花没了

  10.不问问题,相信百度和谷歌的权威,多数人喜欢用搜索引擎思考,将搜索引擎作为自己的智囊。

  建议:互联网确实给了我们许多方便,但是互联网上的东西很多都是未经考证,经不起推敲的。所以要避免犯错,这个地方正需要80后拿出怀疑精神来,不能依赖互联网而使自身的学习功能退化了。
posted @ 2008-08-26 22:07 猪 阅读(147) | 评论 (0)编辑 收藏
public static List openFile(File file)
{
   List list = new ArrayList();
     File saveFile = file;
    
     try
     {
         FileReader fileReader = new FileReader(saveFile);
         BufferedReader bufferedReader = new BufferedReader(fileReader);
         String str;
        
         while((str = bufferedReader.readLine()) != null)
         {
         String [] sData = str.split("\\--");
         list.add(sData);
         }
         bufferedReader.close();
         fileReader.close();
     }
     catch(Exception exc){exc.printStackTrace();}
  
     return list;
}
posted @ 2008-08-26 22:07 猪 阅读(127) | 评论 (0)编辑 收藏
JavaScript语言
01 function compareDate(DateOne)
02    {
03     var OneMonth = DateOne.substring(5,DateOne.lastIndexOf ("-"));
04     var OneDay = DateOne.substring(DateOne.length,DateOne.lastIndexOf ("-")+1);
05     var OneYear = DateOne.substring(0,DateOne.indexOf ("-"));
06  
07     if (Date.parse(OneMonth+"/"+OneDay+"/"+OneYear) >
08      new Date().getTime())
09     {
10      return true;
11     }
12     else
13     {
14      return false;
15     }
16  
17    }
posted @ 2008-08-26 22:07 猪 阅读(322) | 评论 (0)编辑 收藏
Java语言

01 for(int i = 0;i < list.size();i++){
02    dosomething(list.get(i));
03 }
04
05
06 for(int i = 0,n = list.size();i < n;i++){
07    dosomething(list.get(i));
08 }

//得闲看了一眼effective java,看一眼就有新收获
//后一种for循环的写法比前一种有平方级的性能提升
//因为第一种,每循环一次都要调用一次list.size()方法
//如果能确定list.size()固定不变,推荐使用后一种循环
posted @ 2008-08-26 22:07 猪 阅读(145) | 评论 (0)编辑 收藏
想自己写个web应用,东瞅瞅西看看,苦于没有思路....
posted @ 2008-08-26 22:07 猪 阅读(168) | 评论 (0)编辑 收藏

需要写个正则替换字符,网上找来个入门教程,很实用

正则表达式30分钟入门教程

posted @ 2008-08-26 22:07 猪 阅读(115) | 评论 (0)编辑 收藏
select * from (select * from apply_info order by dbms_random.value) where rownum <= 3
posted @ 2008-08-26 22:07 猪 阅读(143) | 评论 (0)编辑 收藏

Java语言: 临时自用代码@代码发芽网
01 public class Test {
02 /**
03 * Simplest in Java 1.5, using the replace method, which
04 * takes CharSequence objects.
05 */
06 public static String replace15(
07     String aInput, String aOldPattern, String aNewPattern){
08     return aInput.replace(aOldPattern, aNewPattern);
09 }
10 /**
11 * Not quite as simple in Java 1.4. The replaceAll method works,
12 * but requires more care, since it uses regular expressions, which
13 * may contain special characters.
14 */
15 public static String replace14(
16     String aInput, String aOldPattern, String aNewPattern){
17     /*
18     * The replaceAll method is a bit dangerous to use.
19     * The aOldPattern is converted into a regular expression.
20     * Thus, if aOldPattern may contain characters which have
21     * special meaning to regular expressions, then they must
22     * be 'escaped' before being passed to replaceAll. It is
23     * easy to forget to do this.
24     *
25     * In addition, aNewPattern treats '$' as special characters
26     * as well: they refer to 'back references'.
27     */
28     return aInput.replaceAll(aOldPattern, aNewPattern);
29     /*
30     Here is an alternative implementation using Pattern and Matcher,
31     which is preferred when the same pattern is used repeatedly
32     final Pattern pattern = Pattern.compile( aOldPattern );
33     final Matcher matcher = pattern.matcher( aInput );
34     return matcher.replaceAll( aNewPattern );
35     */
36 }
37 /**
38 * If Java 1.4 is unavailable, the following technique may be used.
39 *
40 * @param aInput is the original String which may contain substring aOldPattern
41 * @param aOldPattern is the non-empty substring which is to be replaced
42 * @param aNewPattern is the replacement for aOldPattern
43 */
44 public static String replaceOld(
45     final String aInput,
46     final String aOldPattern,
47     final String aNewPattern){
48      if ( aOldPattern.equals("") ) {
49         throw new IllegalArgumentException("Old pattern must have content.");
50      }
51      final StringBuffer result = new StringBuffer();
52      //startIdx and idxOld delimit various chunks of aInput; these
53      //chunks always end where aOldPattern begins
54      int startIdx = 0;
55      int idxOld = 0;
56      while ((idxOld = aInput.indexOf(aOldPattern, startIdx)) >= 0) {
57        //grab a part of aInput which does not include aOldPattern
58        result.append( aInput.substring(startIdx, idxOld) );
59        //add aNewPattern to take place of aOldPattern
60        result.append( aNewPattern );
61        //reset the startIdx to just after the current match, to see
62        //if there are any further matches
63        startIdx = idxOld + aOldPattern.length();
64      }
65      //the final chunk will go to the end of aInput
66      result.append( aInput.substring(startIdx) );
67      return result.toString();
68 }
69 /** Example: update an ip address appearing in a link. */
70 public static void main (String[] aArguments) {
71     String OLD_IP = "insert into LOAD_POLIINFO (IDCARD,POLISTAT,JOINDATE,LOADNO) values ('110102197906300508','13',to_date('null ','yyyy-mm-dd'),70990)";
72 log(replaceOld(OLD_IP,"to_date('null ','yyyy-mm-dd')","null"));
73 }
74 private static void log(String aMessage){
75     System.out.println(aMessage);
76 }
77 }

参考自:http://www.javapractices.com/topic/TopicAction.do?Id=80

             http://biostar.blog.sohu.com/69732830.html

posted @ 2008-08-26 22:07 猪 阅读(614) | 评论 (0)编辑 收藏
养一群地震局“专家”,不如养一群蛤蟆
posted @ 2008-08-26 22:06 猪 阅读(113) | 评论 (0)编辑 收藏

import java.util.*;

public class Test
{
public static void main(String[] agrs)
{
   int[] allIdList = new int[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
   int[] randomIdList = new Test().getRandomIdList(allIdList,10);
   for(int randomIdList_index = 0;randomIdList_index < randomIdList.length;randomIdList_index++){
    System.out.println(randomIdList[randomIdList_index]);
   }
}


/**
*
* @author liuzhaochun
* @explain:从指定的数组中随机取count个,返回这个数组
* @datetime:2008-5-9
* @return
* @return int [] 包含随机取的count个值的数组
*/
public int[] getRandomIdList(int[] allIdList,int count){
  
   int[] randomIdList = new int[count];
   int randomIdList_index = 0;
   for(int allIdList_index = allIdList.length - 1; randomIdList_index < count;allIdList_index--,randomIdList_index++){
    int temp_Index = (int)(Math.random() * allIdList_index);
    randomIdList[randomIdList_index] = allIdList[temp_Index];
    allIdList[temp_Index] = allIdList[allIdList_index];
   }
   return randomIdList;
}



}

posted @ 2008-08-26 22:06 猪 阅读(460) | 评论 (0)编辑 收藏
class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Next("abc123def345ghi"));
            Console.Read();

        }

        private static string Next(string s)
        {
            if (!isNumber(s.Substring(s.Length-1,1)))
                s = s + "0";
            MatchCollection coll = Regex.Matches(s, @"\d+");
            Match m = coll[coll.Count - 1];

            return s.Substring(0, m.Index) + NextNum(m.Value);
        }
        private static string NextNum(string s)
        {
            char[] cs = s.ToCharArray();
            for (int i = s.Length - 1; i >= 0; i--)
            {
                if (!NextChar(ref   cs[i])) break;
            }
          
            string re = new string(cs);
            if (Int32.Parse(re) == 0)
                re = "1" + re;
            return re;
        }
        private static bool NextChar(ref   char c)
        {
            string p = "01234567890123456789";
            int n = p.IndexOf(c);
            c = p[(n + 1) % 10 + 10 * (n / 10)];
            return (n == 9 || n == 19);
        }
        public static bool isNumber(string str)
        {
            Regex r = new Regex(@"^\d+(\.)?\d*$");
            if (r.IsMatch(str))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
posted @ 2008-08-26 22:06 猪 阅读(811) | 评论 (0)编辑 收藏

今儿咱民工真高产,劳动节了嘛,哈哈

真的希望像我那头猪一样啊,呵呵

睡吧,明天太阳会升起

不对,今天的太阳就要升起 呵呵

咯色的垃圾

咯色的垃圾就应该扔到无人烟的垃圾堆里,爱咋咋地去,省的惹别人一身臭

大家离我远点

posted @ 2008-08-26 22:06 猪 阅读(94) | 评论 (0)编辑 收藏

我遇到什么事不能解决就慌乱,心烦,跟他娘的女人来事儿似的,呵呵,据说是

更不用说,几件事压在头上了

能够坦然的,游刃有余的处理来自各方的琐事,可能就是比较高的人了吧,呵呵

想想,周末好像有成为黑色的趋势,听着老婆不时的唠叨妹妹的这啊那啊的,不知如何是好

小系统做了半年多还没结项,开始丧失在大大那的赏识

并且占用了我所有的业余时间,老婆都要跑了

而且老扯票撒谎的出去,心都虚了,每次要编个瞎话跟他娘的下地狱似的,痛苦

太嫩....

posted @ 2008-08-26 22:06 猪 阅读(225) | 评论 (0)编辑 收藏

认识我的人大都说我变了

我难以判定,好像是变了,变怎么了?不知道,大多说我变垃圾了

开始时,看电视也好,电影也好,故事也好,两个人吵架,大都是因为互相不理解,有未言明的误会,吵啊吵的不可开交,甚至不可挽回,那时我就告诉自己,遇到这样的事一定要,立刻解释清楚,静下心来坦言,消除了误会,让对方理解了,也就好了。而现在,我很不想去解释,想的是如果言明了就没意思了,唉...可能也不能一概而论,可能也要分什么事情,可能也分什么关系的人,有默契的人可能就不用解释

人啊,郁闷而又闲闲的时候就容易胡思乱想。

posted @ 2008-08-26 22:06 猪 阅读(105) | 评论 (0)编辑 收藏

发现如果某人惹你不高兴了,一段时间内,你看他哪都不顺眼,呵呵

北京人儿啊,都那么自信,自信的让人都只能隐形了

只知道让人干活的公司会是什么样?就像老一辈讲求无私奉献,为实现共产而努力奋斗,呵呵,我们得到什么了呢,老一辈还得到精神上的满足,我们连精神上的都没了,加班费都不好好给报了,我日啊,老子是喜欢钱地。

开始羡慕民工了,呵呵,

可咱翅膀还没长硬,忍着吧

学习 学习 学习

posted @ 2008-08-26 22:06 猪 阅读(102) | 评论 (0)编辑 收藏

心情不好时就抽烟,喝酒,可命的抽,昨晚浏览了个电影,韩国的,一帅哥爱喝酒抽烟,得了肝硬化,放下身边的工作,妈妈,女友,去疗养院了。呵呵,难道韩国有这样的规定?在我的世界不知道谁能做到去疗养院,能去医院看看,听医嘱,就是有条件的了。

从地铁出来都十一点了,看着外面一个个摆摊卖玉米的,等活儿的出租车司机,人活着比他妈狗都难。

今天公司聚餐,老总说她别看那么大岁数了,可比我们健康,让我们一定要注意身体,她每周都至少在健身房呆两个小时,呵呵,不是一个阶层的人啊,俺倒想去健身房,俺还没房住呢,咋整...

唉...内外兼忧啊

posted @ 2008-08-26 22:06 猪 阅读(117) | 评论 (0)编辑 收藏

好像从开始上大学开始有五一放假这一说,大学时候的放假忘了都干啥了,只记得刚上大一的第一个十一是自己一个人在宿舍过的,大家都回家了。

毕业后的五一都该成我的受难日了,呵呵

劳动节?

posted @ 2008-08-26 22:06 猪 阅读(126) | 评论 (0)编辑 收藏

今天晚上花2块钱16*2站地,大半个北京了,刚回来,可累死了,还好赶上了末班车,要不就惨了,身上就10块钱,在这里祝她老爷子生日快乐,呵呵,虽然人家用不着...

posted @ 2008-08-26 22:06 猪 阅读(102) | 评论 (0)编辑 收藏

我这么个鸟人,自己都没办法,唉...

懦弱,咯色,孤僻,小人,虚荣,胆怯,庸俗,冷血

posted @ 2008-08-26 22:06 猪 阅读(100) | 评论 (0)编辑 收藏
被忽悠了呵呵,谢谢

啥是法儿
今儿累坏了,上午改那该死的bug,下午急匆匆跑了趟前门,刚到就公司打电话找,真他娘的倒霉,又急急忙忙敢了回来,干活,下班了,打个电话吧,呵呵,才知道原来是被忽悠了一天,唉...啥是法儿,还是那么地,只能怪自己,回家吧,呵呵
对了,今天骑的自行车,发现也不比原来远多少,当初怎么就冲动买了电动车呢,下了班,慢慢悠悠骑回来了,唉...想想会有回家的劲儿,一个人都没有,都是自个作地,受吧。

唉...最近不顺,没啥精神事儿

五一了,呵呵 ,又
posted @ 2008-08-26 22:06 猪 阅读(107) | 评论 (0)编辑 收藏

郁闷

做了个小活儿弄得我不得安宁,

心里有事儿,不安,做什么都没心情,烦躁

因为需要给人家去部署,跟公司说有事出去,都不好意思了,好多次了,唉,,,

这么点小事搞的我到处撞墙,老婆都跑了,怪我,太咯色,呵呵,

知道她很想让我带她出去逛街,可我真的是没有心思,又不想让她扫兴,就这么不知如何是好的过了两天

她慌慌着五一回家,我确一点心思没有,回家,向来对我没有吸引力,家里人好像也没问过我回不回去

有个哥们儿真是让我烦,格格不入,也不知是我变了,还是他变了,或许是我太敏感了,越来越咯色

妹妹与老婆的中间是我,让我这个不善维和的笨蛋自己在这发霉,好像现在也没什么,只是老婆发发牢骚,感觉有颗定时炸弹在我心中

下午把跟随我征战北京的自行车骑回来了,骑自行车,爽

自己闷在家里发呆,头疼。

我好想过个快乐的周末,好久没有了。都怪自己没能力,太嫩

以前觉得自己挺会小资的,现在怎么这么机械了呢,越来越俗了。

posted @ 2008-08-26 22:06 猪 阅读(197) | 评论 (0)编辑 收藏

//elm: div id

//url:flash url

//w:width

//h:height

function insertFlash(elm, url, w, h, id) {
if (!document.getElementById(elm)) return;
var str = '';
str += '<embed width="'+ w +'" height="'+ h +'" src="'+ url +'" quality="autohigh" wmode="opaque" type="application/x-shockwave-flash" plugspace="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" id='+id+'></embed>';
document.getElementById(elm).innerHTML = str;
}

posted @ 2008-08-26 22:06 猪 阅读(166) | 评论 (0)编辑 收藏
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test
{


    public static void main(String arg[])
    {
   
        String s = "abc 123    456";
        System.out.println(s);

        while(true){
       
            int index = s.indexOf(" ");
            if(index > 0){
                s = s.replaceAll(" "," ");
            }else{
                break;
            }
        }
       
        System.out.println(s);
    }

public static String replace(String inputStr, String replaceStr) {
            Pattern p = Pattern.compile(" +");
            Matcher m = p.matcher(inputStr);
            return m.replaceAll(replaceStr);
       }


}
posted @ 2008-08-26 22:06 猪 阅读(289) | 评论 (0)编辑 收藏
object oMissing = System.Reflection.Missing.Value;
            Microsoft.Office.Interop.Word._Application oWord;
            Microsoft.Office.Interop.Word._Document oDoc;
            oWord = new Microsoft.Office.Interop.Word.Application();
            //显示word文档
            oWord.Visible = true;
            //取得word文件模板
            object fileName = System.Windows.Forms.Application.StartupPath + "\\word.doc";
            //根据模板生成一个新文档,相当于另存为
            oDoc = oWord.Documents.Add(ref fileName, ref oMissing,
                            ref oMissing, ref oMissing);

            //复制第一个表格
            oDoc.Tables[1].Select();
            oWord.Selection.Copy();

            //在这里操作表格中的文本
            oDoc.Tables[1].Cell(1, 1).Range.Text = "这是第一个表格";

            //下一页
            object mymissing = System.Reflection.Missing.Value;
            object myunit = Microsoft.Office.Interop.Word.WdUnits.wdStory;
            oWord.Selection.EndKey(ref myunit, ref mymissing);
            object pBreak = (int)Microsoft.Office.Interop.Word.WdBreakType.wdPageBreak;
            oWord.Selection.InsertBreak(ref pBreak);

            //粘贴第一个表格
            oWord.Selection.Paste();

            oDoc.Tables[2].Cell(1, 1).Range.Text = "这是第二个表格";
posted @ 2008-08-26 22:06 猪 阅读(2790) | 评论 (0)编辑 收藏

net start OracleDBConsolezhaochun
net start OracleOraDb10g_home1iSQL*Plus
net start OracleOraDb10g_home1TNSListener
net start OracleServiceZHAOCHUN


net stop OracleDBConsolezhaochun
net stop OracleOraDb10g_home1iSQL*Plus
net stop OracleOraDb10g_home1TNSListener
net stop OracleServiceZHAOCHUN

把zhaochun改成自己的服务名
posted @ 2008-08-26 22:06 猪 阅读(203) | 评论 (0)编辑 收藏
谁没有一些刻骨铭心事
谁能预计后果
谁没有一些旧恨心魔
一点点无心错
谁没有一些得不到的梦
谁人负你负我多
谁愿意解释为了什么
一笑已经风云过
posted @ 2008-08-26 22:06 猪 阅读(103) | 评论 (0)编辑 收藏
一个周末,两天,除了吃饭一动不动坐在家里写代码,坐的我屁股疼,腰疼,脖子疼,脑袋疼,眼睛疼....由于决策缺乏前瞻,之前买的一个报表共享控件不能满足现在的新需求,其实原来也有,只是不知道这s控件干不了这活儿,求助作者接连几天都没回音。
被迫将这该死的控件从系统中剥离,想别的办法代替,本来第一种方案使用水晶报表的,研究了一晚上没有进展,放弃,主要是水晶报表画格子太不方便了,也不知道是不是我没找到良方,现在改用了word,在里面画表格保存成模板,然后用程序填充数据。
现在周末过完了,欣慰的是基本上旧的控件程序都剃掉了,换上了word模板,这样最大的缺点就是速度,如果数据量大会很慢,还好,这是个小系统,数据量不算大。
准备收工,洗个澡休息,明儿好上班,突然想起上来空间看看,发现访问量一万多了都,哈哈
本来还想10000的时候抓个图呢,一不小心,过了,呵呵
posted @ 2008-08-26 22:06 猪 阅读(116) | 评论 (0)编辑 收藏
<html>
<head>
    <title>弹出div</title>


   <style>
.#floater {
visibility: hidden;
background-color: #f7fcfe;
z-index: 100;
width: 300px;
height: 50px;
position: absolute;
text-align: center;
font-size: 30px;
color: #FF0000;
font-weight: bold;
vertical-align: middle;
}
</style>



<script language="javaScript">
function show()
{
    var d_dialog = document.getElementById('dialog');
    d_dialog.style.top = document.body.clientHeight / 2 - 60;
    d_dialog.style.left =document.body.clientWidth / 2 -100;
    d_dialog.style.visibility='visible';
    init();
}


function divBlock_event_mousedown()
{
    var e, obj, temp;
    obj=document.getElementById('dialog');
    e=window.event?window.event:e;
    obj.startX=e.clientX-obj.offsetLeft;
    obj.startY=e.clientY-obj.offsetTop;
    document.onmousemove=document_event_mousemove;
    temp=document.attachEvent?document.attachEvent('onmouseup',document_event_mouseup):document.addEventListener('mouseup',document_event_mouseup,'');
}


function document_event_mousemove(e)
{
    var e, obj;
    obj=document.getElementById('dialog');
    e=window.event?window.event:e;
    with(obj.style){
        position='absolute';
        left=e.clientX-obj.startX+'px';
        top=e.clientY-obj.startY+'px';
        }
}

function document_event_mouseup(e)
{
    var temp;
    document.onmousemove='';
    temp=document.detachEvent?document.detachEvent('onmouseup',document_event_mouseup):document.removeEventListener('mouseup',document_event_mouseup,'');
}
</script>
<script language="JavaScript">
self.onError=null;     
currentX = currentY =0;     
whichIt = null;     
lastScrollX =-10; lastScrollY = -100;     
NS = (document.layers) ? 1 : 0;     
IE = (document.all) ? 1: 0;     
<!-- STALKER CODE -->     
function heartBeat() {     
    if(IE) { diffY = document.body.scrollTop; diffX = document.body.scrollLeft; }     
    if(NS) { diffY = self.pageYOffset; diffX = self.pageXOffset; }     
    if(diffY != lastScrollY) {     
        percent = .1 * (diffY - lastScrollY);     


        if(percent > 0) percent = Math.ceil(percent);     
        else percent = Math.floor(percent);     
        if(IE) document.all.dialog.style.pixelTop += percent;     
        if(NS) document.dialog.top += percent;     
        lastScrollY = lastScrollY + percent;     
    }     
    if(diffX != lastScrollX) {     
        percent = .1 * (diffX - lastScrollX);     
        if(percent > 0) percent = Math.ceil(percent);     
        else percent = Math.floor(percent);     
        if(IE) document.all.dialog.style.pixelLeft += percent;     
        if(NS) document.dialog.left += percent;     
        lastScrollX = lastScrollX + percent;     
    }     
}     


<!-- /STALKER CODE -->     
<!-- DRAG Drop CODE -->     
function checkFocus(x,y) {     
    stalkerx = document.dialog.pageX;     
    stalkery = document.dialog.pageY;     
    stalkerwidth = document.dialog.clip.width;     
    stalkerheight = document.dialog.clip.height;     
    if( (x > stalkerx && x < (stalkerx+stalkerwidth)) && (y > stalkery && y < (stalkery+stalkerheight))) return true;     
    else return false;     
}     
function grabIt(e) {     
    if(IE) {     
        whichIt = event.srcElement;     
        while (whichIt.id.indexOf("dialog") == -1) {     

            whichIt = whichIt.parentElement;     
            if (whichIt == null) { return true; }     
        }     
        whichIt.style.pixelLeft = whichIt.offsetLeft;     
        whichIt.style.pixelTop = whichIt.offsetTop;     
        currentX = (event.clientX + document.body.scrollLeft);     
        currentY = (event.clientY + document.body.scrollTop);     
        } else {     
            window.captureEvents(Event.MOUSEMOVE);     
            if(checkFocus (e.pageX,e.pageY)) {     
                whichIt = document.dialog;     
                StalkerTouchedX = e.pageX-document.dialog.pageX;     
                StalkerTouchedY = e.pageY-document.dialog.pageY;     
            }     
    }     


    return true;     
}

function moveIt(e) {     
if (whichIt == null) { return false; }     
if(IE) {     
newX = (event.clientX + document.body.scrollLeft);     
newY = (event.clientY + document.body.scrollTop);     
distanceX = (newX - currentX); distanceY = (newY - currentY);     
currentX = newX; currentY = newY;     
whichIt.style.pixelLeft += distanceX;     
whichIt.style.pixelTop += distanceY;     
if(whichIt.style.pixelTop < document.body.scrollTop) whichIt.style.pixelTop = document.body.scrollTop;     
if(whichIt.style.pixelLeft < document.body.scrollLeft) whichIt.style.pixelLeft = document.body.scrollLeft;     
if(whichIt.style.pixelLeft > document.body.offsetWidth - document.body.scrollLeft - whichIt.style.pixelWidth - 20) whichIt.style.pixelLeft = document.body.offsetWidth - whichIt.style.pixelWidth - 20;     
if(whichIt.style.pixelTop > document.body.offsetHeight + document.body.scrollTop - whichIt.style.pixelHeight - 5) whichIt.style.pixelTop = document.body.offsetHeight + document.body.scrollTop - whichIt.style.pixelHeight - 5;     
event.returnValue = false;     
} else {     
whichIt.moveTo(e.pageX-StalkerTouchedX,e.pageY-StalkerTouchedY);     
if(whichIt.left < 0+self.pageXOffset) whichIt.left = 0+self.pageXOffset;     
if(whichIt.top < 0+self.pageYOffset) whichIt.top = 0+self.pageYOffset;     
if( (whichIt.left + whichIt.clip.width) >= (window.innerWidth+self.pageXOffset-17)) whichIt.left = ((window.innerWidth+self.pageXOffset)-whichIt.clip.width)-17;     
if( (whichIt.top + whichIt.clip.height) >= (window.innerHeight+self.pageYOffset-17)) whichIt.top = ((window.innerHeight+self.pageYOffset)-whichIt.clip.height)-17;     
return false;     
}     
return false;     
}     
function dropIt() {     
whichIt = null;     
if(NS) window.releaseEvents (Event.MOUSEMOVE);     
return true;     
}     
<!-- DRAG Drop CODE -->     
if(NS) {     
window.captureEvents(Event.MOUSEUP|Event.MOUSEDOWN);     
window.onmousedown = grabIt;     
window.onmousemove = moveIt;     
window.onmouseup = dropIt;     
}     
if(IE) {     
document.onmousedown = grabIt;     
document.onmousemove = moveIt;     
document.onmouseup = dropIt;     
}     
if(NS || IE) action = window.setInterval("heartBeat()",1);     
</script>
</head>
<div id ="dialog" onmousedown="divBlock_event_mousedown()">在这里面定义html内容美化</div>
<body onload="show()">
    <table border='0' width="100%" height="100%">
        <tr>
            <td>
                测试
            </td>
        </tr>
        <tr>
           <td>
             处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>

            <br>
            <br>
            <br>
            <br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>

            <br>
            <br>
            <br>
            <br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>

            <br>
            <br>
            <br>
            <br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>

            <br>
            <br>
            <br>
            <br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>

            <br>
            <br>
            <br>
            <br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>

            <br>
            <br>
            <br>
            <br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>

            <br>
            <br>
            <br>
            <br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>

            <br>
            <br>
            <br>
            <br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>

            <br>
            <br>
            <br>
            <br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>

            <br>
            <br>
            <br>
            <br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>

            <br>
            <br>
            <br>
            <br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>

            <br>
            <br>
            <br>
            <br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>

            <br>
            <br>
            <br>
            <br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>

            <br>
            <br>
            <br>
            <br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>
            处理中,请等待……<br>

            <br>
            <br>
            <br>
            <br>
           </td>
        </tr>
    </table>
</body>
</html>
posted @ 2008-08-26 22:06 猪 阅读(1654) | 评论 (1)编辑 收藏

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<style type="text/css">
<!--

.#opstatdiv {
   visibility: hidden;
   background-color: #f7fcfe;
   z-index: 100;
   width: 200px;
   height: 50px;
   position: absolute;
   text-align: left;
   font-size: 12px;
   color: #FF0000;
   font-weight: bold;
   vertical-align: middle;
}
-->
</style>
<script type="text/javascript">

function showOpstatView()
{
var msgStr = "提示信息";
var d_dialog = document.getElementById('opstatdiv');
d_dialog.innerHTML = msgStr;
d_dialog.style.posLeft = document.body.scrollLeft + event.clientX + 10;
d_dialog.style.posTop = document.body.scrollTop + event.clientY;
  
d_dialog.style.visibility='visible';

}

function opstatDivClose()
{
    var d_dialog = document.getElementById('opstatdiv');
    d_dialog.style.visibility='hidden';
}

</script>
</HEAD>

<BODY>
<div id="opstatdiv"></div>
<table>
<tr>
   <td onmouseover="javascript:showOpstatView()" onmouseout="javascript:opstatDivClose()">>
   靠近我
   </td>
</tr>
</table>
</BODY>
</HTML>

posted @ 2008-08-26 22:06 猪 阅读(441) | 评论 (0)编辑 收藏

C#操作Word中的表格

            object oMissing = System.Reflection.Missing.Value;
            Microsoft.Office.Interop.Word._Application oWord;
            Microsoft.Office.Interop.Word._Document oDoc;
            oWord = new Microsoft.Office.Interop.Word.Application();
            //显示word文档
            oWord.Visible = true;
            //取得word文件模板
            object fileName = System.Windows.Forms.Application.StartupPath + "\\word.doc";
            //根据模板生成一个新文档,相当于另存为
            oDoc = oWord.Documents.Add(ref fileName, ref oMissing,
                            ref oMissing, ref oMissing);
            //在这里操作表格中的文本
            oDoc.Tables[1].Cell(1, 1).Range.Text = "cell11";


            //MessageBox.Show(oDoc.Content.Paragraphs[3].Range.Text);

遇到的问题

1、开始时添加word动态链接库引用出错,在引用里面有黄色感叹号,在baidu上搜,找到原因,是因为,先安装的office,后安装的.net,默认没有安装.NET Programmability Support(.net可编程支持)。重新启动office安装程序,选修复,将.NET Programmability Support(.net可编程支持)选择安装到本机就OK了。

参考:http://hi.baidu.com/devzhao/blog/item/4248624ab27e102008f7ef2c.html

2、添加word引用的方法,在Program Files\Microsoft Office\OFFICE11中有个MSWORD.OLB文件,添加引用,就行了,还有中办法好象在com组件中找到Microsoft Word 11.0 Object Library也行。

3、操作word文档的代码参考:http://tmsoft.lsxy.com/index.php?load=read&id=334#comm_top

另外,还不知道,这样的代码对客户机配置有什么要求,office是肯定必须安装了,安装的版本有限制没,以后客户自己升级个office 2007会不会有问题????

高手看到了,麻烦告诉小弟一下,谢过!!!

posted @ 2008-08-26 22:06 猪 阅读(321) | 评论 (0)编辑 收藏
vss for eclipse 显示签出状态老是无缘无故没了,还得每次到baidu上搜,这次记下来省得忘,呵呵
posted @ 2008-08-26 22:06 猪 阅读(134) | 评论 (0)编辑 收藏
JPA(Java Persistence API)
JPA(Java Persistence API)作为Java EE 5.0平台标准的ORM规范,将得到所有Java EE服务器的支持。Sun这次吸取了之前EJB规范惨痛失败的经历,在充分吸收现有ORM框架的基础上,得到了一个易于使用、伸缩性强的ORM规范。
posted @ 2008-08-26 22:06 猪 阅读(131) | 评论 (0)编辑 收藏

<%--

/**

*实现右键菜单功能

*/

--%>

<html>
    <body oncontextmenu = showMenu('')>
        <form name = "menuForm">
            <!--隐藏框,用来保存选择的菜单的id值-->
            <input type = "hidden" name = "id" value = "">
            <table>
            <tr>
       <td><a href="javascript:clickMenu()" oncontextmenu = showMenu('0')>根目录</a></td>
    </tr>
            <tr>
       <td><a href="javascript:clickMenu()" oncontextmenu = showMenu('1')>菜单一</a></td>
    </tr>

            <tr><td><a href="javascript:clickMenu()" oncontextmenu = showMenu('2')>菜单二</a></td></tr>

            </table>
        </form>
    </body>

    <!-- 这里用来定义需要显示的右键菜单 -->
    <div id="itemMenu" style="display:none">
           <table border="1" width="100%" height="100%" bgcolor="#cccccc" style="border:thin" cellspacing="0">
                  <tr>
                      <td style="cursor:default;border:outset 1;" align="center" onclick="parent.create()">
                      新增
                      </td>
                  </tr>
                  <tr>
                      <td style="cursor:default;border:outset 1;" align="center" onclick="parent.update();">
                      修改
                      </td>
                  </tr>
                  <tr>
                      <td style="cursor:default;border:outset 1;" align="center" onclick="parent.del()">
                      删除
                     </td>
                  </tr>
           </table>
    </div>
    <!-- 右键菜单结束-->
</html>


<script language="JavaScript">

/**

*根据传入的id显示右键菜单

*/

function showMenu(id){
    menuForm.id.value = id;

    if("" == id){
        popMenu(itemMenu,100,"100");
    }
    else{
        popMenu(itemMenu,100,"111");
    }

    event.returnValue=false;
    event.cancelBubble=true;
    return false;

}


/**

*显示弹出菜单

*menuDiv:右键菜单的内容

*width:行显示的宽度

*rowControlString:行控制字符串,0表示不显示,1表示显示,如“101”,则表示第1、3行显示,第2行不显示

*/

function popMenu(menuDiv,width,rowControlString){
    //创建弹出菜单
    var pop=window.createPopup();

    //设置弹出菜单的内容
    pop.document.body.innerHTML=menuDiv.innerHTML;
    var rowObjs=pop.document.body.all[0].rows;

    //获得弹出菜单的行数
    var rowCount=rowObjs.length;

    //循环设置每行的属性
    for(var i=0;i<rowObjs.length;i++){
        //如果设置该行不显示,则行数减一
        var hide=rowControlString.charAt(i)!='1';

        if(hide){
            rowCount--;
        }

        //设置是否显示该行

        rowObjs[i].style.display=(hide)?"none":"";

        //设置鼠标滑入该行时的效果

        rowObjs[i].cells[0].onmouseover=function(){
            this.style.background="#818181";
            this.style.color="white";
        }
        //设置鼠标滑出该行时的效果
        rowObjs[i].cells[0].onmouseout=function(){
            this.style.background="#cccccc";
            this.style.color="black";
        }

    }

    //屏蔽菜单的菜单
    pop.document.oncontextmenu=function() {
            return false;
    }

    //选择右键菜单的一项后,菜单隐藏
    pop.document.onclick=function(){
            pop.hide();
    }
    //显示菜单
    pop.show(event.clientX-1,event.clientY,width,rowCount*25,document.body);
    return true;

}
function create(){
    alert("create" + menuForm.id.value + "!");
}

function update(){
    alert("update" + menuForm.id.value + "!");
}
function del(){
    alert("delete" + menuForm.id.value + "!");
}
function clickMenu(){
    alert("you click a menu!");
}
</script>

posted @ 2008-08-26 22:06 猪 阅读(195) | 评论 (0)编辑 收藏
用上百度Hi 的朋友加我好友啊,嘿嘿i

在线等......
posted @ 2008-08-26 22:06 猪 阅读(114) | 评论 (0)编辑 收藏
忙里偷闲
研究了一下webservice,做了个hello world
一点理解,xfire能把一个普通java类映射成web服务
首先要建立一个供外部调用的接口interface
然后建立一个类实现这个接口
再然后在service.xml中配置web服务的名字,名称空间,接口类名,实现接口的类名,这个service.xml文件要放在src/META-INF/xfire/services.xml
最后在web.xml中配置xfire 的servlet
OK了
===============接口HelloWorldService 类==================
package com.capinfo.xfire.pojo;
/**
* @author sing
* @explain:
* @datetime:Mar 26, 2008 4:48:19 PM
*/

public interface HelloWorldService {

    public String sayHello();
   
}
==============接口实现类HelloWorldServiceImpl =====================
package com.capinfo.xfire.pojo;
/**
* @author sing
* @explain:
* @datetime:Mar 26, 2008 4:50:15 PM
*/
public class HelloWorldServiceImpl implements HelloWorldService {

    public String sayHello() {
       
        return "this.is.my first web service";
    }

}
===============service.xml==================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
    <name>HelloWorldService</name>
    <namespace>http://capinfo.com/HelloWorldService</namespace>
    <serviceClass>
        com.capinfo.xfire.pojo.HelloWorldService
    </serviceClass>
    <implementationClass>
        com.capinfo.xfire.pojo.HelloWorldServiceImpl
    </implementationClass>
</service>
</beans>
==============web.xml=======================
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <servlet>
        <servlet-name>XFireServlet</servlet-name>
        <display-name>XFire Servlet</display-name>
        <servlet-class>
            org.codehaus.xfire.transport.http.XFireConfigurableServlet
        </servlet-class>
    </servlet>
   
    <servlet-mapping>
        <servlet-name>XFireServlet</servlet-name>
        <url-pattern>/servlet/XFireServlet/*</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>XFireServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
===================Test.java========================
package com.capinfo.xfire.pojo;

import java.net.MalformedURLException;

import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

/**
* @author spring
* @explain:
* @datetime:Mar 26, 2008 5:50:02 PM
*/
public class Test {

    public static void main(String [] args){
        Service serviceModel = new ObjectServiceFactory().create(HelloWorldService.class);
        try {
            HelloWorldService service = (HelloWorldService)
                new XFireProxyFactory().create(serviceModel, "http://localhost:8081/xfire/services/HelloWorldService");
            System.out.println(service.sayHello());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}

======================放jar包========================
"activation-1.1.jar"
"commons-codec-1.3.jar"
"commons-httpclient-3.0.jar"
"commons-logging-1.0.4.jar"
"jaxen-1.1-beta-9.jar"
"jdom-1.0.jar"
"mail-1.4.jar"
"spring-1.2.6.jar"
"stax-api-1.0.1.jar"
"wsdl4j-1.6.1.jar"
"wstx-asl-3.2.0.jar"
"xbean-spring-2.8.jar"
"xfire-all-1.2.6.jar"


参考资源:http://www.blogjava.net/fastzch/archive/2008/01/03/172535.html
posted @ 2008-08-26 22:06 猪 阅读(282) | 评论 (0)编辑 收藏
早上打开电脑发现可以体验百度Hi了,第二个发现就是百度Hi不支持代理登录,完了,公司要代理才能上网,岂不是上不了?!郁闷,眼瞅着吧
posted @ 2008-08-26 22:06 猪 阅读(140) | 评论 (0)编辑 收藏
ORA-01461: can bind a LONG value only for insert into a LONG column
原来好好的
突然报这样的错误

检查数据库驱动的版本是不是跟数据库一致,升级数据库驱动,问题没有再出现
posted @ 2008-08-26 22:06 猪 阅读(139) | 评论 (0)编辑 收藏
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace psms.util
{
    class Log
    {
        /// <summary>
        /// 写日志文件
        /// </summary>
        /// <param name="sMsg"></param>
        public static void WriteLog(string sMsg)
        {
            if (sMsg != "")
            {
                //Random randObj = new Random(DateTime.Now.Millisecond);
                //int file = randObj.Next() + 1;
                string filename = DateTime.Now.ToString("yyyyMM") + ".log";
                try
                {
                    FileInfo fi = new FileInfo(Application.StartupPath + "\\log\\" + filename);
                    if (!fi.Exists)
                    {
                        using (StreamWriter sw = fi.CreateText())
                        {
                            sw.WriteLine(DateTime.Now + "\n" + sMsg + "\n");
                            sw.Close();
                        }
                    }
                    else
                    {
                        using (StreamWriter sw = fi.AppendText())
                        {
                            sw.WriteLine(DateTime.Now + "\n" + sMsg + "\n");
                            sw.Close();
                        }
                    }
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }
}
posted @ 2008-08-26 22:06 猪 阅读(1724) | 评论 (0)编辑 收藏
遇到这样一个问题
页面中有几个数据项用struts的<html:select>标签展示,今天提出新的需求,要不允许修改这几个<html:select>,那就禁用咯,这样问题发现了,这个页面是来自action,给<html:select>对应actionForm中的属性付了值,页面显示<html:select>自然就选中被赋值的选项,但是提交表单的时候,数据保存的确总是<html:select>列表中的第一个值,如果去掉禁用,就正常了。晕。
试着在onload中用js禁用也不行
在网上搜到一个这样的写法,实现readonly了<select onbeforeactivate="return false" onfocus="this.blur()" onmouseover="this.setCapture()" onmouseout="this.releaseCapture()">
<option>1</option>
</select>
不过要用到
<html:select>中要把onbeforeactivate="return false" 去掉,<html:select>不认识这个属性,不过效果还是实现了。
posted @ 2008-08-26 22:06 猪 阅读(122) | 评论 (0)编辑 收藏

今天周末,被头儿过来改bug
其中一个在hql查询的时候报org.hibernate.hql.ast.QuerySyntaxException: unexpected token: ApplyInfo near line 1, column 23这样的错误,貌似看起来hibernate不认识ApplyInfo这个映射持久类,但是这个类非常确定的是已经映射了,而且在别处用的非常正常。郁闷,找啊找
在网上找org.hibernate.hql.ast.QuerySyntaxException: unexpected token的错误有
1、持久类写错了,要不就是写成了数据库表名
2、hibernate3.0不支持select中嵌套查询,据说from中也不行,只支持where中嵌套查询,好像3.1支持了select中嵌套
3、sql语句中字段是用了保留关键字

然后就是我发现的这个隐蔽错误了
发现的from后的空格是一个全角的空格,半角 空格,全角 空格。距离比一样啊,原来就看出from后面的空格大了,还以为是两个空格呢。

隐蔽,太隐蔽了。

org.hibernate.hql.ast.QuerySyntaxException: unexpected token: ApplyInfo near line 1, column 23 [SELECT contCount FROM ApplyInfo where applyId = (select applyId from com.capinfo.hibernate.person.pojo.AContinueInfo where id=25)]
    at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:59)
    at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:244)
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:155)
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:109)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:75)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:54)
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:71)
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:134)
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:113)
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1602)
    at com.capinfo.zgbm.print.dao.PrintQueryDAO.getContinueCount(PrintQueryDAO.java:273)
    at com.capinfo.zgbm.print.action.PrintContinueCountAction.execute(PrintContinueCountAction.java:95)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
    at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:225)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:127)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
    at com.capinfo.util.LoginFilter.doFilter(LoginFilter.java:61)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
    at com.capinfo.util.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:67)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3212)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:1983)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:1890)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1344)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:181)
Caused by: line 1:23: unexpected token: ApplyInfo
    at org.hibernate.hql.antlr.HqlBaseParser.identPrimary(HqlBaseParser.java:4021)
    at org.hibernate.hql.antlr.HqlBaseParser.primaryExpression(HqlBaseParser.java:861)
    at org.hibernate.hql.antlr.HqlBaseParser.atom(HqlBaseParser.java:3422)
    at org.hibernate.hql.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3200)
    at org.hibernate.hql.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:3082)
    at org.hibernate.hql.antlr.HqlBaseParser.additiveExpression(HqlBaseParser.java:2802)
    at org.hibernate.hql.antlr.HqlBaseParser.concatenation(HqlBaseParser.java:570)
    at org.hibernate.hql.antlr.HqlBaseParser.relationalExpression(HqlBaseParser.java:2586)
    at org.hibernate.hql.antlr.HqlBaseParser.equalityExpression(HqlBaseParser.java:2449)
    at org.hibernate.hql.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2413)
    at org.hibernate.hql.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:2331)
    at org.hibernate.hql.antlr.HqlBaseParser.logicalOrExpression(HqlBaseParser.java:2296)
    at org.hibernate.hql.antlr.HqlBaseParser.expression(HqlBaseParser.java:2082)
    at org.hibernate.hql.antlr.HqlBaseParser.aliasedExpression(HqlBaseParser.java:2249)
    at org.hibernate.hql.antlr.HqlBaseParser.selectedPropertiesList(HqlBaseParser.java:1455)
    at org.hibernate.hql.antlr.HqlBaseParser.selectClause(HqlBaseParser.java:1365)
    at org.hibernate.hql.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1106)
    at org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:702)
    at org.hibernate.hql.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:296)
    at org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:159)
    at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:238)
    ... 33 more
posted @ 2008-08-26 22:06 猪 阅读(4459) | 评论 (0)编辑 收藏
系统中有个功能用户点击一个按钮要调用webservice,可能会等待较长时间,如果用户不耐烦,再点按钮或点击别的功能就乱套了
想到屏蔽页面所有功能,思路是用户点击按钮,调用一个javascript方法,显示预先在页面中定义好的隐藏div,返回结果后再隐藏div,允许用户继续操作。



==========================================================

<html>
<head>
    <title>半透明div</title>


   <style>
.#mask {
visibility: hidden;
background-color: #cccccc;
left: 0px;
position: absolute;
top: 0px;
background-image: none;
filter: alpha(opacity :   50);
}

.#dialog {
visibility: hidden;
background-color: #f7fcfe;
z-index: 100;
width: 300px;
height: 50px;
position: absolute;
text-align: center;
font-size: 30px;
color: #FF0000;
font-weight: bold;
vertical-align: middle;
}
</style>



<script language="javaScript">
function show()
{
    var d_mask=document.getElementById('mask');
    var d_dialog = document.getElementById('dialog');


    d_mask.style.width = document.body.clientWidth ;
    d_mask.style.height=document.body.clientHeight;

    //网页正文全文
    //d_mask.style.width = document.body.scrollWidth ;
    //d_mask.style.height=document.body.scrollHeight;


    d_dialog.style.top = document.body.clientHeight / 2 - 60;
    d_dialog.style.left =document.body.clientWidth / 2 -100;

    d_mask.style.visibility='visible';
    d_dialog.style.visibility='visible';

}


function divBlock_event_mousedown()
{
var e, obj, temp;
obj=document.getElementById('dialog');
e=window.event?window.event:e;
obj.startX=e.clientX-obj.offsetLeft;
obj.startY=e.clientY-obj.offsetTop;
document.onmousemove=document_event_mousemove;
temp=document.attachEvent?document.attachEvent('onmouseup',document_event_mouseup):document.addEventListener('mouseup',document_event_mouseup,'');
}


function document_event_mousemove(e)
{
var e, obj;
obj=document.getElementById('dialog');
e=window.event?window.event:e;
with(obj.style){
    position='absolute';
    left=e.clientX-obj.startX+'px';
    top=e.clientY-obj.startY+'px';
    }
}

function document_event_mouseup(e)
{
var temp;
document.onmousemove='';
temp=document.detachEvent?document.detachEvent('onmouseup',document_event_mouseup):document.removeEventListener('mouseup',document_event_mouseup,'');
}


window.onresize = function()
{
    var d_mask=document.getElementById('mask');
    var d_dialog = document.getElementById('dialog');


    d_mask.style.width = document.body.clientWidth ;
    d_mask.style.height=document.body.clientHeight;
}
</script>
</head>
<div id ="mask"></div>
<div id ="dialog" onmousedown="divBlock_event_mousedown()">处理中,请等待……</div>
<body>
    <table border='0' width="100%" height="100%">
        <tr>
            <td>
                测试
            </td>
        </tr>
        <tr>
           <td>
              <input type="button" value="显示div" onclick="show()" />
           </td>
        </tr>
    </table>
</body>
</html>
posted @ 2008-08-26 22:06 猪 阅读(1085) | 评论 (0)编辑 收藏
bea9\user_projects\domains\base_domain\servers\AdminServer\logs
posted @ 2008-08-26 22:06 猪 阅读(195) | 评论 (0)编辑 收藏

2008年,元旦、春节、清明节、国际劳动节、端午节、中秋节、国庆节放假调休日期具体安排如下:

一、元旦:2007年12月30日-2008年1月1日放假,共3天。其中:1月1日(星期二)为法定节假日,12月30日(星期日)为公休日,12月29日(星期六)公休日调至12月31日(星期一),12月29日(星期六)上班。

二、春节:2月6日—12日(即农历除夕至正月初六)放假,共7天。其中,2月6日(除夕)、2月7日(春节)、2月8日(正月初二)为法定节假日,2月9日(星期六)、2月10日(星期日)照常公休,将2月2日(星期六)、2月3日(星期日)两个公休日调至2月11日(星期一)、2月12日(星期二),2月2日(星期六)、2月3日(星期日)上班。

三、清明节:4月4日—6日放假,共3天。其中:4月4日(清明节),为法定节假日,4月5日(星期六)、4月6日(星期日)照常公休。

四、五一”国际劳动节:5月1日—3日放假,共3天。其中,5月1日为法定节假日,5月3日(星期六)为公休日,5月4日(星期日)公休日调至5月2日(星期五),5月4日(星期日)上班。

五、端午节:6月7日—9日放假,共3天。其中:6月7日(星期六)照常公休,6月8日(农历五月初五,端午节)为法定节假日,6月8日(星期日)公休日调至6月9日(星期一)。

六、中秋节:9月13日—15日放假3天。其中,9月13日(星期六)为公休日;9月14日(农历八月十五,中秋节)为法定节假日,9月14日(星期日)公休日调至9月15日(星期一)。

七、国庆节:9月29日—10月5日放假7天。其中,10月1日、2日、3日,为法定节假日,9月27日(星期六)、9月28日(星期日)两个公休日调至9月29日(星期一)、30日(星期二),9月27日(星期六)、9月28日(星期日)上班,10月4日(星期六)、5日(星期日)照常公休。

posted @ 2008-08-26 22:06 猪 阅读(125) | 评论 (0)编辑 收藏
Interactive DHTML demos
posted @ 2008-08-26 22:06 猪 阅读(110) | 评论 (0)编辑 收藏

秋 23:58:43
哥也许我把你气坏了, 我从来都是这样的,妈也说过我那么多回让我改,我敢说我来北京以后脾气根在家我改了很多,每次回家我是多多少少干了一点,也有没有干的时候,我也不想说什么我干了什么和没有干什么了,没有用,我一周就回来了一次,不是天天在家闲着,要是那样我没有做也行,在家的时候我要是不想做饭了根妈说让妈做妈没有说你怎么不做饭等着吃呢,她也知道我想玩会, 我就是有点不服气,也就这么点事,本来明天回家了高兴得很, 今天我把米饭做好了, 说让你回来买点菜回来就行了,从你把面包丢给我我也看出来了,我也生气你要不就别给我,你让我拿电脑回去,我不愿意拿一是我不想拿,而是我还怕丢了,爸爸那人你又不是不知道说话就那样,你呢还非得跟他较劲,你拿回去爸爸能怎么想,他能高兴,他主要是不懂得电脑就以为坏了,其实他说的也没有错,本来你买的就没有他这个好,要是买一样的你也不能和他换,所以他也就是发泄2下,找明白人给他弄好了也就没有事了,不知道你还老抓住这个不放什么,非给他拿回去,说到我过年回来我不回来了,老师说过你不能每周都回去,也得要锻炼着自己独立,周日多出去转转,我也想了不回来也行,也省得你说我礼貌不到,因为是在家里我跟本就没有注意到也没有上心里去,说到爸把我交给你是个极大的错误, 我也说了让你不用管了,我比谁都后悔来到着,我当初也说过我宁愿在家受累也不想来这,我知道上好的话能改变自己的一生,我知道妈他们挣钱是多么的不容易,我也不能让这2万块钱白交,不管学多少我学了,我尽力了, 这点我很清楚,我在着呢也让你跟着操心,我知道,因为你是我哥,我有什么不对的地方咱都是家里人没有什么,回家的时候我看你和嫂子在厨房也不说话,我以为你们生气了,平常看你们闹那肯定什么事也没有,从周六我回来到今天我看你也不怎么高兴,今天回来也没有说话,我没有进厨房,你们俩在厨房了谁也不吱声,我也就没有进去,说了这么多也没有说到什么重点,我呢脾气就是这样僵,生气的时候什么话都能够说出来,清醒了知道自己错了,不管怎么样你是我哥,我也拿你当哥,我也会慢慢改脾气的,一下子是不能改过来的,这一快过年了我们也都希望全家都高高兴兴的过年,都是一家人,没有什么大不了的,都是亲的没有什么深仇大恨,我希望今天这页就掀过去了,惹你生气了,我也知道自己错了,明天我就回家了希望让妈他们看到我高兴的回去再来,和你们处得也融洽,不让妈担心,希望你回去以后也能够跟爸和和睦睦的,我们全家都过了好年,今年家里多了嫂子也是喜事,我呢也不说了,希望你能把今天的事忘了吧,要是能原谅妹子这次呢,就发个信息给我吧。不原谅就当我什么也没有说好吧。
posted @ 2008-08-26 22:06 猪 阅读(121) | 评论 (0)编辑 收藏

当幸福来敲门 威尔-斯密斯

晚上没事,重温了《当幸福来敲门》的下半部分(上半个不知道怎么没弄没了,呵呵)

I like it

也许应该找点东西感动感动,要不然被周围的冷漠淹没了

奋斗是根本,想想自己的境况比Chris好一点,还没有落魄的在卫生间过夜,多亏了父母的肩膀啊,可也有过半夜搬家的日子,我们还没有Chris努力,所以我们也会没有Chris成功

但是我们还想成功,还想住大房子,开小车,可那不是大风刮来的

当幸福来敲门 多美的一句话

posted @ 2008-08-26 22:06 猪 阅读(125) | 评论 (0)编辑 收藏
无法识别的usb设备 无法识别的生活种种
posted @ 2008-08-26 22:06 猪 阅读(97) | 评论 (0)编辑 收藏
//dwr Message
function useLoadingMessage(message) {
    var loadingMessage;
    if (message) loadingMessage = message;
    else loadingMessage = "Loading";
   
    DWREngine.setPreHook(function() {
        var disabledZone = $('disabledZone');
        if (!disabledZone) {
          disabledZone = document.createElement('div');
          disabledZone.setAttribute('id', 'disabledZone');
          disabledZone.style.position = "absolute";
          disabledZone.style.zIndex = "1000";
          disabledZone.style.left = "0px";
          disabledZone.style.top = "0px";
          disabledZone.style.width = "100%";
          disabledZone.style.height = "100%";
          document.body.appendChild(disabledZone);
          var messageZone = document.createElement('div');
          messageZone.setAttribute('id', 'messageZone');
          messageZone.style.position = "absolute";
          messageZone.style.top = "400px";  //定义显示加载信息层的位置
         messageZone.style.left = "400px";  //定义显示加载信息层的位置
          messageZone.style.width = "150";  //定义显示加载信息层的宽度
          messageZone.style.height = "30";    //定义显示加载信息层的高度
          messageZone.style.background = "red";//定义显示加载信息层的颜色
          messageZone.style.color = "white";
          messageZone.style.fontFamily = "Arial,Helvetica,sans-serif";
          messageZone.style.padding = "4px";
          disabledZone.appendChild(messageZone);
          var text = document.createTextNode(loadingMessage);
          messageZone.appendChild(text);
        }
        else {
          $('messageZone').innerHTML = loadingMessage;
          disabledZone.style.visibility = 'visible';
        }
    });

    DWREngine.setPostHook(function() {
        $('disabledZone').style.visibility = 'hidden';
    });
}
posted @ 2008-08-26 22:06 猪 阅读(230) | 评论 (0)编辑 收藏

sql语句编写能力很差啊,总不用就忘啊,用了聚合函数的查询,得有group by

第一个行,第二个不行

SELECT
(select rowname from RPT_ROWCODE_SERVCORP rs where rs.rowcode = r.rowcode and tname = 'RPT_AGG_ST_SERV_01_2007') rowname,
r.rowcode,
sum(r.N01),sum(r.N02),sum(r.N03),sum(r.N04),sum(r.N05),sum(r.N06),sum(r.N07),
sum(r.N08),sum(r.N09),sum(r.N10),sum(r.N11),sum(r.N12),sum(r.N13),sum(r.N14),sum(r.N15)
FROM RPT_AGG_ST_SERV_01_2007 r
WHERE     r.offino in ('0001') group by r.rowcode
order by r.rowcode

SELECT
rrs.rowcode,rrs.rowname,
sum(r.N01),sum(r.N02),sum(r.N03),sum(r.N04),sum(r.N05),sum(r.N06),sum(r.N07),
sum(r.N08),sum(r.N09),sum(r.N10),sum(r.N11),sum(r.N12),sum(r.N13),sum(r.N14),sum(r.N15)
FROM RPT_AGG_ST_SERV_01_2007 r,RPT_ROWCODE_SERVCORP rrs
WHERE     rrs.rowcode = r.rowcode and rrs.tname = 'RPT_AGG_ST_SERV_01_2007' and r.offino in ('0001') group by r.rowcode
order by r.rowcode

posted @ 2008-08-26 22:06 猪 阅读(205) | 评论 (0)编辑 收藏
avascript 删除 

积分与排名

  • 积分 - 181078
  • 排名 - 317

最新评论

阅读排行榜

评论排行榜