今天开始做管理后台中一个页面。管理后台视图技术用的是 JSP + JSTL。好久不写了,好多地方搞的不是特别清楚。所以,写代码就各种查。D瓜哥做了汇总,省得以后还要东找西找!
简单配置
需要在使用的页面加上相应的标签声明:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
公司原有项目中,因为以前赶时间,有些地方做的稍微粗糙了一些,某些地方存在 N+1查询问题。最近这两个月再做一个新项目。所有,以前踩过的坑,希望这次能尽量避免。比如 N+1查询问题。
公司技术方面,Dao 层使用的是 Spring JdbcTemplate;数据库使用的是 MySQL。所以,关于这次的主题,D瓜哥 也只关注 Spring JdbcTemplate 和 MySQL。
从出坑到入坑
讲述解决办法之前,D瓜哥 先说明一下背景问题:一个订单 Order
中,会有多个订单元素 OrderItem
,在查看订单列表时,需要根据订单 ID 查询相关的订单元素信息。查询方式有两种:一、在循环中,每次循环根据一个订单 ID 查询一个订单对应的订单元素信息。这就是典型的 N+1查询问题。另外一种方式,根据查询出来的所有的订单 ID 一次查询出所有相关的订单元素信息。显然,第二种方式要比第一种方式效率上高很多。这是基本的背景问题。下面来说明一下 D瓜哥 在解决这个问题过程中犯的错误以及更好的解决办法。
看到上述问题时,D瓜哥的第一反应就是使用 IN
就可以很好地解决。开始噼里啪啦写代码:
String sql = " SELECT * " +
" FROM `order_item` " +
" WHERE order_id IN ( ? )";
List<OrderItem> orderItemList = getJdbcTemplate().query(sql, new BeanPropertyRowMapper<OrderItem>(OrderItem.class), orderItemArray);
结果一运行,代码妥妥地 阅读全文…
最近在赶一个项目,由于D瓜哥也算是半个 Google 粉。所以,对 Google 出品的 Guava 项目可以说情有独钟。最近使用使用中遇到三个问题以及使用 Guava 的解决办法,D瓜哥觉得挺有代表性的。所以简单记录一下。
Map
相关的 Joiner
和 Splitter
第一个问题:D瓜哥需要从 URL 中获取相关请求的参数,并且将其转化成 Key-Value
形式放到 Map
对象,方便后续操作。
URL 中,参数的格式大家应该都了解:http://www.diguage.com?userName=diguage&sex=fale
。以 阅读全文…
在写 Java 项目时,很多时候我们都必须判断一下对象是否为 null
。这个在 Java 代码中,很容易实现。在使用 Velocity 的 Java Web 项目中,很多时候,需要在 Velocity 的模板中,判断一个对象是否为空。那么这时,该如何判断呢?今天D瓜哥就来给大家简单介绍介绍!
方式一
事实上,在 Velocity 中 null
对象是作为 阅读全文…
最近项目中一个问题:在常量类 GlobalConstants
中定义了许多关于订单状态的常量(使用public static final
修饰),这些常量,某些情况也许有在 Velocity 模板中访问。请问,该如何访问?
由上面的问题,引申出另外一个问题:又该如何访问静态方法呢?
今天先来解决其中的一个问题。
访问常量
Velocity Tool 中提供了相应的 阅读全文…
博客又有一段时间没有更新了。前一段时间(好几个月前了,哈哈),看一个朋友的博客,内容有长有短,类似日志;最近看一个微信公众号,座右铭是:宁可十年不将军,不可一日不拱卒。所以,考虑以后把每天有趣或者有意义的东西做个小结,记录发文出来。本文章就算是第一个篇文章吧。
公司项目里使用 Velocity 。网上相关的资料很零散,相关的配置查起来挺麻烦了。而且又没有很好的示例,今天又要费心地配置 Toolbox 。所以,干脆记录下来,
工具类配置文件的位置
默认的 Velocity 工具相关的配置放在 WEB-INF/toolbox.xml
。当然,也可以在 web.xml
中配置,配置片段如下:
<!-- Define Velocity template compiler -->
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>
org.apache.velocity.tools.view.servlet.VelocityViewServlet
</servlet-class>
<!--
Unless you plan to put your toolbox.xml and velocity.properties
under different folders or give them different names, then these
two init-params are unnecessary as of VelocityTools 1.3. The
VelocityViewServlet will automatically look for these files in
the following locations.
-->
<init-param>
<param-name>org.apache.velocity.toolbox</param-name>
<param-value>/WEB-INF/toolbox.xml</param-value> <!--1-->
</init-param>
<init-param>
<param-name>org.apache.velocity.properties</param-name>
<param-value>/WEB-INF/velocity.properties</param-value>
</init-param>
</servlet>
<!-- Map *.vm files to Velocity -->
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
- 这里就是 Toolbox 的配置路径。
如果使用 Spring MVC,也可以在 Spring MVC 的配置文件中,配置 阅读全文…
本文将给大家介绍面向对象编程中一个基本的概念–属性隐藏(Field Hiding)。
1、Java中,属性能否被覆盖?
来让我们看看下面的这个示例代码,它创建了两个子类实例:一个被赋值给子类引用,另外一个赋值给父类引用。
package com.diguage.books.simplejava.ar18;
/**
* 属性隐藏示例
* <p/>
* Coder:D瓜哥,http://www.diguage.com/
* <p/>
* Date: 2015-01-25 19:48
*/
class Super {
String s = "Super";
}
class Sub extends Super {
String s = "Sub";
}
public class FieldOverriding {
public static void main(String[] args) {
Sub c1 = new Sub();
System.out.println(c1.s);
Super c2 = new Sub();
System.out.println(c2.s);
}
}
输出是什么呢? 阅读全文…
在本文中,我们先用一个例子来展示什么是实例变量初始化器(instance variable initializer)、实例初始化器(instance initializer)和静态初始化器(static initializer)。然后,再解释一下实例初始化器的工作机制。
1、执行顺序
看下面这个类,你知道哪个先执行吗? 阅读全文…
在本节,让我们来看一看Java垃圾回收的监控与分析。然后,使用一个工具,监控一个示例应用的垃圾回收过程。如果你是个新手,最好看一下本系列的前三篇文章。你可以从“Java垃圾回收入门”开始看。
Java垃圾回收的监控和分析工具
下面是几个可用的工具。每一个可用的工具都有自己的优点和不足。使用恰当的工具,以正确的方式开展分析,可以帮助我们提高应用的性能。在本文,我们主要使用Java VisualVM。
- Java VisualVM
- Naarad
- GCViewer
- IBM Pattern Modeling and Analysis Tool for Java Garbage Collector
- HPjmeter
- IBM Monitoring and Diagnostic Tools for Java – Garbage Collection and Memory
- Visualizer
- Verbose GC Analyzer 阅读全文…
本节我们将介绍几种可用的Java垃圾收集器。垃圾回收是一个自动进程,它把开发人员从内存的分配与回收的杂务中解放出来。本文是“Java垃圾回收系列”的第三篇。在上一篇,也就是第二篇中,我们了解了Java垃圾回收的工作原理,这节非常有意思,我推荐你看一看。在第一篇“Java垃圾回收入门”中,我们介绍了Java虚拟机架构,堆内存模型以及Java相关的一些术语。
Java有四种垃圾收集器:
- Serial Garbage Collector
- Parallel Garbage Collector
- CMS Garbage Collector
- G1 Garbage Collector
D瓜哥注
这是四种类型的垃圾收集器。具体到每一个实现,在Oracle提供的官方JDK中就有Serial Garbage Collector、ParNew Garbage Collector、Parallel Scavenge Garbage Collector、Serial Old Garbage Collector、Parallel Old Garbage Collector、CMS Garbage Collector、G1 Garbage Collector等七种垃圾收集器。以后有机会再专门写文章做详细介绍!
这四种垃圾收集器每一种都有自己的优点与不足。最重要的是, 阅读全文…