Posts Tagged ‘例’

CSS关于相对定位和绝对定位的说明实例

星期三, 06月 4th, 2008

<style>
body
{margin: 30px; font-size:9pt;}

.a, .b, .c, .d, .e
{
width: 100px;
height: 100px;
margin: 5 auto;
color: #fff;
background: #000;
}
.aa, .bb, .cc, .dd, .ee
{
top: 10px;
left: 10px;
width: 10px;
height: 10px;
overflow: hidden;
background: #F90;
}
.b, .d, .e
{position: relative;}
.cc, .dd, .ee
{position: absolute;}
</style>

<div class=”a”>
<div class=”aa”></div>
A:均不设置postion,一般嵌套关系
</div>

<div class=”b”>
<div class=”bb”></div>
B:仅外div设置relative,一般嵌套关系
</div>

<div class=”c”>
<div class=”cc”></div>
C:仅内div设置absolute,文档中为嵌套关系,页面中内div浮起[非float],相对于页面定位,与外div无关.
</div>


<style>
body
{margin: 30px; font-size:9pt;}

.a, .b, .c, .d, .e
{
width: 100px;
height: 100px;
margin: 5 auto;
color: #fff;
background: #000;
}
.aa, .bb, .cc, .dd, .ee
{
top: 10px;
left: 10px;
width: 10px;
height: 10px;
overflow: hidden;
background: #F90;
}
.b, .d, .e
{position: relative;}
.cc, .dd, .ee
{position: absolute;}
</style>

<div class=”a”>
<div class=”aa”></div>
A:均不设置postion,一般嵌套关系
</div>

<div class=”b”>
<div class=”bb”></div>
B:仅外div设置relative,一般嵌套关系
</div>

<div class=”c”>
<div class=”cc”></div>
C:仅内div设置absolute,文档中为嵌套关系,页面中内div浮起[非float],相对于页面定位,与外div无关.
</div>

<div class=”d” style=”background:#ff0000″>
<div class=”dd” ></div>
D:外div设置relative,内div设置absolute,内div浮起来并相对于外div定位
</div>


<div class=”d” style=”background:#ff0000″>
<div class=”dd” style=”position:relative”></div>
D:外div设置relative,内div设置relative,内div浮起来并相对于外div定位
</div>

<div class=”e”>
<div class=”ee” style=”left: -10px;”></div>
E:这个是说明边界问题.-10 != 反向10px间距
</div>

JBuilder2005单元测试之捆绑多个用例

星期一, 06月 2nd, 2008

目前我只为Subsection类生成了一个测试用例,在这节里,我按照前述de方法,通过Test Case向导为StringUtils类创建一个测试用例相关代码框架,并编写测试方法,然后将这两个测试用例捆绑组合在一个测试套件中一起运行.
  选中StringUtils类,通过File->New..->Test,双击Test Case图标为StringUtils类destring2Array()方法创建测试用例,接受默认de测试用例类名TestStringUtils.
  在向导生成de测试用例相关代码框架中,删除测试固件(因为是静态方法,没有必要用固件),即删除StringUtilsde成员变量声明,setUp()和tearDown()方法.并在类中定义一个isArrayEquals()de方法,删除向导生成detestString2Array()测试方法体中de内容,编写自己de测试相关代码,其最终相关代码如下所示:
  相关代码清单 错误!文档中没有指定样式de文字.TestStringUtils:StringUtils类de测试用例
  1. package chapter25;
  2. import junit.framework.*;
  3. public class TestStringUtils extends TestCase
  4. {
  5.  public void testString2Array() {
  6.   String str1 = null, str2 = “, str3 = “a”, str4 = “a,b,c”,str5 = “,a,b,”;
  7.   String[] arr1 = null, arr2 = {”}, arr3 = {”a”}, arr4 = {”a”, “b”, “c”},
  8.   arr5 = {”, “a”, “b”, “}, trimArr5 = {”a”, “b”};
  9.
  10.  assertNull(StringUtils.string2Array(str1, ‘,’, false));
  11.  assertTrue(isArrayEquals(arr1, StringUtils.string2Array(str1, ‘,’, false)));
  12.  assertTrue(isArrayEquals(arr2, StringUtils.string2Array(str2, ‘,’, false)));
  13.  assertTrue(isArrayEquals(arr3, StringUtils.string2Array(str3, ‘,’, false)));
  14.  assertTrue(isArrayEquals(arr4, StringUtils.string2Array(str4, ‘,’, false)));
  15.  assertTrue(isArrayEquals(arr5, StringUtils.string2Array(str5, ‘,’, false)));
  16.  assertTrue(isArrayEquals(trimArr5, StringUtils.string2Array(str5, ‘,’, true)));
  17.  assertFalse(isArrayEquals(StringUtils.string2Array(str5, ‘,’, false),
  18.  StringUtils.string2Array(str5, ‘,’, true)));
  19. }
  20.
  21. //判断两个字符数组是否相等
  22. private boolean isArrayEquals(String[] arr1, String[] arr2) {
  23.  if (arr1 == null || arr2 == null) {
  24.   if (arr1 == null && arr2 == null) {
  25.    return true;
  26.   } else {
  27.    return false;
  28.   }
  29.  } else if (arr1.length != arr2.length) {
  30.   return false;
  31.  } else {
  32.   for (int i = 0; i < arr1.length; i ) {
  33.    if (!arr1[i].equals(arr2[i])) {
  34.     return false;
  35.    }
  36.   }
  37.   return true;
  38.  }
  39. }
  40. }

  虽然JUnit框架提供了许多assertEquals()de重载方法,但却没有入参是两字符串数组deassertEquals()重载方法,所以我需要自己定义一个判断两字符串数组是否相同de方法:isArrayEquals(),如第22~39行所示.
  在testString2Array()方法中,我提供了覆盖多数情况de字符串测试点(特殊转换字符串和其目标值),如第6~8行所示.尔后调用assertXxx()设置测试规则.您也可以像上一节中deTestSubsection测试用例一样运行它.
  注意:
  如果您在内容窗格TestStringUtils文件标签上右击,发现弹出de菜单中只有Run Test using “TestSubsection”时,请在Project->Project Properties…->Run->在Run设置页中取消TestSubsection运行设置项deContext Menu选项,否则只会运行原TestSubsectionde测试用例.
  只包括10个类左右de小型项目工程也许无需用到测试套件,仅通过逐一单独运行测试用例来完成测试就可以了,但对于一个包含较多测试用例de工程,测试套件能给您带来极大de方便,它将多个测试用例捆绑在一起运行,达到一呼而百应de批量处理效果.
   下面我就来为TestSubsection和TestStringUtils这两个测试用例创建一个测试套件,并通过测试套件运行这两个测试.
  1.File->New…->Test->在Test页中双击Test Suite图标启动创建测试套件de向导,如下图所示:


  图 错误!文档中没有指定样式de文字.选择套件中捆绑de测试用例

  在对话框列表中已经列出了工程中已有de两上测试用例类,您可以通过右边deAdd…和Remove添加或删除测试用例.您可以通过Add Recursively,将指定目录下de所有测试用例一并加入.
  点击Next到下一步.
  2.指定测试套件类名.


  图 错误!文档中没有指定样式de文字.指定测试套件类名

  接受JBuilder为测试套件所提供de默认类名,按Finish完成该测试套件de创建,其相关代码如下所示:
  相关代码清单 错误!文档中没有指定样式de文字.测试套件类
  1. package chapter25;
  2. import junit.framework.*;
  3. public class TestSuite1
  4. extends TestCase
  5. {
  6.  public TestSuite1(String s) {
  7.   super(s);
  8.  }
  9.
  10. public static Test suite() {
  11.  TestSuite suite = new TestSuite();
  12.  suite.addTestSuite(chapter25.TestStringUtils.class);
  13.  suite.addTestSuite(chapter25.TestSubsection.class);
  14.  return suite;
  15. }
  16. }
  测试套件类最主要de相关代码是suite()方法(第10~15行),首先在方法中声明一个TestSuite变量,通过addTestSuite()方法将TestStringUtils和TestSubsection测试用例捆绑在一起,您也可以通过这个方法添加其他de测试用例类.
  TestSuite除可以将整个测试用例捆绑外,还可以捆绑另外de一个测试套件或一个测试用例中de测试方法:
  l 添加一个测试套件
  suite.addTest(suite_1)
  l 添加测试用例某个方法
  suite.addTest(new TestSubsection (”testGetValue”))
  在工程窗格资源树deTestSuite1文件节点上右击,在弹出de菜单中选择Run Test using Defaults,JBuilder启动JBTestRunner,运行套件中捆绑de所有测试用例,其窗口如下图所示:


  图 错误!文档中没有指定样式de文字.用测试套件运行组合运行多个测试用例

  TestSuite下有两个测试用例类,测试用例节点下是测试方法节点.

jsp读取大对象CLOB并生成xml文件示例

星期一, 06月 2nd, 2008

<%@ page contentType=”text/html; charset=gb2312″ %>
<%@ page info=”database handler”%>
<%@ page import=”java.io.*”%>
<%@ page import=”java.net.*”%>
<%@ page import=”java.lang.*”%>
<%@ page import=”java.util.*”%>
<%@ page import=”java.sql.*”%>
<%@ page import=”javax.servlet.*”%>
<%@ page import=”javax.servlet.http.*”%>
<%@ page import=”oracle.sql.CLOB”%>
<%@ page import=”oracle.jdbc.driver.OracleResultSet”%>
<html>
<head>
<meta content=”text/html; charset=gb2312″ http-equiv=”content-type”>
</head>
<body>
<%
int i=0;
String parID = request.getParameter(”id_no”);
String strSql;
String content=”";
try{
String xmlFile = “/usr/local/tomcat/webapps/vehicles/test.xml”;
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver”);
String dburl=”jdbc:oracle:thin:@192.168.15.250:1521:ycdb”;
Connection con=DriverManager.getConnection(dburl,”training”,”deep1704sea”);
Statement stmt=con.createStatement();
//使用流读取CLOB或BLOB列
strSql = “select xmlgen.getxml(’select * from account_holder where id_no=”0001”’) from dual “;
ResultSet rs=stmt.executeQuery(strSql);
if(rs.next()){
CLOB clob = ((OracleResultSet)rs).getCLOB(1);
if(clob!=null){
Reader is = clob.getCharacterStream();
BufferedReader br = new BufferedReader(is);
String s = br.readLine();
while(s!=null){
//byte[] temp = s.getBytes(”iso-8859-1″);
//s = new String(temp);
content = s;
s=br.readLine();
}
}
}
//out.println(content);
//将从数据库中读出de内容写到文件中
FileOutputStream fo = new FileOutputStream(xmlFile);
PrintStream so = new PrintStream(fo);
so.println(content);
so.close();
rs.close();
stmt.close();
con.close();
}catch(Exception e){
out.println(e);
}
%>
</body>
</html>

JSP读取文件实例

星期一, 06月 2nd, 2008

//变量声明
java.lang.String strFileName; //文件名
java.io.File objFile; //文件对象
java.io.FileReader objFileReader; //读文件对象
char[] chrBuffer = new char[10]; //缓冲
int intLength; //实际读出de字符数(一个中文为一个字符)

//设置待读文件名
strFileName = “d:\\test.txt”;

//创建文件对象
objFile = new java.io.File(strFileName);

//判断文件是否存在
if(objFile.exists()){//文件存在
//创建读文件对象
objFileReader = new java.io.FileReader(objFile);

//读文件内容
while((intLength=objFileReader.read(chrBuffer))!=-1){
//输出
out.write(chrBuffer,0,intLength);
}

//关闭读文件对象
objFileReader.close();
}
else{//文件不存在
out.println(”下列文件不存在:” strFileName);
}

JSP XML构架网站的实例

星期一, 06月 2nd, 2008

XML(可扩展标记语言)看起来可能像某种W3C标准——现在没有什么实际影响,即使以后能派上用场,也是很久以后de事.但实际上,它现在已经得到了应用.所以,不要等到XML已被加进了您最喜爱deHTML编辑器中才开始使用它.它现在就可以解决各种内部问题和B2B系统问题.
在Sparks.com,我使用XML来标准化从Java对象到HTML数据显示等不同系统之间de数据表示.
特别需要指出de是,我发现,只要以非常基本deXML结构来实现标准化,就可以更容易地共享和操作数据.在这一过程中,我发现了使用XMLde很多有效方法.下面详细介绍我现在de应用情况.
标准化
在使用XML之前,建立与您要使用de信息不同deXML数据格式.
生成动态XML
从数据库中生成HTML并不新鲜,但生成XML却很新鲜.这里我介绍具体de生成步骤.
用XSL作为模板语言
XSL(可扩展样式表语言)是定义XML数据显示格式de好方法,如果写成几个静态模板会更有效.
生成HTML
XML加上XSL就等于HTML.这听起来似乎不对,但用户所见de我deHTML页面其实就是XML和XSL共同产生de效果.

一、标准化
XMLde能力来自于它de灵活性.但不幸de是,它有时太灵活了,以至于您会面对一个空白de页面,发愁该怎么解决问题.
在任何XMLde项目中,第一步工作都是创建标准de数据格式.为此您要作出以下决定:
&&&
确定数据:
因为没有标准deXML格式,开发者可以自由地开发自己de格式.然而,如果您de格式只能被一个应用程序识别,那么您只能运行这个程序来使用该格式.如果还有其他程序也能读懂您deXML格式,那显然会更有帮助.如果某个XML格式被修
改,则使用它de系统可能也需要被修改,所以您应该建立尽可能完整de格式.因为大多数系统忽略它们无法识别de标签,所以改变一个XML格式de最安全de方法是添加标签,而不是修改标签.
单击此处查看XML数据格式实例
在Sparks.com,我查看了不同de产品展示需要de所有产品数据.尽管并不是所有de页面都使用全部数据,但我还是由此开发出适用于所有数据de非常完整deXML数据格式.例如,我de产品明细信息页面显示de数据要比产品浏览页面多.然而,我在这两种情况下仍然使用相同de数据格式,因为每个页面deXSL模板都只使用它所需要de字段.
是否使用DTD
在Sparks.com,我使用组织良好deXML,而不使用仅仅是正确deXML,因为前者不需要DTD.DTD在用户点击和看到页面之间加入了一个处理层.我发现这一层需要太多de处理.当然,在以XML格式与其他公司通信时,使用DTD还是很不错de.因为DTD能在发送和接受时能保证数据结构正确.
选择解析引擎
现在,可以使用de解析引擎有好几个.选择哪一个几乎完全取决于您de应用需要.如果您决定使用DTD,那么这个解析引擎必须能使您deXML被DTD验证.您可以将验证另放到一个进程中,但那样会影响性能.
SAX和DOM是两个基本de解析模型.SAX基于事件,所以在XML被解析时,事件被发送给引擎.接下来,事件与输出文件同步.DOM解析引擎为动态XML数据和XSL样式表建立层次树状结构.通过随机访问DOM树,可以提供XML数据,就象由XSL样式表来决定一样.SAX模型上de争论主要集中于对DOM结构de内存降低过度和加快XSL样式表解析时间缩短方面.
然而,我发现使用SAXde很多系统并没有充分发挥它de能力.这些系统用它来建立DOM结构并通过DOM结构来发送事件.用这种方法,在任何XML处理之前必须从样式表中建立DOM,所以性能会下降.
二、生成动态XML
一旦建立了XML格式,我需要一种能够将其从数据库中动态移植de方法.
生成XML文档相对来说比较简单,因为它只需要一个可以处理字符串de系统.我建立了一个使用Java Servlet、Enterprise JavaBean server、JDBC和RDBMS(关系型数据库管理系统)de系统.
&&&&
(有关XSL应用de其他信息,请参阅用XSL作为模板语言.)
生成XMLde例子
在Java中创建XML文档字符串de真正相关代码可以分成几个方法和类.
启动XML生成过程de相关代码放在EJB方法里.这一实例会立即创建一个StringBuffer,以便存储生成deXML字符串.
StringBuffer xml = new StringBuffer();
xml.append(XmlUtils.beginDocument(”/browse_find/browse.xsl”, “browse”, request));
xml.append(product.toXml());
xml.append(XmlUtils.endDocument(”browse”);
out.print(xml.toString());

后面de三个xml.append()变元本身就是对其他方法de调用.
产生文件头
第一个附加方法调用XmlUtils类来产生XML文件头.我deJava Servlet中de相关代码如下:
public static String beginDocument(String stylesheet, String page)
{
StringBuffer xml = new StringBuffer();
xml.append(”<?xml version=”1.0″?> “)
.append(”<?xml-stylesheet href=”")
.append(stylesheet).append(”"”)
.append(” type =”text/xsl”?> “);
xml.append(”<”).append(page).append(”> “);
return xml.toString();
}
这段相关代码生成了XML文件头.<?xml>标签把本文件定义为支持1.0版本deXML文件.第二行相关代码指向用以显示数据de正确样式表de位置.最后包括进去de是项级标签(本实例中为<browse>).在文件末尾,只有<browse>标签需要被关闭.
<?xml version=”1.0″?> <?xml-stylesheet href=”/browse_find/browse.xsl” type=”text/xsl”?> <browse>
填入产品信息
完成了文件头后,控制方法会调用Java对象来产生它deXML.本例中调用de是product对象.product对象使用两个方法来产生它deXML表示.第一个方法toXML()通过产生<product>和</product>标签来建立product节点.然后它会调用internalXML(),这样就能提供产品XML所需de内容.internalXML()是一系列deStringBuffer.append()调用.StringBuffer也被转换成字符串并返回给控制方法.
public String toXml()
{
StringBuffer xml = new StringBuffer(”<product> “);
xml.append(internalXml());
xml.append(”</product> “);
return xml.toString();
}
public String internalXml()
{
StringBuffer xml = new
StringBuffer(” “)
.append(productType).append(” “);
xml.append(” “).append(idValue.trim())
.append(” “);
xml.append(” “).append(idName.trim())
.append(” “);
xml.append(” “).append(page.trim())
.append(” “);
厖?
xml.append(” “).append(amount).append(” “);
xml.append(” “).append(vendor).append(” “);
xml.append(” “);
xml.append(” “).append(pubDesc).append(” “);
xml.append(” “).append(venDesc).append(” “;
厖?
return xml.toString();
}

关闭文件
最后,XMLUtils.endDocument()方法被调用.这个调用关闭XML标签(本例中为),并最终完成架构好deXML文件.来自控制方法de整个StringBuffer也转换成字符串,并返回给处理最初HTTP请求deservlet.
三、用XSL作为模板语言
为了得到HTML输出,我把生成deXML文件和控制XML数据如何表示deXSL模板相结合.我deXSL模板由精心组织deXSL和HTML标签组成.
开始建模板
我deXSL模板开始部分与下面这段相关代码类似.第一行相关代码为必需相关代码,将本文件定义为XSL样式表.xmlns:xsl=属性引用本文件所使用deXML名称空间,而version=属性则定义名称空间de版本号.在文件de末尾,我关闭标签.
由<xsl:template>开始de第二行相关代码确定了XSL模板de模式.Match属性是必需de,在这里指向XML标签<basketPage>.在我de系统里,<basketPage>标签里包含<product> 标签,这使得XSL模板可以访问嵌在<product>标签内de产品信息.我又一次必须在文件末尾关闭<xsl:template>标签.
接下来,我来看一看组织良好deHTML.由于它将被XML解析引擎处理,所以必须符合组织良好deXMLde所有规则.从本质上来讲,这意味着所有de开始标签必须有对应de结束标签.例如,通常不被结束de<P>标签,必须用</P>关闭.

<xsl:stylesheet xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”
version=”1.0″>
<xsl:template match=”basketPage”>
<html>
<head>
<title>Shopping Bag / Adjust Quantity</title>
</head>
<body bgcolor=”

</xsl:template>
</xsl:stylesheet>

在模板de主体内,有很多XSL标签被用于为数据表示提供逻辑.下面解释两个常用de标签.
Choose
<xsl:choose>标签类似于传统编程语言中if-then-else结构de开始部分.在XSL中,choose标签表示在相关代码进入de部分中,赋值将触发动作de发生.拥有赋值属性de<xsl:when>标签跟在choose标签后面.如果赋值是正确de,位于<xsl:when>de开始和结束标签之间de内容将被使用.如果赋值错误,就使用<xsl:otherwise>de开始和结束标签之间de内容.整个部分用</xsl:choose>来结束.
在这个例子里,when标签会为quantity标签检查XML.如果quantity标签里含有值为真deerror属性,quantity标签将会显示列在下面de表格单元.如果属性de值不为真,XSL将会显示otherwise标签间de内容.在下面de实例里,如果error属性不真,则什么都不会被显示.
<xsl:choose>
<xsl:when test=”quantity[@error='true']“>
<td bgcolor=”src=”http://img.sparks.com/Images/I-Catalog/sparks_images/sparks_ui/clearpixel.gif”/></td>
<td valign=”top” bgcolor=”<font face=”Verdana, Arial” size=”1″ color=”<b>*Not enough in stock. Your quantity was adjusted accordingly.</b></font>
</td>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>

For-each
<xsl:for-each>标签可以用来对相似XML数据de多种情况应用同一个样式表.对于我来说,可以从数据库中取出一系列产品信息,并在Web页上进行统一格式化.这里有一个例子:
<xsl:for-each select=”package”>
<xsl:apply-templates select=”product”/>
</xsl:for-each>

for-each 循环在程序遇到标签时开始.这个循环将在程序遇到标签时结束.一旦这个循环运行,每次标签出现时都会应用这个模板.
四、生成HTML
将来de某一时刻,浏览器将会集成XML解析引擎.到那时,您可以直接向浏览器发送XML和XSL文件,而浏览器则根据样式表中列出de规则显示XML数据.不过,在此之前开发者们将不得不在他们服务器端de系统里创建解析功能.
在Sparks.com,我已经在Java servlet里集成了一个XML解析器.这个解析器使用一种称为XSLT (XSL Transformation)de机制,按XSL标签de说明向XSL模板中添加XML数据.
当我deJava servlet处理HTTP请求时,servlet检索动态生成deXML,然后XML被传给解析引擎.根据XML文件中de指令,解析引擎查找适当deXSL样式表.解析器通过DOM结构创建HTML文件,然后这个文件再传送给发出HTTP请求de用户.
如果您选择使用SAX模型,解析器会通读XML源程序,为每个XML标签创建一个事件.事件与XML数据对应,并最终按XSL标签向样式表中插入数据.

JSP发送邮件实例

星期一, 06月 2nd, 2008

vishal_donth gave this response on 10/18/2000:
//these are the pakages to be imported from
// Java Mail
//The Java Mail PAckage either be dowloaded
//seperately
//or else is Available in the J2sdkee1.2
// (Java Enterprise Edition)
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

//This function can be used to send the mail
// with the parameters given to it
//U have to specify the smtp server through
//which u have to send the mail
//since i was trying with a homenetmail
//account i directly sent the mail its server
//For sending this mail u need a mail server
//which lets u to relay the messages
//Try this thing for sending to a
//www.homenetmail.com account because it lets
//u send
//mails to the accounts like example try
//sending it to a "abc@homenetmail.com"
//account.Create the mail account in homenet
//mail first. If u get any other server which
//supports relaying u can try this on that
//also.
//Use this function in ur Servlet to send
//mail by calling the function with the
//parameters
public void sendMail(String toAddr, String subject, String body, String fromAddr)throws RemoteException{
try{
Properties props = new Properties();
props.put("mail.smtp.host","mail.homenetmail.com");
//Here we specify the SMTP server through
//which the mail should be delivered
Session session = Session.getDefaultInstance(props, null);
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(fromAddr));
//Specify the From Address
InternetAddress[] tos =InternetAddress.parse(toAddr);
//Specify the To Address
msg.setRecipients(Message.RecipientType.TO,tos);
msg.setSubject(subject);
//Specify the Subject
msg.setText(body);
//Specify the Body
Transport.send(msg);
System.out.println("Message is Sent");
}
catch(Exception e){
System.out.println(e);
}
}
// U have to run this function on a computer
//which is directly connected
// to internet but not through a
//proxy……or else use a proxy which
//supports SMTP

用PHP实现ODBC数据分页显示一例

星期一, 06月 2nd, 2008

$pagesize = 2; //一页显示记录数
$con = odbc_connect("access_test","","",SQL_CUR_USE_ODBC) or die("无法连接ODBC数据源access_test"); //连接一个ODBC数据源
$sql = "select count(*) as total from test"; //取得记录总数SQL语句
$rst = odbc_exec($con,$sql) or die("$sql查询出错"); //执行取得记录总数SQL语句
$recordcount = odbc_result($rst,1); //取得记录总数,在这里也可以用$recordcount = odbc_result($rst,"total");
odbc_free_result($rst); //释放资源
$pagecount = bcdiv($recordcount $pagesize-1,$pagesize,0); //算出总页数
if(!isset($page)) $page = 1; //如果没有指定显示页码,缺省为显示第一页
if($page<1) $page = 1; //如果页码比1小,则显示第一页
if($page>$pagecount) $page = $pagecount; //如果页码比总页数大,则显示最后一页
if($page>0){ //页码比0大,表示有数据
echo ‘>> 分页 ‘;
echo ‘<a href="’ . $PHP_SELF . ‘?page=1">首页</a> ‘;
if($page>1){
echo ‘<a href="’ . $PHP_SELF . ‘?page=’. ($page-1) . ‘">前页</a> ‘;
}
else{
echo ‘前页 ‘;
}
if($page<$pagecount){
echo ‘<a href="’ . $PHP_SELF . ‘?page=’. ($page 1) . ‘">后页</a> ‘;
}
else{
echo ‘后页 ‘;
}
echo ‘<a href="’ . $PHP_SELF . ‘?page=’ . $pagecount . ‘">尾页</a> ‘;
echo ‘页次: ‘ . $page . ‘/’ . $pagecount . ‘页 ‘;
echo $pagesize . ‘条/页 ‘;
echo ‘共’ . $recordcount . ‘条 ‘;
$sql = "select * from test"; //取得数据SQL语句
$rst = odbc_exec($con,$sql) or die("$sql查询出错"); //执行取得数据SQL语句
$fieldcount = odbc_num_fields($rst); //取得字段总数
echo ‘<table border="1" cellspacing="0" cellpadding="0">’;
echo ‘<tr>’;
for($i=1;$i<=$fieldcount;$i ){
echo ‘<th>’ . odbc_field_name($rst,$i) . ‘</th>’; //显示第$i个字段名
}
echo ‘</tr>’;
$rowi = ($page-1)*$pagesize 1;
for($i=0;$i<$pagesize;$i ){
echo ‘<tr>’;
if($rowi>$recordcount){
for($j=0;$j<$fieldcount;$j ){
echo ‘<td> </td>’;
}
}
else{
odbc_fetch_into($rst,$rowi,&$row);
for($j=0;$j<$fieldcount;$j ){
$field = $row[$j];
if($field==”) $field = ‘ ‘;
echo ‘<td>’ . $field . ‘</td>’;
}
$rowi = $rowi 1;
}
echo ‘</tr>’;
}
echo ‘</table>’;
odbc_free_result($rst); //释放资源
}
else{
echo "无数据";
}
odbc_close($con); //关闭连接并释放资源
?>

smtp邮件发送一例

星期一, 06月 2nd, 2008

test_smtp.php
<?
require("smtp.php");
$smtp=new smtp_class;
$smtp->host_name="mail.xiaocui.com";
$smtp->localhost="localhost";
$from="webmaster@xiaocui.com";
$to="root@xiaocui.com";
if($smtp->SendMessage(
$from,
array(
$to
),
array(
"From: $from",
"To: $to",
"Subject: Testing Manuel Lemos’ SMTP class"
),
"Hello $to,\n\nIt is just to let you know that your SMTP class is working just fine.\n\nBye.\n"))
echo "Message sent to $to OK.\n";
else
echo "Cound not send the message to $to.\nError: ".$smtp->error."\n"
?>
smtp.php
<?
class smtp_class
{
var $host_name="";
var $host_port=25;
var $localhost="";
var $timeout=0;
var $error="";
var $debug=1;
var $esmtp=1;
var $esmtp_host="";
var $esmtp_extensions=array();
var $maximum_piped_recipients=100;
/* private variables - DO NOT ACCESS */
var $state="Disconnected";
var $connection=0;
var $pending_recipients=0;
/* Private methods - DO NOT CALL */
Function OutputDebug($message)
{
echo $message,"<br>\n";
}
Function GetLine()
{
for($line="";;)
{
if(feof($this->connection))
{
$this->error="reached the end of stream while reading from socket";
return(0);
}
if(($data=fgets($this->connection,100))==false)
{
$this->error="it was not possible to read line from socket";
return(0);
}
$line.=$data;
$length=strlen($line);
if($length>=2
&& substr($line,$length-2,2)=="\r\n")
{
$line=substr($line,0,$length-2);
if($this->debug)
$this->OutputDebug("< $line");
return($line);
}
}
}
Function PutLine($line)
{
if($this->debug)
$this->OutputDebug("> $line");
if(!fputs($this->connection,"$line\r\n"))
{
$this->error="it was not possible to write line to socket";
return(0);
}
return(1);
}
Function PutData($data)
{
if(strlen($data))
{
if($this->debug)
$this->OutputDebug("> $data");
if(!fputs($this->connection,$data))
{
$this->error="it was not possible to write data to socket";
return(0);
}
}
return(1);
}
Function VerifyResultLines($code,$responses="")
{
if(GetType($responses)!="array")
$responses=array();
Unset($match_code);
while(($line=$this->GetLine($this->connection)))
{
if(IsSet($match_code))
{
if(strcmp(strtok($line," -"),$match_code))
{
$this->error=$line;
return(0);
}
}
else
{
$match_code=strtok($line," -");
if(GetType($code)=="array")
{
for($codes=0;$codes<count($code) && strcmp($match_code,$code[$codes]);$codes );
if($codes>=count($code))
{
$this->error=$line;
return(0);
}
}
else
{
if(strcmp($match_code,$code))
{
$this->error=$line;
return(0);
}
}
}
$responses[]=strtok("");
if(!strcmp($match_code,strtok($line," ")))
return(1);
}
return(-1);
}
Function FlushRecipients()
{
if($this->pending_sender)
{
if($this->VerifyResultLines("250")<=0)
return(0);
$this->pending_sender=0;
}
for(;$this->pending_recipients;$this->pending_recipients–)
{
if($this->VerifyResultLines(array("250","251"))<=0)
return(0);
}
return(1);
}
/* Public methods */
Function Connect()
{
$this->error=$error="";
$this->esmtp_host="";
$this->esmtp_extensions=array();
if(!($this->connection=($this->timeout ? fsockopen($this->host_name,$this->host_port,&$errno,&$error,$this->timeout) : fsockopen($this->host_name,$this->host_port))))
{
switch($error)
{
case -3:
$this->error="-3 socket could not be created";
return(0);
case -4:
$this->error="-4 dns lookup on hostname \"".$host_name."\" failed";
return(0);
case -5:
$this->error="-5 connection refused or timed out";
return(0);
case -6:
$this->error="-6 fdopen() call failed";
return(0);
case -7:
$this->error="-7 setvbuf() call failed";
return(0);
default:
$this->error=$error." could not connect to the host \"".$this->host_name."\"";
return(0);
}
}
else
{
if(!strcmp($localhost=$this->localhost,"")
&& !strcmp($localhost=getenv("SERVER_NAME"),"")
&& !strcmp($localhost=getenv("HOST"),""))
$localhost="localhost";
$success=0;
if($this->VerifyResultLines("220")>0)
{
if($this->esmtp)
{
$responses=array();
if($this->PutLine("EHLO $localhost")
&& $this->VerifyResultLines("250",&$responses)>0)
{
$this->esmtp_host=strtok($responses[0]," ");
for($response=1;$response<count($responses);$response )
{
$extension=strtoupper(strtok($responses[$response]," "));
$this->esmtp_extensions[$extension]=strtok("");
}
$success=1;
}
}
if(!$success
&& $this->PutLine("HELO $localhost")
&& $this->VerifyResultLines("250")>0)
$success=1;
}
if($success)
{
$this->state="Connected";
return(1);
}
else
{
fclose($this->connection);
$this->connection=0;
$this->state="Disconnected";
return(0);
}
}
}
Function MailFrom($sender)
{
if(strcmp($this->state,"Connected"))
{
$this->error="connection is not in the initial state";
return(0);
}
$this->error="";
if(!$this->PutLine("MAIL FROM: <".$sender.">"))
return(0);
if(!IsSet($this->esmtp_extensions["PIPELINING"])
&& $this->VerifyResultLines("250")<=0)
return(0);
$this->state="SenderSet";
if(IsSet($this->esmtp_extensions["PIPELINING"]))
$this->pending_sender=1;
$this->pending_recipients=0;
return(1);
}
Function SetRecipient($recipient)
{
switch($this->state)
{
case "SenderSet":
case "RecipientSet":
break;
default:
$this->error="connection is not in the recipient setting state";
return(0);
}
$this->error="";
if(!$this->PutLine("RCPT TO:<".$recipient.">"))
return(0);
if(IsSet($this->esmtp_extensions["PIPELINING"]))
{
$this->pending_recipients ;
if($this->pending_recipients>=$this->maximum_piped_recipients)
{
if(!$this->FlushRecipients())
return(0);
}
}
else
{
if($this->VerifyResultLines(array("250","251"))<=0)
return(0);
}
$this->state="RecipientSet";
return(1);
}
Function StartData()
{
if(strcmp($this->state,"RecipientSet"))
{
$this->error="connection is not in the start sending data state";
return(0);
}
$this->error="";
if(!$this->PutLine("DATA"))
return(0);
if($this->pending_recipients)
{
if(!$this->FlushRecipients())
return(0);
}
if($this->VerifyResultLines("354")<=0)
return(0);
$this->state="SendingData";
return(1);
}
Function PrepareData($data,&$output)
{
$length=strlen(&$data);
for($output="",$position=0;$position<$length;)
{
$next_position=$length;
for($current=$position;$current<$length;$current )
{
switch($data[$current])
{
case "\n":
$next_position=$current 1;
break 2;
case "\r":
$next_position=$current 1;
if($data[$next_position]=="\n")
$next_position ;
break 2;
}
}
if($data[$position]==".")
$output.=".";
$output.=substr(&$data,$position,$current-$position)."\r\n";
$position=$next_position;
}
}
Function SendData($data)
{
if(strcmp($this->state,"SendingData"))
{
$this->error="connection is not in the sending data state";
return(0);
}
$this->error="";
return($this->PutData(&$data));
}
Function EndSendingData()
{
if(strcmp($this->state,"SendingData"))
{
$this->error="connection is not in the sending data state";
return(0);
}
$this->error="";
if(!$this->PutLine("\r\n.")
|| $this->VerifyResultLines("250")<=0)
return(0);
$this->state="Connected";
return(1);
}
Function ResetConnection()
{
switch($this->state)
{
case "Connected":
return(1);
case "SendingData":
$this->error="can not reset the connection while sending data";
return(0);
case "Disconnected":
$this->error="can not reset the connection before it is established";
return(0);
}
$this->error="";
if(!$this->PutLine("RSET")
|| $this->VerifyResultLines("250")<=0)
return(0);
$this->state="Connected";
return(1);
}
Function Disconnect($quit=1)
{
if(!strcmp($this->state,"Disconnected"))
{
$this->error="it was not previously established a SMTP connection";
return(0);
}
$this->error="";
if(!strcmp($this->state,"Connected")
&& $quit
&& (!$this->PutLine("QUIT")
|| $this->VerifyResultLines("221")<=0))
return(0);
fclose($this->connection);
$this->connection=0;
$this->state="Disconnected";
return(1);
}
Function SendMessage($sender,$recipients,$headers,$body)
{
if(($success=$this->Connect()))
{
if(($success=$this->MailFrom($sender)))
{
for($recipient=0;$recipient<count($recipients);$recipient )
{
if(!($success=$this->SetRecipient($recipients[$recipient])))
break;
}
if($success
&& ($success=$this->StartData()))
{
for($header_data="",$header=0;$header<count($headers);$header )
$header_data.=$headers[$header]."\r\n";
if(($success=$this->SendData($header_data."\r\n")))
{
$this->PrepareData($body,&$body_data);
$success=$this->SendData($body_data);
}
if($success)
$success=$this->EndSendingData();
}
}
$disconnect_success=$this->Disconnect($success);
if($success)
$success=$disconnect_success;
}
return($success);
}
};
?>

php上传、管理照片示例

星期一, 06月 2nd, 2008

<!–上传照片示例 upimage.php
功能:上传照片,显示上传人、上传时间、图片名称、图片大小、图片说明.
说明:1.有一些主页空间可能不支持上传后de临时文件操作,那只能换一个试试啦.
2.程序可以自动新建文档photo.txt和目录image,若不能正常运行,请自己新建一个文档photo.txt(和upimage.php在同一个目录下)和目录image.
3.可以到我de主页上测试一下 http://medonline.51.net/upload/upimage.php
–>
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<TITLE>上传照片</TITLE>
<style type="text/css">
<!–
.white12 { font-size: 12pt; color: #FFFFFF; text-decoration: none}
.blue10 { font-size: 10pt; color: #99CCFF; text-decoration: none}
.black10 { font-size: 10pt; text-decoration: none}
–>
</style>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<?php
if ($upload){ //如果点击"上传",则执行此php相关代码部分
if ($picurl=="none"){
echo "您没有上传任何文件.";
exit; //如果没有上传文件,则退出程序
}
$v=opendir("image");
if ($v==0)
{ mkdir("image"); //若目录不存在,则新建一个
$v=opendir("image"); //取得目录handle
}
$up=copy("$picurl","image/$picurl_name"); //关键一步,将临时文件复制到image目录下
if($up==1)
{
//文件操作
$fp=fopen("photo.txt","a");//打开文件,以添加方式写入留言
//初始化写入内容
$mydate=date("Y年m月d日 h:i A");
$photonote=nl2br($photonote);//将换行字元转成 <br>.
$text="照片名:<a href=’image/$picurl_name’ target=’_blank’>$picurl_name</a> <br>照片大小:$picurl_size byte<br> 照片说明:<BR><span class=’blue10′>$photonote</span><br> <div align=’right’>上传人: $user($mydate)</div><hr>";
//写入内容
fwrite($fp,$text,strlen($text)); //strlin计算$textde字串长度
fclose($fp);
echo "文件上传成功!<BR>";
unlink ($picurl); //从临时文件夹中删除档案$picurl
closedir ($v); //关闭目录handle
}
else
{echo "文件上传失败."; exit;} //若上传失败,则退出程序
}
?>
<table width="71%" border="0" cellspacing="0" cellpadding="0" align="center">
<tr bgcolor="#6699FF">
<td>
<div align="center" class="white12">所有照片</div>
</td>
</tr>
<tr>
<td class="black10">
<?php
//显示以往上传照片信息
readfile ("photo.txt");
?>
</td>
</tr>
<tr bgcolor="#6699FF">
<td>
<div align="center" class="white12">上传照片</div>
</td>
</tr>
<tr>
<td>
<form action="upimage.php" method="post" enctype="multipart/form-data" name="UL">
<!–注意:这里必须加上‘enctype="multipart/form-data" ‘,否则不会产生上
传动作–>
<div align="center" class="black10">图片源文件:
<input type="file" name="picurl" size="15" accept="image/x-png,image/gif,image/jpeg">
<br>
照片说明:(不超过50个字)<br>
<textarea name="photonote" cols="50" rows="5"></textarea>
<br>上传人:
<input type="text" name="user" size="10" maxlength="10">
<br>
<input type="Submit" name="upload" value="上传">
<input type="reset" name="Reset" value="重写">
</div>
</form>
<div align="center" class="blue10"><a href="javascript:history.back()"> 返回</a> </div>
</td>
</tr>
</table>
</BODY>
</HTML>
【本文版权归作者与奥索网共同拥有,如需转载,请注明作者及出处】

同时提取多条新闻中的文本一例

星期一, 06月 2nd, 2008

本文为一个提取一批新闻网页中de文本de小程序,它可以将各篇新闻de内容存为以该新闻标题为文件名de文本文件.如有更好de处理方法,请和我联系:
lwx3069@sina.com
这里以人民网中de“今日要闻”下de新闻为例.
<?php
($url) ? "" : $url = "http://www.unn.com.cn/GB/channel2/3/11/index.html"; // 今日要闻
if(isset($url)&&$url!="") {
$str = implode("",file($url));
$str_ary = explode("<ul>",$str);
$str_ary = explode("<li>",trim($str_ary[1]));
for ($i=0; $i<8; $i ) {
if (strlen(trim($str_ary[$i]))<3){
continue;
}
echo "新闻".$i.":".$str_ary[$i];
$str1=strstr("$str_ary[$i]",’<a href="/’);
$str2=strstr("$str_ary[$i]",’" target’);
$len1=strlen("$str1");
$len2=strlen("$str2");
$len=$len1-$len2;
$url=substr("$str1",10,$len-10);
if (strlen(trim($url))!=0) {
$url = "http://www.unn.com.cn/".$url;
define(CONTENTS_DIR,"./contents/");
if(isset($url)&&$url!="") {
$str = implode("",file($url));
$str1=explode(’<div align="right">’,$str); //去掉文件没用de上半部分
$str2 = explode(’<h4 align="center"> </h4>’,$str1[1]);
//取出文件de下半部分,并去掉没用de下半部分,这时得到de都是有用de
$str3=explode(’</font><font size=" 2"><b><font size="3">’,$str2[0]); //从整个有用部分取出文件标题和正文
$str4=explode(’</div>’,$str2[0]); //取出日期和时间
$str5=explode(’</font></b></font><font size="2">’,$str3[1]); //从标题和正文部分取出标题
$title=str_replace("<br>","",$str5[0]);
$str3=explode(’<p><font size="2">’,$str2[0]); //从整个有用部分取出文件正文
$str3[1]=str_replace(’<br><br> ‘,"\n"."  ",$str3[1]);
$str3[1]=str_replace(’ ‘,"",$str3[1]);
$str3=strip_tags($str3[1]);
$pf=trim($title).".txt";
$ppf=fopen(CONTENTS_DIR."$pf",’w');
fputs($ppf,$title);
fputs($ppf,"$str4[0]");
fputs($ppf,$str3);
}
}
}
}
?>