2008年9月26日星期五

等我白头发了~~

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

2008年9月25日星期四

用Url Rewrite Filter重写url

今天发现一个好东西

Url Rewrite Filter

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

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

比如 就显示我的空间

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.xmlXML语言: 临时自用代码@代码发芽网<?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贴在这,呵呵,参考自blojsomJava语言: 临时自用代码@代码发芽网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");
}
}
}

2008年9月19日星期五

让我们记住这些“中国名牌”~~~

我的心啊,哇凉哇凉地啊

真不知道有什么是安全的

连婴儿都害,禽兽不如





检出三聚氰胺婴幼儿配方乳粉企业名单

     1、石家庄三鹿集团股份有限公司生产的三鹿牌婴幼儿配方乳粉

     2、上海熊猫乳品有限公司生产的熊猫可宝牌婴幼儿配方乳粉

     3、青岛圣元乳业有限公司生产的圣元牌婴幼儿配方乳粉

     4、山西古城乳业集团有限公司生产的古城牌婴幼儿配方乳粉

     5、江西光明英雄乳业股份有限公司生产的英雄牌婴幼儿配方乳粉

     6、宝鸡惠民乳品(集团)有限公司生产的惠民牌婴幼儿配方乳粉

     7、内蒙古蒙牛乳业(集团)股份有限公司生产的蒙牛牌婴幼儿配方乳粉

     8、中澳合资多加多乳业(天津)有限公司生产的可淇牌婴幼儿配方乳粉

     9、广东雅士利集团股份有限公司生产的雅士利牌婴幼儿配方乳粉

     10、湖南培益乳业有限公司生产的南山倍益牌婴幼儿配方乳粉

     11、黑龙江省齐宁乳业有限责任公司生产的婴幼儿配方乳粉2段基粉

     12、山西雅士利乳业有限公司生产的雅士利牌婴幼儿配方乳粉

     13、深圳金必氏乳业有限公司生产的金必氏牌婴幼儿配方乳粉

     14、施恩(广州)婴幼儿营养品有限公司生产的施恩牌婴幼儿配方乳粉

     15、广州金鼎乳制品厂生产的金鼎牌婴幼儿配方乳粉

     16、内蒙古伊利实业集团股份有限公司生产的伊利牌儿童配方乳粉

     17、烟台澳美多营养品有限公司生产的澳美多牌婴幼儿配方乳粉

     18、青岛索康营养科技有限公司生产的爱可丁牌婴幼儿配方乳粉

     19、西安市阎良区百跃乳业有限公司生产的御宝牌婴幼儿配方乳粉

     20、烟台磊磊乳品有限公司生产的磊磊牌婴幼儿配方乳粉

     21、上海宝安力乳品有限公司生产的宝安力牌婴幼儿配方乳粉

     22、福鼎市晨冠乳业有限公司生产的聪尔壮牌婴幼儿配方乳粉


普元培训第五天

培训最后一天,报表~

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

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

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

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

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

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

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

通过Xpath来访问数据

通过Xpath来访问数据

例子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

普元培训第四天

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

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

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

也不知道所以然

据说下午还要考试,晕

普元培训第三天

今天接着培训普元EOS

百度竟然长度限制文章这么小气

2008年9月18日星期四

显示帮助的div

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<HEAD>  
<TITLE>code by:haiwa - 随滚动条移动的层 - 中国asp之家 - www.aspxhome.com</TITLE>  
<META HTTP-EQUIV="Content-Type" CONTENT="text/html" charset="gb2312">  
</HEAD>  
<style>  
<!--  
.div{  
position: absolute;  
border: 2px solid red;  
background-color: #EFEFEF;  
line-height:90px;  
font-size:12px;  
z-index:1000;  
}  
-->  
</style>  
<BODY>  
<div id="Javascript.Div1" class="div" style="width: 240px; height:90px" align="center">正中...</div>  
<SCRIPT LANGUAGE="JavaScript">  
function sc1(){  
document.getElementById("Javascript.Div1").style.top=(document.documentElement.scrollTop+(document.documentElement.clientHeight-document.getElementById("Javascript.Div1").offsetHeight)/2)+"px";  
document.getElementById("Javascript.Div1").style.left=(document.documentElement.scrollLeft+(document.documentElement.clientWidth-document.getElementById("Javascript.Div1").offsetWidth)/2)+"px";  
}  
</SCRIPT>  


<div id="Javascript.Div2" class="div" style="width: 240px; height:90px" align="center">左上...</div>  
<SCRIPT LANGUAGE="JavaScript">  
function sc2(){  
document.getElementById("Javascript.Div2").style.top=(document.documentElement.scrollTop)+"px";  
document.getElementById("Javascript.Div2").style.left=(document.documentElement.scrollLeft)+"px";  
}  
</SCRIPT>  

<div id="Javascript.Div3" class="div" style="width: 240px; height:90px" align="center">左下...</div>  
<SCRIPT LANGUAGE="JavaScript">  
function sc3(){  
document.getElementById("Javascript.Div3").style.top=(document.documentElement.scrollTop+document.documentElement.clientHeight-document.getElementById("Javascript.Div3").offsetHeight)+"px";  
document.getElementById("Javascript.Div3").style.left=(document.documentElement.scrollLeft)+"px";  
}  
</SCRIPT>  

<div id="Javascript.Div4" class="div" style="width: 240px; height:90px" align="center">右上...</div>  
<SCRIPT LANGUAGE="JavaScript">  
function sc4(){  
document.getElementById("Javascript.Div4").style.top=(document.documentElement.scrollTop)+"px";  
document.getElementById("Javascript.Div4").style.left=(document.documentElement.scrollLeft+document.documentElement.clientWidth-document.getElementById("Javascript.Div4").offsetWidth)+"px";  
}  
</SCRIPT>  

<div id="Javascript.Div5" class="div" style="width: 240px; height:90px" align="center">右下...</div>  
<SCRIPT LANGUAGE="JavaScript">  
function sc5(){  
document.getElementById("Javascript.Div5").style.top=(document.documentElement.scrollTop+document.documentElement.clientHeight-document.getElementById("Javascript.Div5").offsetHeight)+"px";  
document.getElementById("Javascript.Div5").style.left=(document.documentElement.scrollLeft+document.documentElement.clientWidth-document.getElementById("Javascript.Div5").offsetWidth)+"px";  
}  
</SCRIPT>  


<SCRIPT LANGUAGE="JavaScript">  
<!--  
function scall(){  
sc1();sc2();sc3();sc4();sc5();  
}  
window.onscroll=scall;  
window.onresize=scall;  
window.onload=scall;  
//-->  
</SCRIPT>  
<div style="position: absolute; top: 0px; left: 0px; width: 10000px; height: 4000px;"></div>  
</BODY>  
</HTML>

2008年9月16日星期二

第一次使用Subversion,Attempted to lock an already-locked dir

一直苦恼与不能实现广域网的版本控制,终于发现Google code就提供这种服务,它使用Subversion来控制版本,下了一个TortoiseSVN 1.5.1
装上,捣鼓了半天终于上传上Google code了,哈哈。有成就感
这两天有搞了个eclipse插件subclipse,运行起来以后无论commit还是update都提示错误:

Attempted to lock an already-locked dir

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

Google Code Host的使用说明(转)

by shootsoft

http://www.shootsoft.net

1. Eclipse的Subversion使用说明

开发工具以Eclipse为主,所以Eclipse首先需要安装一个Subversion的插件。参考下面的网址:

http://www.ibm.com/developerworks/cn/opensource/os-ecl-subversion/

项目组的所有成员必须都要按照以上的操作安装好插件,并且注册Google的Gmail帐户。

2.Google Code Host说明

项目组组长到http://code.google.com/hosting/创建新项目(Create a new project)过程省略。最后会看到项目的协作平台网址:http://code.google.com/p/group6homework/。(group6homework是项目名称)组长创建完成后还需要把组员的帐户添加进来:通过[Administer]—[Project Members]就可以对项目组成员帐户进行管理。

创建完成后组长需要安装http://tortoisesvn.net/downloads Subversion的客户端插件进行项目首次的Check In操作。

操作如下:

到Eclipse的项目的workspace目录下,进入需要协作的项目的目录,比如我的:

D:"shootsoft"GP6Platform

单击鼠标右键,选择[TortoiseSVN]—[Import]然后输入:

https://group6homework.googlecode.com/svn/trunk/

注意:

  • 这里网址如果你不太清楚可以登录

http://code.google.com/p/group6homework/source查看

  • Google Code Host使用的密码是随机生成的,如果已经登录Google,可以查看以下网址获得密码:

http://code.google.com/hosting/settings

首次登录可能需要安装证书和输入密码。完成后TortoiseSVN就会自动把文件夹

D:"shootsoft"workspace"GP6Platform下的所有文件同步到服务器上去了。

3. Google Code Host与Eclipse

Check In操作完成后组长还需要将项目Check Out出来,真正和Eclipse中的项目结合,组员也需要这样做:

1.将自己的项目文件夹备份并且从Eclipse中删除。需要选择第一项,连同文件夹一起删除。

2.按照http://www.ibm.com/developerworks/cn/opensource/os-ecl-subversion/中的说明进行Import操作,操作结果如下所示:

3.这时点击Next按钮,选择第一项,然后点击Finish按钮。

4.通过Windows菜单,[Show View]—[Other]

5.在弹出的新窗口中选择“SVN—SVN资源库”

6.在刚才Import进来的那个资源库上单击鼠标右键,选择“检出为(A)...”

7.然后在新窗口中中输入项目名称

点击“Finish”按钮。

稍微等待一会儿,程序就会全部下载回来了。

8.我的Tomcat5补丁放在了D:"Tomcat5补丁目录下,请各位参考我的未知把补丁放置好。

如果导入的项目有红叉叉,在项目上点击鼠标右键,选择“Close Project”然后再打开就好了。这时可以清楚的看到项目上图标发生了一点点变化:

在上面的第3步上,按道理应该可以作为项目可以直接检出,但是我这里操作总是出错,所以只有按照稍微烦琐一点的步骤来操作了。

4. Subversion的使用

如果你对某一个文件进行了修改,想要把这个文件提交到服务器上去,就需要在需要提交的文件上单击鼠标右键,通过Team菜单来[提交]

如果你需要把修改过的文件使用服务器上的来覆盖,可以通过Team菜单的[更新]来进行。

Subversion的使用非常简单,但是要深入探究也可以说上几千字,还是建议通过官方或者非官方的教程来学习:

http://www.baidu.com/s?tn=searches_dg&ie=utf-8&word=subversion+%E6%95%99%E7%A8%8B

http://www.baidu.com/s?wd=Subversion+Eclipse&cl=3

2008年9月12日星期五

普元EOS培训第二天

今天剖析了昨天三下两下生成的增删改查的代码(能看到的代码也仅仅限于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吗???

用Zoundry发blog

想找个离线发布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

2008年9月11日星期四

普元EOS培训第一天

普元EOS,面向构件的开发

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

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

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

首先做了个HelloWorld

界面就是这样的


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

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

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


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

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

2008年9月5日星期五

jsp下载文件的问题

要提供给客户一个下载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的流相关只是掌握不清啊,不能熟练运用

sqlServer2000与sqlServer2005的错误

一哥们在学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
谁位大哥遇到过,提示一下啊......

难道是hibernate装聪明?

今天开发中遇到一个奇怪的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的都认为成主键??不解 不解

试用Google的浏览器

早上上班来,打开电脑,看到一则最新消息,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选项,这不是成了遨游?

什么是SOA

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

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

自己的一点点理解 ,功力尚浅,呵呵,欢迎拍砖

控制td换行的css样式

遇到一个棘手的问题,即便是给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>

2008年9月3日星期三

试用Google的浏览器 chrome

早上上班来,打开电脑,看到一则最新消息,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选项,这不是成了遨游?

一点心得

忙里偷闲
一直想写一个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......

2008年9月1日星期一

web.xml中的3种写法

① 完全匹配

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

② 目录匹配

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

③ 扩展名匹配

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

servlet-mapping的重要规则:

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

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