- 在线时间
- 0 小时
- 最后登录
- 2007-11-12
- 注册时间
- 2004-12-24
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 2467 点
- 威望
- 0 点
- 阅读权限
- 50
- 积分
- 882
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 205
- 主题
- 206
- 精华
- 2
- 分享
- 0
- 好友
- 0
升级   70.5% 该用户从未签到
 |
问: 如何设置Java 2(JDK1.2)的环境变量?
7 B4 [# Y1 x3 x& t* B8 }+ R) Q4 Q% F5 A* t# R
答: Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径. " p) G* @- ~2 ^6 d* J7 V
Java 2环境变量的设置如下例所示: 8 t. ?6 W8 k4 @' g# x
Solaris平台: setenv JAVA_HOME Java2的安装路径
, B( x1 [* D- Nsetenv PATH $JAVA_HOME/bin {PATH}
`1 I( G# T+ ]Windows平台: set JAVA_HOME=Java2的安装路径 * Z* q* ]5 i( J9 y# e% c, b
set PATH=$JAVA_HOMEbin;%PATH% " e# |1 ?, h3 \$ `* Z
) W3 v B5 N0 p' z/ u
问: 哪些Java集成开发工具支持Java 2? . F* {- M1 J. P5 z6 D! s7 |
# M5 C: {' a( K; G答: 目前流行的Java集成开发环境,如Inprise的JBuilder,Symantec的Visual Cafe, Sybase的PowerJ,都支持Java 2.
I# m- r5 u# q: w4 t% o7 I, _! r5 u" J( M
问: 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?
, ^: ^- C8 w3 }$ Y: O6 I9 _- p
- @4 [7 Z) \. g) k: N+ w, \$ f8 \ [答: 当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM.而不同浏览器对JDK的支持程度也不尽相同. 因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关.
* S( o9 @5 e. ?' M+ g# X6 u2 h 如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览 器不完全兼容JDK而引起的. 此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin.
p, ~, w+ u1 j$ }! y 如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误 提示检查applet程序. / f( m$ a& r6 P5 y
0 X ~8 Z* f6 y/ p/ y
问: 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码? 3 X6 p) G D/ }0 [
' U/ e3 B$ e" ?# o4 l2 @
答: 这个问题的实现通常与各个JDBC driver的实现有关. 目前大多数JDBC driver采用本地编码格式来传输中文字符,例如中文字符"0x4175"会被转成"0x41"和"0x75"进行传输. 因此我们需要对JDBC driver返回的字符以及要发给JDBC driver的字符进行转换.
) H [ k F+ @4 Z0 R
( `/ a2 n3 A! v9 j# L) z, l1 B当用JDBC driver向数据库中插入数据时,需要先将Unicode转成native code; 当 JDBC driver从数据库中查询数据时,则需要将native code转换成Unicode. 下面给出了这两种转换的实现: ) h M" w* u/ r" }0 |; Q5 q/ o
2 P4 R* t$ ^: }; X
6 y" x$ W" m% _! k2 n
String native2Unicode(String s) { / i# y1 O+ _' e# E; I, G' s5 ]1 k }
* u# I0 v$ f& M9 ~8 I/ J9 [if (s == null || s.length() == 0) { 5 Z/ P8 [+ T' F: P m ^
4 d5 m. U! o: b/ h5 |
return null;
* D" o; r) T* _: Y X+ k- Z2 l. t% p0 C! ~$ x( q: S- M
}
4 q7 x- q: U- F8 ]/ U. Y& G/ q I& B Y. t, ?8 b1 o
byte[] buffer = new byte[s.length()];
- V) A, B, U4 h) b( y& R2 r4 X2 i
/ i: j! |; s+ f& m* |for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {
" Q. V# \7 g+ A
' I+ ^& E" C0 k6 S/ d: T" Rc = s.charAt(i);
0 f' w8 h6 z1 ~/ N+ ]' G
: z7 z; U3 x; z* x9 h! f2 _byte []buf = (""+c).getBytes(); 3 U( m. L+ I! i( e7 F6 Z+ t
& L2 F1 \! f; i" I2 `
buffer[j++] = (char)buf[0]; ; E4 h$ \7 ?/ C8 \( u
# W& O5 C( p0 z9 J1 x
buffer[j++] = (char)buf[1]; 2 @* A9 L! j% P' T, q* k7 I; L
% z; f. G/ X" M6 ^, [6 q} 8 Z, c7 k$ F$ ~4 X! R3 o) ^
$ P2 P' I2 }% ?# Y0 O% k% Oelse {
% |9 J4 |. F& O
) d# t( J- S; e4 \buffer[j++] = s.charAt(i); 8 P7 ]* y8 I9 v+ n
' O- c' G% n: [6 b6 d3 \
} , H. t( D3 V7 p# Y+ q
( A8 s# _" ~& R5 G9 c8 R
} + a" X" `5 N" P7 x8 p/ }3 c
" X* u8 H( ^4 K X5 a' Lreturn new String(buffer, 0, j);
2 B. O+ Q% \2 X1 ]/ e& } O6 M% |9 J6 x
}
' E2 c4 q! O/ n0 L5 j' b% K5 m5 g. s% [
除使用以上两个方法之外,有些JDBC driver如果对jdbc driver Manager设置了正确 的字符集属性,以上2个方法就不需要了.
! U- ~! j/ \& r$ d5 Y0 u. z. o3 V' Y8 G8 r p3 T. H: r
, t/ t8 U: I' t4 l3 M& t( ]问:
% J" F& R% ]- \/ ]1 k9 m# M8 D9 c+ o! V当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示?
! _9 W* K" w$ [
8 m' u2 w0 f U$ \答:
9 m2 v+ q/ n4 h d% c# J' ]javax.servlet.http.HttpResponse类用于产生返回页面.通过HttpResponse定义的方法getOutputStream()可以获得ServletOutputStream的实例,这样用户就可以利用ServletOutputStream.write方法向输出流中写入返回页面的内容. 但是ServletOutputStream使用的是缺省的编码方式,如果要使返回页面中的中文字 符能够正常显示,最好显示地指定所用的字符编码方式. 通常需要构造一个 OutputStreamWriter , 例程如下:
* ]! k5 V: U& q% w; `0 H! `& [" @4 G' U( o
2 O) \5 \* V% r2 m' }0 ]( W7 N+ ^public void doGet (HttpServletRequest req, HttpServletResponse res) 3 a E9 x: h6 f3 i6 n6 J% P- e
9 h7 C- M% s/ U$ Y( v6 e7 _throws ServletException, IOException ! S! K! x* s- A4 a
* m0 V9 Y9 O. d/ f8 U6 |0 ]& _{
; |1 \- @! g) x- z
- ^' T/ h9 c* F. a) H) Qres.setContentType("text/html"); 2 K; S7 q8 f: ^# P( J7 f
% W2 ~! V8 g( D8 [ServletOutputStream out = res.getOutputStream();
/ m& \5 M: G: R4 n5 Z0 T( J" ^$ ~( f! x1 `" i/ S
OutputStreamWriter ow = new OutputStreamWriter(out,"GB2312");
: c) r x6 r' w/ S! l g2 d
; q9 y( e/ f" O( K# ]7 M4 ?ow.write("这是测试");
9 ?( d; ]1 U0 e I4 l4 e
8 P/ t: d9 b; k8 a. now.flush();
y+ r2 A* _. h2 ~5 m/ F/ c, a* F
' i8 p% O" Y! w# i0 @$ now.close(); & B# w& v* F$ l6 P
# y4 `( E% c/ ^6 y! }- W} * R4 l5 z# `" q, I0 X1 C n
$ B" c @! J2 n+ ?
6 ~' z4 E3 @# h问: 6 _: ~" p3 B* A
如何设置Java WebServer的CLASSPATH,以包含用户的class文件? 1 Z: ^5 s0 _7 |
' D3 t% g1 Q) l9 s6 w答: 9 S* K9 q [# [0 k* e9 n0 Z9 R# [
有两种方法可以设置Java WebServer的CLASSPATH环境变量,以使用户编写的Servlet能够调用用户的class文件.
0 F: m, Q+ R3 }, P) y& [将用户的class文件放到 JavaWebServer_Dir/classes目录下,在Java WebServer 启动时,classes目录被自动加入到CLASSPATH环境变量中了. % |4 }9 j. X9 @ u) a- @
修改httpd.nojre文件,将用户class文件所在的路径名加到CLASSPATH环境变量中. / ?' e# U" }! V! W( K7 Y
J+ M% @( w. C1 f- F
* g) X" D) K+ s8 h2 U) ?2 s问: " M. |# w0 j( e$ m
为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢?
+ L2 ?* E6 S7 h/ i1 g! [2 a3 m" q. g
答: ! C- a; U, {1 Z) f o; v( ]' f
机器的网络设置不正确很可能会引起该问题的发生. . E1 ]5 ^2 E3 {# m6 x5 W
RMI使用了Java网络类,特别是java.net.InetAddress类,它将查询TCP/IP的主机名, 包括IP地址到主机名的映射和主机名到IP地址的映射.在Windows平台,这种查询功能 是由本地的Windows Socket库来实现的. 因此延时是发生在Windows库中,而非RMI中. 2 Y! i3 S9 k! W
1 t; p% E Z$ p- @9 K如果你的机器设置成使用DNS,问题通常是DNS服务器查不到主机名,你所发现的延时 是DNS查询的延时. 请尝试将RMI通信中涉及到的所有主机名/IP地址加到本地文件 winntsystem32driversetchosts或windowshosts中. 格式如下:
( B! U5 F5 U* d/ L! w
* K# }8 Q0 x. s1 E4 CIP地址 主机名 - \, _. ^# ?; ~. O
4 W& w- \7 i- J8 `2 r$ A9 k* T如此设置应当可以明显地减少查询所花的时间.
4 v" Q4 c* \: F# _& v$ R" M6 Q# K
& @6 B* s1 k1 o8 l4 g问: 编写Java application时,如何设置proxy的信息,以便访问外部网站? 7 G* \/ G- ?! g: X/ h& ?
* D# G' o+ _! E b# W
答: * J3 l" I5 \4 h8 R5 |
若在java application中访问外部网站,首先应设置proxy信息,样例代码如下:
% P! u* p: }; c% ?. n
$ {+ m$ z/ V1 i2 n& q0 C" U: P
# `) G! n1 b9 B( ?0 A+ E- d/ oimport java.util.properties; ! k& n0 w# d5 e- T4 q
0 o0 s+ M- k0 f' i; p
.....
5 P9 a& h. N7 O* Z7 p$ D; a4 F2 J ^0 E
Properties sys = System.getProperties(); 6 E" Z0 s$ W' I; P& C+ U
: e. y; I$ \2 y( }( c6 d
sys.put("proxySet","true"); ; g1 }* J1 `3 v) H: z
4 I/ `. Z7 M5 k! T; e& P$ c& \
sys.put("proxyHost","myHTTP.proxyserver.com");
3 c. e. _$ b1 C6 T, g3 a6 X% D' z& z* V3 q; [2 u7 F
sys.put("proxyPort","80"); , p, j( u) J6 F2 m( y( C- O4 c4 Z
# J, v$ `3 Y0 M9 ^5 ?) s; z
System.setProperties(sys); 2 s1 Y. s- a# g: ?- O7 ?2 d
& N' k$ x+ L7 L# B A5 t, E# I3 H( x0 a2 w9 z# Z4 T
. n3 J; s+ e7 s7 s; ?$ q
u = new URL(website);
1 r% p5 C6 x7 j* D O
% G- Z' G _% g5 o6 j9 Cconnect = (HttpURLConnection)u.openConnection(); 7 v6 v" ?+ P: \' Z$ f
6 K5 C. G4 U/ S* r2 m.....
- u( E$ D* s5 W5 v, F7 n5 M! d- X
问: Swing组件JList的列表数据修改了,如何通知JList改变显示? 3 S2 d7 h$ M; L) z
. a& i9 r3 C% ]. x( ^( }+ l答:
& I) J4 X2 d* `. T1 Q% u1 VJList组件有一个单独的显示模式ListModel来表示JList的显示数据.
- V% I9 J& t& f* M/ _8 dJList创建以后,JList数据元素的值及数据元素的数量可以动态地改变. : S D1 k" _5 d3 f& W5 ^/ Q1 }
JList在它的数据模式ListModel中观察数据的改变.因此,一个ListModel 的正确实现应当在每次数据发生改变时,通知事件的监听者. 7 K# Z1 q3 Z# u; F) x
当使用构造函数JList(Object[])创建一个JList的实例时,系统将自动 创建一个DefaultListModel的实例来存储JList的显示数据, 可以调用 DefaultListModel中定义的简便方法来动态地修改JList的数据,如 removeElementAt(index),addElement(Object)等. DefaultListModel 在修改数据的同时,将通知JList关于数据的改变. # W6 ~7 y+ n+ E3 @) x9 R
; G) V( D$ z9 L
问: , r8 [7 F6 |* L- Z* c( C6 J4 d
在Java applet中如何实现一个模式对话框? $ h- J: x% Z( `+ A+ v- {( l4 r
1 e: S% y3 p T- O- n6 W
答: 3 V: T: h- Z: _+ o1 B4 a9 Q
在Java applet中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口.因为Applet是Panel类的子类,不 可以作为对话框的父窗口,所以首先要获得applet所在的窗口,作为模式 对话框的父窗口. 样例代码如下:
y3 T' x# v! f. @: G' O. i" V# n5 H) K A2 d
! w- U T- ?1 t; F% G..... / V$ L. n1 n1 R- \+ F9 t2 d
: z5 I: V0 q. S1 l0 L1 {
Dialog d = new Dialog( getParentWindow(comp),title); # f6 y- Y& k+ v: m7 ]
8 s, a/ s( h7 ^1 U1 l// comp为applet上的任意一个组件
, \( D* L" J( y) E) r$ l3 z- Q9 V# g, L6 d6 m V7 W
.... ) \+ S' n; `3 B; R% N8 P
7 g: H* e: a2 x3 D. i% f- o
5 Z# J3 P0 g0 @, L6 ~
' g3 }) l4 F4 A' y( c; Ipublic void getParentWindow(Component compOnApplet,String title){
' C: W# o# G* {, t* L) S& G- Z `& U# d$ X6 f' R
Container c = compOnApplet.getParent();
/ w3 I& W3 C. z) N9 n0 ~. [% {; }$ ~5 N' [" e
while (c != null) { - ?5 D2 V' ~/ K, ~* k
2 j8 E: |* i5 G ~* e* z% Z7 j z5 p
if (c instanceof Frame) 2 ^# _- z6 p! D6 Q& f( r0 G: W
* Y0 A# _0 q8 g( n; \return (Frame) c;
* z9 t3 B5 {; w9 Q3 ^1 j4 f% F$ ^0 `! I: U+ |! p
c = c.getParent(); " r) Z+ y) z+ V7 `2 u7 D/ |
+ j+ R8 y0 j6 V$ T( J5 F7 t
}
7 u* o; t1 z0 `4 q& P/ s
4 b, ]% N: q( ^. {* V Hreturn null;
2 d4 K9 H% I# |. i2 Z5 d# E" x+ \8 _7 t8 S+ T# H8 v
}
9 b" y8 d3 `0 q9 A+ J
% Y* Y4 M! d5 c5 W6 M" F! G3 J问: 在Java applet中如何显示另外一个HTML页面?
2 O4 ~ s. v: X! t: f( I8 A) L# k+ P! } ]9 ]
答:
# ]* G; o2 R5 T. f4 g通过java.applet.Applet.getAppletContext()方法可以获得与该applet相关的AppletContext, AppletContext.showDocument(URL)方法就可以使applet所在的浏览器显示另外一个网页. , @) j1 L0 _! J2 N6 o
- b& s# `# Q6 [# O* n& j* V a4 K
问:
2 n: P$ ^& x9 d! O9 s/ ~用JDK实现的签名applet,可否在Netscape或IE中运行? ) ?: l9 Z" H, y6 l% B( P
7 N( W$ }3 R2 V) E" ?- Y
答:
* B( y) `, X. _1 Z/ Z( P用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行. 3 v; v" m! I+ e9 o: L) c8 A
% q* ]. c1 v7 D6 v, ?
不同的浏览器提供了不同的签名applet机制,如Netscape提供了zigbert工具和 Capability API, 而IE则需要使用CAB文件. 但是,无论是Netscape工具产生的 签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行. 1 X; {# j P% X% O/ \2 k
8 y* w1 n0 Z( a如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种 浏览器中运行. ) y3 z3 J4 E) q: u- H( i3 e
9 V+ ] S& A$ V+ X, `问: 3 a x6 c# F& ~: o. ?
用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库?
/ m' [/ A1 ^9 p7 b5 Z5 ?1 k
0 \* {2 t" ^+ F \# y7 Z& _答: $ E( m+ b' x2 ]2 I
如果一个被Java调用的C程序库C1仍需要调用另外一个C程序库C2,那么在编译C1的时候应当联接程序库C2,步骤如下(Solaris平台): % Q# j9 l7 c* f; ?$ C$ l
编写调用C库的Java文件,并编译. & |& x5 |- g" Q. b
javac java文件名
& B2 p, |6 o# u2 F& D
: r! b' W8 m8 T9 a J
; |9 R' V% _" H* N) z产生C程序头文件
, p7 s# Z( O& c$ z3 fjavah -jni java文件名(不带后缀.java) $ B8 V( U7 z* Z. }
% ^; j8 |- f4 @3 X6 G9 c* ]! q4 }( p( ~
编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译. 6 ~! t# ~+ ]) j: e6 h. {
cc -G -Iinclude路径名 C2.c -o libC2.so 3 g$ ^0 p, u8 @4 ^+ I' J
cc -G -Iinclude路径名 -lC2 C1.c -o libC1.so 1 d$ e! x3 \: B4 o: i+ _" W! r
/ t3 y% x/ A/ _* C3 ]& g* z
0 y; F% L; @8 e3 h0 o
设置环境变量
% d$ l8 |8 R0 ^setenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径 6 l* a( q$ I7 c( V
{LD_LIBRARY_PATH}
! h) `: h" `9 h7 K
0 Y t. @0 o2 v$ X
2 g" R$ s3 p- a0 C4 T+ c# a运行java应用
/ ]( ^- K/ Y9 |/ J/ ^2 B2 |: l8 Z$ H
J3 i: C# v3 c/ A M2 l; j问:
+ [/ Y8 E5 O m) h8 n: Q( H在Java语言中,如何列出PC机文件系统中的所有驱动器名? 5 ^# j' q0 U- I) V" E+ B
( q% Z, c I5 S: S( n& C答: 5 f9 F2 Y2 g% m9 T) i
在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能.
( Z+ T: y8 m f& F$ ?: \3 `
0 a- g! J1 L! {! z- B% _. h问:
* _) P7 {9 b) j# T2 t( v7 P3 M0 P为什么Runtime.exec("ls")没有任何输出?
' } Y2 y6 C, N' g0 e2 {9 a, c$ V9 w' ~& h" S* x; i! h
答: ! K2 Q4 c' {1 K
调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下:
6 M0 z3 ?# A6 B! ^9 J+ }+ N3 Q% o
( V6 T, ^1 j4 T) l) Q8 ]$ O
/ [$ g" u9 b1 E. U( Ktry + a( E6 |+ f5 f8 f" m$ n
: I3 h( d6 ]( x. i) s
{
: b. U- }- y! m+ @, c. k
% B4 o' G) ?2 k \process = Runtime.getRuntime().exec (command); 7 [0 }# I. K7 x H. _3 l3 x/ O
4 H6 [- x: a* S" K, {. LInputStreamReader ir=newInputStreamReader(process.getInputStream()); % e0 o2 O+ |. k3 X: O; O
( Q# t0 r0 Y2 D: U; R" \2 fLineNumberReader input = new LineNumberReader (ir); * j+ ~3 V# C3 O6 ~4 q! T
1 p' p* @4 u1 e# R: s" k/ R
String line;
) q- W7 F7 F! Z, h
" I$ C }& F0 e* Dwhile ((line = input.readLine ()) != null) 1 z4 Z! `& M/ F# G: R7 S
* l+ _3 k: `0 L) w# f; h
System.out.println(line);
; @9 T7 @# r \" j8 h7 T7 x3 O1 p0 A( I& |" j# ?$ ~
}
6 {7 h. I$ |% W. \, o5 _2 k( q
, C" ~& w8 S1 l0 H" Ccatch (java.io.IOException e){
2 J+ `! J# `1 }! V* g) S& Y& n
7 t2 s- A0 K4 M# x4 h7 u9 lSystem.err.println ("IOException " + e.getMessage());
$ y0 ~" v' e' B7 J6 \: }
2 n5 `, x ^" [! h}
+ m% N9 l& y0 |7 Q
% S! V- ^1 z z& `; A L. w( E0 h7 S& ~2 I7 a; }" V: y2 L1 y
问: & t! \" O, p, |* j6 R2 J& R, k
如何产生签名applet,以使applet能够访问本地资源?
" O( r, b/ W1 ? L" Q+ r4 \2 _4 \* w: P
答:
( `) t; F6 ^$ C+ K在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料 请参考: http://java.sun.com/security/usingJavakey.html而java 2对签名机制做了比较大的改进,允许用户更灵活地设置安全权限.Java 2提供了三个工具:keytool,policytool和jarsigner来实现签名applet.例如,Joe编写了一个签名applet:SignedApplet.java,那么产生一个简单的签名applet的过程如下:
. v7 \3 }2 t4 j7 R0 S M& j$ ^3 T
4 v/ h1 O$ M) b2 l
% A0 g4 |/ r# x8 G! R7 F; ~//产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中
2 m( K) T& {4 B% q! |' j$ I% _( m+ l) u9 W" F* w
keytool -genkey -alias joe -keypass sign12 -keystore joestore 6 N* t/ K. G1 ~ f; ` P# s
( g$ v* L! D4 e' g: _! @, |
//将SignedApplet.class及相关文件打包成jar文件 % x, t: }% p# I' X& N! W
2 v0 S+ T9 \9 Q! w' ]
jar cvf SignedAppletDemo.jar 0 W* T+ u3 J+ ?2 [1 ~% g3 Y: r
: b; e5 Q+ W5 B8 Q- Z
//利用keytool生成的自签名的证书产生签名applet(jar文件)
9 M% H l3 G2 u8 j2 e. S5 |$ W' ^ J
* s6 L, Z. h K: l8 z! Mjarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe # {+ J U. d9 k3 N0 l
* {3 f+ _9 E: V2 |. g1 j( U//将自签名证书从keystore中输出到文件
" @" d: [9 G/ h5 E0 T
, V( x5 w2 F/ F: ?4 X4 Y- rkeytool -export -keystore joestore -alias joe -file joe.cer $ h: k" W- R: Z% Z: l
; R. x4 \) d* m& X/ W2 W
) d+ }& U2 I4 _5 n1 n$ ]* R6 X5 l; J7 G
而对于签名applet的接受方Susan,需要通过如下步骤来安全地执行 3 M% }1 y7 U* q5 z& D: b
2 G% H" ~5 z& P0 N( x( xJoe编写的签名applet:
u1 |2 }* y7 }" w* m/ E; c! A0 ]0 T' y7 c
//得到Joe的证书并将之读入到密钥库中susanstore中
) ~% Q$ Z7 p3 r3 a; a
% N& u ~( W' Ukeytool -import -alias joe -file joe.cer -keystore susanstore + s$ ~, Y& W) S
: J0 h, x% [( e; T3 o- x3 n# g//运行policytool产生满足Susan要求的policy文件
, R0 @* f9 s+ d$ ^5 Z
* T. N( @6 z2 y9 P T' Bpolicytool 1 S, e& H1 ~& Q2 G0 ?; g I+ Y
/ c1 M% t# ~+ u& G+ D8 ^& A
//用appletviewer运行之,或在浏览器中安装java plugin来运行之. 7 x2 w& |. g4 _! y3 @
! v( y/ u6 c* K+ J# M4 |% E, t; [7 b; a+ p; d
5 U; m; |: P* }! D& o
关于签名applet在Java Plugin中的部署请参考以下网页: % H4 a4 Y% l2 n# @6 }% n
$ w" X4 J: F# I
http://java.sun.com/security/signExample12/ 1 h9 U; h; V2 L; v- x7 g
. W2 r. a4 l' [5 i: A# i3 {6 t+ N# ?# v! s
. W; ?- @% }* E
注:以上的例子为简单起见,使用了keytool产生的自签名证书.其实,用户也可以 4 Z# S/ q$ q/ h w1 {6 v8 r: f
. u% m- ^) v- n
使用keytool -certreq向商业CA中心申请电子证书. 0 J+ z: [+ @9 i3 |9 l3 P
# U: w: X/ Z9 V. Y" L4 k8 Z+ D- Y
T# f! ^7 a' n! r7 ^5 k& z* k; i0 m# e. {$ u4 S4 h* u* Q% L
! ~" G& G0 X8 t8 x' `7 Y/ \& s问:
, [, H% Y% {- Q* K若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException? * t B! i' l# B
" w3 x% D7 X5 y- z; U7 _
答: $ Y+ u1 J0 \1 u$ c8 r4 q! l A
使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应.ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头.因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头.所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException.一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法.被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,羰?则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法.
7 }/ }$ Q8 F" [4 S8 p7 M3 l8 w0 c* ~, G4 f# L( n
问: 7 Q* W, o8 ]; c* ?+ R
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中?
4 j _& C, S: p) x$ r4 j$ p% @' n9 x; r# W9 s, W
答: 2 s h& d- d% ?; H2 U4 u
目前,没有直接的方法可以将对象写入到随机存取文件中.
1 d' r: X8 B: s4 i但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象.需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误. 例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中.相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象.
+ N0 y% N. T, b% Y+ X" k
% O1 @) ^& U9 X$ J- g$ f问: # L& @- @4 q& O% O3 x
运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之?
% X; W. e+ Y- }
0 q; M9 V0 S* j7 Y% u; Y答: # E+ ~* X) j& b" L9 Q
可以. java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务.调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工启动rmiregistry.此外,LocateRegistry.getRegistry(String host,int port)方法可用于获取名字服务.
) G' y9 k" t- S& l0 T& \0 M
+ P: }9 |; l. F: \* d a问:
6 {3 ^* r- Q$ Z# [3 u* _' g$ G使用类PrintJob进行打印操作时,应如何设置打印机名等打印属性? 6 [5 h0 F$ f* Y+ j4 I5 X* d
' M, N- v, M' F3 J- Z! `答:
3 W- J8 s! I# v. Q' p使用如下方法可以获得PrintJob的实例用于控制打印操作:
5 f/ s( @ [' d1 _- ^/ }$ d+ u- Q5 a, b9 ^3 Z6 R3 w2 k2 g
, |% `/ B) m* f/ H- V3 e! p
Toolkit.getPrintJob(Frame f, String jobtitle, Properties prop)
( J3 g$ F% T9 W0 y; k, j7 ?8 A# q& k; K3 {
那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括:
& c0 }, x, J5 G1 n3 h) C" y* q6 O" q% D* Q
awt.print.destination: 可以是"printer"或"file"
% ^& X0 F- W6 K! z/ }( Z" }9 A0 U. R0 A
awt.print.printer: 打印机名
9 |% ?& n1 ^( Y; i+ g8 J# Y" r0 p! ]& L+ w+ U9 ]+ t
awt.print.fileName: 打印文件名 6 }! A; B V. }( b( E+ R
7 }4 b0 j# l% ^# ^' L" vawt.print.numCopies: 打印份数 $ n% q1 V2 a6 R3 i) s9 U8 d
( w$ h, e v7 P5 u T. A, f2 t8 r
awt.print.options: 打印命令的打印选项 " u, e# i8 a h$ j
+ R5 p" \7 N1 g% `3 iawt.print.orientation: 打印方向,可以是"portrait"或"landscape"
_1 P6 Q6 T% M3 ~: s: |, d, i
awt.print.paperSize: 纸张大小,可以是"letter","legal","executive"或"a4" $ i$ u( C4 k( L' I8 P4 S
3 R5 u7 k' { ^+ h" p7 W8 c# n* ^: m6 X2 V" q. V, @
5 R/ x4 f! z1 k, Z. I: W) K
" S6 _+ ], L Y1 l1 V3 Y4 L) e, [1 @9 Q; R
; V. h' c) `" g+ ]! A! P: _问: 1 j! q1 C1 L0 T
在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?
6 C& x# _' e/ |2 m2 k
& L1 S4 N+ K6 b答: - e3 s& o+ e" G; Y/ B
Thread.suspend本身易于产生死锁.如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源.如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁.
4 y0 B) w& r3 t& B1 ?4 D- s: l
" Y" Z9 s( @6 w因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态.一旦需要该线程继续运行,其它线程会调用notify()方法来通知它.
$ [: P, G! C9 T, m1 T: ^$ F
' ~$ s2 [! V* Z, n! d( ?; w问: ( `$ Q' q5 d7 X7 b0 z3 E" P5 a
使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行? / o7 F2 A w2 S' c
% p3 ]+ P7 H& Z, \答: ( H# i/ i( B8 ~7 h# k, |! C j
在JDK1.1中,ResultSet类中只定义了next()方法支持数据指针的下移.但在Java 2中,ResultSet类增加了如下方法支持数据指针的移动,包括: 9 _' X4 N# b, m4 U. d9 O: v$ E: ^
! ^: d2 c5 G) A6 H, N/ a" N
. }) Q/ c h d2 x5 ?4 Z8 z, Q& mResultSet.first():将数据指针移到结果集的第一行 8 V6 a0 L9 A( D6 W/ h: v+ M
7 I* g* M2 q9 U# m8 n! GResultSet.last(): 将数据指针移到结果集的最后一行
: @ h5 F$ E; c! q% f5 ]8 \ x/ K% {% k
ResultSet.previous(): 将数据指针上移一行
% A. o+ w4 D F. R
# H. x- W9 W6 }! Z7 _+ i. e! }. b
6 \' W0 O" e+ T! j5 ~以上的方法定义在JDBC2.0的规范中,所有支持JDBC 2.0的JDBC驱动程序都可以支持上述方法.目前Intersolv和OpenLink等JDBC驱动程序厂商均有产品支持JDBC 2.0 .
; `- r" b$ k! C/ U! H5 g& K5 r; t% l5 M: E4 D6 V
7 N8 p& ?6 d# s6 [5 Q4 o
问: ( `4 B }9 D0 D% _ y
哪几种Web Server支持Servlet?如何使IIS支持Servlet? / y% J. A- s# F+ W( @
! A a4 p& |& i: K
答:
' n2 R$ f# a G0 J% Y% p1 U, z% F目前,支持Servlet的服务器端产品主要有: Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等.
+ O/ P y5 l1 j" h1 ^8 J0 ~
) {, H3 p6 h: \# P1 Q1 P此外,一些第三方厂商也开发了Servlet engine,以使其它WebServer(如Netscape Web Server,IIS等)能够运行Servlet,如LiveSoftware的Jrun(http://www.livesoftware.com/ products/jrun/)等. 3 ^8 a. a" e- p4 \$ ^: G- x1 N- f
- j: T# c" b8 j$ W0 P
问: Q# t* v1 R- m: M, Z5 K
如何在Java应用中将图像存储到图像文件中?
; X2 R3 T! R- K$ M2 _0 n& w4 B" V4 Q) m7 E; ]/ m+ n- k" Q
答: 6 ~1 g/ \# k! v) |6 r& {
Java Advanced Imaging API(包含在Java Media API中)允许在Java应用中执行复杂的,高性能的图像处理.JAI API提供了存储图像的能力.目前,JAI API支持以下几种图像文件格式:BMP,JEPG,PNG,PNM,TIFF.下面给出了将图像存储到BMP文件的一段代码: P" Q/ l* a: `! P, n2 }
" ]3 X3 w3 W. n9 o" E7 `0 }% y5 X+ N8 V9 ^& k
OutputStream os = new FileOutputStream(fileToWriteTo); - t0 ^* m* U9 f3 _* H8 [ ]
7 S; E6 E" C+ c- K1 b
BMPEncodeParam param = new BMPEncodeParam(); , U5 k* ]3 c l! b
# e+ X) H0 @# ], Q- S% zImageEncoder enc = ImageCodec.createImageEncoder("BMP", os, param); 2 x$ O+ Q# |. l( I6 |
6 ~, x# a. K2 A6 q1 x) S: J% f
enc.encode(img);
! H% I4 y$ V: B L& ^. q1 B5 _/ G: e) X, w- f
os.close();
( S; b I9 A) M" M% C4 V/ r/ g" ?) m
有关存储图像文件的编程指南请参考以下网页:
! `% |6 i* z: ~0 `: w
7 m' f! C+ A* b Lhttp://java.sun.com/products/java-media/jai/forDevelopers/jai-guide/ , k4 a# }' Y2 m3 J( z; O+ L
2 }9 ]& {) a0 }4 L" t9 X5 K5 ?
. o i4 T5 C' Z) S4 }5 T S
7 A7 |/ V2 v$ h! T X, x
- \9 m+ O5 _ @% s6 s; ?
问:
% d) ~1 e4 a; p% B) |- P3 i如何用Java语言向串口读写数据? font>
, }3 g0 M1 f! m G
$ D1 `& T5 O% y4 @1 a答: 8 R+ m" X$ y( [7 T/ ^
Sun公司的Java Communication API2.0可用于读写串口,它支持RS232串口和IEEE 1284 并口,提供了一种与平台无关的串/并口通信机制. 9 r( i) S0 _# ?3 p, o/ v; L5 h
8 H5 I: z* {( Z% x9 r详细文档,请访问:<a href="http://java.sun.com/products/javacomm/" target="_blank" >http://java.sun.com/products/javacomm/</A> |
zan
|