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