淺析Swing客戶端知識
1.簡介
Jakarta Struts是基于MVC模式創建servlet應用程序的框架。大部分的Struts應用程序都是使用瀏覽器作為客戶端,實際上Struts足夠的開放,它可以使用其它的客戶端模式。在這里我將在我 "Coding your second Jakarta Struts Application"這篇文章里的一個瀏覽器應用實例改成Swing客戶端模式,只需要修改一點代碼。
這篇文章主要介紹如何使用Swing客戶端去連接已經存在的Servlet應用。如果你打算開發一個java應用程序,既能夠使用瀏覽器做客戶端也可以用Swing做客戶端,你就需要根據你程序的需要靈活的選擇構架,如EJB或web service,他們提供了簡單的接口。
2.Struts結構
在我們開始之前,先看看瀏覽器如何和Struts應用通信的。這些將在我們的Swing應用程序中體現。
◆Struts應用程序是由servlet接受到GET或POST請求開始的。
◆servlet決定調用哪個"action",是從URL中獲得信息的。
◆實現了Action的java類是在struts-config.xml中配置的。
◆ Struts的輸出由jsp來顯示,jsp的名字也在struts-config.xml文件中指定。
所以***個非瀏覽器應用需要能夠給servlet發送一個請求,并且能從jsp頁面得到響應。
3.The URLConnection class
使用URLConnection類能夠很簡單的使用java編寫servlet請求代碼。這個類很有趣,因為它有一些奇怪的設計。如果你想看看它的實現,我建議你讀一讀"Dodge the traps hiding in the URLConnection class".
如果想發送一個帶有"list"action的請求,并接受打印響應,你需要這樣寫代碼:
- URL url = new URL("http://myserver/project/list.do");
- URLConnection conn = url.openConnection();
- BufferedReader in =
- new BufferedReader(new InputStreamReader(conn.getInputStream()));
- String line;
- while ((line = in.readLine()) != null) {
- System.out.println(line);
- }
一般來講你通常需要在請求的同時發送一些數據--就像提交表單那樣。這些數據需要在你讀取響應前發送過去。
- URL url = new URL("http://myserver/project/list.do");
- URLConnection conn = url.openConnection();
- conn.setDoOutput(true);
- conn.setRequestProperty("user-agent","SWING");
- BufferedWriter out =
- new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
- out.write("name1=value1&name2=value2");
- out.flush();
- out.close();
- String c = conn.getHeaderField("Set-Cookie");
- BufferedReader in =
- new BufferedReader(new InputStreamReader(conn.getInputStream()));
- String line;
- while ((line = in.readLine()) != null) {
- System.out.println(line);
- }
這個例子同時也顯示了如何讀寫HTTP頭信息。
***個例子使用GET方法與HTTP通信,而第二個例子使用POST方法通信。你同樣可以使用GET方法來給servlet傳送數據,但是就必須要把數據加到URL里,像這樣:
- URL url = new URL("http://myserver/project/list.do?name1=value1&name2=value2");
4.Identifying the client
現在我們知道怎么發送和請求數據了,但是我們怎么接受數據呢?如果響應是給瀏覽器的,那響應里就包含了HTML或者還有JavaScript和樣式。對于我們的Swing客戶端,我們只需要數據。這將帶來一個新問題:Struts應用程序如何能識別出客戶端是一個瀏覽器,是個Swing還是其它什么呢?
一種解決辦法是在每個請求里添加參數時其能間鑒別出是哪種客戶端。我在第二個例子里已經使用了user-agent這個頭信息來使其識別出是個Swing客戶端。
當Struts應用程序準備好給客戶端返回數據時,它就會檢測user-agent的值,然后選擇適合客戶端的jsp頁面。這將會替代Struts Action類設置的跳轉信息。
- String client = (String)request.getHeader("user-agent");
- // Forward control to the list page
- if (client.equals("SWING"))
- return (mapping.findForward("swinglist"));
- else return (mapping.findForward("list"));
【編輯推薦】