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.mzph.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…