java的映射機制__java
來源:互聯網
上載者:User
java的映射機制和xml在Strutszhjong的應用
1. 問題描述
在java開發的web應用當中我們要經常地用到對資料庫的訪問,但是在開發當中可能會遇到很多的問題,比如使用者輸入的字串不合法,插入資料格式不對,網路連接中斷等一系列的問題,java提供了異常處理的機制,這大大的簡化了開發人員的代碼量,以提供了很好的代碼品質和程式的健壯性,在struts中我們開發程式一般要有一些基本的東西,比如說要有struts-conf.xml檔案老對程式的流程進行配置,actionForm老儲存資料的傳遞,Action來處理常式業務處理,雖然我們可以在actionForm中來驗證請求資料和合法性,但是在背景程式在運行時我們不知道會有什麼意想不到情況的發生,只在actionForm中進行驗證時不一定可以杜絕非法情況的發生的,我們可以在後台來進行處理,這個時候我們引出了java的映射機制,當然在struts中用到映射機制還不僅僅有助於我們對異常的處理,還在於這樣可以提高我們的開發速度,還可以較少action和actionForm的數量,雖然struts也有這方面的類,但我覺得還不夠好,還不可以簡化我們的工作。同時,在開發有高的安全性的系統的時候,如何保證資訊的安全漸漸的成為了開發人員的課題,一般的方式是直接用到request對象來傳遞表但到背景資料,在struts中使用的actionForml來完成的,但是我們有沒有別的方法那,答案是肯定的,那就是xml,下面,我就java的映射機制和xml在Strutszhjong的應用來展開討論,如有不對的地方敬請斧正.
2.java 的映射機制
java 是不支援動態語言的,雖然最近傳聞sun公司將在下一個jvm中添加動態語言的特性,但是現在我們還沒有辦法適用,不過還好,因為java中的映射機制可以讓我們來完成動態程式,實事上java的映射機制就是及時地滿足了我們開發的需要,也對我們使用動態語言奠定了一定的思維基礎.java的映射機制在我們開發中我們是這樣的來使用的.我想評鑑一個情境:加入你要為一個教育機構建立一個平台,使用的是java和Struts,在開發當中我們要為每個頁面開發action,在action中我們要進行必要的業務,現在我們要開發對學生管理工作,b包括對學生資訊的增加,修改和刪除,我們要將建立3個action和3個actionForm(後者是一個actionForm),再不然就是建立一個action和一個actionForm,當然我們就要繼承DispatchAction,利用DispatchAction開發struts真的是很方便的,我在這裡要聲明,這個類的確很好用,我並不反對你不使用它,不過在這裡我只是找到了一種更好的方法而已。要實現這三個業務我們必定要將牽涉到對資料庫的操作,我們不能保證對資料庫的操作會不會有異常,常規的方式就是我們在這裡直接的捕獲異常並返回出錯頁面,在這裡我並不打算這麼做,原因就是我認為我推薦的方法是更好的一種方式,要實現我的這個架構我們第一步將是建立一個類,代碼如下:
import java.lang.reflect.*;
import java.io.IOException;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
public class BaseAction extends Action
{ public ActionForward perform(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
String methodName="";
try
{
String actionMethod = request.getParameter("actionMethod"); // 客戶那裡傳來的要調用那一個方法
// 根據Form的action調用不同的方法。
// 擷取方法名
methodName = "do" + actionMethod;
// 利用反射調用相應方法
Class[] param = {
Class.forName("org.apache.struts.action.ActionMapping"),
Class.forName("org.apache.struts.action.ActionForm"),
Class.forName("javax.servlet.http.HttpServletRequest"),
Class.forName("javax.servlet.http.HttpServletResponse")};
Object[] obj = {mapping, form, request, response};
Method method = this.getClass().getMethod(methodName, param);
ActionForward forward = (ActionForward)method.invoke(this, obj);
saveToken(request);
return forward;
}
catch(NoSuchMethodException ee)
{
request.setAttribute("error",ee);
// 來傳遞異常
return processForwardByException(mapping, ee, request, response);
}
}
}
在我們鞋每一個action的時候都繼承這個類,而在類裡邊直接的寫自己的方法就可以了,同時還可以達到幾個jsp頁面公用一個action的目的,是不是有點像DispatchAction那,的確非常的類似歐.不過我們發現,在這各類裡邊我們捕獲了異常,這就意味著我們在實現我們方法的時候不用考慮會有什麼異常,我們只要拋出就可以了,這就減少和很多的捕獲代碼,我們可以看到,我們在捕獲的異常之後還把它放到了request當中,這樣就可以在jsp裡直接的得到他了,很方便的給使用者提示是什麼原因讓該操作沒有執行成功,是不是很酷。
那麼我們再來看看我們為什麼要用映射那。
不是很好回答,加入你使用過php的話,你就會明白動態語言的巨大潛力,在php當中根本不需要什麼映射,雖然也有這種機制,但是我認為他並不需要,在php中他還有很多的函數和自訂函數,加入我們不知道什麼時間要調用那一個函數,或者要調用的函數時表單傳來的一個參數,我們可以這樣的萊處理,看下面代碼片斷
<?php
$moth=$_Post("moth");
// 我們要調用名字是$moth值得方法,我們只要這麼做就可以了
$moth();
?>
假定我們的url是http://127.0.0.1/test.php?moth=Show,那麼在程式中將會執行Show()這個方法,這在java總是不可以的,我們只有使用映射的機制,他就是這樣在不經意之間給我們很大的自由,我們不需要寫一大堆的if或者是switch就可以很輕鬆的執行我們希望的代碼,提高了程式的靈活性,在我們添加了一個新了類後,只要放到web伺服器上,我們就會馬上看到效果,因為web的緩衝當中沒有這個類,這樣就解決了當我們把新的東西放到web伺服器後不能馬上反應出來,只有重新啟動伺服器後者是手動清除緩衝才可以的問題。
3 xml 在web開發中的應用。
的確,現在xml很流行,webservic的發展更是推動的他的發展,更有一些人斷言xml將會取代html,今天我不但算講究xml在webservic中的發展,而是就一個方面來談他的價值。
還是我們先假設一個情境:假定有一個銀行要做一個系統,無論如何她也不希望使用者看到他的後台返回來的未經處理資料,我們該如何做那,頁面和資料分離會是一個好的選擇阿,我們這樣就可以大膽的使用xml。當然這是由前提的,你必須對xml的解析有瞭解,不論你是採用dom還是xsl後者是xpath都無所謂,反正就是實現了頁面和資料的分離。一般的使用者就不可以簡單的參看原始碼而分析出你返回客戶的資料了。
4 總結
java 映射機制和xml在web開發中不僅於此,java的映射機制在一些開元的架構重用的十分的多,最出名的spring,struts,hibnater都用到的java的反射機制,可見他的功能給使用者很大的自由度,xml在面對資料的封裝,格式化,傳輸體現的優點就更多了,具體可以參考soap方面的書籍來對xml有更深刻的理解,這裡就不敘述了。