1.简介5 k h: Q1 v- ?0 h" K
Jakarta Struts是基于MVC模式创建servlet应用程序的框架。大部分的Struts应用程序都是使用浏览器作为客户端,实际上Struts足够的开放,它可以使用其它的客户端模式。在这里我将在我 "Coding your second Jakarta Struts Application"这篇文章里的一个浏览器应用实例改成Swing客户端模式,只需要修改一点代码。
$ }2 o1 j" C% Q; m3 X1 r 这篇文章主要介绍如何使用Swing客户端去连接已经存在的Servlet应用。如果你打算开发一个java应用程序,既能够使用浏览器做客户端也可以用 Swing做客户端,你就需要根据你程序的需要灵活的选择构架,如EJB或web service,他们提供了简单的接口。+ [' e# ?9 G, D' r0 ]5 g: E7 W
2.Struts结构
( v* y R9 z8 @4 y+ s 在我们开始之前,先看看浏览器如何和Struts应用通信的。这些将在我们的Swing应用程序中体现。( S9 k* ~6 _5 Y! P
◆Struts应用程序是由servlet接受到GET或POST请求开始的。" v; P. ? @& R2 \
◆servlet决定调用哪个"action",是从URL中获得信息的。
) D# ~) Y& U9 B% k2 M N. Q ◆实现了Action的java类是在struts-config.xml中配置的。
A8 v* k0 `/ L ◆ Struts的输出由jsp来显示,jsp的名字也在struts-config.xml文件中指定。2 ?6 G7 o2 D( H2 H. J
所以第一个非浏览器应用需要能够给servlet发送一个请求,并且能从jsp页面得到响应。
# V4 o% @9 N' C/ z2 @ 3.The URLConnection class2 E/ I) W. l/ n& d2 a+ W
使用URLConnection类能够很简单的使用java编写servlet请求代码。这个类很有趣,因为它有一些奇怪的设计。如果你想看看它的实现,我建议你读一读"Dodge the traps hiding in the URLConnection class".如果想发送一个带有"list"action的请求,并接受打印响应,你需要这样写代码:5 P# W1 w/ f; s3 W$ p! H$ i# ]9 W4 I
URL url = new URL("http://myserver/project/list.do");
" a6 d! Y0 O% O7 d URLConnection conn = url.openConnection();
3 w6 n1 m* U% ~0 _ BufferedReader in =
. ~! F2 V+ P7 T0 c; S4 ~& D- y9 k H new BufferedReader(new InputStreamReader(conn.getInputStream()));
) G9 T! ~5 G% q# r, Y' I2 I, {0 S String line;
" `8 Z: p1 W. E9 d% m; s while ((line = in.readLine()) != null) {% C- b8 Z. D- F' Q' W8 G1 \
System.out.println(line);8 g% c8 D) a8 _8 G+ y5 f" e! f K
} 0 L' i: S5 u7 p
一般来讲你通常需要在请求的同时发送一些数据——就像提交表单那样。这些数据需要在你读取响应前发送过去。8 q7 A& b" X# V9 ~, o! U
URL url = new URL("http://myserver/project/list.do");
q/ L+ |" D% @" a9 S7 i& Q URLConnection conn = url.openConnection();8 E& K; K8 u+ s3 N l$ g+ T. f
conn.setDoOutput(true);. r6 f& I4 O! U& R, L a
conn.setRequestProperty("user-agent","SWING");
0 ?2 T# u( ]/ P# S0 U4 b, f& ? j BufferedWriter out =9 N. Q: b ^5 \! {' T" E9 |7 K: |% S
new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
# k9 |1 ^& L) X- v; Z1 a R out.write("name1=value1&name2=value2");
6 ?: Y1 S& e s# W( J2 X% z' ? out.flush();
3 f% V$ d4 k4 ]5 s7 t0 U out.close();2 ^- }/ Z: L e7 G
String c = conn.getHeaderField("Set-Cookie");
2 Y0 G8 A9 L! H1 e0 I BufferedReader in =# \3 @9 T$ R) O
new BufferedReader(new InputStreamReader(conn.getInputStream()));
' {5 q$ A; [3 x i4 L& I( A String line;
7 w& O, J& G: f& }3 x while ((line = in.readLine()) != null) {
( U# H' R4 F+ u0 G6 `6 ]9 |9 H System.out.println(line);
l! |* \& ?* x5 ` }
# {4 [- `7 _7 a' O* p: E3 L 这个例子同时也显示了如何读写HTTP头信息。
; n* ^# {7 q/ _$ N; v0 w 第一个例子使用GET方法与HTTP通信,而第二个例子使用POST方法通信。你同样可以使用GET方法来给servlet传送数据,但是就必须要把数据加到URL里,像这样:
O! }# W0 d4 B* x1 A0 x URL url = new URL("http://myserver/project/list.do?name1=value1&name2=value2
1 U$ a! W9 L: C+ p. u1 h 4.Identifying the client! T" i9 C/ n/ T9 D$ I- P: }" T
现在我们知道怎么发送和请求数据了,但是我们怎么接受数据呢?如果响应是给浏览器的,那响应里就包含了HTML或者还有JavaScript和样式。对于我们的Swing客户端,我们只需要数据。这将带来一个新问题:Struts应用程序如何能识别出客户端是一个浏览器,是个Swing还是其它什么呢?% }) f1 t3 v( I" L, j: T
一种解决办法是在每个请求里添加参数时其能间鉴别出是哪种客户端。我在第二个例子里已经使用了user-agent这个头信息来使其识别出是个Swing客户端。% D! W* T# M2 }! c, E/ G
当Struts应用程序准备好给客户端返回数据时,它就会检测user-agent的值,然后选择适合客户端的jsp页面。这将会替代Struts Action类设置的跳转信息。
: f% W# k& L& W2 e String client = (String)request.getHeader("user-agent");' _1 o% E1 L+ Q Z# o& H# |& p
// Forward control to the list page
4 R, a. M: e' n# t+ G if (client.equals("SWING"))# W) X1 v+ Q4 x) ?1 y+ R w
return (mapping.findForward("swinglist"));/ p, _* G! l) b" y; P4 _. z
else return (mapping.findForward("list")); |