Welcome

Sep 5 2015
Java设计模式学习之组合模式

组合模式是结构型模式中的一种,他通常可以用来实现类似树结构的功能。

就比如一副画,画由矩形,三角形组成,其中各个形状的颜色不同。这里画就好比跟节点(Tree Root), 各个形状就好比 Tree Leaf,而这些形状就是组成画的基本元素

通过上述比喻,不难推断出组合模式有以下对象组成

  1. Base Component 组合模式中所有对象需要实现的接口类
  2. Leaf 实现Base Component的类,且各个Leaf是互不相关的
  3. Composite 包含Leaf,同时也实现了Base Component

下面我们通过画画这个例子来实现组合模式

Base Component

接口类,提供颜色来表明Leaf 的颜色

Shape.java

1
2
3
4
5
6
package com.walterlife.dp.CompositeDP;

public interface Shape {
public void draw(String color);
public String getName();
}

阅读此文

Sep 1 2015
Spring Autowired By type,name,constructor,Autowired and Qualifer 注解例子

Spring Framework的主要特性之一是DI[依赖注入],而实现该方式主要通过配置spring bean的

通常我们会在bean configuration file 中配置程序想要注入的bean 配置,也可以引用配置在其他 file中的bean[通过 ref 引用]。这种方法在需要注入很多bean的时候配置会显得比较繁锁

所以spring提供了 autowired 机制,从而必须定义每一个bean

目前有以下几种方式实现autowired:

  1. autowired byName, 这种方式在 service 中必须实现需要inject的成员变量的setter方法,
    并bean 中配置的bean name 必须和成员变量相同

    1
    2
    <!-- autowiring byName, bean name should be same as the property name -->
    <bean name="employeeServiceByName" class="com.walterlife.springtest.service.EmployeeService" autowire="byName" />
  2. autowired byType, 该种方式下同一种 bean type 只能 配置一次

    1
    2
    <!-- autowiring byType, there should be only one bean definition for the mapping -->
    <bean name="employeeServiceByType" class="com.walterlife.springtest.service.EmployeeService" autowire="byType" />
  3. autowired by constructor, 和 byType类似,只是该种方式是通过构造函数进行注入的

  4. autowired by @Autowired 注解, 使用该种方式,需要配置

    1
    2
    <!-- Enable Annotation based configuration -->
    <context:annotation-config />
  5. @Qualifer, 该注解用来表明@Autowired的参数指定的类型,本身需要带上injected 的bean name

    1
    2
    3
    4
    @Autowired(required=false)
    public EmployeeAutowiredByConstructorService(@Qualifier("employee") Employee employee) {
    this.employee = employee;
    }
阅读此文

Aug 25 2015
Java设计模式学习之观察者模式

观察者模式是行为型模式中的一种。

该模式用于:应用程序对某个对象状态变更感兴趣,并希望该对象状态在每次变更都能及时的收到通知。被观察的对象称为主题,观察这个对象的一堆对象称为观察者。

在GOF中定义如下

建立对象与对象之间的一对多关系, 当一个对象的状态发生变化时,依赖该对象的所有对象都收到通知并自动更新

主题对象包含一堆观察者,时时刻刻装备等待着主题的状态变更,主题对象需要向应用程序提供增加和删除观察者, 以及当状态发生变化时通知观察者的接口

观察者需要提供接口去设置自己感兴趣的观察对象(主题),以及能够使主题对象及时通知自己状态变更的接口

在Java的世界中,该模式应用还是挺广泛的。
JMS(Java Message Service) 将观察者模式和中介者模式结合在一起,从而使应用程序之间互相订阅和发布消息

MVC(Model-View-Controller) 框架中,模型属于主题,视图属于观察者,在模型发生变化时,视图立刻收到通知从而更改相关的状态

Java标准库中有提供了 java.util.Observable(主题)类和Java.util.Observer(观察者)接口,来实现生产者模式

阅读此文

Aug 22 2015
Java设计模式学习之原型模式

原型模式是创造型模式的一种,因此他提供了对象创建的机制

该种模式主要用于:当你需要创建某个对象时,而刚好已经存在与该对象类似的对象,但是同时
不同用已经存在的对象,因为你也想对新的对象做某些定制,此时你就可以使用原型模式咯

Java中是实现对象的clone 方法来实现原型模式的啦

下面这个例子中,我们已经存在一个对象,该对象中的数据需要load from db,此时程序中需要多次对这些数据进行修改,且相互不影响, 此时我们使用原型模式,先创建一个对象,再将对象clone 成多份,避免了每创建一个对象就重新 load data from db

阅读此文

Jul 30 2015
Java Servlet 知识点整理

前言

  • Servlets 是一些实现java Servlet API 的类,用于实现http的请求和响应。
  • 一个Servlet类必须被部署到Servlet容器才可用,如tomcat
  • 像jsp,jsf都最终会被转换为Servlet类

第一个 Servlet 例子

  • 下面是一个很简单的例子,但是可以了解到servlet的原理所在
  • 使用mvn创建一个 webapp 项目,在pom.xml添加如下依赖
    1
    2
    3
    4
    5
    6
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
    </dependency>
阅读此文

Jul 21 2015
Java Thread 相关知识点

1. start 与 run 的区别

  • start 会新创建一个线程,并且执行重新的run方法中的代码
  • run 不会新创建一个线程,而在当前线程内执行 run方法内的代码
  • start 方法不能连续调用,否则会抛出 IllegalStateException
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.walterlife.javacore;

import java.lang.Thread;

public class StartVsRunCall {
public static void main( String[] args ) {
Thread startThread = new Thread(new Task("start"), "startThread");
Thread runThread = new Thread(new Task("run"), "runThread");

startThread.start();
runThread.run();
}

private static class Task implements Runnable {
private String caller;

public Task(String caller) {
this.caller = caller;
}

public void run() {
System.out.println("caller: " + this.caller + " and code exectue in thread " + Thread.currentThread().getName());
}
}
}

// Output:
caller: run and code exectue in thread main
caller: start and code exectue in thread startThread
阅读此文

Jul 20 2015
Java Struts 相关知识点

1. 改变 Struts action url 的m默认后缀

org.apache.struts2.dispatcher.FilterDispatcher 与 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 的区别

  • FilterDispatcher 在Struts2.1.3之前使用
  • StrutsPrepareAndExecuteFilter 在 2.1.3 后推荐使用
阅读此文

Jul 20 2015
永远不要再犯的 5 个编程错误

说明

本文转载自微信公众号文章 http://mp.weixin.qq.com/s?__biz=MjM5OTA1MDUyMA==&mid=209343220&idx=2&sn=bd46e2355bf4184672ca03a3c019476a&scene=1#rd
个人觉得比较实用,故转载于博客中

前言

当你开始成为一个程序员的时候,在编程的时候很容易陷入下面所述的一些坏习惯。
作为一名程序员,犯错误不可避免,这是你学习编程课程中的一部分。在你的职业生涯中你会犯很多错误 – 有的特别、有的普遍 – 通过这些错误你可以学习如何避免在将来再犯同样的错误。
但是如果你是一个初学者,你犯的错误可能会比其他人更频繁。那么如何才能避免大部分程序员每天都犯的这些普遍的错误呢?
想要避免错误,就要对它有所了解。这也是为什么我要和大家分享一些在我们的程序员生涯中阻碍我们成长的普遍错误。
在开始之前,你可能想知道为什么我知道这些是错误,不是最佳的方法?

有一个简单的回答就是 – 在我的职业生涯中,所有这些情况我都遇到过。有些情况经常遇到,有些只遇到过几次。每次犯错之后,我都后悔莫及。
最坏的情况是我根本你不知道我在做错的东西。一旦我意识到我在做错事,我就开始避免这些失误。至少,我现在写的代码比以前写的要好多了。
现在你们也可以避免这些错误。首先要知道你现在在做的是错误的。我知道大部门程序员都不会做任何错事,因为他们认为那是正确的,所以他们的行为会对程序和程序员的职业成长产生不利影响。

绝大部分的不良编程习惯都源于无知,而没有任何其他原因。

要成为一个好的程序员,我们必须一个一个的去掉这些无知。这也是那些好的编程书籍所尽力展示给我们的。

我们犯这些错误的部分原因在于它们确实完成了工作。并不是我们要做的 – 让我们的程序运行起来,完成我们日常的工作。

但是让什么好用只是你工作的一部分。如果想要让你的应用程序好用,你将不得不定期更新,修复任何新的bug,这些将有可能变得很频繁。这样一来能让你的工作变得比较容易的方法就是遵循好的编程实践。另外,即使你在小型程序中能够摆脱这些错误,在大型程序中你也可能碰到他们。

如果你仍然犯这些错误,可能你的程序依然正常运行,能够完成需要的任务,但是它会变得易出bug,充满低效率的代码,难于维护。并且,当你很长时间后再来看它的代码的时候,你会发现代码很难理解。

作为程序员,我们的工作不仅仅是让我们的程序工作,而让用户来处理bug。我们的工作是确保用户即使输入错误也不会得到意外的结果。所以要创建高品质的应用程序,请确保你不会在编程的时候犯下面的这些普遍的错误:
阅读此文

Jul 19 2015
Java String 相关知识点

String 类 在java中是非常特殊的,而且也是经常使用的,本文所讲的是String类要熟知的知识点

1. String 并不是以 \0 结束的

  • 并不像 c/c++ 那样,string 是以 \0 结尾的,java 中String是对象存储的,底层数据存储在 char[]中,你可以使用 charToArray来获得String 的char array

2. String 在 java中 是 f不可变的并且是 inal class

  • String是不可变的,意味着对象一旦创建你就不可以改变其值[重新赋值实际上是重新创建新的对象]。像toLowerCase, toUpperCase 这类操作都会返回一个新的对象。
  • String 的返回是不能被重写的
  • 对于为什么 String 会被定义为 final class 或是 不可变的,可以点击链接阅读

3. String字符串是存储在 字符串池中的

  • 字符串常量(eg: “walterblog”)是存储在一块独立的内存的,字符串池.每次你使用 字符串常量来初始化String 对象时, JVM 都会去 String Pool 检查是否有相同的字符串常量,有则返回没有则创建新的内存并放入字符串池。如果使用 new String 来创建对象的话,JVM不会检查 String Pool 的。

阅读此文

Jul 18 2015
maven webapp 项目部署至tomcat

在本文中,我们使用Apache Tomcat Maven plugin,将maven webapp 项目的war 文件自动部署至 Apache Tomcat下,作者的环境如下:

  • Apache Maven 2.1.1
  • Apache Tomcat Maven Plugin
  • JDK 1.7
  • Apache Tomcat 7
  • OS: Debian 7

1. 在 Tomcat 中创建用户

  • 在 {tomcat installed path}/conf/tomcat-users.xml 中配置如下信息
    1
    2
    3
    4
    5
    6
    7
    <tomcat-users>
    <role rolename="manager"/>
    <role rolename="admin"/>
    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <user username="admin" password="admin" roles="admin, manager, manager-gui, manager-script"/>
    </tomcat-users>

2. 在 Maven 中创建用户

  • 在 /etc/conf/maven/setting.xml[linux环境] 中配置如下信息
    1
    2
    3
    4
    5
    <server>
    <id>tomcat</id>
    <username>admin</username>
    <password>admin</password>
    </server>
阅读此文