欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
在你的企業(yè)級java應用中使用Drools

摘要:

Drools 是一個(gè)基于Charles Forgy‘s的Rete算法的,專(zhuān)為Java語(yǔ)言所設計的規則引擎。Rete算法應用于面向對象的接口將使基于商業(yè)對象的商業(yè)規則的表達更為自然。Drools是用Java寫(xiě)的,但能同時(shí)運行在Java和.Net上。這篇文章將向你展示如何在企業(yè)級Java應用中使用Drools.

 
在你的企業(yè)級java應用中使用Drools

作者:Paul Browne

08/24/2005

翻譯:simmone


版權聲明:可以任意轉載,轉載時(shí)請務(wù)必以超鏈接形式標明文章原始出處和作者信息及本聲明
原文地址:
http://www.onjava.com/pub/a/onjava/2005/08/24/drools.html
中文地址:
http://www.matrix.org.cn/resource/article/43/43782_Drools.html
關(guān)鍵詞: Drools J2ee


什么是Drools
(譯者增加:什么是Drools, 摘自drools.org)
Drools 是一個(gè)基于Charles Forgy‘s的Rete算法的,專(zhuān)為Java語(yǔ)言所設計的規則引擎。Rete算法應用于面向對象的接口將使基于商業(yè)對象的商業(yè)規則的表達更為自然。Drools是用Java寫(xiě)的,但能同時(shí)運行在Java和.Net上。

Drools
Drools 被設計為可插入式的語(yǔ)言實(shí)現。目前規則能用Java, Python和Groovy實(shí)現。更為重要的是,Drools提供了聲明式程序設計(Declarative Programming),并且使用域描述語(yǔ)言(Domain Specific Languages (DSL))-專(zhuān)為你的問(wèn)題域定義了某種模式的Xml, 它已經(jīng)足夠靈活到可以用來(lái)描述你的問(wèn)題域。DSLs包含的XML元素(Element)和屬性(Attribute)代表了問(wèn)題域中各種要素。

(原文開(kāi)始)
這段時(shí)間企業(yè)級Java簡(jiǎn)直能讓你睡著(zhù)。有多少J2EE-EJB應用程序只是從網(wǎng)頁(yè)提取數據并把它們存入到數據庫中?但開(kāi)發(fā)者真正應該開(kāi)發(fā)和維護的卻是他們應用程序中復雜的商業(yè)邏輯。這個(gè)問(wèn)題不僅僅適用于將要新應用,而且漸漸地,也適用于那些長(cháng)期運行的商業(yè)核心應用,它們的內部邏輯也需要經(jīng)常改變,而且往往要求在一個(gè)非常短的時(shí)間內。

在以前的文章中,“用Drools讓你的商業(yè)邏輯使用框架”,我介紹了Drools框架,展示了它如何用來(lái)組織復雜的商業(yè)邏輯。Drool用一組簡(jiǎn)單的,眾所周知的事物替換了許多纏雜的if…then表達式。如果你經(jīng)歷過(guò)和商業(yè)客戶(hù)的會(huì )議,并為他們提出的想要實(shí)現的東西的復雜程度搞得頭痛,或許你應該考慮一下像Drools這樣的規則引擎了。這篇文章將向你展示如何在企業(yè)級Java應用中使用Drools.

一路到底的框架

大多數開(kāi)發(fā)者都有自己喜愛(ài)的框架。無(wú)特定順序,它們包括表現層框架(Struts, JSF, Cocoon和Spring),持久化框架(JDO, Hibernate, Cayenne and Entity Beans)以及結構框架(EJB, 又是Spring, Pico和Excalibur), 還有其它很多。每種框架都各有所長(cháng),給開(kāi)發(fā)者提供子許多“即開(kāi)即用”的功能。使用框架來(lái)部署應用意味著(zhù)你避免了許多讓人厭煩的細節,讓你集中注意力到關(guān)鍵之處。
到目前為直,在框架所能做的事中仍然有一個(gè)缺口,那就是商業(yè)邏輯沒(méi)有框架。像EJB和Spring這樣的工具雖好,但它們卻幾乎沒(méi)有提及怎么組織你的那些if …then語(yǔ)句。把Drools加到你的開(kāi)發(fā)工具箱中意味著(zhù)現在你可以“一路到底”的使用框架來(lái)構建你的應用程序。圖1顯示了這樣的一個(gè)應用


圖1. 用于Java應用的框架

這篇文章將基于我們已經(jīng)了解的Drools框架的功能,這些功能可以讓我們構建這樣的一個(gè)應用。]

我什么時(shí)候應該使用規則引擎?
“如果你有一把錘子,那所有的東西都看起來(lái)都像釘子”,這句話(huà)在軟件工程領(lǐng)域幾乎成了陳詞濫調了。雖然規則引擎能解決我們的許多問(wèn)題,但確實(shí)值得認真考慮一下規則引擎對我們的企業(yè)級Java應用是否合適。需要問(wèn)的問(wèn)題有:

我的應用程序有多復雜?對于那些只是把數據從數據庫中傳入傳出,并不做更多事情的應用程序,最好不要使用規則引擎。但是,當在Java中有一定量的商業(yè)邏輯處理的話(huà),可以考慮Drools的使用。這是因為很多應用隨著(zhù)時(shí)間的推移越來(lái)越復雜,而Drools可以讓你輕松應對這一切。

我的應用的生命周期有多久?這個(gè)問(wèn)題的正確答案往往是“令人驚訝的長(cháng)”――還記得那些認為他們的程序不會(huì )茍活到2000年的大型機的程序員嗎?使用規則引擎將會(huì )在中長(cháng)期得到好處。像這篇文章所展示的那樣,甚至原型都能從Drools與靈活方法的組合中獲益,讓“原型系統”轉化成生產(chǎn)系統。

我的應用需要改變嗎?唯一能確定的是你的需求將會(huì )改變,無(wú)論是在開(kāi)發(fā)過(guò)程中或是在開(kāi)發(fā)完成以后。Drools使用一個(gè)或多個(gè)簡(jiǎn)單易配的XML文件幫你來(lái)應對這一切。

那么性能呢?
如果你正在寫(xiě)一個(gè)企業(yè)級應用,很有可能它會(huì )擴展到成百(如果不是成千)的用戶(hù)。你已經(jīng)知道現有的Java和J2EE應用能做到這一點(diǎn),但一個(gè)使用了Drools的應用對這一壓力的表現如何?答案是:“令人吃驚的好”。大多數開(kāi)發(fā)者只是因為不愿“失控”而依賴(lài)于他人的代碼(比如:某種框架),想想這個(gè):Drools不僅可以讓你的應用和“傳統”的編程方法一樣快,甚至可以更快,看下面:

避免糟糕的代碼:Drools引導開(kāi)發(fā)者去做“正確的事”。你可以確定你正在寫(xiě)的代碼是好的,但你的開(kāi)發(fā)伙伴呢?你可以同樣這樣說(shuō)嗎?使用框架可以讓你更輕松地寫(xiě)出更快,更好的代碼。

優(yōu)化過(guò)的框架:你有多少次看見(jiàn)商業(yè)邏輯重復地從數據庫中提取相同的信息,從而降低了整個(gè)應用的速度?如果正確使用的話(huà),Drools不僅僅能夠記住信息,而且還能記住以往使用該信息進(jìn)行測試的結果,從而大幅提升應用的速度。

Rete算法:很多次我們并不是真正需要使用“if”條件。被Drools實(shí)現的Rete算法,可以用一個(gè)優(yōu)化的方法替換掉所有的“if…then”表達式。需要重點(diǎn)提及的是:Rete算法在使用更多的內存來(lái)降低運行時(shí)延遲方面作了折衷。當然這在現代的應用服務(wù)器中并不是一個(gè)問(wèn)題,我們也并不推薦你在移動(dòng)手機上使用Drools!

我們到哪里了?

在我們上一篇文章中,我們寫(xiě)了一個(gè)基于Drools引擎的簡(jiǎn)單的股票交易程序。我們實(shí)現了不同的商業(yè)規則,展示了我們可以如何迅速地改變規則去適應商業(yè)需求,并且JUnit測試給了我們高度自信可以確認系統確實(shí)是像我們設想的那樣運作的。但是這個(gè)應用幾乎沒(méi)有用戶(hù)介面,而且用硬編碼代替了數據庫。為了把我們的程序提升到企業(yè)級的水平,我們需要增加兩個(gè)主要的東西。

● 某種用戶(hù)介面,最理想的是基于標準的Web表現層的框架。
● 一個(gè)數據存取對象(DAO)讓Drools與數據庫(或其它后端)交互。

從現有表現框架中實(shí)現規則引擎

大多數企業(yè)級Java應用是通過(guò)Web介面進(jìn)行交互的,其中最被廣泛使用的Web表現層框架是Apache的Struts。理想的結果是:我們寫(xiě)的應用可以從表現層知道它下面的應用層,而不是通過(guò)相反的方向。它的好處在于不僅僅可以使我們將來(lái)變換其它的表現層(比如Ajax或web service界面),而且意味著(zhù)示例代碼可以非常容易地應用于其它像Spring的框架。

下面的代碼片斷演示了始何從Web表現層調用商業(yè)邏輯(通過(guò)規則引擎),并根據返回結果顯示不同的頁(yè)面。這一例子中,我們使用了一個(gè)Struts行為,但其代碼是和使用其它表現層框架甚至一個(gè)Servlet或一個(gè)Jsp頁(yè)面是很類(lèi)似的。這個(gè)片斷使用了struts-config.xml配置文件,JSP頁(yè)面來(lái)上傳/顯示數據,并且生成WAR文件來(lái)進(jìn)行布署。片斷展示了怎樣把規則引擎和web框架集成使用。

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import BusinessLayer;
/**
* Sample Struts action with Pseudocode
* 使用偽代碼的Struts行為示例
*/
public class SampleStrutsAction extends Action{
      
  /**
   * Standard Struts doPerfom method
   * 標準的Struts doPerform方法
   */
  public ActionForward doPerform(
                ActionMapping mapping,
                    ActionForm form,
                    HttpServletRequest request,
                    HttpServletResponse response)
        throws InvalidEntryPointException {
//Local Variables
//本地變量
    StockOffer userOffer =null;
        
//Get any previous values from the session
//從session取得以前的數據
    userOffer=(StockOffer)request.getSession()
           .getAttribute("PREVIOUS_STOCK_OFFER");
                
//create this object if it is null
//如為null則創(chuàng )建新對象
    if (null==userOffer){
      userOffer = new StockOffer();
    }
//Update with the incoming values
//用上送的數據更新
//These values match those on the form      
//這些數據是與form中的數據相對應的
    userOffer.setStockName(request.
                getParameterValue("STOCK_NAME"));
    userOffer.setStockPrice(request
               .getParameterValue("STOCK_PRICE"));
    userOffer.setStockQuantity(request
               .getParameterValue("STOCK_QTY"));
                                
//Reset the output value
//重置輸出數據
    userOffer.setRecommendPurchase(null);
//Call the Business Layer
//調用商業(yè)層
    BusinessLayer
              .evaluateStockPurchase(userOffer);        
                
//Forward to the appropriate page
//轉向合適的頁(yè)面
    if ("YES".equals(
      testOffer.getRecommendPurchase()){
        return mapping.findForward("YES_WEB_PAGE");
    }
//otherwise default to the no page
//否則指向無(wú)此頁(yè)面
          return mapping.findForward("NO_WEB_PAGE");
  }
}


這個(gè)例子包含了幾個(gè)東西。經(jīng)常,我們需要的數據是用戶(hù)通過(guò)好幾個(gè)網(wǎng)頁(yè)傳來(lái)的,因此在這一例子中展示了通過(guò)session中的StockOffer對象來(lái)保存過(guò)去以來(lái)的數據。

下一步,如果用戶(hù)改變了一些值,我們更新StockOffer對象。然后我們重置了rcommendPurchase標志用以在調用商業(yè)邏輯層之前清除以前的結果。最后我們使用商業(yè)邏輯層的返回來(lái)決定讓用戶(hù)轉向哪一頁(yè)面。

在這一例子中,需要注意我們將商業(yè)邏輯(買(mǎi)或不買(mǎi)一支股票)與表現層邏輯(決定轉向哪一頁(yè)面)分離開(kāi)來(lái)。這將使我們可以在不同的應用中重用我們的商業(yè)規則。另外,看一下?tīng)顟B(tài)信息(用戶(hù)已經(jīng)告知我們的東西)是存儲在Session中的StockOffer對象中的,并沒(méi)有在商業(yè)層中。這樣就保證了商業(yè)層的無(wú)狀態(tài)性,這將使整個(gè)應用更具擴展性和性能。

集成規則引擎與數據庫層

到目前為止,我們的應用已經(jīng)有一個(gè)web表現層和一個(gè)商業(yè)層的規則引擎,但還沒(méi)有方法與數據庫進(jìn)行交互。這一節的例子將展示如何實(shí)現。我們的例子是基于數據訪(fǎng)問(wèn)對象(DAO)模式的,它把所有與數據庫(或后端數據源)交互的代碼包裝在了一個(gè)可插入,可配置的類(lèi)中。同樣的,這一例子一樣適用于其它持久性框 架,比如Hibernate和Cayenne。
關(guān)于如何組織數據導有幾個(gè)要點(diǎn):

● 應該只有商業(yè)層與數據層交互。如果表現層(前端)需要一些數據,它首先應通過(guò)商業(yè)層。這將使我們的代碼更容易組織和閱讀。
● 盡可能地,我們應讓我們的數據層無(wú)狀態(tài)-我們應該在其它的地方存放客戶(hù)端數據(比如:web前端的session,就像前面的例子)。這不同于我們可以在這一層做的數據緩存。兩者的區別在于狀態(tài)信息經(jīng)常是用戶(hù)定義的,而我們在數據層緩存的數據應該是整個(gè)應用共享的。這樣的層次提升了性能。
● 我們應該讓商業(yè)邏輯決定數據是否需要――如不需要,提取數據的調用就不應該執行。

為了實(shí)現我們簡(jiǎn)單的數據訪(fǎng)問(wèn)對象,我們創(chuàng )建三個(gè)新對象:StockNameDao, DaoImplementation,和 DaoFactory

StockNameDao是一個(gè)定義了兩個(gè)方法的接口:getStockName()返回一個(gè)我們可以處理的股票名稱(chēng)的列表,isOnStockList()檢查一個(gè)給定的股票是否在處理列表中。我們的商業(yè)層在需要這些信息時(shí)會(huì )調用這些方法。

DaoImplementation是StockNameDao的一個(gè)實(shí)現。這里的數據是硬編碼的,但我們可以通過(guò)查詢(xún)數據庫或通過(guò)像Bloomberg這樣的web service提取信息。

DaoFactory我們用來(lái)生成合適的StockNameDao實(shí)例。不直接創(chuàng )建對象而使用這一小驟的好處在于,它充許我們在運行時(shí)刻決定使用哪一個(gè)DAO實(shí)現(這是像Spring這樣的框架特別擅長(cháng)的).一個(gè)factory(工廠(chǎng))可以返回多種類(lèi)型的DAO(比如:StockNameDao, StockPriceDao, StockHistoryDao),這意味著(zhù)我們可以通過(guò)我們的DaoFactory,讓規則自己決定需要什么數據和DAO.

這是StockNameDao接口:

/**
* Defines a Data Access Object - a non data
* source specific way of obtaining data.
* 定義一個(gè)數據存取對象-一種非數據源獲取數據的方法
*/
public interface StockNameDao {
  /**
   * Get a list of stock names for the application
   * @return String[] array of stock names
   * 得到一個(gè)股票名字的列表
   * 返回股票名稱(chēng)的String[]數組
   */
  public String [] getStockNames();
        
  /**
   * Check if our stock is on the list
   * 檢查股票是否在列表中
   * @param stockName
   * @return
   */
  public boolean isOnStockList(String stockName);
}
And here‘s the DaoImplementation:
這是DaoImplementation:

/**
* Concrete Definition of a Data Access Object
* 數據存取對象的具體定義
*/
public class DaoImplementation
                        implements StockNameDao {
  /**
   * Constructor with package level access only
   * to encourage use of factory method
   * 這里的構造器只是讓你使用工廠(chǎng)(factory)方法
   */
  DaoImplementation(){}
  /**
   * Get a list of stock names for the app.
   * This is a hard coded sample
   * normally we would get this from
   * a database or other datasource.
   * 得到一個(gè)股票名字的列表,這只是一個(gè)硬編碼的例子,一般來(lái)
  * 說(shuō)我們應該從數據庫或其它數據源取得數據
   * @return String[] array of stock names
   */
  public String[] getStockNames() {
    String[] stockNames=
      {"XYZ","ABC","MEGACORP","SOMEOTHERCOMPANY"};
  
    return stockNames;
  }
        
  /**
   * Check if our stock is on the list
   * 檢查我們的股票是否在列表中
   * @param stockName
   * @return true / false as appropriate
   */
  public boolean isOnStockList(String stockName){
                
//Get our list of stocks  
//獲取股票列表          
    String stockList[] = getStockNames();
                
    //Loop and see if our stock is on it
// done this way for clarity . not speed!
//循環(huán)看股票是否存在,這樣做是為了清晰不是速度!
    for (int a=0; a<stockList.length;a++){
        if(stockList[a].equals(stockName)){
          return true;
        }
    }
                
    //Default return value
    return false;      
  }
}


簡(jiǎn)單的DaoFactory,只是返回DaoImplementation:

package net.firstpartners.rp;
/**
* Factory Method to get the Data Access Object.
* Normally we could replace this with a
* framework like Spring or Hibernate
* 得到數據存取對象的工廠(chǎng)方法,通常我們可以將它替換為像Spring或
*  Hibernatte這樣的框架
*/
public class DaoFactory {
  /**
   * Get the stock name Dao
   * This sample is hardcoded - in reality
   * we would make this configurable / cache
   * instances of the Dao as appropriate
   * 得到股票名字的Dao,這個(gè)例子是硬編碼的-實(shí)際上我們可以讓它成為
  * 可配的,緩存的合適的Dao對象。
   * @return an instance of StockNameDao
   */
  public static StockNameDao getStockDao(){
        return new DaoImplementation();
  }
}


現在我們有了簡(jiǎn)單的DAO實(shí)現來(lái)作為我們的數據庫層,那如何將它與Drools商業(yè)層集成在一起呢?最新的商業(yè)規則文件,BusinessLayer.xml將會(huì )向我們展示:

<?xml version="1.0"?>
<rule-set name="BusinessRulesSample"
  xmlns="http://drools.org/rules"
  xmlns:java="http://drools.org/semantics/java"
  xmlns:xs="
        http://www.w3.org/2001/XMLSchema-instance"
  xs:schemaLocation="
        http://drools.org/rules rules.xsd
  http://drools.org/semantics/java java.xsd">
  <!-- Import the Java Objects that
                        we refer to in our rules -->
<!-- 導入規則中使用的對象 -->
  <java:import>
    java.lang.Object
  </java:import>
  <java:import>
    java.lang.String
  </java:import>
  <java:import>
    net.firstpartners.rp.StockOffer
  </java:import>
  <java:import>
    net.firstpartners.rp.DaoFactory
  </java:import>
  <java:import>
    net.firstpartners.rp.StockNameDao
  </java:import>
  <!-- Application Data not associated -->
  <!-- with any particular rule -->
  <!-- In this case it‘s our factory -->
  <!-- object which gives us back -->
  <!-- a handle to whatever Dao (Data -->
  <!-- access object) that we need -->
  <!-- 沒(méi)有和任何規則聯(lián)系的應用數據,這里是我們的工廠(chǎng)對象,-->
  <!—它向我們提供向后的操作,告訴我們什么Dao 是我們需要的。-->

  <application-data
    identifier="daoFactory">DaoFactory
  </application-data>
  <!-- A Java (Utility) function -->
<!-- 一個(gè)Java方法 -->
  <!-- we reference in our rules -->  
  <!-- 在我們的規則中打印跟蹤信息 -->    
  <java:functions>
    public void printStock(
      net.firstpartners.rp.StockOffer stock)
      {
          System.out.println(
          "Name:"+stock.getStockName()
          +" Price: "+stock.getStockPrice()    
          +" BUY:"+stock.getRecommendPurchase());
      }
  </java:functions>
  <!-- Check for XYZ Corp-->  
<!-- 檢查XYZ公司 -->    
  <rule name="XYZCorp" salience="-1">
    <!-- Parameters we can pass into-->
<!-- the business rule -->
<!-- 可以傳入規則中的參數 -->
    <parameter identifier="stockOffer">
      <class>StockOffer</class>
    </parameter">
    <!-- Conditions that must be met for -->
<!-- business rule to fire -->  
<!-- 激活規則必須滿(mǎn)足的條件 -->      
    <java:condition>
      stockOffer.getStockName().equals("XYZ")
    </java:condition>
    <java:condition>
      stockOffer.getRecommendPurchase() == null
    </java:condition>
    <java:condition>
      stockOffer.getStockPrice() > 10
    </java:condition>
        
    <!-- What happens when the business -->
<!-- rule is activated -->
<!-- 規則激活后執行的步驟 -->
    <java:consequence>
        stockOffer.setRecommendPurchase(
        StockOffer.NO);
        printStock(stockOffer);
    </java:consequence>
  </rule>
  <!-- Ensure that negative prices -->
  <!-- are not accepted -->  
  <!-- 確定負數不被接受 -->    
  <rule name="Stock Price Not Negative">
    <!-- Parameters we can pass into the -->
<!-- business rule -->
<!-- 可以傳入規則中的參數 -->  
    <parameter identifier="stockOffer">
      <class>StockOffer</class>
    </parameter>
<!-- Conditions for rule to fire -->
<!-- 激活規則必須滿(mǎn)足的條件 -->    
    <java:condition>
      stockOffer.getStockPrice() < 0
    </java:condition>
  
<!--When rule is activated then ... -->
<!-- 規則激活后執行的步驟 -->
    <java:consequence>
      stockOffer.setRecommendPurchase
        (StockOffer.NO);        
      printStock(stockOffer);
    </java:consequence>
  </rule>
  <!-- Check for Negative Prices-->  
<!-- 尋找低價(jià) -->    
  <rule name="Stock Price Low Enough">
  <!-- Parameters for the rule -->
<!-- 可以傳入規則中的參數 -->
    <parameter identifier="stockOffer">
      <class>StockOffer</class>
    </parameter>
    
<!-- Now uses Dao to get stock list -->
<!-- 現在使用Dao獲取股票列表 -->
    <java:condition>
      daoFactory.getStockDao().isOnStockList(
        stockOffer.getStockName())
    </java:condition>
        
    <java:condition>
      stockOffer.getRecommendPurchase() == null
    </java:condition>
    <java:condition>
      stockOffer.getStockPrice() < 100
    </java:condition>
<!-- When rule is activated do this -->
<!-- 規則激活后執行的步驟 -->
    <java:consequence>
        stockOffer.setRecommendPurchase(
          StockOffer.YES);      
          printStock(stockOffer);
    </java:consequence>
  </rule>
</rule-set>


為了與數據訪(fǎng)問(wèn)層集成,該文件(相對于上一篇文章)有幾處改變:
● 在最上面,我們有幾個(gè)新的<java:import>來(lái)把StockNameDao, DaoImplementation, 和 DaoFactory類(lèi)引入系統。
● 我們有一個(gè)新的標記<application-data>,它把DaoFactory的實(shí)例賦給一個(gè)變量。<application-data>標記類(lèi)似于參數,只不過(guò)它是運用于所有商業(yè)規則,而不只是一個(gè)。
● “股價(jià)足夠低”的規則有一個(gè)新條件,它用DaoFactory和StockNameDao來(lái)檢查股票是否在處理列表中。

我們又一次運行BusinessRulesTest(模擬器)。模擬單元測試沒(méi)有問(wèn)題,既使我們改變了程序的結構,我們仍然沒(méi)有改變它在做什么。從輸出的日志來(lái)看,我們可以看到我們的商業(yè)規則使用StockNameDao作為他們評估的一部份,并且DaoImplementation.isOnStockList()被調用了。
雖然這個(gè)例子展示的是從數據源讀取信息,其實(shí)寫(xiě)信息也是一樣的原理。如果某個(gè)規則決定應該做的話(huà)。區別在于我們的DAO將會(huì )有一些setSomeInformation()的方法,一旦條件滿(mǎn)足,這個(gè)方法將會(huì )在商業(yè)規則的<java:consequence>部分被調用。

總結
這篇文章中,我們展示了大多數Java服務(wù)器端的應用有的三層:表現層,商業(yè)邏輯層和數據持久化層。當框架被廣泛地使用在表現層和持久層中,直到目前為止還沒(méi)有框架可以包裝低級的商業(yè)邏輯。就像我們在這些例子中看的,Drools和JSR-94是降低java應用復雜度,提高開(kāi)發(fā)速度的理想候選者。我希望這些例程能鼓勵你去進(jìn)一步接近規則引擎,他們將會(huì )為你的應用的開(kāi)發(fā)和維護節省不少時(shí)間。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
面試Java實(shí)習生時(shí)的一些面試題
java語(yǔ)言中有多少種框架?
在Jboss Drools的在Web應用程序
JAVA工程師簡(jiǎn)歷模板
JAVA SSH 框架介紹
SSH框架總結(框架分析+環(huán)境搭建+實(shí)例源碼下載)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久