国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Hibernate+Spring+Struts擴(kuò)展Struts

2019-11-18 12:59:17
字體:
供稿:網(wǎng)友

  簡介:
  我看到很多項目中,開發(fā)者實現(xiàn)了自己的MVC框架,并不是因為他們想做同Struts根本不同的東西,而是因為他們并沒有意識到如何擴(kuò)展Struts。開發(fā)自己的MVC框架可以獲得全部的控制權(quán),但是這也意味著需要很多資源來實現(xiàn)它(人力物力),在緊張的日程安排下,有時候這是不可能的。
  
  Struts不僅僅是一個強(qiáng)大的框架,同時它也是可擴(kuò)展的。你可以以三種方式來擴(kuò)展Struts。
  
  1、PlugIn:假如你想在application startup或shutdown的時候做一些業(yè)務(wù)邏輯的話,那就創(chuàng)建你自己的PlugIn類。
  
  2、RequestPRocessor:假如你想在請求被處理的過程中某個時刻做一些業(yè)務(wù)邏輯的話,那么創(chuàng)建你自己的RequestProcessor類。比如說,在每次請求執(zhí)行之前,你可以擴(kuò)展RequestProcessor來檢查用戶是否登陸了以及他是否有權(quán)限去執(zhí)行某個特定的action。
  
  3、ActionServlet:假如你想在application startup和shutdown的時候以及請求被處理的時候做某些業(yè)務(wù)邏輯,你也可以擴(kuò)張ActionServlet類。不過你應(yīng)當(dāng)在PlugIn和RequestProcessor都不能解決你的需求的時候來使用ActionServlet。
  
  在這篇文章中,我們將使用一個Struts應(yīng)用的示例來示范如何使用這三種方式來擴(kuò)展Struts。示例程序的代碼可以從http://www.onjava.com/onjava/2004/11/10/examples/sample1.zip下載。兩個擴(kuò)展Struts成功的范例是Struts自身的Validation和Tiles框架。
  
  我們假設(shè)你已經(jīng)比較熟悉Struts框架并且知道如何使用它創(chuàng)建一個簡單的應(yīng)用。假如你想知道更多關(guān)于Struts的內(nèi)容,請參考官方主頁。
  
  PlugIn
  
  PlugIn是一個接口,你可以創(chuàng)建一個實現(xiàn)該接口的類,當(dāng)application startup或shutdown的時候做些事情。
  
  比方說,我創(chuàng)建了一個使用Hibernate作為持久層的web應(yīng)用,我想當(dāng)應(yīng)用啟動的時候就初始化Hibernate,這樣子當(dāng)我的web應(yīng)用受到第一個請求的時候,Hibernate就已經(jīng)是配置好的并且可用的。同時我們想當(dāng)application關(guān)閉的時候關(guān)閉Hibernate。我們可以用一個Hibernate PlugIn來實現(xiàn)這個需求,通過如下的兩步:
  
  1、創(chuàng)建一個類實現(xiàn)了PlugIn接口:
  
  public class HibernatePlugIn implements PlugIn{
  private String configFile;
  // This method will be called at application shutdown time
  public void destroy() {
  System.out.println("Entering HibernatePlugIn.destroy()");
  //Put hibernate cleanup code here
  System.out.println("Exiting HibernatePlugIn.destroy()");
  }
  //This method will be called at application startup time
  public void init(ActionServlet actionServlet, ModuleConfig config)
  throws ServletException {
  System.out.println("Entering HibernatePlugIn.init()");
  System.out.println("value of init parameter " +
  getConfigFile());
  System.out.println("Exiting HibernatePlugIn.init()");
  }
  public String getConfigFile() {
  return name;
  }
  public void setConfigFile(String string) {
  configFile = string;
  }
  }
  
  實現(xiàn)PlugIn接口的類必須完成兩個方法:init()和destroy()。當(dāng)application startup的時候init()方法被調(diào)用,當(dāng)shutdown的時候destroy()方法被調(diào)用。Struts還答應(yīng)給你的PlugIn類傳遞初始化參數(shù)。為了傳遞參數(shù),你必須在PlugIn類中為每一個參數(shù)創(chuàng)建JavaBean式的setter方法。在我們的HibernatePlugIn類中,我會把configFile的name作為參數(shù)傳進(jìn)去,而不是硬編碼到程序中。
  
  2、在struts-config.xml中添加如下的代碼來通告Struts有新的PlugIn:
  
  <struts-config>
  ...
  <!-- Message Resources -->
  <message-resources parameter= "sample1.resources.ApplicationResources"/>
  
  <!-- Declare your plugins -->
  <plug-in className="com.sample.util.HibernatePlugIn">
  <set-property property="configFile" value="/hibernate.cfg.xml"/>
  </plug-in>
  </struts-config>
  
  屬性className是實現(xiàn)了PlugIn接口的類的全限定名。對于每一個初始化參數(shù),可以使用<set-property>元素傳遞參數(shù)。在我們的例子中,我要把config文件的名字傳進(jìn)去,所以使用了一個帶有配置文件路徑的<set-property>。
  
  Struts的Tiles和Validator框架都使用PlugIn來讀取配置文件進(jìn)行初始化。另外兩件PlugIn可以幫你做到的事情是:
  
  假如你的application依靠于某些配置文件,那么你可以在PlugIn類中檢查它們是否可用,假如不可用的話拋出一個ServletException,這樣就可以使ActionServlet變?yōu)椴豢捎谩?br />  
  PlugIn接口的init()方法是你可以改變ModuleConfig的最后機(jī)會,ModuleConfig是一組靜態(tài)配置信息的集合,用來描述基于Struts模塊。Struts將會在所有PlugIn處理完后釋放ModuleConfig。
  
  Request是如何被處理的
  ActionServlet是Struts框架中唯一的Servlet,它負(fù)責(zé)處理所有request。無論何時接收到一個request,它都會先嘗試為當(dāng)前的request尋找一個sub-application。一旦一個sub-application被找到,ActionServlet就會為那個sub-application創(chuàng)建一個RequestProcessor對象,調(diào)用這個對象的process()方法并把HttpServletRequest和HttpServletResponse對象傳入。
  
  RequestProcessor.process()就是大部分request被處理的地方。process()方法使用了Template Method模式實現(xiàn),其中有很多獨立的方法來執(zhí)行請求處理的每一步驟,這些方法將會在process方法中依次被調(diào)用。比如,將會有一個獨立的方法用來尋找當(dāng)前request對應(yīng)的ActionForm類,一個方法來檢查當(dāng)前用戶是否有執(zhí)行action mapping所必須的權(quán)限。這些給與我們極大的靈活性。在發(fā)布的Struts包中有一個RequestProcessor類提供了請求處理每一步驟的默認(rèn)實現(xiàn)。這就意味著你可以僅僅重寫你感愛好的方法,其它的使用默認(rèn)的實現(xiàn)。舉例來說,默認(rèn)地Struts調(diào)用request.isUserInRole()來檢查用戶是否有權(quán)限執(zhí)行當(dāng)前的ActionMapping;這時假如你想通過查詢數(shù)據(jù)庫來實現(xiàn),你所要做的就是重寫processRoles()方法,通過查詢出的用戶是否擁有必須的權(quán)限來返回true或false。
  
  首先我們將會看到缺省情況下,process()方法是如何實現(xiàn)的,然后我將會具體解釋默認(rèn)的RequestProcessor類中的每一個方法,這樣你就可以決定哪一部分是你想要改變的。
  
  public void process(HttpServletRequest request,HttpServletResponse response)
  throws IOException, ServletException {
  // Wrap multipart requests with a special wrapper
  request = processMultipart(request);
  // Identify the path component we will
  // use to select a mapping
  String path = processPath(request, response);
  if (path == null) {
  return;
  }
  if (log.isDebugEnabled()) {
  log.debug("Processing a '" + request.getMethod() + "' for path '" + path + "'");
  }
  // Select a Locale for the current user if requested
  processLocale(request, response);
  // Set the content type and no-caching headers
  // if requested
  processContent(request, response);
  processNoCache(request, response);
  // General purpose preprocessing hook
  if (!processPreprocess(request, response)) {
  return;
  }
  // Identify the mapping for this request
  ActionMapping mapping =
  processMapping(request, response, path);
  if (mapping == null) {
  return;
  }
  // Check for any role required to perform this action
  if (!processRoles(request, response, mapping)) {
  return;
  }
  // Process any ActionForm bean related to this request
  ActionForm form = processActionForm(request, response, mapping);
  processPopulate(request, response, form, mapping);
  if (!processValidate(request, response, form, mapping)) {
  return;
  }
  // Process a forward or include specified by this mapping
  if (!processForward(request, response, mapping)) {
  return;
  }
  if (!processInclude(request, response, mapping)) {
  return;
  }
  // Create or acquire the Action instance to
  // process this request
  Action action =
  processActionCreate(request, response, mapping);
  if (action == null) {
  return;
  }
  // Call the Action instance itself
  ActionForward forward = processActionPerform(request, response,action, form, mapping);
  // Process the returned ActionForward instance
  processForwardConfig(request, response, forward);
  }
  
  1、processMutipart():在這個方法中,Struts將會讀取request來檢查request的contentType是否是multipart/form-data。假如是的話,將會解析request并且將之包裝到HttpServletRequest中。當(dāng)你創(chuàng)建了一個Html FORM用來提交數(shù)據(jù),那么request的cont

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 聂拉木县| 邵武市| 鄱阳县| 姚安县| 靖边县| 任丘市| 日喀则市| 邛崃市| 务川| 台南县| 岚皋县| 那坡县| 乌鲁木齐市| 清丰县| 金乡县| 东安县| 通许县| 和平县| 连平县| 高淳县| 渭南市| 同江市| 新源县| 夏津县| 金阳县| 玉门市| 兴城市| 阿瓦提县| 惠州市| 上思县| 石渠县| 丘北县| 轮台县| 拉萨市| 丰顺县| 台南县| 乌拉特后旗| 类乌齐县| 阿拉善左旗| 年辖:市辖区| 郸城县|