Michael Isvy

Michael Isvy

校友
博文Michael Isvy

将Spring Web MVC应用程序从JSP迁移到AngularJS

工程 | 2015年8月19日 | ...

作者注

此文由Han LimTony Nguyen特邀撰写。Han和Tony在新加坡Spring用户组上就Spring + Angular JS做了一次精彩的演讲。此博客基于他们的演讲内容。

摘要

在本文中,我们将尝试描述我们从JSP、Struts和Velocity等服务器端渲染视图技术迁移到使用AngularJS(一个流行的现代浏览器JavaScript框架)的客户端渲染视图技术的经验。我们将讨论在进行此更改时需要注意的一些事项以及可能遇到的潜在陷阱。如果…

新加坡免费Spring - Hadoop会议

新闻 | 2013年8月22日 | ...

我们很高兴地宣布,我们将于8月30日星期五晚上6点至8点在新加坡市中心举办一场关于Spring和Hadoop的免费会议。

Spring最佳实践:从Spring Petclinic到Spring Data Hadoop

Michael Isvy于2008年加入SpringSource(Spring背后的公司,现为Pivotal的一部分)。自那时起,他已在10个不同国家教授Spring给1000多名学生。他曾在众多会议上就Spring发表演讲,并且是SpringSource博客上的活跃技术博主。Michael在SpringSource担任亚太地区教育经理…

Spring Petclinic已上线Github!

工程 | 2013年3月21日 | ...

我们很高兴地宣布,Spring Petclinic示例应用程序已重构。

源代码现已在github上可用。这是新应用程序的截图:

以下是新架构的概述

Spring, Spring, Spring

我们使用了以下Spring特性

  • 使用注解进行依赖注入
  • 使用jdbc (JdbcTemplate)、JPA或Spring Data JPA (repository层) 进行数据访问集成。您可以通过在web.xml或JUnit测试中设置相应的bean profile来选择要使用的实现。
  • 使用@Transactional进行事务处理(服务层)
  • 使用@Cacheable和ehcache作为缓存实现进行缓存(服务层)
  • 面向切面编程(监控每个Repository方法被调用的次数)
  • Spring MVC:使用Bean Validation (JSR-303) 进行表单验证
  • Spring MVC:使用ContentNegotiatingViewResolver进行内容协商(html、xml或atom)。
  • Spring MVC:使用SimpleMappingExceptionResolver进行异常处理
  • Spring MVC:使用Spring MVC测试框架

 

我们充满活力的社区

我们获得了社区中许多专家的贡献(包括几个开源项目的负责人)。

 

Thymeleaf

如果您还没有听说过,Thymeleaf可以被视为JSP的替代品。它将自己定义为XML / XHTML / HTML5模板引擎。

它基于一些普通的HTML文件,带有一些命名空间的魔法。

Thymeleaf项目的Daniel和Soraya创建了一个Spring-Petclinic分支,该分支使用Thymeleaf代替JSP。他们在这篇博客文章中记录了迁移步骤:http://www.thymeleaf.org/petclinic.html

Spring Petclinic的Thymeleaf分支可在此处获取:https://github.com/thymeleaf/thymeleafexamples-petclinic

了解更多关于Thymeleaf的信息:http://www.thymeleaf.org

在twitter上关注Thymeleaf:https://twitter.com/thymeleaf

 

Dandelion

Dandelion提供了一组标签库,您可以将其与JSP或Thymeleaf一起使用。

我们已在Spring-Petclinic内部使用它来处理DataTables。它基于jQuery DataTables和Bootstrap生成表格。

你可以这样做


<datatables:table data="${ownerList}" id="dataTable"  theme="bootstrap2" export="pdf">
 <datatables:column title="Name" property="name" sortable="true" />
 <datatables:column title="Address" property="address" sortable="true" />
</datatables:table>

输出的html表格看起来像这样

Dandelion在Spring Petclinic的主分支中使用。

Dandelion项目的Thibault Duchateau撰写了一篇精彩的博客文章,描述了Spring Petclinic应用程序的迁移

了解更多关于Dandelion的信息:http://dandelion.github.com/

在twitter上关注他们:https://twitter.com/dandelion_proj

 

Maven还是Gradle?

默认情况下,Spring Petclinic使用Maven,因为它是Java应用程序最常见的选择。虽然Spring Petclinic与大多数实际应用程序相比相当小,但其Maven pom.xml文件已经非常冗长。

来自Thoughtworks China的Li Yanhui非常友好地将Spring Petclinic迁移到Gradle。这是一种并排比较Maven和Gradle的好方法。build.gradle配置文件确实更易于理解。它目前包含143行(而Maven POM为543行)。

您可以在此处浏览基于Gradle的Spring Petclinic版本:https://github.com/whimet/spring-petclinic 感谢他们,我们能够识别出Spring Petclinic内部一些存在代码重复和缺乏自动化测试的地方。

 

性能测试:让我们扩展!

是否有可能在单个服务器实例上将当前的Spring Petclinic扩展到每秒1000个请求?Ippon Technologies的Julien Dubois就此主题撰写了一系列五篇精彩的博客文章。

它回答了以下问题: - 我应该依赖会话上下文吗?(第二部分) - 我应该使用哪个Apache Tomcat连接器?(第二部分) - 我应该使用哪个数据库连接池?(第三部分) - JDBC是否比JPA或Spring Data JPA更快?( 第四部分) - 使用OpenSessionInViewFilter有什么优点?( 第四部分)

 

参考文献

GitHub上的Spring Petclinic Cloud Foundry上的Spring Petclinic Petclinic + Thymeleaf Petclinic + Gradle

 

Spring MVC:从JSP和Tiles到Thymeleaf

工程 | 2012年10月30日 | ...

对于视图层,Spring @MVC提供了多种选择。在本文中,我们将首先讨论您在过去几年中最可能使用视图层的方式:JSP。我们将看到使用它们的好坏方法(纯JSP,带有自定义标签的JSPApache Tiles)。

然后,我们将讨论一个名为Thymeleaf的新项目,您可以将其用作JSP的替代方法。

像往常一样,您可以在github上的相应应用程序中找到本文讨论的所有代码示例。

纯JSP

让我们从下面的代码示例开始

<html …> <body>
 <div style="padding-top: 50px;">
   <jsp:include page="../menu.jspx"/>
   <c…

将Spring MVC与jQuery集成以实现验证规则

工程 | 2012年8月29日 | ...

我很高兴地看到在最近一项来自zeroturnaround的调查中,Spring MVC被评为Java最受欢迎的Web框架。

这个框架非常灵活,有几十种使用方法。与所有具有许多选项的灵活框架一样,讨论常见实践非常重要。

我为这篇博客文章创建的项目使用了许多Spring MVC应用程序中常见的特性。您会发现类似这样的内容

在控制器中,您会发现典型的Spring MVC特性,用于映射请求、通过注解提取请求数据、数据绑定、文件上传……

在…

事务、缓存和AOP:理解Spring中的代理使用

工程 | 2012年5月23日 | ...

在Spring框架中,许多技术特性都依赖于代理使用。我们将使用三个示例深入探讨这个主题:事务缓存Java配置

这篇博客文章中显示的所有代码示例都可以在我的github帐户上找到。

事务

第一步:无事务

下面的Service类尚未事务化。让我们首先看看它的原样,然后使其事务化。

@Service
public class AccountServiceImpl  implements AccountService {
 //…

//Not specifying a transaction policy here!
 public void create(Account account) {
 entityManager.persist(account);
 }
}

由于“create”方法不是事务化的,它很可能会抛出异常(因为这个Account对象不应该……