Spring3 RESTful Web服務

Spring 3提供了對RESTful Web服務的支持。 在本教程中,我們將向您展示如何在Spring中實現RESTful Web服務 ,或者如何將現有的Spring服務公開為RESTful Web服務 。 為了使事情變得更有趣,我們將從上一篇關于Spring GWT Hibernate JPA Infinispan HornetQ集成的文章的 開頭繼續 。 我們將使用GWTSpringInfinispanHornetQ項目,并將“ employeeService” CRUD功能公開為RESTful Web服務 。 當然,您可以參考本文,只是了解如何將Spring服務公開為RESTful Web服務 。

實現RESTful Web服務的最流行的方法是Sun的JAX-RS規范。 有幾個支持JAX-RS的項目,例如CXF , Jersey , RESTEasy和Restlet 。 他們中的大多數人還提供Spring支持。 Spring不直接支持JAX-RS ,而是將RESTful功能添加到了Spring MVC本身。 如果您不熟悉Spring MVC框架,請在此處查閱Spring文檔的相應章節。 對于不耐煩的人,下面簡要概述。

Spring MVC代表模型視圖控制器。 它有助于構建靈活且松散耦合的Web應用程序。 模型-視圖-控制器設計模式可確保多層Web應用程序中關注點(業務邏輯,表示邏輯和導航邏輯)的分離。 “控制器”負責接收來自用戶的請求并調用后端服務。 模型負責封裝應用程序數據。 視圖使用模型對象將響應呈現給用戶。 簡而言之 :

將請求發送到Spring MVC Framework時,將發生以下事件序列。

  • “ DispatcherServlet”首先收到請求
  • “ DispatcherServlet”查詢“ HandlerMapping”并調用與請求關聯的“ Controller”
  • “控制器”通過調用適當的服務方法來處理請求,并將“ ModeAndView”對象返回到“ DispatcherServlet”。 “ ModeAndView”對象包含模型數據和視圖名稱
  • “ DispatcherServlet”將視圖名稱發送到“ ViewResolver”以查找要調用的實際“視圖”
  • “ DispatcherServlet”將模型對象傳遞給“視圖”以呈現結果
  • 在模型數據的幫助下,“視圖”呈現結果并將其返回給用戶

聊夠了! 讓我們弄臟雙手!

我們將需要“ cglib”字節碼生成庫和“ asm”字節碼操作框架,以便Spring能夠將AOP方面正確地應用于“ Controller”對象。 我們將使用“CGLIB” 2.2版本,您可以下載在這里和在“asm”二進制分發版,你可以下載在這里 。 在“ asm”二進制發行版的/ lib / all文件夾下找到asm-all-3.3.jar,并將asm-all-3.3.jar和cglib-2.2.jar都放置在項目的/ war / WEB-INF / lib文件夾下。

最后,我們將需要Jackson JSON處理器。 我們將使用1.5.3版的“核心”和“映射器”發行版,您可以從此處下載。 將兩個jackson-core-asl-1.5.3.jar
和項目的/ war / WEB-INF / lib文件夾下的jackson-mapper-asl-1.5.3.jar。

我們必須照顧我們的Eclipse項目的依賴性。 以下jar應包含在項目的Java構建路徑中:

  • org.springframework.web-3.0.1.RELEASE-A.jar

如上所述,“ DispatcherServlet”是一個用于管理整個請求處理過程的servlet。 與其他任何servlet一樣,它需要在Web部署描述符或我們的應用程序中進行配置。 在/ war / WEB-INF文件夾下找到“ web.xml”文件,然后添加以下內容:

<servlet><servlet-name>dispatcher</servlet-name><servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class><load-on-startup>2</load-on-startup>
</servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/restServices/*</url-pattern>
</servlet-mapping>

默認情況下,“ DispatcherServlet”將查找名為“ {servlet-name} –servlet.xml”的文件以加載Spring MVC配置。 在我們的例子中是“ dispatcher-servlet.xml”。 在這里,我們將url –模式用作“ / restServices / *”,以便“ DispatcherServlet”僅處理指定模式下的所有傳入請求。 創建一個“ dispatcher–servlet.xml”文件,并將其放在/ war / WEB-INF文件夾下,如下所示:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"><context:component-scan base-package="com.javacodegeeks.gwtspring.server.endpoints" /><tx:annotation-driven /><mvc:annotation-driven /></beans>

這里要注意的事情:

  • 我們將“ context:component-scan”配置元素的base-package屬性設置為我們的Spring MVC注釋類將駐留的位置
  • 我們使用“ tx:annotation-driven”配置元素,以便能夠向我們的MVC類注入事務行為
  • “ mvc:annotation-driven”是Spring 3的配置元素,可大大簡化Spring MVC的設置。 該標簽注冊了將請求分派到@Controller注釋類的所需的“ HandlerMapping”和“ HandlerAdapter”。 另外,它根據您的類路徑中存在的內容應用合理的默認值。 這樣的默認值包括(包括其他):
    • 支持使用@NumberFormat注釋格式化數字字段
    • 如果類路徑上有Joda Time,則支持使用@DateTimeFormat批注格式化Date,Calendar和Joda Time字段
    • 如果類路徑上有JSR-303提供者,則支持使用@Valid注釋驗證@Controller注釋的類輸入
    • 如果類路徑上包含JAXB ,則支持讀寫XML
    • 如果杰克遜在類路徑上,則支持讀寫JSON

在項目的“服務器”包下創建一個“端點”子包。 就GWT而言,服務端點是服務器端組件,因此所有類都必須放在“服務器”包下。 在“端點”子包下,放置“ EmployeeServiceController”類,如下所示:

package com.javacodegeeks.gwtspring.server.endpoints;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;import com.javacodegeeks.gwtspring.shared.dto.EmployeeDTO;
import com.javacodegeeks.gwtspring.shared.services.EmployeeService;@Controller
@RequestMapping("/employeeService")
public class EmployeeServiceController {@AutowiredEmployeeService employeeService;@RequestMapping(value = "/{id}", method = RequestMethod.GET)@ResponseBodypublic EmployeeDTO findEmployee(@PathVariable("id") long employeeId) {return employeeService.findEmployee(employeeId);}@RequestMapping(value = "/{id}/{name}/{surname}/{job}", method = RequestMethod.POST)@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public String saveEmployee(@PathVariable("id") long employeeId, @PathVariable String name, @PathVariable String surname, @PathVariable("job") String jobDescription) throws Exception {employeeService.saveEmployee(employeeId, name, surname, jobDescription);return "redirect:/restServices/employeeService/" + employeeId;}@RequestMapping(value = "/{id}/{name}/{surname}/{job}", method = RequestMethod.PUT)@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public String updateEmployee(@PathVariable("id") long employeeId, @PathVariable String name, @PathVariable String surname,  @PathVariable("job") String jobDescription) throws Exception {employeeService.updateEmployee(employeeId, name, surname, jobDescription);return "redirect:/restServices/employeeService/" + employeeId;}@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)@ResponseBodypublic String deleteEmployee(@PathVariable("id") long employeeId) throws Exception {employeeService.deleteEmployee(employeeId);return "OK";}}

我們提供“ EmployeeService”和“ EmployeeDTO”實現作為參考:

package com.javacodegeeks.gwtspring.server.services;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;import com.javacodegeeks.gwtspring.server.dao.EmployeeDAO;
import com.javacodegeeks.gwtspring.server.utils.NotificationsProducer;
import com.javacodegeeks.gwtspring.shared.dto.EmployeeDTO;
import com.javacodegeeks.gwtspring.shared.services.EmployeeService;@Service("employeeService")
public class EmployeeServiceImpl implements EmployeeService {@Autowiredprivate EmployeeDAO employeeDAO;@AutowiredNotificationsProducer notificationsProducer;@PostConstructpublic void init() throws Exception {}@PreDestroypublic void destroy() {}public EmployeeDTO findEmployee(long employeeId) {return employeeDAO.findById(employeeId);}@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void saveEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception {EmployeeDTO employeeDTO = employeeDAO.findById(employeeId);if(employeeDTO == null) {employeeDTO = new EmployeeDTO(employeeId, name,surname, jobDescription);employeeDAO.persist(employeeDTO);}}@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void updateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception {EmployeeDTO employeeDTO = employeeDAO.findById(employeeId);if(employeeDTO != null) {employeeDTO.setEmployeeName(name);employeeDTO.setEmployeeSurname(surname);employeeDTO.setJob(jobDescription);}}@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void deleteEmployee(long employeeId) throws Exception {EmployeeDTO employeeDTO = employeeDAO.findById(employeeId);if(employeeDTO != null)employeeDAO.remove(employeeDTO);}@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)public void saveOrUpdateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception {EmployeeDTO employeeDTO = new EmployeeDTO(employeeId, name,surname, jobDescription);employeeDAO.merge(employeeDTO);notificationsProducer.sendNotification("Save Or Update Employee with values : \nID : " + employeeId + "\nName : " + name + "\nSurname : " + surname + "\nJob description : " + jobDescription);}}

如您所見,“ EmployeeServiceController”充當“ employeeService”類的包裝器類。 我們參考了實際的服務,并實現了直接調用服務功能的方法。 要將具有“控制器”功能的“ EmployeeServiceController”類注入,我們只需對其進行注釋即可。 @Controller注釋指定被注釋的類是“ Controller”類,可用于“ DispatcherServlet”將請求委托給它。

在本教程的開始,我們談到了“ DispatcherServlet”如何使用“ HandlerMappings”來選擇適當的“ Controllers”以委派用戶請求。 @RequestMapping批注用于將Web請求映射到特定的處理程序類和/或處理程序方法。 因此,通過在類型級別使用@RequestMapping(“ / employeeService”)批注,我們指示“ DispatcherServlet”將“ / employeeService”資源URI下的所有Web請求委托給“ EmployeeServiceController”實例。 此外,我們在方法級別使用@RequestMapping批注,以根據請求的資源URI將“ DispatcherServlet”委托范圍縮小到特定操作。 您應該已經注意到@PathVariable注釋的使用。 在Spring 3中,引入了通過@PathVariable注釋使用URI模板的方法。 URI模板是一個URI –類似于字符串,包含一個或多個變量名。 當這些變量代替值時,模板將成為URI。 因此,對“ / employeeService / 1”資源URI的客戶端HTTP GET請求將委派給我們的“ EmployeeServiceController”實例的“ findEmployee”操作,并且“ employeeId”參數的值將設置為1。

注意:僅當分派器中存在相應的“ HandlerMapping”(用于類型級別的注釋)和/或“ HandlerAdapter”(用于方法級別的注釋)時,才會處理@RequestMapping。 由于Spring 3 MVC的簡化,在“ dispatcher-servlet.xml”中使用“ mvc:annotation-driven”配置元素可以滿足我們的所有配置需求。

在本教程的開始,我們談到了“控制器”如何通過調用適當的服務方法來處理每個請求并將“ ModeAndView”對象返回到“ DispatcherServlet”。 “ ModeAndView”對象包含模型數據和視圖名稱,以便正確地呈現給客戶端。 這種行為并不總是令人滿意的。 例如,在我們的示例中,我們想將服務響應序列化到HTTP響應主體。 可以將@ResponseBody批注放在方法上,并指示將返回類型直接寫到HTTP響應主體(而不是放置在Model中或解釋為視圖名稱)。 根據客戶端接受的內容類型(信息來自客戶端請求的“ Accept” HTTP Header字段),我們將返回服務回復的XML或JSON表示形式。 為此,我們通過Spring OXM模塊和Jackson JSON處理器使用JAXB編組器和反編組器。

最后,您應該注意到“ saveEmployee”和“ updateEmployee”操作。 這兩個沒有@ResponseBody批注,并返回“ redirect:/ restServices / employeeService / + employeeId”字符串。 “ Controller”方法可以返回“特殊” String值,該值會向“ DispatcherServlet”發出命令。 使用上述重定向命令,“ DispatcherServlet”會將調用重定向到與指定URI資源關聯的“ Controller”方法(在我們的示例中為“ findEmployee”操作)。 因此,當客戶端發出“ saveEmployee”或“ updateEmployee”命令時,將收到剛剛插入或更新的“ employeeDTO”對象的XML或JSON表示作為答復。

下面我們介紹DTO類。

package com.javacodegeeks.gwtspring.shared.dto;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;@Cache (usage=CacheConcurrencyStrategy.TRANSACTIONAL)
@Entity
@XmlRootElement
@Table(name = "EMPLOYEE")
public class EmployeeDTO implements java.io.Serializable {private static final long serialVersionUID = 7440297955003302414L;@Id@Column(name="employee_id")private long employeeId;@Column(name="employee_name", nullable = false, length=30)private String employeeName;@Column(name="employee_surname", nullable = false, length=30)private String employeeSurname;@Column(name="job", length=50)private String job;public EmployeeDTO() {}public EmployeeDTO(int employeeId) {this.employeeId = employeeId;        }public EmployeeDTO(long employeeId, String employeeName, String employeeSurname,String job) {this.employeeId = employeeId;this.employeeName = employeeName;this.employeeSurname = employeeSurname;this.job = job;}public long getEmployeeId() {return employeeId;}public void setEmployeeId(long employeeId) {this.employeeId = employeeId;}public String getEmployeeName() {return employeeName;}public void setEmployeeName(String employeeName) {this.employeeName = employeeName;}public String getEmployeeSurname() {return employeeSurname;}public void setEmployeeSurname(String employeeSurname) {this.employeeSurname = employeeSurname;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}
}

這里唯一需要注意的是,我們已經用@XmlRootElement注釋對DTO類進行了注釋,以便被JAXB編組器正確編組。

而已! 要部署Web應用程序,只需將/ war文件夾復制到Apache – Tomcat “ webapps”文件夾中。 您可以將war文件夾的名稱更改為自己喜歡的名稱,最好在項目名稱后重命名,例如GWTSpringInfinispanHornetQRemoting

在午餐之前,應用程序不要忘記創建數據庫模式,這里是“ javacodegeeks”。

在此示例中,我們使用了Apache Derby數據庫版本10.6.1.0。 您可以在此處下載二進制發行版。 在發行版的/ lib目錄下找到derby.jar并將其放置在項目的/ war / WEB-INF / lib目錄下。 要使用Spring配置嵌入式數據庫,請在/ war / WEB-INF目錄下的applicationContext.xml中添加以下配置代碼:

<bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
init-method="init" destroy-method="close"><property name="uniqueResourceName" value="javacodegeeks" /><property name="xaDataSourceClassName" value="org.apache.derby.jdbc.EmbeddedXADataSource" /><property name="xaProperties"><props><prop key="databaseName">javacodegeeks</prop><prop key="createDatabase">create</prop></props></property><property name="maxPoolSize" value="50" /><property name="minPoolSize" value="20" />
</bean>

您可以下載RESTClient并測試“ employeeService”的REST接口,如下所示:

  • 發出“ http:// localhost:8080 / GWTSpringInfinispanHornetQRemoting / restServices / employeeService / 1 / myName / mySurname / myJob”的POST請求,然后應檢索新創建的“ employeeDTO”的XML表示形式,如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes">
<employeeDTO><employeeId>1</employeeId><employeeName>myName</employeeName><employeeSurname>mySurname</employeeSurname><job>myJob</job>
</employeeDTO>
  • 對http:// localhost:8080 / GWTSpringInfinispanHornetQRemoting / restServices / employeeService / 1發出GET請求,通過POST操作將收到相同的結果
  • 發出PUT請求,并從“ employeeDTO”對象更新您喜歡的任何字段。 該服務將以更新的“ employeeDTO” XML表示形式進行回復
  • 對http:// localhost:8080 / GWTSpringInfinispanHornetQRemoting / restServices / employeeService / 1發出DELETE請求,您將收到“確定”答復!
  • 在添加HTTP標頭指令以將接受的內容類型定義為“ application / json”后,發出上述命令。 返回的“ employeeDTO”表示應如下所示:
{"employeeId":1,"employeeName":"myName","employeeSurname":"mySurname","job":"myJob"}

您可以從此處下載該項目(如開頭所述,并且不包含先前的文章,所需的第三方庫)

玩得開心!

賈斯汀

相關文章 :
  • GWT 2 Spring 3 JPA 2 Hibernate 3.5教程
  • GWT Spring和Hibernate進入數據網格世界
  • Spring 3 HornetQ 2.1集成教程
  • GWT 2 Spring 3 JPA 2 Hibernate 3.5教程– Eclipse和Maven 2展示
  • 帶有Spring和Maven教程的JAX–WS

翻譯自: https://www.javacodegeeks.com/2010/06/spring-3-restful-web-services.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374632.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374632.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374632.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

zoj 3765 塊狀鏈表 OR splay

各種操作o(╯□╰)o...不過都挺簡單&#xff0c;不需要lazy標記。 方法1&#xff1a;塊狀鏈表 塊狀鏈表太強大了&#xff0c;區間操作實現起來簡單暴力&#xff0c;效率比splay稍微慢一點&#xff0c;內存開銷小很多。 1 #include <iostream>2 #include <cstring>3…

【C#公共幫助類】 Image幫助類

大家知道&#xff0c;開發項目除了數據訪問層很重要外&#xff0c;就是Common了&#xff0c;這里就提供了強大且實用的工具。 【C#公共幫助類】 Convert幫助類 Image類&#xff1a; using System; using System.Collections.Generic; using System.Text; using System.IO; usin…

Java泛型快速教程

泛型是Java SE 5.0引入的一種Java功能&#xff0c;在其發布幾年后&#xff0c;我發誓那里的每個Java程序員不僅聽說過它&#xff0c;而且已經使用過它。 關于Java泛型&#xff0c;有很多免費和商業資源&#xff0c;而我使用的最佳資源是&#xff1a; Java教程 Java泛型和集合…

876. 鏈表的中間結點

給定一個頭結點為 head 的非空單鏈表&#xff0c;返回鏈表的中間結點。 如果有兩個中間結點&#xff0c;則返回第二個中間結點 代碼一&#xff1a; 自己想的一個方法 class Solution {public ListNode middleNode(ListNode head) {ListNode p1 head;ListNode p2 head;//i,j…

Hive查詢Join

Select a.val,b.val From a [Left|Right|Full Outer] Join b On (a.keyb.key); 現有兩張表&#xff1a;sales 列出了人名及其所購商品的 ID&#xff1b;things 列出商品的 ID 和名稱&#xff1a; hive> select * from sales; OK Joe 2 Hank 4 Ali 0 Eve 3 Ha…

jquery 獲取easyui combobox選中的值

$(#comboboxlist).combobox(getValue);轉載于:https://www.cnblogs.com/ftm-datablogs/p/5526857.html

調度Java應用程序中的主體

許多項目需要計劃功能&#xff0c;例如我們計劃的工作&#xff0c;重復的工作&#xff0c;異步執行等。 我們的首選方法是使用企業工作調度程序&#xff0c;例如OpenSymphony的Quartz。 使用計劃任務進行編碼時&#xff0c;最棘手的部分之一是執行部分。 這里的主要經驗法則是…

繼承映射關系 joinedsubclass的查詢

會出現下面這樣的錯一般是配置文件中的mapping和映射文件中的package路徑或者class中的name路徑不一致 org.hibernate.MappingException: Unknown entity: com.zh.hibernate.joinedsubclass.Student at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(Sessi…

Spark系列—02 Spark程序牛刀小試

一、執行第一個Spark程序 1、執行程序 我們執行一下Spark自帶的一個例子&#xff0c;利用蒙特卡羅算法求PI&#xff1a; 啟動Spark集群后&#xff0c;可以在集群的任何一臺機器上執行一下命令&#xff1a; /home/spark/spark-1.6.1-bin-hadoop2.6/bin/spark-submit \ --class o…

JVM選項:-client vs -server

您是否曾經在運行Java應用程序時想知道-client或-server開關是什么&#xff1f; 例如&#xff1a; javaw.exe -client com.blogspot.sdoulger.LoopTest也顯示在java.exe的“幫助”中&#xff0c;例如&#xff0c;其中的選項包括&#xff1a; -client選擇“客戶端” VM -serv…

網頁前臺小知識

1.左右布局div塊自適應&#xff0c;首先外邊套一個div,把寬度固定一個px&#xff0c;然后margin設為&#xff10; atuo&#xff1b;這樣他會根據窗口大小自動變換左右距離&#xff0e;就這么簡單&#xff1c;/p> 2.多個標簽共用一個樣式&#xff0c;用&#xff0c;分隔開 p…

統計字符串每個字符出現的次數

//str是個只包含小寫字母的字符串&#xff0c;以下是統計每個字符出現的頻數 int[] cnt new int[26];//toCharArray() for (char ch : str.toCharArray()) {cnt[ch - a]; }//charAt() for(int i 0;i<str.length;i){char ch str.charAt(i);cnt[ch - a]; }

在Java 7中處理文件

以下是The Well-Grounded Java Developer的草稿的修改后的片段。 它使您快速了解與以前版本相比&#xff0c;在Java 7中操作文件要容易得多。 通過使用新的Files類及其許多實用程序方法&#xff0c;您可以僅用一行代碼就可以對文件執行以下操作&#xff1a; 創建 刪除 復制 …

3.1存儲管理操作系統

存儲器管理的對象是主存&#xff08;內存&#xff09;。其主要功能包含分配和回收主存空間、提高主存的利用率、擴充主存、對主存信息實現有效保護。存儲器的結構為&#xff1a;寄存去、緩存、主存、外存。邏輯地址&#xff08;對用戶角度。程序存放的位置&#xff09;、物理地…

學習教材《構建之法》遇到的問題及思路

在學習中每個人都會遇到各種各樣的問題&#xff0c;下面就是我遇到的問題及可能解決問題的思路。 1.如何寫好程序的注釋&#xff0c;每個人都會寫注釋&#xff0c;但是&#xff0c;需要注釋什么&#xff1f; 思路&#xff1a;注釋是為了解釋程序做什么&#xff0c;為什么要這樣…

了解和擴展Java ClassLoader

Java ClassLoader是項目開發中Java的關鍵但很少使用的組件之一。 就我個人而言&#xff0c;我從未在任何項目中擴展ClassLoader&#xff0c;但是擁有自己的可以自定義Java類加載的ClassLoader的想法讓我感到很興奮。 本文將概述Java類加載&#xff0c;然后繼續創建自定義ClassL…

CAD教程-AL對其命令

AL可以實現不規則的對其功能 1.第一步按下AL&#xff0c;按下Enter 2.選擇第一個源點 3.選擇第一個目標點 4.選擇第二個源點 5.選擇第二個目標點 6.按下Enter&#xff0c;完成移位 轉載于:https://www.cnblogs.com/weloveshare/p/4739873.html

使用Spring將POJO公開為JMX MBean

這是一個非常不錯的教程&#xff0c;介紹了如何通過我們最新的JCG合作伙伴 “ The Holy Java ”博客&#xff08;很酷的名字&#xff09;實現“ 用Spring輕松將POJO作為JMX MBean公開 ”。 &#xff08;注意&#xff1a;對原始帖子進行了少量編輯以提高可讀性&#xff09; Jav…

mysql 5.1由于Host為localhost的用戶為空,密碼為空,導致本地用戶無法登陸。

不說了。直接上mysql的用戶數據&#xff0c;第四列里面&#xff0c;host為localhost&#xff0c;用戶為空&#xff0c;密碼為空。 導致在本地登陸的時候除了root的賬戶外&#xff0c;其他賬號不需要密碼即可登陸&#xff0c;并且影響host為 %的用戶登陸。 這里只需要刪除對應的…

scala 88 for替換map,flatmap,filtermap,for,scala,flatmap

王家林親授《DT大數據夢工廠》大數據實戰視頻“Scala深入淺出實戰經典”視頻、音頻和PPT下載&#xff01;第88講&#xff1a;Scala中使用For表達式實現map、flatMap、filter百度云盤&#xff1a;http://pan.baidu.com/s/1mgtgcIG360云盤&#xff1a;http://yunpan.cn/cdXsbctXf…