标签或者其他特定的JSP文件了。接下来的那些表单和普通的HTML差不多了,的方法,然后加一个提交按钮,可能还有一个Reset按钮,对了,别忘了,还得给每一个input表单加一个名字。 这么写:
使用GET和POST方法
用GET和POST方法可以发数据到服务器,在JSP程序中GET和POST方法可以发数据到Bean、servlet、或者其他服务器端的组件。
理论上说,GET是从服务器上请求数据,POST是发送数据到服务器。事实上,GET方法是把数据参数队列(query string)加到一个URL上,值和表单是一一对应的。比如说,name=John。在队列里,值和表单用一个&符号分开,空格用+号替换,特殊的符号转换成十六进制的代码。因为这一队列在URL里边,这样队列的参数就能看得到,可以被记录下来,或更改。通常GET方法还限制字符的大小。事实上POST方法可以没有时间限制的传递数据到服务器,用户在浏览器端是看不到这一过程的,所以POST方法比较适合用于发送一个
保密的(比如信用卡号)或者比较大量的数据到服务器。
写Bean
如果JSP程序用到了Bean,你就得按照JavaBeans API的说明设计你的Bean。
记住下面两个关键部分。
如果JSP程序里用标签,那你就得在Bean里边配合的GET方法。
如果JSP程序进而用 标签,那你就得在Bean里边配合的Set方法。
设置参数到Bean或者从里边取参数将在以后的部分详细介绍。
传数据到Bean
把HTML表单的数据传到Bean里需要两个工作:
• 用标签创建或者定位到Bean
• 在Bean里面用设置属性值
第一步用标签创建或者定位到Bean一定要用在之前,首先按照你指定的名字查找Bean,如果没找到,会给你指定一个。允许在一个JSP文件中创建一个Bean,然后再另一个文件中调用,这就给了Bean一个很广泛的运行空间。
第二步在Bean里面用设置属性值。最简单的方法是把值定义成与表单名相配合。举个例子,如果你把表单名定义成“username”那么,你就在Bean里定义属性“username”然后用方法getUsername和setUsername。
当然也可以定义成不同的名字,只要你不认为麻烦。谁让你记忆力好呢!
Request对象
用户输入的数据用来存放在Request对象里,用rvletRequest来执行(你也可以用其他不同的工具来执行,但他们其实都是rvletRequest的子集)
你也可以直接用scriptlet来直接访问Request对象。Scriptlet将在下一讲里边详细的讨论,现在你只需要知道他是用脚本语言写的一段放?lt;% 和%> 之间的代码就足够了。在JSP 1.0中,你必须用JavaTM程序语言作为你的脚本语言。
你经常会用到如下方法处理Request对象:
方法
说明
执行结果
getRequest
ntext
返回当前Request对象
getParameterNames
tRequest
返回当前Request对象参数名
getParameterValues
tRequest
返回当前Request对象参数值
你将会发现其他方法包括ServletRequest,HttpServletRequest或者其他任何ServletRequest的子集。
JSP引擎经常在scenes之后使用Request对象,即使你没有明确地在JSP文件中调用。
从Bean中调数据到JSP页面
一旦用户的数据被传到Bean,你就想重新得到数据,然后在JSP面页中显示出来。想达到这一步,你就得用到标签。传Bean名和属性名:
Hello, !
, , 和 标签必须相配,举个例子:
:
:
Hello, !
在这个例子里,标签被放在两个文件中,但是指定的名字都是相同的,如果不同的话,那么系统会返回一个错误信息。
如何运行例子
我用的是UNIX主机,如果你用windows,那么改相应的路径即可。
创建路径../jswdk-1.0/examples/jsp/tutorial/hellouser.
把文件, , , 和文件放进去。
创建一个目录,../jswdk-1.0/examples/WEB-INF/jsp/beans/hello
把文件和放进去。
3. JSP入门教程(三)
作者:SUN/网猫
使用脚本
在有些地方,你大概要加一些好的,成熟的程序到你的JSP页里,JSP的标签虽然很强大,但是完成某些工作还是比较费力的困难的。这时你可以使用脚本语言段来补充JSP标签。
使用的JSP引擎是支持脚本语言的,SUN的JSP参考文说明,必须使用Java程序语言来编写脚本,但是其他第三方的JSP引擎允许使用其他语言来写脚本程。
如何增加脚本
首先,你必须了解一些增加脚本元素到JSP页中的一些基本规则
1、 在JSP页面里用Page指令定义脚本(默认值是Java,一般不需要定义)
2、 声明语法<%!„„%>声明变量和方法(函数)。
3、 表达式语法<%=„„%>定义脚本语言表达式
4、 脚本语法〈%„„%>可以操作声明、表达式和其他类型合法的代码段在页脚本语言。
5、 一定要在结尾加%>标签
声明、表达式、脚本使用起来有一些相似,但也有一些不同让我们用一些例子来讲述一下相同点和不同点吧。
声明<%!„„%>包含了一个或多个变量和方法,结尾以分号分隔。
例:<%! Int I=0 ; %>
<%! Int a, b ; double c ; %>
<%! Circle a = new circle(2.0) ; %>
在页面中使用变量和方法之前必须声明
声明的范围通常是JSP页,但如果页面中使用INCLUDE指令包含其他页面,范围应变得扩展到被包含的页面。
表达式<%=„„%>可以在页面中包含任何合法的语言表达式,不用分号。
例:<%= (2) %>
<%= item[I] %>
<%= a+b+c %>
<%= new () %>
表达式和脚本的一个关键的不同点就是不需要分号。如果你需要在脚本中使用表达式就必须加分号。
脚本<%„„%>允许你写的任何数量的脚本语言
例:<% String name=null ;
If (meter("name")==null{
%>
记住在脚本中必须使用分号结尾。
猜数字游戏
猜数字游戏非常的有趣,而且从这里你还可以学到很多表达式的用法。
代码
显示用的主屏幕()
<%@ page import = "GuessBean" %>
Number Guess
4. JDK安装
作者:东方一蛇/我的家
一、前言
JDK(Java Development Kit )是一切java应用程序的基础,可以说,所有的java应用程序是构建在这个之上的。它是一组API,也可以说是一些java Class。目前已经正式发布的最新版本是JDK1.3。考虑到我对linux不熟悉,而且大多数都是在MS系统下,所以,在这里我用的是win2000。
二、下载,安装
下载地址为JAVA官方站点:,国内也到处都是。
Windows下,直接运行.exe文件,安装到一个目录,我这里用F:jdk13作为例子。
三、配置
桌面上选择“我的电脑”(右键)
高级
环境变量
在“系统变量”--->“新建”
在变量名中输入:CLASSPATH,变量值中输入:
F:;F:;F:JDK13BIN;然后确定;
好了,配置完了,要重新启动计算机后,环境变量才能有效的。
四、测试
(1)用文本编辑器写一个简单的java程序:
public class HelloWorld {
public static void main(String args[]) {
n("Hello World!");
}
}
这个例子就是著名的“Hello World”,它的功能就是显示“Hello World”。
注意:该文件名称必须为“”,大小写也区分。细心的朋友会注意到就是和public class后的名字一样的。
(2)编译:在dos命令提示符下执行:(注意大小写)
javac
如果正常的话,将生成文件。
(3)运行:在dos命令提示符下执行:(注意大小写)
java HelloWorld
这里有一个java初学者很有可能遇到的问题(不怕笑话,我也是)就是输入:
java
多了后面的.class,一定要注意,否则会出现下面的错误:
Exception in thread "main" sDefFoundError:HelloWorld/class
(本人猜想,是不是java翻译“.”的时候换成了“/”,或者是其他的本人不知道的原因)
好了,运行java HelloWorld应该会出现伟大的“Hello World”了。
到这一步,你已经成功配置好了JDK,可以开始漫长而痛苦(对于象我一样的,以前不懂java的朋友来说,可以用“痛苦”来形容,不理解的概念,不熟悉的,不过,不要急,我将和大家一起慢慢入门,慢慢提高... ...)的Java过程了。
5. Tomcat安装
作者:东方一蛇/我的家
一、前言
对于初学者来说,要执行JSP和Servlet,Tomcat是一个很不错的选择,。Tomcat是
Apache组织的产品,sun公司对它的支持也相当不错。
二、下载,安装
下载地址为JAVA官方站点:,国内也比较多。
从这个地址可以下载:/builds/tomcat/release/,我下载的是Tomcat32b4版本。
下载完,解压到一个目录,我这里用F:tomcat32b4作为例子。
三、配置
桌面上选择“我的电脑”(右键)
高级
环境变量
在“系统变量”--->“新建”
在变量名中输入:JAVA_HOME,变量值中输入:F:JDK13然后确定;
在“系统变量”--->“新建”
在变量名中输入:TOMCAT_HOME,变量值中输入:F:tomcat32b4然后确定;
好了,配置完了,要重新启动计算机后,环境变量才能有效的。
注意,对于Tomcat其他设置,如果没有必要,是可以不改的,我这里讲的都是最简单而可行的方法,如果对你的改动没有把握,还是建议不要改动。
四、测试
(1)启动tomcat:
在F:tomcat32b4bin下有一个:,运行它,将出现一个Dos窗口。
(2)浏览
在浏览器中输入:localhost:8080/看看有什么效果(Tomcat默认端口为8080,在不冲突的前提下,你可以改动的),是不是可以看到一只可爱的小猫(其实,我个人认为,无论从颜色还是样子,更象一只老虎)
(3)运行
在这个页面有JSP Examples和 Servlet Examples, 好了,自己测试运行它们吧。
(4)退出tomcat
在F:tomcat32b4bin下有一个:,运行它,将关闭Dos窗口(如果坚持直接关闭这个DOS窗口也是可以的,但是,既然有这个,应该有它存在的理由)。
6. Resin+Apache的安装
作者:东方一蛇/我的家
一、前言
对于初学者来说,要执行JSP和Servlet,Tomcat是一个很不错的选择。你也可以用Resin,这两个产品都是可以不花一分钱的。 Resin对Xml的支持是很好的。
二、下载,安装
下载地址为Resin官方站点:/。
从这个地址可以下载:/download/,我下载的是Resin1.1.4版
本。
下载完,解压到一个目录,我这里用E:resin114作为例子。
三、配置
在这之前,当然我们要先安装了Apache,而且能正常运行了。
(1)配置Apache
打开apache的conf子目录下的文件,用文本编辑工具编辑它。加入如下几行:
LoadModule caucho_module "E:resin114srunwin32-1.3.6mod_"
AddModule mod_caucho.c
CauchoConfigFile "E:"
SetHandler caucho-status
注意:上面的步骤也可以通过更加简单的方式实现,就是直接运行E:resin114bin目录下的,勾上apache,然后Apply,最后OK。这样,上面这些行应该会自动加上的。
(2)配置Resin
在resin的conf子目录下有个文件,将该文件备份一个。然后建立文件,如下内容:
<>
>
四、测试
(1)启动Resin:
在resin的bin下有一个,运行它,将出现一个窗口。
(2)做一个简单的jsp文件(我们用resin站点的例子)
该文件放在:apache/htdocs/
内容如下:
<%@ page language=javascript %>
2 + 2 = <%= 2 + 2 %>
(3)运行
在浏览器中输入:localhost/,应该出现下面结果:
2+2=4
好了,到这里你已经安装成功了,你可以在htdocs下建立一些自己的子目录, 管理文件。
注意:在四(1)中,启动resin 可以将srun加在Win2000的服务中,让每次这个resin服务自动启动,不必每次都运行。
7. Orion App Server的安装
作者:东方一蛇/我的家
一、前言
Orion这个东西,小巧,但是功能却非常多,废话不讲,看它目前的支持就知道了:
(1)Servlets/JSP
(2)EJB
(3)HTTP (注:说明不再需要Apache或者IIS等Web Server)
二、下载,安装
下载地址为Orion Application Server官方站点:/,我下载的是Orion1.4版本。
下载完,解压到一个目录,我这里用E:Orion作为例子。
三、配置
(1)根据Orion官方站点的安装说明,如果要支持JSP等技术的话,要将JDK的复制到e:orion目录下,文件在你安装的JDK目录的lib子目录下。
到现在,其实已经成功了缺省的配置了,如果你的80端口没有被占用,而且你也想用80作为端口的话,你到这里已经完成了,否则,请继续下面的配置。
(2)配置端口
在E:orionconfig目录下有个文件,找到文件中下面行:
将这行改为:
注意,我这里使用的是8008端口。
四、测试
(1)启动Orion:
在Orion目录下,command方式运行:
java -jar
将出现 initialized,我这里版本是1.4所以显示:
Orion/1.4.0 initialized
到此,说明你已经成功了。
(2)执行jsp文件
在浏览器中输入:
localhost:8008/
出现:Orion Application Server 1.4.0 - Up and running,下面有JSP examples你可以试着运行。
8. JDBC-ODBC翻页例子
作者:东方一蛇/我的家
一、运行前准备
建议了一个MS SQLServer7数据库 DNS,名称为:Test_DB
数据库中有一个表:guestbook字段为:name(varchar),email(varchar),body(text)
数据库用户为sa 密码空,可以自己修改的。
二、代码
<%@ page contentType="text/html;charset=gb2312"%>
<%
//变量声明
tion sqlCon; //数据库连接对象
ent sqlStmt; //SQL语句对象
Set sqlRst; //结果集对象
strCon; //数据库连接字符串
strSQL; //SQL语句
int intPageSize; //一页显示的记录数
int intRowCount; //记录总数
int intPageCount; //总页数
int intPage; //待显示页码
strPage;
int i,j,k; //设置一页显示的记录数
intPageSize = 5; //取得待显示页码
strPage = ameter("page");
if(strPage==null){
//表明在QueryString中没有page这一个参数,此时显示第一页数据
intPage = 1;
} else{
//将字符串转换成整型
intPage = nt(strPage);
if(intPage<1) intPage = 1; }
//装载JDBC-ODBC驱动程序
e("bcDriver");
//设置数据库连接字符串
strCon = "jdbc:odbc:Test_DB";
//连接数据库
sqlCon = nection(strCon,"sa","");
//创建SQL语句对象
sqlStmt = Statement();
//获取记录总数
strSQL = "select count(*) from guestbook";
sqlRst = eQuery(strSQL);
//执行SQL语句并取得结果集
(); //记录集刚打开的时候,指针位于第一条记录之前
intRowCount = (1);
(); //关闭结果集
//记算总页数
intPageCount = (intRowCount+intPageSize-1) / intPageSize;
//调整待显示的页码 if(intPage>intPageCount) intPage = intPageCount;
//设置获取数据SQL语句
strSQL = "select name,email,body from guestbook";
//执行SQL语句并取得结果集
sqlRst = eQuery(strSQL);
//将记录指针定位到待显示页的第一条记录上
i = (intPage-1) * intPageSize;
for(j=0;j
JSP数据库操作例程 - 数据分页显示 - JDBC-ODBC
jdbc-odbc留言版
<%
//显示数据
i = 0;
while(i
姓名:<%=ing(1)%> | 邮件:<%=ing(2)%> |
<%=ing(3)%> |
<% i++; } %>
第<%=intPage%>页 共<%=intPageCount%>页 <%if(intPage 下一页<% } %> <%if(intPage>1){%> 上一页<% } %> |
<%
//关闭结果集
();
//关闭SQL语句对象
();
//关闭数据库
();
%>
三、怎么去运行?
将代码存为文件
Orion Application Server下:
Copy到orion的default-web-app目录下,通过:
localhost:port/
访问测试
对于Resin,Tomcat,JWS等等,都可以运行通过。
9. MySQL翻页例子
作者:东方一蛇/我的家
一、运行前准备
下载了mysql的jdbc驱动(一个jar文件)并加载在CLASSPATH(方法见《JAVA/JSP学习系列之四(JDK安装) 》)
(如果找不到,请从本站下载)
建一个MySQL数据库test
数据库中有一个表:note,字段为:name(varchar)
二、下载,安装
<%@ page contentType="text/html;charset=gb2312" %>
<% tion sqlCon; //数据库连接对象
ent sqlStmt; //SQL语句对象
Set sqlRst; //结果集对象
strCon; //数据库连接字符串
strSQL; //SQL语句
int intPageSize; //一页显示的记录数
int intRowCount; //记录总数
int intPageCount; //总页数
int intPage; //待显示页码
strPage;
int i;
//设置一页显示的记录数
intPageSize = 2;
//取得待显示页码
strPage = ameter("page");
if(strPage==null){
//表明在QueryString中没有page这一个参数,此时显示第一页数据
intPage = 1;
} else{
//将字符串转换成整型
intPage = nt(strPage);
if(intPage<1) intPage = 1;
}
//装载JDBC驱动程序
e("").newInstance();
//连接数据库
sqlCon= nection("jdbc:mysql://localhost/test");
//创建语句对象
sqlStmt = Statement(_SCROLL_INSENSITIVE,.
_READ_ONLY); //执行SQL语句
strSQL = "select name from note";
//执行SQL语句并获取结果集
sqlRst = eQuery(strSQL);
//获取记录总数
();
intRowCount = ();
//记算总页数
intPageCount = (intRowCount+intPageSize-1) / intPageSize;
//调整待显示的页码
if(intPage>intPageCount) intPage = intPageCount;
%>
JSP数据库操作例程 - 数据分页显示 - JDBC 2.0 - mysql
姓名 |
<% if(intPageCount>0)
{
//将记录指针定位到待显示页的第一条记录上
te((intPage-1) * intPageSize + 1);
//显示数据
i = 0;
while(i
<%=ing(1)%> |
<% ();
i++;
}
}
%>
第<%=intPage%>页 共<%=intPageCount%>页
<%if(intPage下一页<%}%>
<%if(intPage>1){%>上一页<%}%>
<%
//关闭结果集
();
//关闭SQL语句对象
();
//关闭数据库
();
%>
三、怎么去运行?
见前文《JAVA/JSP学习系列之八(JDBC-ODBC翻页例子)》。
10. Orion下自定义Tag
作者:东方一蛇/我的家
一、前言 (本文译自Orion官方站点)
本文将一步一步介绍在Orion Application Server下定义自己的标签,然后,实现该标签的功能,最后用一个jsp例子测试。
二、建立标签,实现该标签的功能。
1.命名package为:(为了和原文相同,我不做改动)
package ;
相关class
import .*;
import .*;
3.实现接口:
public class HelloWorld implements Tag
{
4.定义局部变量
private PageContext pageContext;
private Tag parent;
5.调用标签开始的实现方法
public int doStartTag() throws eption
{
return SKIP_BODY;
}
注意:这个方法返回 SKIP_BODY,就是标签的body为空的时候,将返回这个值,否则将返回:EVAL_BODY_INCLUDE
6.调用标签结束的实现方法
public int doEndTag() throws eption
{
try
{
().write("Hello World!");
}
catch(ption e)
{
throw new JspException("IO Error: " + sage());
}
return EVAL_PAGE;
}
这样将在jsp文件的自定义标签结束地方输出“Hello World!”
7.还不够,我们还要写下面的方法:
public void release() {}
对于本简单的例子,上面的方法不需要任何实现。
的容器要调用下面的方法:
public void setPageContext(final ntext pageContext) {
ntext=pageContext;
}
JSP容器通过上面的方法调用标签,而且上面的方法用来设置标签的PageContext.
的容器还要调用下面的方法:
public void setParent(final parent)
{
=parent;
}
JSP容器通过上面的方法设置标签的parent-Tag,因为每个标签的PageContext都要保留它的parent标签。
10.最后,实现方法:
public getParent()
{
return parent;
}
}
11. 编译标签。
三、描叙标签
现在将要写一个描叙文件,描叙该标签。
1.建立一个文件,
是一个XML格式的文本文件,XML的头如下:
"/j2ee/dtds/web-jsptaglibrary_1_">
3.描叙标签库
1.0
1.1
mt
/tutorials/tagtut/lesson1/
My first Tag library
4.描叙标签
helloWorld
orld
empty
A Hello world Tag
5.结束
四、打包
名称为:
其目录结构为:
com/acme/mytags/
META-INF/
五、在jsp文件中使用自定义标签
建立如下:
<%@ taglib uri="" prefix="mt" %>
Hello World!
六、测试运行
在orion目录下,建立如下结构,其中,tag是自己建立的,前面的目录是本来就有的。
E:oriondefault-web-apptag
将jar文件和jsp文件全部放到这个目录下。
然后,访问:
localhost:[port]/tag/
将出现:
--------------------------------------------------------------------------------
Hello World!
--------------------------------------------------------------------------------
七、恭喜,你已经成功了!
附:和 文件本站下载地址:
/softdownload/java/orion_
11. 改写MySQL翻页例子
作者:东方一蛇/我的家
一、前言
其实,改写后的JDBC Data-Source是运行在Servlet中的,通过JNDI去查找数据源。我用Orion试的,将本站《JAVA/JSP学习系列之九(MySQL翻页例子) 》 简单改写了一下。
二、配置
(1)JDBC
需要将用到的JDBC驱动Copy到[ORION]/lib目录下
(2)data-source
在[ORION]/config/文件中加入如下:
〈data-source
class="ManagerDataSource"
name="mySqlDbpage"
location="jdbc/HypersonicCoreDS"
xa-location="jdbc/xa/HypersonicXADS"
ejb-location="jdbc/mysqlDbPage"
connection-driver=""
username="root"
password=""
url="jdbc:mysql://localhost/test"
inactivity-timeout="30"
/〉
需要注意的是:
(1)ejb-location这个后面的“jdbc/mysqlDbPage”是JNDI要来查找的。
(2)connection-driver为JDBC数据库驱动
(3)url是JDBC中的URL
(4)username为数据库用户名
(5)password为用户密码
(6)inactivity-timeout为数据库连接超时,默认为30秒
对于其他的地方不要改。
三、改写后的代码如下:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import=".*, urce, lContext" %>
<%
//建立一个JNDI查找对象
InitialContext JNDI_Context = new InitialContext();
//JNDI查找数据源
DataSource ds = (DataSource) JNDI_("jdbc/mysqlDbPage");
//得到一个数据源连接
Connection conn = nection();
int intPageSize; //一页显示的记录数
int intRowCount; //记录总数
int intPageCount; //总页数
int intPage; //待显示页码
strPage;
int i;
//设置一页显示的记录数
intPageSize = 2;
//取得待显示页码
strPage = ameter("page");
if(strPage==null){
//表明在QueryString中没有page这一个参数,此时显示第一页数据
intPage = 1;
} else{
//将字符串转换成整型
intPage = nt(strPage);
if(intPage<1) intPage = 1;
}
// 得到结果
stmt = Statement();
ResultSet sqlRst = eQuery("select f1 from test");
//获取记录总数
();
intRowCount = ();
//记算总页数
intPageCount = (intRowCount+intPageSize-1) / intPageSize;
//调整待显示的页码
if(intPage>intPageCount)
intPage = intPageCount;
%>
JSP数据库操作例程 - 数据分页显示 - JDBC 2.0 - mysql
姓名 |
<% if(intPageCount>0)
{
//将记录指针定位到待显示页的第一条记录上
te((intPage-1) * intPageSize + 1);
//显示数据
i = 0;
while(i
<%=ing(1)%> |
<% ();
i++;
}
}
%>
第<%=intPage%>页 共<%=intPageCount%>页
<%if(intPage下一页<%}%>
<%if(intPage>1){%>上一页<%}%>
<%
//关闭结果集
();
%>
三、怎么去运行?
见前文《JAVA/JSP学习系列之八(JDBC-ODBC翻页例子)》。
注意:MySQL数据库为test,中间有个表test,有个字段f1(varchar)
12. 理解构造器
作者:东方一蛇/我的家
理解构造器
构造器和方法的区别
摘要
要学习Java,你必须理解构造器。因为构造器可以提供许多特殊的方法,这个对于初学者经常混淆。但是,构造器和方法又有很多重要的区别。
原作者:Robert Nielsen 原站:
我们说构造器是一种方法,就象讲澳大利亚的鸭嘴兽是一种哺育动物。(按:老外喜欢打比喻,我也就照着翻译)。要理解鸭嘴兽,那么先必须理解它和其他哺育动物的区别。同样地,要理解构造器,那么就要了解构造器和方法的区别。所有学习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() {
n("born alive.");
}
}
class Platypus extends Mammal {
void getBirthInfo() {
n("hatch from eggs");
("a mammal normally is ");
thInfo();
}
}
在上面的例子中,使用thInfo()去调用超类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 {
n("Hi");
}
Example() {}
}
public class SubClass extends Example {
}
类 SubClass 自动继承了父类中的sayHi方法,但是,父类中的构造器 Example()却不能被继承。
13. JavaMail API发邮件[servlet]
作者:东方一蛇/我的家
一:条件
必须下载sun公司的JavaMail API包,地址为:/products/javamail/
我这里用的是1.2版本,将相关包(jar文件)加到CLASSPATH中
二:该程序非常简单,不需要我们考虑很多地层的东西,因为API都帮我们做好了这些事情,下面是一个简单的发邮件的Servlet:(对于熟悉的人来说,恐怕是再简单不过了的一个servlet)
import .*;
import t.*;
import .*;
import .*;
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
{
tentType("text/html; charset=gb2312");
PrintWriter out = ter();
n("
"); ();
}
public void doPost(HttpServletRequest req, HttpServletResponse
ServletException,IOException
{
tentType("text/html; charset=gb2312");
PrintWriter out = new PrintWriter(putStream());
String from = ameter(MAIL_FROM);
String to = ameter(MAIL_TO);
String subject = ameter(MAIL_SUBJECT);
String body = ameter(MAIL_BODY);
String mailhost = ameter(MAIL_HOST);
try
{
SmtpClient mailer = new SmtpClient(mailhost);
(from);
(to);
PrintStream ps = essage();
n("From: " + from);
n("To: " + to);
n("Subject: " + subject);
n(body);
erver();
n("Success!");
}
catch (Exception ex)
{
n("An error about:" + sage());
}
();
}
public void init(ServletConfig cfg) throws ServletException
{
(cfg);
}
public void destroy()
{
y();
}
}
resp) throws
14. 简单的“抓网页”代码
作者:东方一蛇/我的家
一、前言
从一个网站上,看到一个“抓网页”的代码,觉得有点意思,但是没有提供源代码,于是,自己想写一个,其实代码比较简单的。
二、代码
<%@ page contentType="text/html;charset=gb2312"%>
<%
String sCurrentLine;
String sTotalString;
sCurrentLine="";
sTotalString="";
tream l_urlStream;
l_url = new ("/");
LConnection l_connection = (LConnection)
l_nnection();
l_t();
l_urlStream = l_utStream();
edReader l_reader = new edReader(new
treamReader(l_urlStream));
while ((sCurrentLine = l_ne()) != null)
{
sTotalString+=sCurrentLine;
}
n(sTotalString);
%>
三、后记
虽然代码比较简单,但是,我认为根据这个,可以实现“网络爬虫”的功能,比如从页面找href连接,然后再得到那个连接,然后再“抓”,不停止地(当然可以限定层数),这样,可以实现“网页搜索”功能。
15. JSP生成jpeg图片用于投票
作者:东方一蛇/我的家
一、前言
本文原作者为Tony Wang ,该文章涉及到文件的读写和jpg图片的自动生成。利用jsp+servlet的技术,jsp调用servlet生成图片。
二、首文件如下:
<%--
Author: Tony Wang
E-mail: lucky_tony@
Date: 2001-01-01
如果对程序有什么疑问,可以和我联系, 另外程序如果有什么bug,麻烦指出!!
--%>
<%@ page contentType="text/html;charSet=gb2312"%>
<%
der("Cache-Control","no-store");
eHeader("Expires",0);
%>
<%!
public String[] getQuestion(String s)
{
String[] strQ = new String[4];
String strTemp = null;
int i;
AccessFile rf = null;
try {
rf = new AccessFile(s,"r");
} catch(Exception e)
{
n(e);
(0);
}
for(i=0;i<4;i++)
{
try {
strTemp = ne();
} 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 = lPath("");
question = getQuestion(s);
%>
冰帆调查 |
三、写文件
<%--
Author: Tony Wang
E-mail: lucky_tony@
Date: 2001-01-01
如果对程序有什么疑问,可以和我联系,
另外程序如果有什么bug,麻烦指出!!
--%>
<%!
public int[] getNumber(String s)
{
int[] mCount = new int[4];
String strTemp = null;
int i;
AccessFile rf = null;
try {
rf = new AccessFile(s,"r");
} catch(Exception e)
{
n(e);
(0);
}
for(i=0;i<4;i++)
{
try {
strTemp = ne();
} 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 {
riter pw = new riter(new .
FileOutputStream(s));
for (int i=0;i<4;i++){
n(x[i]+"");
}
();
} catch(Exception e) {
n("Write file error:"+sage());
}
}
%>
<%
String tmp = null;
int choice = -1;
int[] count = new int[4];
tmp = ameter("choice");
if (tmp==null){
} else {
choice = new Integer(tmp).intValue();
}
/////////////
String s = lPath("");
if(choice>=0){
count = getNumber(s);
count[choice]++;
setNumber(s,count);
}
direct("");
%>
四、servlet原代码: :
/*
Author: Tony Wang
E-mail: lucky_tony@
Date: 2001-01-01
如果对程序有什么疑问,可以和我联系,
另外程序如果有什么bug,麻烦指出!!
*/
import .*;
import .*;
import .*;
import t.*;
import .*;
import .*;
import .*;
import .*;
public class VoteImage extends HttpServlet
{
private String strFile = null;
private Color color[]={,,,
};
private int baseAng = 30;
public void doGet(HttpServletRequest request,HttpServletResponse
response)
throws ServletException,IOException
{
strFile = lPath("");
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];
der("Cache-Control","no-store");
eHeader("Expires",0);
tentType("image/jpeg");
ServletOutputStream out=putStream();
BufferedImage image=new BufferedImage(150,100,BufferedImage.
TYPE_INT_RGB);
Graphics2D g=(Graphics2D)phics();
deringHint(_ANTIALIASING,
_ANTIALIAS_ON);
or();
ct(0,0,150,100);
AffineTransform at = null;
Arc2D arc = null;
int fromAng = baseAng;
at = ateInstance((-20*)
/180,45,37);
nsform(at);
int r =6;
int dx = (int)(r*((baseAng+ang[0])/2.0*java.
/180));
int dy = (int)(r*((baseAng+ang[0])/2.0*java.
/180));
arc = new (10+dx,24-dy,80,50,fromAng,ang[0],);
or(color[0]);
(arc);
fromAng+=ang[0];
for (int i=1;i<4;i++)
{
or(color[i]);
arc = new (10,24,80,50,fromAng,ang[i],);
(arc);
fromAng+=ang[i];
if (fromAng>360)
{
fromAng-=360;
}
}
at = ateInstance(0,terX(),arc.
getCenterY());
nsform(at);
for (int i=0;i<4;i++){
or(color[i]);
ct(100,15*i+20,10,10);
ring((char)('A'+i)+"",120,15*i+20+8);
}
JPEGImageEncoder encoder=JPEGEncoder(out);
(image);
();
}
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;
AccessFile rf = null;
try
{
rf = new AccessFile (sFileName,"r");
} catch(Exception e)
{
n(e);
(0);
}
for (i=0;i<4;i++)
{
int m=0;
try {
strTemp = ne();
} 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;
}
}
五、在目录下建立和文件分别用来保存投
票的问题和投票的数量,用户投票后,就修改的值。
为了对原作者表示感谢,这2个文件内容不变化,如下:
:
Yes,I think so!
No,I dont think so!
Sorry,I dont know the answer!
:
12
9
5
9
六、目录结构:
(1)jsp文件和txt文件同一个目录
(2).java文件是servlet目录下
七、测试:
[server:port]/dir/
16. Applet调用JavaScript函数
作者:东方一蛇/我的家
下面的例子将说明在applet中去调用javascript函数 。
一、applet源代码(tmin_)
// Importations
import cs ;
import ;
// for JavaScript
import ct ;
public class tmin_JS extends {
// Variables
// Initialisation de l'applet
public void init() { // Methode init()
}
// Dessiner l'applet
public void paint(Graphics g) { // Methode paint()
ring("", 5, 10) ;
}
// Mouse down
public boolean mouseDown(Event e, int x, int y) {
try { // create JSObject
dow (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函数的时候,要加这行:
dow (this).eval ("javascript:... ") ;
(2)要将JSObject引用进来:
import ct ;
(3)定义applet的时候要加“MAYSCRIPT”标记
17. JavaScript改变Applet状态
作者:东方一蛇/我的家
下面的例子将说明利用javascript去改变applet状态和在javascript中调用applet中的方法。
一、applet源代码(tmin_)
// Import
import cs ;
import ;
// for JavaScript
// (it's more simple)
public class tmin_JS2 extends {
// Variables
String str ; //
int i ; //
// 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()
ring(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中,要命名:
18. JSP源代码实例一
转:jsp源码实例(搜索引擎)
Marty Hall [2001-01-06]
作者:Marty Hall
package coreservlets;
import .*;
import t.*;
import .*;
import .*;
public class SearchEngines extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String searchString = ameter("searchString");
if ((searchString == null) ||
(() == 0)) {
reportProblem(response, "Missing search string.");
return;
}
// The URLEncoder changes spaces to "+" signs and other
// non-alphanumeric characters to "%XY", where XY is the
// hex value of the ASCII (or ISO Latin-1) character.
// Browsers always URL-encode form values, so the
// getParameter method decodes automatically. But since
// we're just passing this on to another server, we need to
// re-encode it.
searchString = (searchString);
String numResults = ameter("numResults");
if ((numResults == null) ||
(("0")) ||
(() == 0)) {
numResults = "10";
}
String searchEngine =
ameter("searchEngine");
if (searchEngine == null) {
reportProblem(response, "Missing search engine name.");
return;
}
SearchSpec[] commonSpecs = monSpecs();
for(int i=0; i<; i++) {
SearchSpec searchSpec = commonSpecs[i];
if (e().equals(searchEngine)) {
String url =
L(searchString, numResults);
direct(url);
return;
}
}
reportProblem(response, "Unrecognized search engine.");
}
private void reportProblem(HttpServletResponse response,
String message)
throws IOException {
ror(_NOT_FOUND,
"
" + message + "
"); }
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
19. JSP源代码实例二
转:jsp源码实例(获取jsp各种参数)
Marty Hall [2001-01-06]
作者:Marty Hall
package coreservlets;
import .*;
import t.*;
import .*;
import .*;
/** Creates a table showing the current value of each
* of the standard CGI variables.
*
* Taken from Core Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
* /.
* © 2000 Marty Hall; may be freely used or adapted.
*/
public class ShowCGIVariables extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
tentType("text/html");
PrintWriter out = ter();
String[][] variables =
{ { "AUTH_TYPE", hType() },
{ "CONTENT_LENGTH",
f(tentLength()) },
{ "CONTENT_TYPE", tentType() },
{ "DOCUMENT_ROOT",
getServletContext().getRealPath("/") },
{ "PATH_INFO", hInfo() },
{ "PATH_TRANSLATED", hTranslated() },
{ "QUERY_STRING", ryString() },
{ "REMOTE_ADDR", oteAddr() },
{ "REMOTE_HOST", oteHost() },
{ "REMOTE_USER", oteUser() },
{ "REQUEST_METHOD", hod() },
{ "SCRIPT_NAME", vletPath() },
{ "SERVER_NAME", verName() },
{ "SERVER_PORT",
f(verPort()) },
{ "SERVER_PROTOCOL", tocol() },
{ "SERVER_SOFTWARE",
getServletContext().getServerInfo() }
};
String title = "Servlet Example: Showing CGI Variables";
n(thTitle(title) +
"
n" + "
" + title + "
n" + "
n" + "
n" + "
CGI Variable Name | Value"); for(int i=0; i<; i++) { String varName = variables[i][0]; String varValue = variables[i][1]; if (varValue == null) varValue = "Not specified"; n(" |
" + varName + " | " + varValue); } n(" |
"); }
/** POST and GET requests handled identically. */
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
20. JSP源代码实例三
转:jsp源码实例(获取表单参数)
Marty Hall [2001-01-06]
作者:Marty Hall
package coreservlets;
import .*;
import t.*;
import .*;
import .*;
/** Shows all the parameters sent to the servlet via either
* GET or POST. Specially marks parameters that have
* no values or multiple values.
*
* Taken from Core Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
* /.
* © 2000 Marty Hall; may be freely used or adapted.
*/
public class ShowParameters extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
tentType("text/html");
PrintWriter out = ter();
String title = "Reading All Request Parameters";
n(thTitle(title) +
"
n" + "
" + title + "
n" + "
n" + "
n" + "
Parameter Name | Parameter Value(s)"); Enumeration paramNames = ameterNames(); while(eElements()) { String paramName = (String)ement(); (" |
" + paramName + "n | "); String[] paramValues = ameterValues(paramName); if ( == 1) { String paramValue = paramValues[0]; if (() == 0) n("No Value"); else n(paramValue); } else { n(" "); for(int i=0; i<; i++) { n(" - " + paramValues[i]);
} n(" "); } } n(" |
n"); }
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
发表评论