⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档.txt

📁 俄罗斯方块游戏,大学时写的,支持单机及点对点网络对战!同时我还在里面加入了使用技能的功能!不过有一个缺点,呵呵好象代码写的不够严谨,所以现在性能很低,我一直也没有优化它!
💻 TXT
📖 第 1 页 / 共 4 页
字号:
%>
格式化成"yyyy-MM-dd HH:mm:ss"格式的日期时间:<%=str_date1%>
未经格式化的String格式的日期时间:<%=str_date2%>
未经格式化的Date格式的日期时间:<%=currentTime%>
-------------------------------------------------
页面的输出内容:
格式化成"yyyy-MM-dd HH:mm:ss"格式的日期时间:2005-03-17 09:55:40 
未经格式化的String格式的日期时间:Thu Mar 17 09:55:40 CST 2005 
未经格式化的Date格式的日期时间:Thu Mar 17 09:55:40 CST 2005

    通常我们需要的是这种格式化后的时间:2005-03-17 09:55:40。现在有这样一个问题:“2005-03-17 09:55:40”是一个字符串,有些时候我们需要在这个字符串里提取出年、月、日等的相关信息,怎么办呢?看下面的代码:
----------------------规则的字符串----------------------------------------------
规则的字符串(年4位,月2位,日2位,中间用字符“-”分隔):
<br>原字符串为:
<%
  String date="1989-12-30";
  out.println(date+"<br>");
  String year=date.substring(0,4);//取第0+1位至第4位
  String month=date.substring(5,7);//取第5+1位至第7位
  String day=date.substring(8,10);//取第8+1位至第10位
  out.println("year="+year+",month="+month+",day="+day);
%>
----------------------------------------------------------------------------------
    从上面的代码我们可以看出来:这只能针对规则的字符串(年4位,月2位,日2位),要是不规则的呢?年可能2位也可能4位,月和日可能1位也可能2位,怎么办?通过对上面的代码修改,可以得到下面的通用的代码(这个“通用”有一个前提——年月日之间必须以“-”分隔):
----------------------不规则的字符串----------------------------------------------
不规则的字符串(年、月、日长度不一定,中间用字符“-”分隔):
<br>原字符串为:
<%
  String date="04-05-6";
  out.println(date+"<br>");
  int a=date.indexOf("-");//求第一个“-”的位数
  int b=date.lastIndexOf("-");//求最后一个“-”的位数
  int len=date.length();//求字符串的长度
  year=date.substring(0,a);//取第一个“-”前的字符串
  month=date.substring(a+1,b);//取两个“-”之间的字符串
  day=date.substring(b+1,len);//取最后一个“-”以后的字符串
  out.println("year="+year+",month="+month+",day="+day);
%>
----------------------------------------------------------------------------------
    现在这个问题解决了。可是我们会想到:每次需要对一个表示年月日的字符串进行分割的时候都需要在.jsp页面里写上这么一段代码,不但麻烦而且使页面显得混乱,能不能以一种看起来更清晰的方法解决这个问题呢?当然可以了,用javabean就行了。

二、第一个javabean
    什么是javabean?我在接触到这个问题时苦恼不已,因为我始终无法理解这个概念,直到我相继写了几个之后,我蓦然发现:它不就是一个类吗?!现在,我们先不去管什么是类,先看下面的这个javabean:
--------------------------------DateBean.java-------------------------------------
//该bean能够从jsp文件中得到一个表示年月日(用“-”分隔)的字符串,然后返回给jsp文件分别表示年、月、日的字符串
package ringz.javabeans;  //ringz.javabeans是我的包名,我自己写的javabean都在这个包里
public class DateBean   //这个class的名字是DateBean,那么这个javabean文件的名就必须叫:DateBean.java
{
   private String dateStr;
   private String year;
   private String month;
   private String day;
   //
   public void setDateStr(String str)    //私有变量dateStr的set方法
   {
     this.dateStr=str;
   }
   public String getDateStr()    //私有变量dateStr的get方法
   {
     return dateStr;
   }
   public String getYear()//得到年的字符串
   {
     int a=dateStr.indexOf("-");//求第一个“-”的位数
     year=dateStr.substring(0,a);//取第一个“-”前的字符串
     return year;
   }
   public String getMonth()//得到月的字符串
   {
     int a=dateStr.indexOf("-");//求第一个“-”的位数
     int b=dateStr.lastIndexOf("-");//求最后一个“-”的位数
     month=dateStr.substring(a+1,b);//取两个“-”之间的字符串
     return month;
   }
   public String getDay()//得到日的字符串
   {
     int b=dateStr.lastIndexOf("-");//求最后一个“-”的位数
     int len=dateStr.length();//求字符串的长度
     day=dateStr.substring(b+1,len);//取最后一个“-”以后的字符串
     return day;
   }
}
---------------------------------------------------------------------------------
    一个javabean里最主要的是set和get方法:set方法用于从.jsp页面向javabean传值;get方法用于从javabean向.jsp页面传值。下面看.jsp页面如何使用这个javabean:
------------------------------ymd_use_bean.jsp----------------------------------
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<jsp:useBean id="ymd" scope="page" class="ringz.javabeans.DateBean">
<jsp:setProperty name="ymd" property="*"/>
</jsp:useBean>
<!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>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>使用javabean从字符串中取得年月日信息</title>
</head>
<body>
<%
try
{
out.println("您输入的字符串是:"+ymd.getDateStr()+"<br>");
out.println("year="+ymd.getYear()+",month="+ymd.getMonth()+",day="+ymd.getDay());
}
catch(Exception e){}
%>
<br><br><hr><br>请在下边的文本框中输入代表年月日的字符串,格式:XXXX-XX-XX,其中代表年、月、日的位数可以不限定。
<form method="post" action="ymd_use_bean.jsp">
  <input type="text" name="dateStr"><!--必须和所使用的javabean:DateBean中的这个“private String dateStr;”所定义的名称完全一致!!!-->
  <input type="submit"  value="确定"> 
(必须使用两个“-”分开,如:1999-9-29)
</form>
</body>
</html>
--------------------------------------------------------------------------------
    你在这段代码里能看到get方法,可是set方法呢?怎么没看见?这里面的玄机在<jsp:useBean></jsp:useBean>之间和form里的这句:<input type="text" name="dateStr">,这里我不想重点说明.jsp文件如何引用javabean,你不清楚的话请查阅其他资料。
    另外在这里提一个小技巧你自己试一试:把try和catch的内容去掉,看看结果是什么样的;把catch的内容改成这样:
    catch(Exception e)
     {out.print(e);}
再看看结果是什么样的。然后自己分析一下为什么会这样。这是一个我经常使用的小技巧,不知道别人是不是也用这种方法来解决这种问题。

    上面已经说了javabean就是一个类,下面我要用自己的话说一下什么是类,我是怎么理解类这个概念(理解的不一定准确,还请高手们给予指正,免的误人子弟^_^!):
    先是想起一个笑话:说有一种机器,从机器的一侧放进一头猪,机器的另一侧就会出香肠。引申一下。这台机器在一个仓库里,这个仓库里还有一台能自动出猪毛和一台出猪皮的机器。现在这个仓库就可比做一个类,而每台机器就是一个方法,因为这个仓库是只针对猪的仓库,所以这个仓库一定在java.pig这个包(java的API——说白了就是类库或者按照C的说法就是函数库——里有很多类,这些类是分类存放的,每一个分类称做一个包,比如,和输入输出有关的类就放在java.io包里,和绘制图形相关的类就放在java.awt包里)里面,我们给这个仓库起名叫PigFactory,这就是类名。现在拿来一头猪:Japanese属于类Pig,先通过和PigFactory同名的构造函数PigFactory()为处理这头猪新建一个实例:
    java.pig.PigFactory pf = new java.pig.PigFactory();
现在我们可以通过这个实例对这头猪进行操作了——由于我们只想要它的皮,那就使用出皮的机器就行了,这台机器作为一个方法叫做getSkin(),那么:
    Skin pigskin = pf.getSkin(Japanese);
猪皮(pigskin)出来了,并且运送出仓库,它属于类“皮”(Skin)了。
    类似的,还有一些专门处置牛、羊的仓库,它们也有自动出皮的机器,所以也是方法:getSkin(),这也就是为什么我们会发现很多不同的类里边有相同名称的方法,如:getString方法。
    我们可以发现:这台自动出皮的机器是如何工作的,我们并不关心,我们所关心的只是怎样使用它。我们也可以自己开发一个类(或者javabean),它的工作原理和SUN给我们开发好的API里的类是基本一致的。在使用时我们所关心的仅仅是如何把值传给它和如何从它那里得到值。
    以上是我的理解,可能有很多不确切的地方,希望大家指正。

    说了这很多废话以后,你可能想问:我们上面写的javabean现在可以用了吗?还不行。刚刚我们写好的是一个.java文件,必须把它编译成.class文件以后Jsp才能调用它。下面说怎么编译,由于我现在没有使用专门的java开发工具(如JBuilder),所以只能使用我们安装的JDK(java 2 sdk)所提供的编译工具:
    把DateBean.java这个文件放到C:\下,“开始”-“运行”-“cmd命令”,在开启的窗口中将当前路径改为C:\,然后输入:javac DateBean.java,回车,如果窗口中没有提示出错的话,OK,编译成功了。这时你会发现和DateBean.java处于同目录的地方多了一个DateBean.class文件,就是它了。现在的问题是它应该放在哪了。由于是我自己写的javabean,所以我不打算把他们和Tomcat自带的放在一起:之前我们定义了自己的根目录:e:\MyJsp,在它的下面新建一个WEB-INF文件夹(注意大小写),其下再建一个classes文件夹,放在这里就行了。当然你可以专门为你自己开发的javabean做一个包——就像SUN那样——我自己的包名叫ringz.javabeans,所以我在classes文件夹下建了一个ringz的文件夹,里面再建一个javabeans文件夹,然后把我开发的.class文件放到这里。这时使用的时候要注意包名:<jsp:useBean id="ymd" scope="page" class="ringz.javabeans.DateBean" />。

    本章需要注意的当然是每次改完后的.java文件都要重新编译成.class文件,而且使用.class文件时要重启Tomcat服务器。



CNBIE BLOG
--------------------------------------------------------------------------------

一个microsoft的.exe程序文件的启动过程
原文:一个microsoft的.exe程序文件的启动过程
 
一个microsoft的.exe程序的启动过程
   学习windows 编程从mfc角度来说可分为两部分那就是WinMain函数以前的,和WinMain函
数以后的。前者涉及很多windows操作系统内部的知识,后者么看mfc源码就可以了。虽然大
多数程序不需要你了解太多关于os加载应用程序这方面的知识,但我认为能较深入了解wind
ows os的运行情况对程序员是很有帮助的。
   最近我正在研究一个microsoft的.exe程序的启动过程,这也是以上所说的关于os如何加
载程序的知识,它包括进程创建,主线程 创建,PE文件加载,程序c运行时启动函数以及四种
main函数的调用等许多令我不得不静下心来好好思索的东东。从mfc编程角度来说,这些都是
不得见的,不过了解这些对程序员编制好的windows程序是有好处的。在平时的学习中中我有
很多疑点,到底在桌面双击一个exe程序,os调用的第一个函数是什么?甚至到现在我研究很
长时间后,还是得不到令我满意的答案。不过在学习的过程中我还是又说收获的,下面和大
家一起分享一下,我也把这段时间所学作一下总结。
   要了解一个.exe程序的启动过程就不得不了解一下有关操作系统方面的知识,such as“
进程,线程,虚拟内存"的基本的知识。当然这里我就不详细介绍了,有兴趣的同学可以自己
去查一查这方面的资料。在未真正开始之前,先统一一下本文出现的一些名词的含义:
   App.exe----------假定为应用mfc的AppWizard做出的一个SDI程序,App是它的名字。你
可以把它看为一个标准的"hello mfc!"程序。
   PE------------不要以为它是“体育课”的缩写呦。它可是微软的标准win32可执行文件
.exe和动态链接库.dll的文件格式,它的english name是Portable Executable File Forma
t。 
   下面可要正式开始了。
    一个microsoft的.exe程序的启动方法有很多,这里我们以双击App.exe图标启动为例(
其他方法,我想也是一样的)。在补充一下,我所用的os是Windows2000Server,所以这里也
主要讨论win2000下的应用程序,过要涉及较多关于NT内核,毕竟微软主推win2000/winxp和
Unicode么。
    一个microsoft的.exe程序的启动过程如下:
  (1)当我们双击App.exe图标启动程序时,系统首先做什么呢,让我们先听一听侯捷是如何
说的吧“执行起来的App进程其实是shell调用CreateProcess激活的”----"深入浅出MFC se
cond edition" page39载。很多书上都是如是说的,shell又名“命令解释器”,是win32操
作系统基于浏览器的一个32位用户接口,它是一个多线程的好例子,屏幕上每一个文件夹浏
览窗口都是它的一个线程。它是操作系统引导时加载的系统进程,它具体表现为windows ex
plorer.exe。explorer.exe是所有用户应用程序的创造者。你完全可以将shell看成是所有应
用程序进程的父进程,就像桌面(desktop)可看成所有窗口的父窗口一样。shell的用途很多
,如启动应用程序,管理文件系统,将应用程序与相应文件相关联等等。我们常见的桌面上
的带有小箭头的快捷方式(shortcut)就是一个shell链接,shell负责管理一个叫"名字空间"
的类似文件系统似的“超文件系统”,它允许应用程序在任何地方在不知访问对象名字和位置
的前提下访问到这个对象,此类对象有:文件,目录,驱动器,打印机以及网络资源。而名
字空间就是shell把这些对象有层次组织起来的一个结构。名字空间为用户和应用程序提供了
一种可靠和高效的方法来访问和管理对象。好了不论它是什么,凡正它调用了CreateProcess,一切就从这里开始了。
  (2)CreateProcess这个函数可作了不少工作。App进程由此诞生。当CreateProcess这个函
数被调用,系统就会创建一个“进程内核对象”。进程内核对象可以看作一个操作系统用来
管理进程的内核对象,它也是系统用来存放关于进程统计信息的地方(一个小的数据结构)
,其实它的真正创建者是一个叫NtCreateProcess的windows2000系统服务函数(也叫执行体服
务函数),他创建了进程内核对象供用户扩展。进程内核对象的初始使用计数为1。然后系统
为该进程创建4GB(=2^32)的虚拟地址空间(所谓虚拟就不是真的创建4GB的物理内存空间,这
些空间不是真在物理内存上).用于加载App.exe可执行文件和任何必要的dll文件的数据和代
码。
  (3)下面概述一下系统的加载器(可称为loader)是如何加载这些东东的。首先了解一下系
统为该进程创建4GB的虚拟地址空间是如何分配的,对于win2000/winxp来说,默认情况下每
个用户进程可以占有2GB的私有地址空间;操作系统占有剩余的2GB空间。
在32位x86系统上,
从0x00000000到0x7fffffff的空间中存放着 应用程序代码,全局变量,每个线程堆栈,dll
代码。
从0x80000000到0xc0000000的空间中存放着 内核和执行体,HAL(硬件抽象层),引导驱动程序
从0xc0000000到0xc0800000的空间中存放着 进程页表和超空间。
从0xc0800000到0xffffffff的空间中存放着 系统高速缓存,分页缓冲池,非分页缓冲池。
首先,CreateProcess打开应用程序文件(.exe),它先扫描该文件的文件头,该文件头里含有文
件能运行在那个环境之下,如果是win32环境,系统就直接加载文件的代码和数据并输入(im
port)该文件执行所需的dll函数。如果不是win32环境比如时os/2的.exe则先加载相应的环境
子系统,载由该环境加载该文件的代码和数据以及该文件执行所需的dll函数。至于系统是如
何知道文件的代码和数据以及该文件执行所需的dll函数所在的位置就需要你了解一下PE文件
格式了,其实也很简单,PE文件拥有很多sections,数据和代码都放在不同的section里面,
文件执行所需的dll也放在单独的section(.idata)里,这里就不详述了。而且在加载过程中涉
及到有关虚拟内存,内存映射文件等很多较深的知识,我会在以后的系列文章中详细专题论
述的。
  (4)进程加载代码和数据完毕后,就开始创建线程来执行进程空间内的代码。进程是静态的
,它只是线程的容器。一个进程至少因该有一个线程(main thread),其它线程都是主线程通
过调用CreateThread函数创建的。线程也是核心对象,他的实际创建者是一个叫NtCreateTh
read的windows2000系统服务函数。一个线程其实只是一个线程核心对象和两个堆栈(一个核
心堆栈,用于线程运行在核心态;一个用户堆栈,用于线程运行在用户态),线程与进程类似
,也拥有线程核心对象计数和线程句柄,这里不详述。线程用于描述进程中的运行路径。每
当进程被初始化时,系统就要创建一个主线程。该线程与c/c++运行时库的启动代码一道开始
运行,启动代码则调用进入点函数(就是我们的main函数,它也是主线程的进入点函数),并
且继续运行直到进入点函数返回并且c/c++运行时库的启动代码调用ExitProcess为止。每个
线程都有自己的入口点函数,主线程入口点函数名字必须是main,wmain,WinMain或wWinMain
.而其他的线程入口点函数名字可使用任何名字。每个线程函数必须有一个返回值,它将作为
线程的退出代码。对于主线程来说,这个返回值将传给c/c++运行时库的启动函数。
  (5)c/c++运行时库的启动函数它其实是一个程序的真正调用的第一个函数,它是在程序链
接时由链接程序选择相应的启动函数并加到程序的开始处。c/c++运行时库有四个版本的启动
函数,他们分别对应不同类型的应用程序。比如,需要ANSI字符和字符串的GUI应用程序的启
动函数是WinMainCRTStartup,其对应的进入点函数是
WinMain,需要Unicode字符和字符串的GUI应用程序的启动函数是wWinMainCRTStartup,其对应
的进入点函数是
wWinMain,而需要ANSI字符和字符串的CUI应用程序(如控制台console程序)的应用程序的启动
函数是mainCRTStartup,对应的入口点函数为main;需要Unicode字符和字符串的CUI应用程序
(如控制台console程序)的应用程序的启动函数为wmainCRTStartup,对应的入口点函数为wma
in;c/c++运行时库的启动函数的功能如下:
以wWinMainCRTStartup(大多数运行在windows2000下的应用程序的启动函数都是它)为例。它
负责:
  *检索指向新进程的完整命令行指针;
  *检索指向新进程的环境变量的指针;
  *对c/c++运行时的全局变量进行初始化;
  *对c运行期的内存单元分配函数(比如malloc,calloc)和其他低层I/O例程使用的内存栈进
行初始化。
  *为C++的全局和静态类调用构造函数。
当这些初始化工作完成后,该启动函数就调用wWinMain函数进入应用程序的执行。
当wWinMain函数执行完毕返回时,wWinMainCRTStartup启动函数就调用c运行期的exit()函
数,将返回值
(nMainRetVal)传递给它。之后exit()便开始收尾工作:
  *调用由_onexit()函数调用和注册的任何函数。
  *为C++的全局和静态类调用析构函数;
  *调用操作系统的ExitProcess函数,将nMainRetVal传递给它,这使得操作系统能够撤销进
程并设置它的exit  代码。
(6)至此启动函数的任务完成,至于中间wWinMain函数的运行过程看看mfc源码即可。不过我还要提一下,wWinMain函数其实只是调用了mfc的AfxWinMain()函数,而一切的真正代码的运
行也是从AfxWinMain()开始的。
   以上只是粗略将一下一个microsoft的.exe程序的启动过程,其中有很多深奥的知识我只是提了一下,有些知识在以后的文章中还会陆续提到的。
                                                              bigwhite
                                                            2002.5.18
 


CNBIE BLOG
--------------------------------------------------------------------------------

一个oracle+PHP的查询的例子
原文:一个oracle+PHP的查询的例子

 http://qdlover.yeah.net 
  一个oracle+PHP的查询的例子 
  本来我不用php了,可是还是有很多朋友问我,我就做了一个例子,具体函数请查手册 
  其实oracle的函数和别的也差不多,只不过它这里多了一个定义输出变量的过程, 
  如果学过pl/sql的人都知道的(不过听说只有清华和西安交大用它做网站)。 
  就是OCIDefineByName($id,"ROWNUM",&$rownum);对应了查询中的rownum,一个对应一个, 
  而且最应该注意的就是,在定义的时候,字段名必须是大写的,因为oracle里不认小写 
  其它的就差不多了,赋值,显示,关闭游标 
  $conn = ocilogon("gcxx","gcxx","server1"); 
  $id = OCIParse($conn,"select rownum,gcdjbh,gcmc from zbgg"); 
  OCIDefineByName($id,"ROWNUM",&$rownum); 
  OCIDefineByName($id,"GCDJBH",&$gcdjbh); 
  OCIDefineByName($id,"GCMC",&$gcmc); 
   
  OCIExecute($id); 
  $i=0; 
  while (OCIFetch($id)) { 
   
  echo "序号:".$rownum." 
  "; 
  echo "工程登记编号:".$gcdjbh." 
  "; 
  echo "工程名称:".$gcmc." 
  "; 
  $i++; 
  if ($i>10) break; 
  } 
  OCIFreeStatement($id); 
  OCILogoff($conn); 
  ?> 
   
(出处:Viphot) 


 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -