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