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