??xml version="1.0" encoding="utf-8" standalone="yes"?>
int number=0;
synchronized void countPeople(){
if(number==0){
try{
FileInputStream in=new FileInputStream("/counter.txt");
DataInputStream dataIn=new DataInputStream(in);
number=dataIn.readInt();
number++;
in.close();
dataIn.close();
}catch(FileNotFoundException e){
number++;
try{
FileOutputStream out=new FileOutputStream("/counter.txt");
DataOutputStream dataOut=new DataOutputStream(out);
dataOut.writeInt(number);
out.close();
dataOut.close();
}catch(IOException ffe){
System.out.print(ffe);
}
}catch(IOException ee){
System.out.println(ee);
}
}else{
number++;
try{
FileOutputStream out=new FileOutputStream("/counter.txt");
DataOutputStream dataOut=new DataOutputStream(out);
dataOut.writeInt(number);
out.close();
dataOut.close();
}catch(FileNotFoundException e){
System.out.println(e);
}
catch(IOException e){
System.out.println(e);
}
}
}
%>
<% countPeople();%>
|
使用interface的方式定义Demo抽象cȝ方式如下Q?
|
在abstract class方式中,Demo可以有自q数据成员Q也可以有非abstarct的成员方法,而在interface方式的实CQDemo只能够有静态的不能被修改的数据成员Q也是必须是static final的,不过在interface中一般不定义数据成员Q,所有的成员Ҏ都是abstract的。从某种意义上说Qinterface是一U特DŞ式的abstract class?
从编E的角度来看Qabstract class和interface都可以用来实?design by contract"的思想。但是在具体的用上面还是有一些区别的?
首先Qabstract class在Java语言中表C的是一U承关p,一个类只能使用一ơ承关pR但是,一个类却可以实现多个interface。也许,q是Java语言的设计者在考虑Java对于多重l承的支持方面的一U折中考虑吧?
其次Q在abstract class的定义中Q我们可以赋予方法的默认行ؓ。但是在interface的定义中Q方法却不能拥有默认行ؓQؓ了绕q这个限Ӟ必须使用委托Q但是这?增加一些复杂性,有时会造成很大的麻烦?
在抽象类中不能定义默认行存在另一个比较严重的问题Q那是可能会造成l护上的ȝ。因为如果后来想修改cȝ界面Q一般通过abstract class或者interface来表C)以适应新的情况Q比如,d新的Ҏ或者给已用的方法中d新的参数Q时Q就会非常的ȝQ可能要p很多的时_对于zcd多的情况Q尤为如此)。但是如果界面是通过abstract class来实现的Q那么可能就只需要修改定义在abstract class中的默认行ؓ可以了?
同样Q如果不能在抽象cM定义默认行ؓQ就会导致同LҎ实现出现在该抽象cȝ每一个派生类中,q反?one ruleQone place"原则Q造成代码重复Q同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心?BR>三、从设计理念层面看abstract class和interface
上面主要从语法定义和~程的角度论qCabstract class和interface的区别,q些层面的区别是比较低层ơ的、非本质的。本文将从另一个层面:abstract class和interface所反映出的设计理念Q来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概늚本质所在?
前面已经提到q,abstarct class在Java语言中体C一U承关p,要想使得l承关系合理Q父cdzcM间必d?is a"关系Q即父类和派生类在概忉|质上应该是相同的。对于interface 来说则不Ӟq不要求interface的实现者和interface定义在概忉|质上是一致的Q仅仅是实现了interface定义的契U而已。ؓ了便于理解Q下面将通过一个简单的实例q行说明?
考虑q样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Doorh执行两个动作open和closeQ此时我们可以通过abstract class或者interface来定义一个表C抽象概念的类型,定义方式分别如下所C:
|
其他具体的Doorcd可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看h好像使用abstract class和interface没有大的区别?BR>如果现在要求Doorq要h报警的功能。我们该如何设计针对该例子的cȝ构呢Q在本例中,主要是ؓ了展Cabstract class和interface反映在设计理念上的区别,其他斚w无关的问题都做了化或者忽略)下面罗列出可能的解x案,q从设计理念层面对这些不同的Ҏq行分析?BR>解决Ҏ一Q?BR>单的在Door的定义中增加一个alarmҎQ如下:
|
那么h报警功能的AlarmDoor的定义方式如下:
|
|
q种实现方式基本上能够明的反映出我们对于问题领域的理解Q正的揭示我们的设计意图。其实abstract class表示的是"is a"关系Qinterface表示的是"like a"关系Q大家在选择时可以作Z个依据,当然q是建立在对问题领域的理解上的,比如Q如果我们认为AlarmDoor在概忉|质上是报警器Q同时又hDoor的功能,那么上述的定义方式就要反q来了?
abstract class和interface是Java语言中的两种定义抽象cȝ方式Q它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概忉|质的理解、对于设计意囄反映是否正确、合理,因ؓ它们表现了概念间的不同的关系Q虽焉能够实现需求的功能Q。这其实也是语言的一U的惯用法,希望读者朋友能够细l体?/FONT>
DELETE FROM History WHERE (Id > 0)
truncate table youtable;
Z么要用TRUNCATE TABLE 语句代替DELETE语句Q当你用TRUNCATE TABLE语句Ӟ记录的删除是不作记录的。也是_q意味着TRUNCATE TABLE 要比DELETE快得多?
action add aggregate all
alter after and as
asc avg avg_row_length auto_increment
between bigint bit binary
blob bool both by
cascade case char character
change check checksum column
columns comment constraint create
cross current_date current_time current_timestamp
data database databases date
datetime day day_hour day_minute
day_second dayofmonth dayofweek dayofyear
dec decimal default delayed
delay_key_write delete desc describe
distinct distinctrow double drop
end else escape escaped
enclosed enum explain exists
fields file first float
float4 float8 flush foreign
from for full function
global grant grants group
having heap high_priority hour
hour_minute hour_second hosts identified
ignore in index infile
inner insert insert_id int
integer interval int1 int2
int3 int4 int8 into
if is isam join
key keys kill last_insert_id
leading left length like
lines limit load local
lock logs long longblob
longtext low_priority max max_rows
match mediumblob mediumtext mediumint
middleint min_rows minute minute_second
modify month monthname myisam
natural numeric no not
null on optimize option
optionally or order outer
outfile pack_keys partial password
precision primary procedure process
processlist privileges read real
references reload regexp rename
replace restrict returns revoke
rlike row rows second
select set show shutdown
smallint soname sql_big_tables sql_big_selects
sql_low_priority_updates sql_log_off sql_log_update sql_select_limit
sql_small_result sql_big_result sql_warnings straight_join
starting status string table
tables temporary terminated text
then time timestamp tinyblob
tinytext tinyint trailing to
type use using unique
unlock unsigned update usage
values varchar variables varying
varbinary with write when
where year year_month zerofill
采用了calendarc,q把最后分的结果传到数据库Q?/P>
year week content
2005 1 1月3日~Q月Q日
... ... ....................
源码如下(其中DBcL我用来实现数据库q接用的)
import java.util.*;
import java.util.Date;
import java.sql.*;
import rkind.db;
public class shijian {
public static void main(String args[]){
int day,mon,year,week,dayofweek;
db base=new db();
String content="";
Calendar nova = Calendar.getInstance();
Date d1=new Date();
nova.setTime(d1);
nova.set(2005,Calendar.JANUARY,1);
//nova.add(Calendar.DATE,6);
//day=nova.get(Calendar.WEEK_OF_YEAR );
dayofweek=nova.get(Calendar.DAY_OF_WEEK );
while(dayofweek!=2){
nova.add(Calendar.DATE,1);
dayofweek=nova.get(Calendar.DAY_OF_WEEK );
}
year=nova.get(Calendar.YEAR);
//String sql=new String("insert into shijian(year,week,content) values('"+year+"','"+week+"','"+content+"')");
//System.out.println("day+++:"+day);
while(year==2005){
week=nova.get(Calendar.WEEK_OF_YEAR );
mon=nova.get(Calendar.MONTH)+1;
day=nova.get(Calendar.DATE);
content=mon+"?+day+"?+"~~ ";
System.out.print("W?+week+"?+": "+mon+"?+day+"?);
nova.add(Calendar.DATE,6);
week=nova.get(Calendar.WEEK_OF_YEAR );
mon=nova.get(Calendar.MONTH)+1;
day=nova.get(Calendar.DATE);
content+=mon+"?+day+"?;
try{
String sql=new String("insert into shijian(year,week,content) values('"+year+"','"+week+"','"+content+"')");
base.executeUpdate(sql);
}catch(Exception e){System.out.println(e);}
System.out.println("~~~~"+mon+"?+day+"?);
nova.add(Calendar.DATE,1);
week=nova.get(Calendar.WEEK_OF_YEAR );
mon=nova.get(Calendar.MONTH)+1;
day=nova.get(Calendar.DATE);
year=nova.get(Calendar.YEAR);
}
}
}
虽然功能上实CQ但是还有大量的重复代码Q和费语句,q就是没有好好重视J2se的结果,没办法,
边学J2EE边看Se吧,Q)
在Javax.naming 中提供了Context接口Q?/P>
数据源的配置涉及到Server.xml和web.xmlQ需要在server.xml中加入如下内容:说明一下:我的数据库是MYsql
<Context path="/text" docBase="d:/upload" debug="0">
<Resource name="jdbc/testDb" auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/testDB">\\数据源的名称
<parameter><name>username</name><value>root</value></parameter>数据库的名称
<parameter><name>password</name><value>password</value></parameter>数据库密?BR> <parameter><name>driverClassName</name>
<value>org.gjt.mm.mysql.Driver</value></parameter>\\要加载的驱动
<parameter><name>url</name>
<value>jdbc:mysql://172.20.0.73/rk?</value></parameter>\\要连接的URL
</ResourceParams>
</Context>
具体q有一些详l的选项例如QMaxActive{,参加Server.xml中说?/P>
另外在Web.xml中加入如下内容:
<description>test connection</description>\\描述
<res-ref-name>jdbc/testDB</res-ref-name>\\名称与上对应
<res-type>javax.sql.DataSource</res-type>\\与上对应
<res-auth>Container</res-auth>\\与上一|?BR> </resource-ref>
配置以上内容后,只要在你的Jsp或Javabean 中按以下方式创徏q接Q就可以
Context ctx=new InitialContext();
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/testDB");
conn = ds.getConnection();
以上代码均测试成功,但是在Server.xml中配|数据库的URL中我不能加入useUnicode=true&characterEncoding=GBKQ所以从数据库中取出来的汉字都是Q?Q?
刚刚解决了上面的问题Q可以这样加?/STRONG>
jdbc:mysql://172.20.0.73/rk?useUnicode=true&characterEncoding=GBK
因ؓ&是特D字W?/STRONG>
我用如下代码来解册个问题:
public static String toChinese(String strvalue) {
try{
if(strvalue==null)
{
return null;
}
else {
strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK");
return strvalue;
}
}catch(Exception e){
return null;
}
}
写Blog 的时候停了几ơ电Q真是郁P数据库的q接池的概念我现在还是不太清晎ͼ加强学习Q看书去了1
Q于是先导入SQlsever2000中,想生成SQL脚本Q然后再在Mysql Front中改入。SQL文gQ可是发现导出来的脚本只有创的SQL脚本Q没有数据的脚本Q无奈,
后来又想找个软g试一下,下了一个什么DBF To Mysql 在未破解的情况下Q只可以导入Q行数据Q!汗)
用了破解补丁以后导入的时候出错,软g上说库限制的是8MQ可是我的库只有QM多一点,试了几次也不?/P>
然后只好l箋用Sql2000试,选导出的时候发现可以选择导出文本和CSV文gQ而在我的MYsqlfront里面支持?/P>
入CSV文gQ于是先用SQl2000导出文本文gQ把后缀名改为CSvQ再从Mysql中一导入OKQ?/P>
后来在用中才发玎ͼ用这U方法导入以后,有的是Charcd的字D在Mysql front中被认ؓ是Intcd的,
可是在Phpmyadmin中字D|C正常?/P>
首先是数据库的设计,考虑新闻有一个优先的问题,因些我在表中需要设|一个recommand的字D,我想设成一个布类型,可是发现在mysql里面没有q种cdQ查查了都推荐用ENUMq种cdQ可以设|两个?/P>
一个设成true一个设成falseQ然后我在JSP中就可以通过Insert一个布值往q个字段传|
今天在表单中使用了单选框Q原来以为需要用request.getparameterValusQ后来发C?/P>
最后在上传新闻的过E中Qtomcat提示一个叫invalid column 什?key的错误,调试了很多次才发现是表中?/P>
有一个ID 的主建,本来是自动增长的Q可是死了几ơ机Q居然变成不是自动增长的Q狂?/P>
q几天电压L不够Q一天死很多ơ机Q搞的现在一个劲按ctrl+s
因ؓ同时要上传文Ӟ所以ENCTYPE="multipart/form-data" 必须要加在form里面
可是q样的话Q我再servlet里面用request.getParameter()Ҏ无论如何都只是获得null|
不是一般的郁闷Q百度了一下,有h出现了同L问题可是它用的是jspsmartuploadlg实现文g上传的,
而我用的commons fileuploadlgQ仔l看了一下这个组件的apiQ可是英语太差了Q没有发现相关的信息
我又试用session传递参敎ͼ可是发现有点ȝQ因为在表单提交之时你就得赋lsession表单上它的数|
q似乎要javascriptQ可是偶也不会,
后来只有google了,搜烦了一些中文网,也没有找到资料,试试不限制语aQ呵呵呵Q一大片Q后来被俺发
Cq个
I cannot read the submitter using request.getParameter("submitter") (it returns null). ]
Situation: javax.servlet.HttpServletRequest.getParameter(String) returns null when the ContentType is multipart/form-data Solutions: Solution A: 1. download http://www.servlets.com/cos/index.html 2. invoke getParameters() on com.oreilly.servlet.MultipartRequest Solution B: 1. download http://jakarta.apache.org/commons/sandbox/fileupload/ 2. invoke readHeaders() in org.apache.commons.fileupload.MultipartStream Solution C: 1. download http://users.boone.net/wbrameld/multipartformdata/ 2. invoke getParameter on com.bigfoot.bugar.servlet.http.MultipartFormData Solution D: Use Struts. Struts 1.1 handles this automatically.
说是不详l,接着往下看Q另一U解x?/PRE>> Solution B:
> 1. download
> http://jakarta.apache.org/commons/sandbox/fileupload/
> 2. invoke readHeaders() in
> org.apache.commons.fileupload.MultipartStream
The Solution B as given by my dear friend is a bit hectic and a bit complex :(
We can try the following solution which I found much simpler (at least in usage).
1. Download one of the versions of UploadFile from http://jakarta.apache.org/commons/fileupload/
2. Invoke parseRequest(request) on org.apache.commons.fileupload.FileUploadBase which returns list of org.apache.commons.fileupload.FileItem objects.
3. Invoke isFormField() on each of the FileItem objects. This determines whether the file item is a form paramater or stream of uploaded file.
4. Invoke getFieldName() to get parameter name and getString() to get parameter value on FileItem if it's a form parameter. Invoke write(java.io.File) on FileItem to save the uploaded file stream to a file if the FileItem is not a form parameter.按照上面的步骤来Q果然一切都okQGQOQLQ真不错Q主要是getFieldName和getStringQ?/PRE>虽然说这U做法有一炚w烦,但稍微判断加工一下,L获取不到?BR>
]]>
java中当前日期的获取Ҏ
旧方法(已不常用Q:
int year = 0;
int month = 0;
int day = 0;
java.util.Date now = new java.util.Date();
year = now.getYear() + 1900;
month = now.getMonth() + 1;
day = now.getDate();
新方法:
SimpleDateFormat formatter = new SimpleDateFormat(“yyyy-mm-dd?;
Calendar cal_today = Calendar.getInstance();
int m_day = cal_today.get(cal_today.DAY_OF_MONTH);
int m_month = cal_today.get(cal_today.MONTH) + 1;
int m_hour = cal_today.get(cal_today.HOUR_OF_DAY);
int m_minute = cal_today.get(cal_today.MINUTE);
String d = formatter.format(cal_today.getTime());
我采用前一U方法实C按日期生成文件夹.
2
jsp传给mysql当前pȝ旉的方?/P>
insert into youDB(date) values(NOW())
不过q样只能获得当前日期
3
判断要徏立的文gҎ否存?如果不则新徏立一个文件夹
int year,mm,dd;
String month,day;
Date d1=new Date();
year=d1.getYear()+1900;
mm=d1.getMonth()+1;
if (mm<10) month="0"+mm;
else month=""+mm;
dd=d1.getDate();
if (dd<10) day="0"+dd;
else day=""+dd;
String filepath="d:\\upload"+"\\"+year+month+day+"\\";
if(!new File(filepath).isDirectory())
new File(filepath).mkdirs();
然后~写如下代码
String name="org.gjt.mm.mysql.Driver";///加蝲jdbc driver
String url="jdbc:mysql://172.20.0.73/jilei"; //q接?72.20.0.73上的jilei的mysql数据?BR> Class.forName(name),//创徏c?BR> con=DriverManager.getConnection(url,"你的username","你的密码")//创徏q接
输入以下代码供测试?/P>
Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from student";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {
System.out.println("您的W一个字D内容ؓQ?+rs.getString(1));
System.out.println("您的W二个字D内容ؓQ?+rs.getString(2) );
System.out.println("您的W三个字D内容ؓQ?+rs.getString(3) );
}
rs.close();
stmt.close();
con.close();