2007年3月30日
很久没有写过东西了,总是不能坚持

好累,过年后,一直到现在,每天都忙个不停,下班回住处后,就只想睡觉。唉,不说了,睡觉,明天钓鱼去:)
2006年7月19日
下午学着在利用Stuts提供的MapForm机制来存储和检索字段。在网上google了一下,很多网站都提供了这样的例子:
public class MapForm extends ActionForm
{
private Map map = null;
public void setMap(Map map) {
this.map = map;
}
public Map getMap() {
return this.map;
}
同时增加一个属性方法去设置和获取Map中的数据。
public void setAttribute(String attributeKey, Object attributeValue)
{
getMap().put(attributeKey, attributeValue);
}
public Object getAttribute(String attributeKey)
{
Object keyValue = getMap().get(attributeKey);
return keyValue;
}
这样我们在jsp页面中,我们就可以使用Struts的标签接触这些Map数据。
<html:text property="attribute(key)"/>
于是照着提供的这个例子在本机允许了一下,发现总是报Exception thrown by getter for property formvalue(password) of bean org.apache.struts.taglib.html.BEAN异常。初步估计是getFormvalue方法有错误,可一想网上都是这么做的,而我对java也刚熟悉,所以用了1个小时还是没有解决。后来把这代码仔仔细细的看了一篇,还真被我发现问题了。问题就出在private Map map = null; 这句话上,查了一些java资料,Map是一个接口,而且代码中也没有代码来实例化它,因此像getMap().get(attributeKey)这样的方法当然就会报错。因此对代码做了以下修改:private Map map=new HashMap()。果然,改好程序就能正常运行了。
2005年11月15日
客户端第一次请求某一个aspx文件时,在服务器端,csc或vbc首先将该aspx文件相关的.cs编译成dll,然后再运行这个dll文件,将绘制的html返回给客户端,然后以后的访问就直接调用编译后的dll 。同时把该dll文件保存在%Windir%\Microsoft.NET\Framework\<框架版本号>\Temporary ASP.NET Files\$YourWebAppName$\随机数\随机数\目录下。在该目录下我们发现每一个编译后的cs文件将分别产生一系列文件。假设该文件名为index.aspx,它将产生如下文件:
index.aspx.c6be2b85.xml,该文件中包含以下内容:
<preserve assem="ic4c67s_" type="ASP.index_aspx" hash="48be2af831319072">
<filedep name="c:\inetpub\wwwroot\UnicomJx\WorkFlow\bin\WorkFlow.DLL" />
<filedep name="c:\inetpub\wwwroot\UnicomJx\WorkFlow\bin\Microsoft.Web.UI.WebControls.DLL" />
<filedep name="c:\inetpub\wwwroot\UnicomJx\WorkFlow\OfficeThingManage\index.aspx" />
</preserve>
assem属性指示编译时产生的文件名前缀
filedep包含编译时产生的文件名和aspx文件名之间的映射关系,以及该文件所引用的dll;
ic4c67s_.pdb:包含了辅助调试信息和单步调试代码
ic4c67s_.cs:该文件包含以下内容(注:省略部份代码)
public class index_aspx : twoa.module.tool.index, System.Web.SessionState.IRequiresSessionState
{
public index_aspx() {
System.Collections.ArrayList dependencies;
if ((ASP.index_aspx.__initialized == false)) {
ASP.index_aspx.__stringResource = System.Web.UI.TemplateControl.ReadStringResource(typeof(ASP.index_aspx));
dependencies = new System.Collections.ArrayList();
dependencies.Add("c:\\inetpub\\wwwroot\\UnicomJx\\WorkFlow\\OfficeThingManage\\index.aspx");
ASP.index_aspx.__fileDependencies = dependencies;
ASP.index_aspx.__initialized = true;
}
this.Server.ScriptTimeout = 30000000;
}
protected override void FrameworkInitialize() {
SetStringResourcePointer(ASP.index_aspx.__stringResource, 2295);
this.__BuildControlTree(this);
this.FileDependencies = ASP.index_aspx.__fileDependencies;
this.EnableViewStateMac = true;
}
}
通过上述代码,我们发现class index_aspx继承twoa.module.tool.index(aspx.cs页面类),在这个类里初始化自定义属性或对象,把组成该index.aspx页面
的所有子控件添加到控件集合树中,初始化子控件
ic4c67s_.cmdline:编译该文件相关参数
ic4c67s_.dll:初始化该page页面
ic4c67s_.err:包含当编译出错产生的信息
ic4c67s_.out:包含执行编译命令后的一些输出信息
2005年9月12日
一、问题的形成
公司MSS系统里,原有的生成文档方式方式是,利用window.open打开一个wordcreate.aspx文件,然后在这个aspx文件中调用生成文档控件(注:该控件有vb编写,通过引用microsoft office 10.0 object library来生成文档)来生成一个doc文件,但是由于由于现在大多数客户端都安装了广告拦截工具,用这种方式的话,会把生成文档控件所在窗口给屏蔽了,导致不能生成文档。于是现在用ifame标签把wordcreate.aspx嵌入到页面中,来生成文档。用这种方式第一次生成文档的时候,无任何异常情况,但是第二次再执行同样的生成文档操作时,就会发现生成文档控件启动了三个word进程,文档生成结束后,只关闭了一个word进程。这导致生成的文档没有达到预期的效果,并且打开时还提示该文档已被某某用户锁定。
二、问题产生的原因
调试程序发现,当程序运行到ActiveWindow.View.TableGridlines = False时出错,显示462错误:The remote server machine does not exist or is unavailable,而出错后,程序并没有把当前出错进程终止掉,只是把Word.Application类型变量oWord设置成Nothing,并且继续往下执行(注:生成文档的过程是先创建一个word进程,打开一doc文件,然后把该doc文件里的图片,表格,文字复制出来。然后再重复同样的操作,把另一doc文件的信息复制出来。最后一步,把之前复制出来的信息保存到一新的doc文件中, 终止该进程),这样就会出现三个word进程。而那句代码的意思是让改文档里表格线隐藏掉。
上网查找462错误形成的原因,发现ms有一篇《在 Visual Basic 中使用早期绑定时 Office 自动执行出现错误或意外行为》的文章刚好说到这个问题。出现这个错误的原因就是因为使用了全局对象的非限定方法引起的。而代码ActiveWindow.View.TableGridlines = False中的ActiveWindow恰好就是一个全局对象。
三、为什么用window.open和iframe方法会现在两种不同的结果呢?
这得从全局对象说起,全局对象就是在程序中,可以在任何代码位置来调用全局对象的方法和属性,而不需要显式设置对象的大小和创建对象的新实例。如果以前尚未创建该对象,在调用代码时 VB 将创建该对象,然后在一个隐藏的变量中设置对该对象的引用。对该对象的任何非限定方法或属性调用都在隐藏的引用上调用。程序无权访问此隐藏的变量。也无法更改或释放它。该引用直到项目结束后才会自动释放。因此,在页面第一次调用该控件生成文档时,控件就会创建office引用库中的相关全局对象的引用,当用window.open方法生成文档后,会关闭当前IE窗口,从而释放了全局对象的引用。而用ifame方式生成文档后,当前IE窗口并没有关闭,全局对象的引用还是之前第一次生成文档时创建的word对象实例,因此虽然代码在每次运行时都创建 Office 应用程序的一个新实例,但非限定代码(非限定代码:属性过程使用同一名称并返回各自的对象)导致 VB 设置了对旧实例的一个隐藏引用,而旧实例已经结束了,因此就会出现本文开头描述的错误。