<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # EJB 簡介 原文:http://zetcode.com/java/ejb/ 在本教程中,我們學習如何使用 Enterprise JavaBeans。 我們使用 GlassFish,NetBeans,Derby 和 Maven。 Enterprise JavaBean (EJB) 是服務器端組件,封裝了應用的業務邏輯。 EJB 在 EJB 容器中運行,該容器負責各種系統級服務,包括事務管理,安全性和并發控制。 EJB 是 Java EE 規范的一部分。 GlassFish 是 Java EE 的參考實現,它包括 Enterprise JavaBeans 容器。 我們將在 GlassFish 中運行示例。 Apache Derby 是完全用 Java 實現的開源關系數據庫。 Oracle 以 Java DB 的名義分發相同的二進制文件。 ## 第一個 EJB 我們在 NetBeans 中創建一個新的 Web 應用。 該項目將稱為`MyFirstEJB`。 從“服務器和設置”頁面,選擇 GlassFish 服務器,并將上下文更改為`myfirstejb`。 ![Server and Settings](https://img.kancloud.cn/56/2a/562a398b2f0c2ed202cae175c01ea846_546x183.jpg) 圖:服務器和設置 在此對話框中,我們選擇應用服務器,Java EE 版本和上下文路徑。 `index.html` ```java <!DOCTYPE html> <html> <head> <title>Test page</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <p>Test page</p> </body> </html> ``` 這是我們的`index.html`頁面。 如果我們訪問應用的根頁面,它將返回。 我們右鍵單擊應用圖標,然后選擇一個 Session Bean 類型的新 EJB。 我們將 bean 稱為`MyFirstBean`,鍵入`com.zetcode.ejb`包,然后選擇無狀態會話類型。 ![Creating a new session bean in NetBeans](https://img.kancloud.cn/c6/fb/c6fb764577f001f55e936d87267a526a_423x342.jpg) 圖:在 NetBeans 中創建一個新的會話 Bean 無狀態會話 Bean 不維護與客戶端的對話狀態。 當客戶端調用無狀態 Bean 的方法時,該 Bean 的實例變量可能包含特定于該客戶端的狀態,但僅在調用期間包含。 該方法完成后,客戶端特定的狀態將丟失。 `FirstBean.java` ```java package com.zetcode.ejb; import javax.ejb.Stateless; @Stateless public class FirstBean { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public String sayHello() { StringBuilder sb = new StringBuilder("Hello "); sb.append(this.getName()).append("!"); return sb.toString(); } } ``` `MyFirstBean`是無狀態會話 Bean。 使用`@Stateless`裝飾創建一個無狀態會話 bean。 它具有`no-interface view`,其中不使用本地業務接口,并且 Bean 類的所有公共方法都自動向調用者公開。 ```java public String sayHello() { StringBuilder sb = new StringBuilder("Hello "); sb.append(this.getName()).append("!"); return sb.toString(); } ``` `MyFirstBean's`的工作是構造對調用者的問候。 接下來,我們通過右鍵單擊項目圖標并從 Web 類別中選擇 Servlet 文件類型來創建一個新的 Servlet。 我們將 servlet 稱為`Greet`,然后鍵入`com.zetcode.web`包。 我們將 URL 模式更改為`/greet`。 ![New servlet](https://img.kancloud.cn/69/e2/69e2b0494769f54115fd2118c940ac0a_567x205.jpg) 圖:創建新的 servlet 在新的 Servlet 對話框中,我們提供 Servlet 名稱及其包。 `Greet.java` ```java package com.zetcode.web; import com.zetcode.ejb.FirstBean; import java.io.IOException; import java.io.PrintWriter; import javax.ejb.EJB; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(name = "Greet", urlPatterns = {"/greet"}) public class Greet extends HttpServlet { @EJB private FirstBean firstBean; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain;charset=UTF-8"); firstBean.setName(request.getParameter("name")); String msg = firstBean.createMessage(); try (PrintWriter out = response.getWriter()) { out.println(msg); } } } ``` `Greet` Servlet 從客戶端發送的 URL 中讀取名稱參數,調用 EJB 的`createMessage()`業務方法,并以純文本形式返回響應。 ```java @EJB private FirstBean firstBean; ``` `@EJB`注解將 EJB 注入 Servlet。 ```java response.setContentType("text/plain;charset=UTF-8"); ``` servelt 響應以 UTF-8 字符集的純文本格式顯示。 ```java firstBean.setName(request.getParameter("name")); ``` 我們從請求中檢索`name`參數,并將其設置為 EJB。 ```java String msg = firstBean.createMessage(); ``` 我們將其稱為`createMessage()`業務方法。 ![MyFirstEJB project structure](https://img.kancloud.cn/2e/3d/2e3d699f5dda86bbb66a366d8525e801_329x314.jpg) 圖:MyFirstEJB 項目結構 我們構建應用并將其部署到 GlassFish 服務器。 要構建應用,請右鍵單擊項目圖標,然后選擇“構建”。 要部署應用,請右鍵單擊項目圖標,然后選擇“部署”。 ```java $ curl localhost:8080/myfirstejb/greet?name=Jan Hello Jan! ``` 使用`curl`工具,我們連接到`myfirstejb` Web 應用的`Greet` servlet,并向其傳遞參數。 Web 應用以問候語響應。 ```java $ curl localhost:8080/myfirstejb/ <!DOCTYPE html> <html> <head> <title>Test page</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <p>Test page</p> </body> </html> ``` 訪問根頁面,應用將返回 HTML 測試頁面。 ## 使用實體 bean 持久化數據 在第二個示例中,我們創建一個將讀取和保存汽車的 Web 應用。 汽車對象將保存在 Derby 數據庫中。 我們使用`car-app`名稱創建一個新的 Java Web 應用。 然后,我們創建一個新的`Car`實體。 實體類文件類型位于持久性類別中。 包將為`com.zetcode.persistence`。 主鍵類型為`Long`,并選中了創建持久性單元選項。 在下一頁中,我們將持久性單元名稱更改為`carpu`,然后選擇默認的`EclipseLink`持久性供應器。 我們選擇`jdbc/sample`數據源,并選擇了`Create`表生成策略。 `jdbc/sample`數據源是指默認情況下位于用戶主目錄的`.netbeans-derby`子目錄中的`sample`數據庫。 ![Persistence provider](https://img.kancloud.cn/0c/87/0c87377db1d153277e68d919c5fc5204_584x205.jpg) 圖:持久性供應器 在此視圖中,我們提供了持久性單元名稱,持久性供應器,數據源和表生成策略。 ### 實體 Bean 實體 Bean 是一種 Enterprise JavaBean,它表示持久存儲中存在的業務實體對象。 實體 bean 由主鍵標識。 與在客戶端會話的生存期內生存的會話 Bean 不同,實體 Bean 即使在 EJB 容器崩潰時也可以幸免。 `Car.java` ```java package com.zetcode.persistence; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="Cars") public class Car implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="Id") private Long id; @Column(name="Name") private String name; @Column(name="Price") private int price; public Car() { } public Car(String name, int price) { this.name = name; this.price = price; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } } ``` `Car`是 EJB 實體 Bean。 它是要存儲在 Derby 數據庫中的業務對象。 ```java @Entity @Table(name="Cars") public class Car implements Serializable { ``` 實體 bean 用`@Entity`注解修飾。 該實體映射到`Cars`表。 ```java @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="Id") private Long id; ``` 每個實體都有一個唯一的對象標識符。 此唯一標識符或主鍵使客戶端能夠定位特定的實體實例。 `@Id`聲明此實體 bean 的標識符屬性,`@GeneratedValue`注解用于指定主鍵的生成方式,`@Column`將標識符映射到數據庫表的`Id`列。 ```java public Car() { } ``` 持久性框架需要無參數的構造器。 ### EJB 我們創建一個本地無狀態`ManageCarBean`企業 bean。 這次 EJB 具有本地接口視圖。 `ManageCarBeanLocal.java` ```java package com.zetcode.ejb; import javax.ejb.Local; import com.zetcode.persistence.Car; @Local public interface ManageCarBeanLocal { void saveCar(Car car); void setPrice(int price); void setName(String name); Car getCar(Long id); } ``` 該接口定義了 EJB 客戶端要使用的方法。 客戶端只能通過 bean 的業務接口中定義的方法來訪問會話 bean。 ```java @Local public interface ManageCarBeanLocal { ``` `@Local`裝飾指定該接口是本地業務接口。 `ManageCarBean.java` ```java package com.zetcode.ejb; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import com.zetcode.persistence.Car; @Stateless public class ManageCarBean implements ManageCarBeanLocal { private String name; private int price; @PersistenceContext(unitName = "carpu") private EntityManager em; public String getName() { return name; } @Override public void setName(String name) { this.name = name; } public int getPrice() { return price; } @Override public void setPrice(int price) { this.price = price; } @Override public void saveCar(Car car) { em.persist(car); } @Override public Car getCar(Long id) { Car car = em.find(Car.class, id); return car; } } ``` `ManageCarBean`讀取并保存汽車對象。 ```java @PersistenceContext(unitName = "carpu") private EntityManager em; ``` 容器使用`persistence.xml`中的信息創建`EntityManager`。 `@PersistenceContext`注解將實體管理器注入到 Bean 中。 管理器已映射到`carpu`持久性單元。 實體管理器用于通過持久性上下文與數據進行交互。 ```java @Override public void saveCar(Car car) { em.persist(car); } ``` `saveCar()`方法將汽車對象保存到數據庫中; 在我們的例子中是 Derby。 ```java @Override public Car getCar(Long id) { Car car = em.find(Car.class, id); return car; } ``` `getCar()`方法通過其 ID 查找汽車。 `persistence.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <persistence-unit name="carpu" transaction-type="JTA"> <jta-data-source>jdbc/sample</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="eclipselink.ddl-generation" value="create-tables" /> </properties> </persistence-unit> </persistence> ``` `persistence.xml`文件是一個配置文件,其中包含有關我們在應用中使用的數據庫的信息。 `jdbc/sample`是 GlassFish 服務器隨附的內置數據源。 在我們的應用中,我們將數據保存在 Derby 的預先創建的`sample`數據庫中。 如果`eclipselink.ddl-generation`屬性不存在,則會自動導致創建`Cars`表。 ![NetBeans Derby tool](https://img.kancloud.cn/97/0a/970a9f801b02f53cfed7f4551ed32245_451x204.jpg) 圖:NetBeans Derby 工具 我們可以使用 NetBeans Derby 工具來連接和管理數據庫中的數據。 該工具位于“服務”窗口中。 ### servlet 我們創建兩個 servlet:`SaveCar`和`ReadCar`。 我們將它們放入`com.zetcode.web`包中。 Servlet 是從 NetBeans Web 類別創建的。 兩個 servlet 均以純文本形式響應。 ![Apache Common Lang JARs](https://img.kancloud.cn/c6/31/c63115795e44c64a1fb0ae96758df301_296x90.jpg) 圖:Apache Common Lang JAR 我們還包括用于幫助程序方法的 Apache Common Lang JAR。 可以從[項目網站](https://commons.apache.org/proper/commons-lang/download_lang.cgi)下載該庫。 `ValidateParameter.java` ```java package com.zetcode.util; import org.apache.commons.lang3.math.NumberUtils; public class ValidateParameter { private static final int MAX_PRICE_CAR = 10_000_000; public static boolean validateName(String param) { return !(null == param || "".equals(param) || NumberUtils.isNumber(param)); } public static boolean validateId(String param) { return !(null == param || "".equals(param) || !NumberUtils.isNumber(param)); } public static boolean validatePrice(String param) { if (null == param || "".equals(param) || !NumberUtils.isNumber(param)) { return false; } int price = Integer.valueOf(param); return !(price < 0 || price > MAX_PRICE_CAR); } } ``` `ValidateParameter`類用于驗證請求參數。 參數不能為`null`或為空,并且 ID 和價格值必須為數字。 另外,價格必須在合理范圍內。 我們使用 Apache Common Lang 的`NumberUtils.isNumber()`檢查數字值。 `SaveCar.java` ```java package com.zetcode.web; import java.io.IOException; import java.io.PrintWriter; import javax.ejb.EJB; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.zetcode.ejb.ManageCarBeanLocal; import com.zetcode.persistence.Car; import com.zetcode.util.ValidateParameter; @WebServlet(name = "SaveCar", urlPatterns = {"/save"}) public class SaveCar extends HttpServlet { @EJB private ManageCarBeanLocal manageCarBean; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String sname = request.getParameter("name"); String sprice = request.getParameter("price"); String message; if (ValidateParameter.validateName(sname) && ValidateParameter.validatePrice(sprice)) { message = String.format("%s car is saved", sname); int price = Integer.valueOf(sprice); Car car = new Car(sname, price); manageCarBean.saveCar(car); } else { message = "Wrong parameters"; } response.setContentType("text/plain;charset=UTF-8"); try (PrintWriter out = response.getWriter()) { out.println(message); } } } ``` `SaveCar` Servlet 的目的是調用適當的 EJB 來保存汽車。 汽車對象的數據是從客戶端發送的 URL 中讀取的。 ```java @WebServlet(name = "SaveCar", urlPatterns = {"/save"}) ``` `@WebServlet`注解將`SaveCar` Servlet 映射到`/save`路徑。 ```java @EJB private ManageCarBeanLocal manageCarBean; ``` `ManageCarBeanLocal`企業 bean 被注入到 servlet 中。 ```java String sname = request.getParameter("name"); String sprice = request.getParameter("price"); ``` 從請求中讀取參數。 ```java if (ValidateParameter.validateName(sname) && ValidateParameter.validatePrice(sprice)) { ``` 參數正在驗證中。 ```java Car car = new Car(sname, price); manageCarBean.saveCar(car); ``` 創建一個新的汽車對象并將其保存到數據庫。 為了保存汽車對象,我們利用了`ManageCarBean`的`saveCar()`方法。 `ReadCar.java` ```java package com.zetcode.web; import com.zetcode.ejb.ManageCarBeanLocal; import java.io.IOException; import java.io.PrintWriter; import javax.ejb.EJB; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.zetcode.persistence.Car; import com.zetcode.util.ValidateParameter; @WebServlet(name = "ReadCar", urlPatterns = {"/read"}) public class ReadCar extends HttpServlet { @EJB private ManageCarBeanLocal manageCarBean; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain;charset=UTF-8"); String message; String pid = request.getParameter("id"); if (ValidateParameter.validateId(pid)) { Long carId = Long.valueOf(pid); Car rcar = manageCarBean.getCar(carId); if (null != rcar) { message = String.format("Name: %s, Price: %d", rcar.getName(), rcar.getPrice()); } else { message = "Cannot find car with this ID"; } } else { message = "Wrong parameters"; } try (PrintWriter out = response.getWriter()) { out.println(message); } } } ``` `ReadCar` servlet 調用`ManageCarBean`企業 bean 從數據庫中讀取數據; 它根據提供的 ID 選擇汽車對象。 ```java String sid = request.getParameter("id"); ``` 從 URL 讀取 ID。 ```java Long carId = Long.valueOf(pid); Car rcar = manageCarBean.getCar(carId); if (null != rcar) { message = String.format("Name: %s, Price: %d", rcar.getName(), rcar.getPrice()); } else { message = "Cannot find car with this ID"; } ``` `ManageCarBean`的`readCar()`方法用于檢索汽車對象。 `web.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <session-config> <session-timeout> 30 </session-timeout> </session-config> <error-page> <error-code>404</error-code> <location>/error404.txt</location> </error-page> <error-page> <location>/error.txt</location> </error-page> </web-app> ``` 在`web.xml`文件中,我們提供了兩個錯誤頁面。 `error.txt`是所有錯誤的默認錯誤頁面,`error404.txt`是 404 錯誤的錯誤頁面,當客戶端請求不存在的資源時觸發。 注意,`error404.txt`必須先于`error.txt`。 ![Error pages](https://img.kancloud.cn/72/ff/72ffc9dcbc4fe4ebfa836644474f880e_262x128.jpg) 圖:錯誤頁面s 我們將兩個文本文件放置在網頁中。 `error.txt` ```java Error has occurred, check the GlassFish log file ``` 這是一般錯誤頁面。 `error404.txt` ```java 404 : Page was not found ``` 這是 404 錯誤的錯誤頁面。 ### 部署方式 是時候部署應用了。 通過右鍵單擊 Web 項目并選擇 Deploy 命令來部署應用。 請注意,當我們清理項目時,將取消部署該應用。 如果未運行所選的應用服務器,那么 deploy 命令還將啟動它。 ```java $ ./asadmin list-applications MyFirstEJB <ejb, web> car-app <ejb, web> Command list-applications executed successfully. ``` GlassFish 的`asadmin`工具可用于確定當前已部署的應用。 GlassFish 啟動時,NetBeans 會自動啟動 Derby 服務器。 可以在 GlassFish 服務器設置中將其關閉。 ![GlassFish server properties](https://img.kancloud.cn/30/00/3000345917ca44042cc80b090e9e2cea_492x323.jpg) 圖:GlassFish 服務器屬性 在 NetBeans 的“服務”選項卡中,我們展開“服務器”節點,然后選擇 GlassFish 屬性。 在那里,我們可以看到“啟動已注冊 Derby 服務器”選項。 ```java $ curl localhost:8080/car-app/doread 404 : Page was not found ``` 如果嘗試訪問不存在的資源,則會收到自定義 404 錯誤消息。 ```java $ curl "localhost:8080/car-app/save?name=Volvo&price=29000" Volvo car is saved ``` 沃爾沃汽車將保存到數據庫中。 注意 URL 的雙引號的用法。 ```java $ curl "localhost:8080/car-app/save?name=Bentley&price=299000000" Wrong parameters ``` 驗證器發現了不切實際的高汽車價格。 ```java $ curl localhost:8080/car-app/read?id=401 Name: Volvo, Price: 29000 ``` 我們從數據庫中讀取了一輛汽車。 ## 使用 Maven 構建項目 NetBeans 在開發過程中為我們節省了許多繁瑣的工作。 但是使用 Maven 手動構建項目是有益的。 ```java mvn archetype:generate -DgroupId=com.zetcode -DartifactId=car-app -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false ``` 我們創建一個新的 Maven 項目。 我們使用`maven-archetype-webapp`類型。 ```java $ tree . └── car-app ├── pom.xml └── src └── main ├── resources └── webapp ├── index.jsp └── WEB-INF └── web.xml 6 directories, 3 files ``` `tree`命令向我們顯示了創建的項目結構。 ```java $ mkdir -p src/main/java/com/zetcode/ejb $ mkdir src/main/java/com/zetcode/persistence $ mkdir src/main/java/com/zetcode/web $ mkdir src/main/java/com/zetcode/util $ mkdir src/main/resources/META-INF ``` 我們創建目錄。 復制應用源文件后,項目結構如下所示: ```java $ tree . ├── pom.xml └── src └── main ├── java │ └── com │ └── zetcode │ ├── ejb │ │ ├── ManageCarBean.java │ │ └── ManageCarBeanLocal.java │ ├── persistence │ │ └── Car.java │ ├── util │ │ └── ValidateParameter.java │ └── web │ ├── ReadCar.java │ └── SaveCar.java ├── resources │ └── META-INF │ └── persistence.xml └── webapp ├── index.jsp └── WEB-INF └── web.xml ``` 不要忘記復制`web.xml`文件。 Maven 為我們創建了一個空的`web.xml`文件。 `pom.xml` ```java <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>car-app</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>car-app Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.0</version> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-web-api</artifactId> <version>7.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <finalName>car-app</finalName> </build> </project> ``` `pom.xml`是一個文件,其中包含有關項目的信息以及 Maven 用于構建項目的配置詳細信息。 我們提供了 Eclipse 鏈接持久性供應器,Apache Commons lang 庫和 Java EE Web API 的依賴項。 我們指示 Maven 使用 Java8。最終的構建文件稱為`car-app.war`,位于`target`子目錄中。 ```java $ mvn package ``` 該項目是使用`mvn package`命令構建的。 ```java $ ./asadmin start-domain ``` 從 GlassFish 的`bin`目錄中,啟動 GlassFish 服務器。 ```java $ ./asadmin start-database --db-home ~/.netbeans-derby ``` Derby 服務器已啟動。 NetBeans 在`.netbeans-derby`目錄中創建 Derby 系統主目錄,該目錄位于用戶的主目錄中。 在這里,我們可以找到我們之前使用過的`sample`數據庫。 ```java $ ~/bin/glassfish-4.1.1/glassfish/bin/asadmin deploy target/car-app.war ``` 我們部署應用。 我們看到警告語`Table/View 'CARS' already exists in Schema 'APP'`。 這是`eclipselink.ddl-generation`屬性的結果,該屬性設置為`create_tables`。 我們可以忽略警告。 ```java $ curl localhost:8080/car-app/read?id=401 Name: Volvo, Price: 29000 ``` 我們檢索先前創建的汽車。 在本教程中,我們為一些簡單的業務邏輯創建了 Enterprise JavaBeans。 我們已使用 NetBeans,Derby 和 Maven 作為示例。 ZetCode 具有以下相關教程: [Derby 教程](/db/apachederbytutorial/), [Java 教程](/lang/java/)和 [Stripes 教程](/java/stripes/)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看