Chinaunix首页 | 论坛 | 博客
  • 博客访问: 407917
  • 博文数量: 403
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: -70
  • 用 户 组: 普通用户
  • 注册时间: 2016-09-05 12:45
文章分类

全部博文(403)

文章存档

2014年(3)

2013年(1)

2012年(3)

2011年(21)

2010年(13)

2009年(64)

2008年(9)

2007年(36)

2006年(253)

分类: Java

2006-09-15 16:13:56

忘记从哪里找的了,很早以前的了:

JAVA/JSP学习系列之一(JDK安装)

一、前言

 

   JDK(Java Development Kit )是一切java应用程序的基础,可以说,所有的java应用程序是构建在这个之上的。它是一组API,也可以说是一些java Class。目前已经正式发布的最新版本是JDK1.3。考虑到我对linux不熟悉,而且大多数都是在MS系统下,所以,在这里我用的是win2000

 

二、下载,安装

 

   下载地址为JAVA官方站点:java.sun.com,国内也到处都是。

 

   Windows下,直接运行.exe文件,安装到一个目录,我这里用F:\jdk13作为例子。

 

三、配置

 

   桌面上选择“我的电脑”(右键)

 

   高级

 

   环境变量

 

   在“系统变量”--->“新建”

 

   在变量名中输入:CLASSPATH,变量值中输入:

 

F:\JDK13\LIB\dt.JAR;F:\JDK13\LIB\TOOLS.JAR;F:\JDK13\BIN;然后确定;

 

好了,配置完了,要重新启动计算机后,环境变量才能有效的。

 

四、测试

 

   (1)用文本编辑器写一个简单的java程序:

 

public class HelloWorld {

 

public static void main(String args[]) {

 

System.out.println("Hello World!");

 

}

 

}

 

这个例子就是著名的“Hello World”,它的功能就是显示“Hello World”。

 

注意:该文件名称必须为“HelloWorld.java”,大小写也区分。细心的朋友会注意到就是和public class后的名字一样的。

 

   (2)编译:在dos命令提示符下执行:(注意大小写)

 

javac HelloWorld.java

 

如果正常的话,将生成HelloWorld.class文件。

 

   (3)运行:在dos命令提示符下执行:(注意大小写)

 

java HelloWorld

 

这里有一个java初学者很有可能遇到的问题(不怕笑话,我也是)就是输入:

 

java HelloWorld.class

 

多了后面的.class,一定要注意,否则会出现下面的错误:

 

Exception in thread "main" java.lang.NoClassDefFoundError:HelloWorld/class

 

(本人猜想,是不是java翻译“.”的时候换成了“/”,或者是其他的本人不知道的原因)

 

好了,运行java HelloWorld应该会出现伟大的“Hello World”了。

 

到这一步,你已经成功配置好了JDK,可以开始漫长而痛苦(对于象我一样的,以前不懂java的朋友来说,可以用“痛苦”来形容,不理解的概念,不熟悉的java api...,不过,不要急,我将和大家一起慢慢入门,慢慢提高... ...)Java过程了。

 

 

 

JAVA/JSP学习系列之二(Tomcat安装)

一、前言

 

   对于初学者来说,要执行JSPServletTomcat是一个很不错的选择,。TomcatApache组织的产品,sun公司对它的支持也相当不错。

 

二、下载,安装

 

   下载地址为JAVA官方站点:jakarta.apache.org,国内也比较多。

 

从这个地址可以下载:,我下载的是Tomcat32b4版本。

 

   下载完,解压到一个目录,我这里用F:\tomcat32b4作为例子。

 

三、配置

 

   桌面上选择“我的电脑”(右键)

 

   高级

 

   环境变量

 

   在“系统变量”--->“新建”

 

   在变量名中输入:JAVA_HOME,变量值中输入:F:\JDK13然后确定;

 

   在“系统变量”--->“新建”

 

   在变量名中输入:TOMCAT_HOME,变量值中输入:F:\tomcat32b4然后确定;

 

好了,配置完了,要重新启动计算机后,环境变量才能有效的。

 

注意,对于Tomcat其他设置,如果没有必要,是可以不改的,我这里讲的都是最简单而可行的方法,如果对你的改动没有把握,还是建议不要改动。

 

四、测试

 

   (1)启动tomcat

 

F:\tomcat32b4\bin下有一个:startup.bat,运行它,将出现一个Dos窗口。

 

   (2)浏览

 

在浏览器中输入:看看有什么效果(Tomcat默认端口为8080,在不冲突的前提下,你可以改动的),是不是可以看到一只可爱的小猫(其实,我个人认为,无论从颜色还是样子,更象一只老虎)

 

   (3)运行

 

在这个页面有JSP Examples Servlet Examples 好了,自己测试运行它们吧。

 

   (4)退出tomcat

 

F:\tomcat32b4\bin下有一个:shutdown.bat,运行它,将关闭Dos窗口(如果坚持直接关闭这个DOS窗口也是可以的,但是,既然有这个shutdown.bat,应该有它存在的理由)。

 

 

JAVA/JSP学习系列之三(Resin+Apache的安装)

一、前言

 

  对于初学者来说,要执行JSPServletTomcat是一个很不错的选择。你也可以用Resin,这两个产品都是可以不花一分钱的。 ResinXml的支持是很好的。

 

二、下载,安装

 

  下载地址为Resin官方站点:

 

从这个地址可以下载:download/index.xtp,我下载的是Resin1.1.4版本。

 

  下载完,解压到一个目录,我这里用E:\resin114作为例子。

 

三、配置

 

   在这之前,当然我们要先安装了Apache,而且能正常运行了。

 

   (1)配置Apache

 

打开apacheconf子目录下的httpd.conf文件,用文本编辑工具编辑它。加入如下几行:

 

LoadModule caucho_module "E:\resin114\srun\win32-1.3.6\mod_caucho.dll"

 

AddModule mod_caucho.c

 

 

CauchoConfigFile "E:\\resin114\\conf\\resin.conf"

 

 

SetHandler caucho-status

 

 

 

注意:上面的步骤也可以通过更加简单的方式实现,就是直接运行E:\resin114\bin\目录下的setup.exe,勾上apache,然后Apply,最后OK。这样,上面这些行应该会自动加上的。

 

   (2)配置Resin

 

resinconf子目录下有个resin.conf文件,将该文件备份一个。然后建立resin.conf文件,如下内容:

 

 

 

 

 

 

 

 

 

 

四、测试

 

   (1)启动Resin

 

resinbin下有一个srun.exe,运行它,将出现一个窗口。

 

   (2)做一个简单的jsp文件test.jsp(我们用resin站点的例子)

 

该文件放在:apache/htdocs/test.jsp

 

内容如下:

 

<%@ page language=javascript %>

 

2 + 2 = <%= 2 + 2 %>

 

   (3)运行

 

在浏览器中输入:,应该出现下面结果:

 

2+2=4

 

好了,到这里你已经安装成功了,你可以在htdocs下建立一些自己的子目录, 管理文件。

 

注意:在四(1)中,启动resin 可以将srun加在Win2000的服务中,让每次这个resin服务自动启动,不必每次都运行srun.exe

 

 

JAVA/JSP学习系列之四(Orion App Server的安装)

一、前言

 

   Orion这个东西,小巧,但是功能却非常多,废话不讲,看它目前的支持就知道了:

(1)Servlets/JSP

 

(2)EJB

 

(3)HTTP (注:说明不再需要Apache或者IISWeb Server)

 

二、下载,安装

 

   下载地址为Orion Application Server官方站点:,我下载的是Orion1.4版本。

 

   下载完,解压到一个目录,我这里用E:\Orion作为例子。

 

三、配置

 

   (1)根据Orion官方站点的安装说明,如果要支持JSP等技术的话,要将JDKtools.jar复制到e:\orion目录下,tools.jar文件在你安装的JDK目录的lib子目录下。

 

到现在,其实已经成功了缺省的配置了,如果你的80端口没有被占用,而且你也想用80作为端口的话,你到这里已经完成了,否则,请继续下面的配置。

 

   (2)配置端口

 

E:\orion\config目录下有个default-web-site.xml文件,找到文件中下面行:

 

 

 

将这行改为:

 

 

 

注意,我这里使用的是8008端口。

 

四、测试

 

   (1)启动Orion

 

Orion目录下,command方式运行:

 

java -jar orion.jar

 

将出现Orion/x.x.x initialized,我这里版本是1.4所以显示:

 

Orion/1.4.0 initialized

 

到此,说明你已经成功了。

 

   (2)执行jsp文件

 

在浏览器中输入:

 

 

出现:Orion Application Server 1.4.0 - Up and running,下面有JSP examples你可以试着运行。

 

 

 

JAVA/JSP学习系列之五(JDBC-ODBC翻页例子)

一、运行前准备

 

   建议了一个MS SQLServer7数据库 DNS,名称为:Test_DB

 

   数据库中有一个表:guestbook字段为:name(varchar),email(varchar),body(text)

 

   数据库用户为sa 密码空,可以自己修改的。

 

二、代码

 

<%@ page contentType="text/html;charset=gb2312"%>

 

<%

 

//变量声明

 

java.sql.Connection sqlCon; //数据库连接对象

 

java.sql.Statement sqlStmt; //SQL语句对象

 

java.sql.ResultSet sqlRst; //结果集对象

 

java.lang.String strCon; //数据库连接字符串

 

java.lang.String strSQL; //SQL语句

 

int intPageSize; //一页显示的记录数

 

int intRowCount; //记录总数

 

int intPageCount; //总页数

 

int intPage; //待显示页码

 

java.lang.String strPage;

 

int i,j,k; //设置一页显示的记录数

 

intPageSize = 5; //取得待显示页码

 

strPage = request.getParameter("page");

 

if(strPage==null){

 

//表明在QueryString中没有page这一个参数,此时显示第一页数据

 

intPage = 1;

 

} else{

 

//将字符串转换成整型

 

intPage = java.lang.Integer.parseInt(strPage);

 

if(intPage<1) intPage = 1; }

 

//装载JDBC-ODBC驱动程序

 

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

 

//设置数据库连接字符串

 

strCon = "jdbc:odbc:Test_DB";

 

//连接数据库

 

sqlCon = java.sql.DriverManager.getConnection(strCon,"sa","");

 

//创建SQL语句对象

 

sqlStmt = sqlCon.createStatement();

 

//获取记录总数

 

strSQL = "select count(*) from guestbook";

 

sqlRst = sqlStmt.executeQuery(strSQL);

 

//执行SQL语句并取得结果集

 

sqlRst.next(); //记录集刚打开的时候,指针位于第一条记录之前

 

intRowCount = sqlRst.getInt(1);

 

sqlRst.close(); //关闭结果集

 

//记算总页数

 

intPageCount = (intRowCount+intPageSize-1) / intPageSize;

 

//调整待显示的页码 if(intPage>intPageCount) intPage = intPageCount;

 

//设置获取数据SQL语句

 

strSQL = "select name,email,body from guestbook";

 

//执行SQL语句并取得结果集

 

sqlRst = sqlStmt.executeQuery(strSQL);

 

//将记录指针定位到待显示页的第一条记录上

 

i = (intPage-1) * intPageSize;

 

for(j=0;j

 

 

 

JSP</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据库操作例程</SPAN><SPAN lang=EN-US><FONT face="Times New Roman"> - </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据分页显示</SPAN><SPAN lang=EN-US><FONT face="Times New Roman"> - JDBC-ODBC

 

 

 

jdbc-odbc留言版

 

 

<%

 

//显示数据

 

i = 0;

 

while(i

 

 

 

 

 

 

 

 

<% i++; } %>

 

 

 

 

姓名:<%=sqlRst.getString(1)%> 邮件:<%=sqlRst.getString(2)%>
<%=sqlRst.getString(3)%>

 

<%=intPage%> <%=intPageCount%>

 

<%if(intPage

 

下一页<%

 

}

 

%>

 

<%if(intPage>1){%>

 

上一页<%

 

}

 

%>

 

 

 

<%

 

//关闭结果集

 

sqlRst.close();

 

//关闭SQL语句对象

 

sqlStmt.close();

 

//关闭数据库

 

sqlCon.close();

 

%>

 

三、怎么去运行?

 

   将代码存为文件test.jsp

 

Orion Application Server下:

 

Copyoriondefault-web-app目录下,通过:

 

 

访问测试

 

对于Resin,Tomcat,JWS等等,都可以运行通过。

 

 

JAVA/JSP学习系列之六(MySQL翻页例子)

一、运行前准备

 

   下载了mysqljdbc驱动(一个jar文件)并加载在CLASSPATH(方法见《JAVA/JSP学习系列之一(JDK安装) )

 

   (如果找不到,请从本站下载)

 

   建一个MySQL数据库test

 

   数据库中有一个表:note,字段为:name(varchar)

 

二、下载,安装

 

<%@ page contentType="text/html;charset=gb2312" %>

 

<% java.sql.Connection sqlCon; //数据库连接对象

 

java.sql.Statement sqlStmt; //SQL语句对象

 

java.sql.ResultSet sqlRst; //结果集对象

 

java.lang.String strCon; //数据库连接字符串

 

java.lang.String strSQL; //SQL语句

 

int intPageSize; //一页显示的记录数

 

int intRowCount; //记录总数

 

int intPageCount; //总页数

 

int intPage; //待显示页码

 

java.lang.String strPage;

 

int i;

 

//设置一页显示的记录数

 

intPageSize = 2;

 

//取得待显示页码

 

strPage = request.getParameter("page");

 

if(strPage==null){

 

//表明在QueryString中没有page这一个参数,此时显示第一页数据

 

intPage = 1;

 

} else{

 

//将字符串转换成整型

 

intPage = java.lang.Integer.parseInt(strPage);

 

if(intPage<1) intPage = 1;

 

}

 

//装载JDBC驱动程序

 

Class.forName("org.gjt.mm.mysql.Driver").newInstance();

 

//连接数据库

 

sqlCon= java.sql.DriverManager.getConnection("jdbc:mysql://localhost/test");

 

//创建语句对象

 

sqlStmt = sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.

 

ResultSet.CONCUR_READ_ONLY); //执行SQL语句

 

strSQL = "select name from note";

 

//执行SQL语句并获取结果集

 

sqlRst = sqlStmt.executeQuery(strSQL);

 

//获取记录总数

 

sqlRst.last();

 

intRowCount = sqlRst.getRow();

 

//记算总页数

 

intPageCount = (intRowCount+intPageSize-1) / intPageSize;

 

//调整待显示的页码

 

if(intPage>intPageCount) intPage = intPageCount;

 

%>

 

 

 

 

JSP</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据库操作例程</SPAN><SPAN lang=EN-US><FONT face="Times New Roman"> - </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据分页显示</SPAN><SPAN lang=EN-US><FONT face="Times New Roman"> - JDBC 2.0 - mysql

 

 

 

 

 

 

 

<% if(intPageCount>0)

 

{

 

//将记录指针定位到待显示页的第一条记录上

 

sqlRst.absolute((intPage-1) * intPageSize + 1);

 

//显示数据

 

i = 0;

 

while(i

 

 

 

 

<% sqlRst.next();

 

i++;

 

}

 

}

 

%>

 

姓名

 

<%=sqlRst.getString(1)%>

 

 

<%=intPage%> <%=intPageCount%>

 

<%if(intPage下一页<%}%>

 

<%if(intPage>1){%>上一页<%}%>

 

 

 

<%

 

//关闭结果集

 

sqlRst.close();

 

//关闭SQL语句对象

 

sqlStmt.close();

 

//关闭数据库

 

sqlCon.close();

 

%>

 

三、怎么去运行?

 

   见前文《JAVA/JSP学习系列之五(JDBC-ODBC翻页例子)》。

 

 

JAVA/JSP学习系列之七(Orion下自定义Tag)

一、前言 (本文译自Orion官方站点)

 

   本文将一步一步介绍在Orion Application Server下定义自己的标签,然后,实现该标签的功能,最后用一个jsp例子测试。

 

二、建立标签,实现该标签的功能。

 

1.命名package为:com.acme.mytags(为了和原文相同,我不做改动)

 

package com.acme.mytags;

 

2.import相关class

 

import javax.servlet.jsp.*;

 

import javax.servlet.jsp.tagext.*;

 

3.实现javax.servlet.jsp.tagext.Tag接口:

 

public class HelloWorld implements Tag

 

{

 

4.定义局部变量

 

private PageContext pageContext;

 

private Tag parent;

 

5.调用标签开始的实现方法

 

public int doStartTag() throws javax.servlet.jsp.JspException

 

{

 

return SKIP_BODY;

 

}

 

注意:这个方法返回 SKIP_BODY,就是标签的body为空的时候,将返回这个值,否则将返回:EVAL_BODY_INCLUDE

 

6.调用标签结束的实现方法

 

public int doEndTag() throws javax.servlet.jsp.JspException

 

{

 

try

 

{

 

pageContext.getOut().write("Hello World!");

 

}

 

catch(java.io.IOException e)

 

{

 

throw new JspException("IO Error: " + e.getMessage());

 

}

 

return EVAL_PAGE;

 

}

 

这样将在jsp文件的自定义标签结束地方输出“Hello World!

 

7.还不够,我们还要写下面的方法:

 

public void release() {}

 

对于本简单的例子,上面的方法不需要任何实现。

 

8.JSP的容器要调用下面的方法:

 

public void setPageContext(final javax.servlet.jsp.PageContext pageContext) {

 

this.pageContext=pageContext;

 

}

 

JSP容器通过上面的方法调用标签,而且上面的方法用来设置标签的PageContext.

 

9.JSP的容器还要调用下面的方法:

 

public void setParent(final javax.servlet.jsp.tagext.Tag parent)

 

{

 

this.parent=parent;

 

}

 

JSP容器通过上面的方法设置标签的parent-Tag,因为每个标签的PageContext都要保留它的parent标签。

 

10.最后,实现方法:

 

public javax.servlet.jsp.tagext.Tag getParent()

 

{

 

return parent;

 

}

 

}

 

11. 编译标签。

 

三、描叙标签

 

现在将要写一个描叙文件,描叙该标签。

 

1.建立一个taglib.tld文件,

 

2.taglib.tld是一个XML格式的文本文件,XML的头如下:

 

"">

 

3.描叙标签库

 

 

1.0

 

1.1

 

mt tutorials/tagtut/lesson1/mytags.jar

 

My first Tag library

 

4.描叙标签

 

 

helloWorld

 

com.acme.mytags.HelloWorld

 

empty

 

A Hello world Tag

 

 

5.结束

 

 

四、打包

 

名称为:mytags.jar

 

其目录结构为:

 

com/acme/mytags/HelloWorld.class

 

META-INF/taglib.tld

 

五、在jsp文件中使用自定义标签

 

建立hello.jsp如下:

 

<%@ taglib uri="mytags.jar" prefix="mt" %>

 

 

 

Hello World!

 

 


 

 


 

 

 

六、测试运行

 

orion目录下,建立如下结构,其中,tag是自己建立的,前面的目录是本来就有的。

 

E:\orion\default-web-app\tag

 

jar文件和jsp文件全部放到这个目录下。

 

然后,访问:

 

[port]/tag/hello.jsp

 

将出现:

------------------------------------------------------------------

Hello World! 

------------------------------------------------------------------

 

七、恭喜,你已经成功了!

 

附:mytags.jarhello.jsp 文件本站下载地址:

 

 

 

 

JAVA/JSP学习系列之八(改写MySQL翻页例子)

一、前言

 

   其实,改写后的JDBC Data-Source是运行在Servlet中的,通过JNDI去查找数据源。我用Orion试的,将本站《JAVA/JSP学习系列之六(MySQL翻页例子) 简单改写了一下。

 

二、配置

 

(1)JDBC

 

   需要将用到的JDBC驱动Copy[ORION]/lib目录下

 

(2)data-source

 

   [ORION]/config/data-sources.xml文件中加入如下:

 

data-source

 

class="com.evermind.sql.DriverManagerDataSource"

 

name="mySqlDbpage"

 

location="jdbc/HypersonicCoreDS"

 

xa-location="jdbc/xa/HypersonicXADS"

 

ejb-location="jdbc/mysqlDbPage"

 

connection-driver="org.gjt.mm.mysql.Driver"

 

username="root"

 

password=""

 

url="jdbc:mysql://localhost/test"

 

inactivity-timeout="30"

 

/

 

需要注意的是:

 

(1)ejb-location这个后面的“jdbc/mysqlDbPage”是JNDI要来查找的。

 

(2)connection-driverJDBC数据库驱动

 

(3)urlJDBC中的URL

 

(4)username为数据库用户名

 

(5)password为用户密码

 

(6)inactivity-timeout为数据库连接超时,默认为30

 

对于其他的地方不要改。

 

三、改写后的代码如下:

 

<%@ page contentType="text/html;charset=gb2312" %>

 

<%@ page import="java.sql.*, javax.sql.DataSource, javax.naming.InitialContext" %>

 

<%

 

//建立一个JNDI查找对象

 

InitialContext JNDI_Context = new InitialContext();

 

//JNDI查找数据源

 

DataSource ds = (DataSource) JNDI_Context.lookup("jdbc/mysqlDbPage");

 

//得到一个数据源连接

 

Connection conn = ds.getConnection();

 

int intPageSize; //一页显示的记录数

 

int intRowCount; //记录总数

 

int intPageCount; //总页数

 

int intPage; //待显示页码

 

java.lang.String strPage;

 

int i;

 

//设置一页显示的记录数

 

intPageSize = 2;

 

//取得待显示页码

 

strPage = request.getParameter("page");

 

if(strPage==null){

 

//表明在QueryString中没有page这一个参数,此时显示第一页数据

 

intPage = 1;

 

} else{

 

//将字符串转换成整型

 

intPage = java.lang.Integer.parseInt(strPage);

 

if(intPage<1) intPage = 1;

 

}

 

// 得到结果

 

stmt = conn.createStatement();

 

ResultSet sqlRst = stmt.executeQuery("select f1 from test");

 

//获取记录总数

 

sqlRst.last();

 

intRowCount = sqlRst.getRow();

 

//记算总页数

 

intPageCount = (intRowCount+intPageSize-1) / intPageSize;

 

//调整待显示的页码

 

if(intPage>intPageCount)

 

intPage = intPageCount;

 

%>

 

 

 

 

JSP</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据库操作例程</SPAN><SPAN lang=EN-US><FONT face="Times New Roman"> - </FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据分页显示</SPAN><SPAN lang=EN-US><FONT face="Times New Roman"> - JDBC 2.0 - mysql

 

 

 

 

 

 

 

<% if(intPageCount>0)

 

{

 

//将记录指针定位到待显示页的第一条记录上

 

sqlRst.absolute((intPage-1) * intPageSize + 1);

 

//显示数据

 

i = 0;

 

while(i

 

 

 

 

<% sqlRst.next();

 

i++;

 

}

 

}

 

%>

 

姓名

 

<%=sqlRst.getString(1)%>

 

 

<%=intPage%> <%=intPageCount%>

 

<%if(intPage下一页<%}%>

 

<%if(intPage>1){%>上一页<%}%>

 

 

 

<%

 

//关闭结果集

 

sqlRst.close();

 

%>

 

三、怎么去运行?

 

   见前文《JAVA/JSP学习系列之五(JDBC-ODBC翻页例子)》。

 

注意:MySQL数据库为test,中间有个表test,有个字段f1(varchar)

 

 

 

JAVA/JSP学习系列之九(理解构造器)

了解构造器

 

构造器和方法的区别

摘要

要学习Java,你必须理解构造器。因为构造器可以提供许多特殊的方法,这个对于初学者经常混淆。但是,构造器和方法又有很多重要的区别。

 

我们说构造器是一种方法,就象讲澳大利亚的鸭嘴兽是一种哺育动物。(按:老外喜欢打比喻,我也就照着翻译)。要理解鸭嘴兽,那么先必须理解它和其他哺育动物的区别。同样地,要理解构造器,那么就要了解构造器和方法的区别。所有学习java的人,尤其是对那些要认证考试的,理解构造器是非常重要的。下面将简单介绍一下 ,最后用一个表作了些简单的总结。

 

功能和作用的不同

构造器是为了创建一个类的实例。这个过程也可以在创建一个对象的时候用到:Platypus p1 = new Platypus();

 

相反,方法的作用是为了执行java代码。

 

修饰符,返回值和命名的不同

构造器和方法在下面三个方便的区别:修饰符,返回值,命名。和方法一样,构造器可以有任何访问的修饰: public, protected, private或者没有修饰(通常被package friendly调用). 不同于方法的是,构造器不能有以下非访问性质的修饰: abstract, final, native, static, 或者 synchronized

 

返回类型也是非常重要的。方法能返回任何类型的值或者无返回值(void),构造器没有返回值,也不需要void

 

最后,谈谈两者的命名。构造器使用和类相同的名字,而方法则不同。按照习惯,方法通常用小写字母开始,而构造器通常用大写字母开始。构造器通常是一个名词,因为它和类名相同;而方法通常更接近动词,因为它说明一个操作。

 

"this"的用法

构造器和方法使用关键字this有很大的区别。方法引用this指向正在执行方法的类的实例。静态方法不能使用this关键字,因为静态方法不属于类的实例,所以this也就没有什么东西去指向。构造器的this指向同一个类中,不同参数列表的另外一个构造器,我们看看下面的代码:

 

public class Platypus {

 

String name;

 

Platypus(String input) {

name = input;

}

 

Platypus() {

this("John/Mary Doe");

}

 

public static void main(String args[]) {

Platypus p1 = new Platypus("digger");

Platypus p2 = new Platypus();

}

}

 

在上面的代码中,有2个不同参数列表的构造器。第一个构造器,给类的成员name赋值,第二个构造器,调用第一个构造器,给成员变量name一个初始值 "John/Mary Doe".

 

在构造器中,如果要使用关键字this,那么,必须放在第一行,如果不这样,将导致一个编译错误。

 

"super"的用法

构造器和方法,都用关键字super指向超类,但是用的方法不一样。方法用这个关键字去执行被重载的超类中的方法。看下面的例子:

 

class Mammal {

void getBirthInfo() {

System.out.println("born alive.");

}

}

 

class Platypus extends Mammal {

void getBirthInfo() {

System.out.println("hatch from eggs");

System.out.print("a mammal normally is ");

super.getBirthInfo();

}

}

 

在上面的例子中,使用super.getBirthInfo()去调用超类Mammal中被重载的方法。

 

构造器使用super去调用超类中的构造器。而且这行代码必须放在第一行,否则编译将出错。看下面的例子:

 

public class SuperClassDemo {

SuperClassDemo() {}

}

 

class Child extends SuperClassDemo {

Child() {

super();

}

}

 

在上面这个没有什么实际意义的例子中,构造器 Child()包含了 super,它的作用就是将超类中的构造器SuperClassDemo实例化,并加到 Child类中。

 

编译器自动加入代码

编译器自动加入代码到构造器,对于这个,java程序员新手可能比较混淆。当我们写一个没有构造器的类,编译的时候,编译器会自动加上一个不带参数的构造器,例如:public class Example {}

编译后将如下代码:

 

public class Example {

Example() {}

}

 

 

在构造器的第一行,没有使用super,那么编译器也会自动加上,例如:

 

public class TestConstructors {

TestConstructors() {}

}

 

编译器会加上代码,如下:

 

public class TestConstructors {

TestConstructors() {

super;

}

}

 

仔细想一下,就知道下面的代码

 

public class Example {}

 

经过会被编译器加代码形如:

 

public class Example {

Example() {

super;

}

}

 

继承

 

构造器是不能被继承的。子类可以继承超类的任何方法。看看下面的代码:

 

public class Example {

public void sayHi {

system.out.println("Hi");

}

 

Example() {}

}

 

public class SubClass extends Example {

}

 

SubClass 自动继承了父类中的sayHi方法,但是,父类中的构造器 Example()却不能被继承。

 

总结

 

 

 

 

 

主题

构造器

方法

功能

建立一个类的实例

java功能语句

修饰

不能用bstract, final, native, static, or synchronized

返回类型

没有返回值,没有void

有返回值,或者void

命名

和类名相同;通常为名词,大写开头

通常代表一个动词的意思,小写开头

this

指向同一个类中另外一个构造器,在第一行

指向当前类的一个实例,不能用于静态方法

super

调用父类的构造器,在第一行

调用父类中一个重载的方法

继承

构造器不能被继承

方法可以被继承

编译器自动加入一个缺省的构造器

自动加入(如果没有)

不支持

编译器自动加入一个缺省的调用到超类的构造器

自动加入(如果没有)

不支持

 

 

 

JAVA/JSP学习系列之十(JavaMail API发邮件[servlet])

一:条件 必须下载sun公司的JavaMail API包,地址为:

 

我这里用的是1.2版本,将相关包(jar文件)加到CLASSPATH

 

二:该程序非常简单,不需要我们考虑很多地层的东西,因为API都帮我们做好了这些事情,下面是一个简单的发邮件的Servlet(对于熟悉的人来说,恐怕是再简单不过了的一个servlet)

 

import java.io.*;

 

import javax.servlet.*;

 

import javax.servlet.http.*;

 

import sun.net.smtp.*;

 

public class SendMailServlet extends HttpServlet {

 

public static String MAIL_FROM = "from";

 

public static String MAIL_TO = "to";

 

public static String MAIL_SUBJECT = "subject";

 

public static String MAIL_BODY = "body";

 

public static String MAIL_HOST = "mailhost";

 

public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException

 

{

 

resp.setContentType("text/html; charset=gb2312");

 

PrintWriter out = resp.getWriter();

 

out.println("

");

 

out.println("

");

 

out.println("

");

 

out.println("

");

 

out.println("

");

 

out.println("

");

 

out.println("

");

 

out.println("

");

 

out.println("

");

 

out.println("

");

 

out.println("

");

 

out.println("

");

 

out.println("

send mail server:
from:
to:
subject:
text:

");

 

out.println("");

 

out.println("");

 

out.println("");

 

out.flush();

 

}

 

public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException

 

{

 

resp.setContentType("text/html; charset=gb2312");

 

PrintWriter out = new PrintWriter(resp.getOutputStream());

 

String from = req.getParameter(MAIL_FROM);

 

String to = req.getParameter(MAIL_TO);

 

String subject = req.getParameter(MAIL_SUBJECT);

 

String body = req.getParameter(MAIL_BODY);

 

String mailhost = req.getParameter(MAIL_HOST);

 

try

 

{

 

SmtpClient mailer = new SmtpClient(mailhost);

 

mailer.from(from);

 

mailer.to(to);

 

PrintStream ps = mailer.startMessage();

 

ps.println("From: " + from);

 

ps.println("To: " + to);

 

ps.println("Subject: " + subject);

 

ps.println(body);

 

mailer.closeServer();

 

out.println("Success!");

 

}

 

catch (Exception ex)

 

{

 

out.println("An error about:" + ex.getMessage());

 

}

 

out.flush();

 

}

 

public void init(ServletConfig cfg) throws ServletException

 

{

 

super.init(cfg);

 

}

 

public void destroy()

 

{

 

super.destroy();

 

}

 

}

 

 

JAVA/JSP学习系列之十一(简单的“抓网页”代码)

一、前言

 

  从一个网站上,看到一个“抓网页”的代码,觉得有点意思,但是没有提供源代码,于是,自己想写一个,其实代码比较简单的。

 

二、代码

 

<%@ page contentType="text/html;charset=gb2312"%>

 

<%

 

String sCurrentLine;

 

String sTotalString;

 

sCurrentLine="";

 

sTotalString="";

 

java.io.InputStream l_urlStream;

 

java.net.URL l_url = new java.net.URL("");

 

java.net.HttpURLConnection l_connection = (java.net.HttpURLConnection) l_url.openConnection();

 

l_connection.connect();

 

l_urlStream = l_connection.getInputStream();

 

java.io.BufferedReader l_reader = new java.io.BufferedReader(new java.io.InputStreamReader(l_urlStream));

 

while ((sCurrentLine = l_reader.readLine()) != null)

 

{

 

sTotalString+=sCurrentLine;

 

}

 

out.println(sTotalString);

 

%>

 

三、后记

 

  虽然代码比较简单,但是,我认为根据这个,可以实现“网络爬虫”的功能,比如从页面找href连接,然后再得到那个连接,然后再“抓”,不停止地(当然可以限定层数),这样,可以实现“网页搜索”功能。

 

 

JAVA/JSP学习系列之十二(JSP生成jpeg图片用于投票)

一、前言

 

   本文原作者为Tony Wang ,该文章涉及到文件的读写和jpg图片的自动生成。利用jsp+servlet的技术,jsp调用servlet生成图片。

 

二、首文件index.jsp如下:

 

<%--

 

Author: Tony Wang

 

E-mail: lucky_tony@163.net

 

Date: 2001-01-01

 

如果对程序有什么疑问,可以和我联系, 另外程序如果有什么bug,麻烦指出!!

 

--%>

 

<%@ page contentType="text/html;charSet=gb2312"%>

<%

response.setHeader("Cache-Control","no-store");

response.setDateHeader("Expires",0);

%>

<%!

public String[] getQuestion(String s)

{

String[] strQ = new String[4];

String strTemp = null;

int i;

java.io.RandomAccessFile rf = null;

try {

rf = new java.io.RandomAccessFile(s,"r");

} catch(Exception e)

{

System.out.println(e);

System.exit(0);

}

for(i=0;i<4;i++)

{

try {

strTemp = rf.readLine();

} catch(Exception e) {

strTemp = "None Question";

}

if(strTemp==null)strTemp = "None Question";

strQ[i] = strTemp;

}

return strQ;

}

 

%>

 

<%

String s = null;

String[] question = new String[4];

 

s = request.getRealPath("question.txt");

question = getQuestion(s);

%>

 

 

 

冰帆调查

<%

String ss = null;

for (int i=0;i<4;i++)

{

ss = ""+

 

(char)('A'+i)+""+ question[i]+"
";

out.println(ss);

}

%>

">

 

height=100>

 

 

三、写文件write.jsp

 

<%--

Author: Tony Wang

E-mail: lucky_tony@163.net

Date: 2001-01-01

如果对程序有什么疑问,可以和我联系,

另外程序如果有什么bug,麻烦指出!!

--%>

<%!

public int[] getNumber(String s)

{

int[] mCount = new int[4];

String strTemp = null;

int i;

java.io.RandomAccessFile rf = null;

try {

rf = new java.io.RandomAccessFile(s,"r");

} catch(Exception e)

{

System.out.println(e);

System.exit(0);

}

for(i=0;i<4;i++)

{

try {

strTemp = rf.readLine();

} catch(Exception e) {

strTemp = "0";

}

if(strTemp==null)strTemp = "0";

mCount[i] = new Integer(strTemp).intValue();

}

return mCount;

}

 

public void setNumber(String s,int[] x)

{

try {

java.io.PrintWriter pw = new java.io.PrintWriter(new java.io.

 

FileOutputStream(s));

for (int i=0;i<4;i++){

pw.println(x[i]+"");

}

pw.close();

} catch(Exception e) {

System.out.println("Write file error:"+e.getMessage());

}

}

%>

 

 

<%

String tmp = null;

int choice = -1;

int[] count = new int[4];

tmp = request.getParameter("choice");

if (tmp==null){

} else {

choice = new Integer(tmp).intValue();

}

/////////////

String s = request.getRealPath("count.txt");

if(choice>=0){

count = getNumber(s);

count[choice]++;

setNumber(s,count);

}

 

response.sendRedirect("index.jsp");

%>

四、servlet原代码:VoteImage.java :

 

/*

Author: Tony Wang

E-mail: lucky_tony@163.net

Date: 2001-01-01

如果对程序有什么疑问,可以和我联系,

另外程序如果有什么bug,麻烦指出!!

*/

import java.io.*;

import java.util.*;

import com.sun.image.codec.jpeg.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.awt.*;

import java.awt.geom.*;

import java.awt.image.*;

public class VoteImage extends HttpServlet

{

private String strFile = null;

private Color color[]={Color.red,Color.black,Color.orange,

 

Color.green};

private int baseAng = 30;

public void doGet(HttpServletRequest request,HttpServletResponse

 

response)

throws ServletException,IOException

{

strFile = request.getRealPath("count.txt");

float[][] xy = new float[4][2];

xy = getNumAndPercent(strFile);

 

int[] ang = new int[4];

ang[0] = (int)(xy[0][1]*360);

ang[1] = (int)(xy[1][1]*360);

ang[2] = (int)(xy[2][1]*360);

ang[3] = 360-ang[0]-ang[1]-ang[2];

 

response.setHeader("Cache-Control","no-store");

response.setDateHeader("Expires",0);

response.setContentType("image/jpeg");

ServletOutputStream out=response.getOutputStream();

BufferedImage image=new BufferedImage(150,100,BufferedImage.

 

TYPE_INT_RGB);

Graphics2D g=(Graphics2D)image.getGraphics();

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

 

RenderingHints.VALUE_ANTIALIAS_ON);

g.setColor(Color.white);

g.fillRect(0,0,150,100);

AffineTransform at = null;

Arc2D arc = null;

int fromAng = baseAng;

 

at = AffineTransform.getRotateInstance((-20*java.lang.Math.PI)

 

/180,45,37);

g.setTransform(at);

 

int r =6;

int dx = (int)(r*java.lang.Math.cos((baseAng+ang[0])/2.0*java.

 

lang.Math.PI/180));

int dy = (int)(r*java.lang.Math.sin((baseAng+ang[0])/2.0*java.

 

lang.Math.PI/180));

arc = new Arc2D.Double(10+dx,24-dy,80,50,fromAng,ang[0],Arc2D.PIE);

g.setColor(color[0]);

g.fill(arc);

fromAng+=ang[0];

for (int i=1;i<4;i++)

{

g.setColor(color[i]);

arc = new Arc2D.Double(10,24,80,50,fromAng,ang[i],Arc2D.PIE);

g.fill(arc);

fromAng+=ang[i];

if (fromAng>360)

{

fromAng-=360;

}

}

 

at = AffineTransform.getRotateInstance(0,arc.getCenterX(),arc.

 

getCenterY());

g.setTransform(at);

 

for (int i=0;i<4;i++){

g.setColor(color[i]);

g.fillRect(100,15*i+20,10,10);

g.drawString((char)('A'+i)+"",120,15*i+20+8);

}

JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out);

encoder.encode(image);

out.close();

}

 

public void doPost(HttpServletRequest request,HttpServletResponse

 

response)

throws ServletException,IOException

{

doGet(request,response);

}

 

public synchronized float[][] getNumAndPercent(String sFileName)

{

float xx[][] = new float[4][2];

int totalNum = 0 ;

String strTemp = null;

int i = 0;

java.io.RandomAccessFile rf = null;

try

{

rf = new java.io.RandomAccessFile (sFileName,"r");

} catch(Exception e)

{

System.out.println(e);

System.exit(0);

}

for (i=0;i<4;i++)

{

int m=0;

try {

strTemp = rf.readLine();

} catch (Exception e){

strTemp = "0";

}

 

if (strTemp == null) strTemp = "0";

m = new Integer(strTemp).intValue();

xx[i][0]=m;

totalNum += m;

}

if (totalNum==0) totalNum=1;

for ( i=0;i<4;i++){

xx[i][1] = xx[i][0]/totalNum;

}

return xx;

}

}

 

五、在index.jsp目录下建立question.txtcount.txt文件分别用来保存投

 

票的问题和投票的数量,用户投票后,就修改count.txt的值。

 

为了对原作者表示感谢,这2个文件内容不变化,如下:

 

question.txt:

 

Yes,I think so!

 

No,I dont think so!

 

Sorry,I dont know the answer!

 

 

 

count.txt:

 

12

 

9

 

5

 

9

 

六、目录结构:

 

(1)jsp文件和txt文件同一个目录

 

(2).java文件是servlet目录下

 

七、测试:

 

http://[server:port]/dir/index.jsp

 

 

 

JAVA/JSP学习系列之十三(Applet调用JavaScript函数)()

下面的例子将说明在applet中去调用javascript函数 一、applet源代码(tmin_JS.java

 

// Importations

import java.awt.Graphics ;

import java.awt.Event ;

 

// LiveConnect... for JavaScript

import netscape.javascript.JSObject ;

 

public class tmin_JS extends java.applet.Applet {

// Variables

 

// Initialisation de l'applet

public void init() { // Methode init()

}

 

// Dessiner l'applet

public void paint(Graphics g) { // Methode paint()

g.drawString("Click here...", 5, 10) ;

}

 

// Mouse down

public boolean mouseDown(Event e, int x, int y) {

try { // create JSObject

JSObject.getWindow (this).eval ("javascript:ale

rt('tmin_JS click " +

" x=" + x + " y=" + y + "')") ;

}

catch (Exception ex) { // Error on create JSObject

showStatus( "Error call javascript err=" + ex );

}

return true ;

}

 

}

 

二、注意的地方

 

(1)在调用javascipt函数的时候,要加这行:

 

JSObject.getWindow (this).eval ("javascript:... ") ;

 

(2)要将JSObject引用进来:

 

import netscape.javascript.JSObject ;

 

(3)定义applet的时候要加“MAYSCRIPT”标记

 

 

 

 

JAVA/JSP学习系列之十四(JavaScript改变Applet状态)()

下面的例子将说明利用javascript去改变applet状态和在javascript中调用applet中的方法。

 

一、applet源代码(tmin_JS2.java

 

// Import

import java.awt.Graphics ;

import java.awt.Event ;

 

// LiveConnect... for JavaScript

// Not used... (it's more simple)

 

 

public class tmin_JS2 extends java.applet.Applet {

// Variables

String str ; // Sample string...

int i ; // nb change...

 

 

// Initialisation de l'applet

public void init() { // Methode init()

str = new String("test");

i = 0 ;

}

 

// Dessiner l'applet

public void paint(Graphics g) { // Methode paint()

g.drawString(str, 5, 10) ;

}

 

// setString : change string value

public void setString(String s) {

str = new String( s );

i++ ;

 

// force repaint to see change

repaint() ;

return ;

}

 

// getString : get string value

public String getString() {

return str ;

}

 

// getVal : get number of change

public int getVal() {

return i ;

}

 

}

 

二、注意的地方

 

(1)applet中,要命名:

 

阅读(2273) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~