480 likes | 1.18k Views
集成 Spring @MVC 与 jQuery 和 Bootstrap. Michael Isvy. Michael Isvy. 培训师兼资深顾问 2008 年加入 SpringSource 曾在 20 多个国家和地区教授 Spring Core-Spring 、 Spring MVC 、 Spring 与 JPA/Hibernate 、 Apache Tomcat… blog.springsource.com 上的活跃博主. 历史. 2004. Spring 1.0. ….
E N D
集成 Spring @MVC 与 jQuery 和 Bootstrap Michael Isvy
Michael Isvy • 培训师兼资深顾问 • 2008 年加入 SpringSource • 曾在 20 多个国家和地区教授 Spring • Core-Spring、Spring MVC、Spring 与 JPA/Hibernate、Apache Tomcat… • blog.springsource.com 上的活跃博主
历史 2004 Spring 1.0 … 创立 SpringSource (原名称 Interface21) 设立法国分公司 2008 Spring 1.0?? 我 VMware 收购SpringSource 2009 2012 Vmware 推出众多新产品:CloudFoundry、GemFire、RabbitMQ … 3
博客文章的启发 http://blog.springsource.org/2012/08/29/
议题 HTML Javascript CSS Taglibs JSP 文件 常见 Spring MVC 最佳实践 添加 jQuery (Javascript) 添加 Bootstrap (CSS) 避免 JSP 粥
为什么选择 Spring MVC? 因为简单,很多人喜欢它
为什么选择 Spring MVC? http://www.infoq.com/research/jvm-web-frameworks • InfoQ JVM Web 框架 20 强 • Spring MVC 位列第一
为什么选择 Spring MVC? http://zeroturnaround.com/labs/developer-productivity-report-2012-java-tools-tech-devs-and-data/ • 来自 zeroturnaround 的调查 • Spring MVC 位列第一
如何使用 Spring MVC? @Controller publicclassUserController { @RequestMapping(value="/users/", method=RequestMethod.POST) public ModelAndView createUser(User user) { //... } } publicclassUserController extendsSimpleFormController { public ModelAndView onSubmit(Object command) { //... } } 已过时!! 哪种方式更恰当?
通过 Spring MVC 验证 classDiningValidator extendsValidator { publicvoidvalidate(Object target, Errors errors) { if((DiningForm)target) .merchantNumber.matches("[1-9][0-9]*") ) errors.rejectValue("merchantNumber", "numberExpected"); } } 非首选方式! 程序验证?
通过 Spring MVC 验证 importjavax.validation.constraints.*; public classDining { @Pattern(regexp="\\d{16}") privateString creditCardNumber; @Min(0) privateBigDecimal monetaryAmount; @NotNull privateDate date; } POJO Bean 验证 (JSR 303) 注释
通过 Spring MVC 验证 importjavax.validation.Valid; … @Controller publicclassUserController { @RequestMapping("/user") publicString update(@ValidUser user, BindingResult result) { if (result.hasErrors()) { return "rewards/edit"; } // continue on success... } } 控制器 Bean 验证 (JSR 303)
表示层 <c:urlvalue="/user.htm"var="formUrl"/> <form:formmodelAttribute="user"action="${formUrl}"> <labelclass="control-label">Enter your first name:</label> <form:inputpath="firstName"/> <form:errorspath="firstName"/> ... <buttontype="submit">Save changes</button> </form:form> JSP 表单标记库
JSP:哪种方法更好? <tr> <td><%=user.getFirstName() %></td> <td><%=user.getLastName() %></td> </tr> 1 不好:若使用 taglibs 会更好 jsp 文件 <tr> <td>${user.firstName} </td> <td>${user.lastName} </td> </tr> 2 没有 html 转义符:有遭受跨站脚本攻击的危险 <tr> <td><c:outvalue="${user.firstName}"/></td> <td><c:outvalue="${user.lastName}"/></td> </tr> 3 不错!
Jar 文件最佳实践 Webjars 简介
它好用吗? 版本号!!!
最佳实践 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.1.3.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> Maven POM 文件 pom.xml 通过 Maven 或 Gradle 管理版本号
版本号? <linkhref="/bootstrap/css/bootstrap.css"rel="stylesheet"/> <script src="/js/addThis.js"></script> <script src="/js/jquery-ui.js"></script> <script src="/js/jquery.dataTables.js"></script> <script src="/js/jquery.js"></script> JSP 文件 我们来谈谈 Webjars!
Webjars • 允许 CSS 和 JS 库导入为 Maven 库 • jQuery、jQuery-ui、bootstrap、backbonejs… • http://www.webjars.org/
Webjars <dependency> <groupId>org.webjars</groupId> <artifactId>jquery-ui</artifactId> <version>1.9.1</version> </dependency> pom.xml
使用 Webjars <dependency> <groupId>org.webjars</groupId> <artifactId>jquery-ui</artifactId> <version>1.9.1</version> </dependency> <mvc:resourcesmapping="/webjars/**"location="classpath:/META-INF/resources/webjars/"/> <link rel="stylesheet"href="/webjars/jquery-ui/1.9.1/js/jquery-ui-1.9.1.custom.js"> . js 文件在 jar 文件内! pom.xml 内部 Spring 配置 JSP 内部
jQuery 是什么? • Javascript 框架 • 非常简单的核心,拥有数以百计的插件 • 数据表 • jQuery UI(日期选择器、表单交互…)
Jqueri 用户界面 • 最流行的 jQuery 插件之一 • 自动完成 • 日期选择器 • 拖放 • 滑块 • … • 我们从日期开始!
您在 Java 中如何使用日期? 仅适用于简单情况 不错! 与 Spring MVC 完美集成 尚不可用可能在 2013 年 java.util.Date Joda Time JSR 310: 日期和时间 API
jqueryui 日期选择器 <script> $( "#startDate").datepicker({ dateFormat: "yy-m-dd"}); $( "#endDate").datepicker({ dateFormat: "yy-m-dd"}); </script> … <form:inputpath="startDate"/> <form:inputpath="endDate"/> JSP 文件
添加 jQuery 数据表
jQuery 数据表 • jQuery 数据表插件 • 单击、排序、滚动、下一页/上一页… • http://datatables.net/
Spring MVC 中的数据表 <dependency> <groupId>com.github.datatables4j</groupId> <artifactId>datatables4j-core-impl</artifactId> <version>0.7.0</version> </dependency> pom.xml • 您甚至不需要自己编写 Javascript! • 只需借助 DataTables4J • http://datatables4j.github.com/docs/
Spring MVC 中的数据表 <datatables:tabledata="${userList}"id="dataTable"row="user"> <datatables:columntitle="First Name" property="firstName"sortable="true"/> <datatables:columntitle="Last Name" property="lastName"sortable="true"/> </datatables:table> JSP 文件 JSP 文件内部
Bootstrap 我们来谈谈 CSS…
为什么选择 Bootstrap? 我们来谈谈 Bootstrap! 网页设计师从此不再哭泣,泪水成往事!
Bootstrap 是什么? 原名为“Twitter Bootstrap” 始于 2011 字体、表单、按钮、图表、导航以及其他界面组件 可与 jQuery 完美集成
Bootstrap 是什么? 1 2 3 https://github.com/popular/starred • Github 上最流行的项目!
Bootstrap 主题 • 数以百计的主题 • 让您的网站看起来与众不同! • 既有免费的,也有商业化的 • 例如:www.bootswatch.com/
JSP 文件 避免 JSP 粥 HTML Javascript CSS Taglibs
避免 JSP 粥 • 我们的应用程序现在在浏览器中看起来还不错 • 实际上怎么样? • 我们可以做得更好!
JSP 自定义标记 • 您驾驭 JSP 的最佳帮手! • 轻松将100 行代码转换为10 行代码!
自定义标记 • 自定义标记是 Java EE 的一部分 • .tag 和 .tagx 文件 • 创建于 2004 年 • 并非新功能!
表单字段:无自定义标记 <divclass="control-group"id="${lastName}"> <labelclass="control-label">${lastNameLabel}</label> <divclass="controls"> <form:inputpath="${name}"/> <spanclass="help-inline"> <form:errorspath="${name}"/> </span> </div> </div> CSS div 标签 表单输入 错误消息(如果有) JSP
使用自定义标记 <%@taglibprefix="form"uri="http://www.spring…org/tags/form"%> <%@attributename="name"required="true"rtexprvalue="true"%> <%@attributename="label"required="true"rtexprvalue="true"%> <divclass="control-group"id="${name}"> <labelclass="control-label">${label}</label> <divclass="controls"> <form:inputpath="${name}"/> <spanclass="help-inline"> <form:errorspath="${name}"/> </span> </div> </div> inputField.tag • 先创建一个标记(或 tagx)文件
使用自定义标记 包含自定义标记的文件夹 <htmlxmlns:custom="urn:jsptagdir:/WEB-INF/tags/html" …> … <custom:inputFieldname="firstName"label="Enter your first name:"/> <custom:inputFieldname="lastName"label="Enter your last name:"/> </html> JSP 文件 1 行代码, 而不是 9 行! JSP 不再是JSP 粥! • 自定义标记调用
总结 • 考虑对静态文件使用 WebJars • http://www.webjars.org/ • 将 Spring MVC 与 jQuery 集成很简单 • 考虑使用 DataTables4J • http://datatables4j.github.com/docs/ • Bootstrap 酷毙了! • JSP 自定义标记可助您一臂之力