存档

‘Java’ 分类的存档

Java Web JSTL 示例

2016年3月4日 没有评论

今天开始做管理后台中一个页面。管理后台视图技术用的是 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" %>

判断对象是否 阅读全文…

Spring JdbcTemplate 具名参数使用简介

2016年2月28日 2 条评论

公司原有项目中,因为以前赶时间,有些地方做的稍微粗糙了一些,某些地方存在 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);

结果一运行,代码妥妥地 阅读全文…

Guava 小技巧三则

2016年2月26日 没有评论

最近在赶一个项目,由于D瓜哥也算是半个 Google 粉。所以,对 Google 出品的 Guava 项目可以说情有独钟。最近使用使用中遇到三个问题以及使用 Guava 的解决办法,D瓜哥觉得挺有代表性的。所以简单记录一下。

Map 相关的 JoinerSplitter

第一个问题:D瓜哥需要从 URL 中获取相关请求的参数,并且将其转化成 Key-Value 形式放到 Map对象,方便后续操作。

URL 中,参数的格式大家应该都了解:http://www.diguage.com?userName=diguage&sex=fale。以 阅读全文…

分类: Java, 挨踢(IT), 日拱一卒 标签:

在 Velocity 中判断对象为 null

2016年2月25日 没有评论

在写 Java 项目时,很多时候我们都必须判断一下对象是否为 null。这个在 Java 代码中,很容易实现。在使用 Velocity 的 Java Web 项目中,很多时候,需要在 Velocity 的模板中,判断一个对象是否为空。那么这时,该如何判断呢?今天D瓜哥就来给大家简单介绍介绍!

方式一

事实上,在 Velocity 中 null 对象是作为 阅读全文…

在 Velocity 模板中访问常量

2016年2月25日 没有评论

最近项目中一个问题:在常量类 GlobalConstants 中定义了许多关于订单状态的常量(使用public static final 修饰),这些常量,某些情况也许有在 Velocity 模板中访问。请问,该如何访问?

由上面的问题,引申出另外一个问题:又该如何访问静态方法呢?

今天先来解决其中的一个问题。

访问常量

Velocity Tool 中提供了相应的 阅读全文…

Velocity 工具类配置

2016年2月16日 没有评论

博客又有一段时间没有更新了。前一段时间(好几个月前了,哈哈),看一个朋友的博客,内容有长有短,类似日志;最近看一个微信公众号,座右铭是:宁可十年不将军,不可一日不拱卒。所以,考虑以后把每天有趣或者有意义的东西做个小结,记录发文出来。本文章就算是第一个篇文章吧。

公司项目里使用 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>
  1. 这里就是 Toolbox 的配置路径。

如果使用 Spring MVC,也可以在 Spring MVC 的配置文件中,配置 阅读全文…

简易Java(18):属性能否重写?为什么?

2015年1月25日 8 条评论

本文将给大家介绍面向对象编程中一个基本的概念–属性隐藏(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);
  }
}

输出是什么呢? 阅读全文…

分类: Java, 挨踢(IT) 标签: ,

简易Java(17):Java中的实例初始化器是什么?

2015年1月11日 1 条评论

在本文中,我们先用一个例子来展示什么是实例变量初始化器(instance variable initializer)、实例初始化器(instance initializer)和静态初始化器(static initializer)。然后,再解释一下实例初始化器的工作机制。

1、执行顺序

看下面这个类,你知道哪个先执行吗? 阅读全文…

分类: Java, 挨踢(IT) 标签: ,

Java垃圾回收(4):监控与分析

2014年11月30日 2 条评论

在本节,让我们来看一看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, 挨踢(IT) 标签: , ,

Java垃圾回收(3):常见的四种垃圾收集器

2014年11月23日 没有评论

本节我们将介绍几种可用的Java垃圾收集器。垃圾回收是一个自动进程,它把开发人员从内存的分配与回收的杂务中解放出来。本文是“Java垃圾回收系列”的第三篇。在上一篇,也就是第二篇中,我们了解了Java垃圾回收的工作原理,这节非常有意思,我推荐你看一看。在第一篇“Java垃圾回收入门”中,我们介绍了Java虚拟机架构,堆内存模型以及Java相关的一些术语。

Java有四种垃圾收集器:

  1. Serial Garbage Collector
  2. Parallel Garbage Collector
  3. CMS Garbage Collector
  4. 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等七种垃圾收集器。以后有机会再专门写文章做详细介绍!

四种Java垃圾收集器工作流程对比

这四种垃圾收集器每一种都有自己的优点与不足。最重要的是, 阅读全文…

分类: Java, 挨踢(IT) 标签: , ,