约定大于配置--实战

2014-08-22 Architecture

约定优于配置是一个简单的概念。 系统,类库,框架应该假定合理的默认值,而非要求提供不必要的配置。 在大部分情况下,你会发现使用框架提供的默认值会让你的项目运行的更快。

零配置并不是完全没有配置,而是通过约定来减少配置, 减少 XML

#约定代码结构或命名规范来减少配置数量

如果模型中有个名为Sale的类,那么数据库中对应的表就会默认命名为sale。只有在偏离这一约定时,例如将该表命名为”products_sold”,才需写有关这个名字的配置。

比如 EJB3 持久化,将一个特殊的Bean持久化,你所需要做的只是将这个类标注为 @Entity 。 框架将会假定表名和列名是基于类名和属性名。 系统也提供了一些钩子,当有需要的时候你可以重写这些名字.

比如 maven 项目约定,在没有自定义的情况下,源代码假定是在 /workspace/content-zh/src/main/java,资源文件假定是在/workspace/content-zh/src/main/resources 。测试代码假定是在 /workspace/content-zh/src/test。项目假定会产生一个 JAR 文件。Maven假定你想要把编译好的字节码放到 /workspace/content-zh/target/classes 并且在 /workspace/content-zh/target 创建一个可分发的 JAR 文件。Maven 对约定优于配置的应用不仅仅是简单的目录位置,Maven 的核心插件使用了一组通用的约定,以用来编译源代码,打包可分发的构件,生成 web 站点,还有许多其他的过程。 Maven 的力量来自它的”武断”,它有一个定义好的生命周期和一组知道如何构建和装配软件的通用插件。如果你遵循这些约定,Maven 只需要几乎为零的工作——仅仅是将你的源代码放到正确的目录,Maven 将会帮你处理剩下的事情。

比如 Yeoman 创建项目,只需一行代码

yeoman init angular 

就会创建整个详细结构包括渲染路由的骨架,单元测试等

比如 HTML5 Boilerplate,为App的默认模板以及文件路径规范,无论是网站或者富UI的App,都可以采用这个模板作为起步。HTML5 Boilerplate的模板核心部分不过30行,但是每一行都可谓千锤百炼,可以用最小的消耗解决一些前端的顽固问题: Boilerplate

#采用更简洁的配置方式来替代XML

##比如:hibernate.properties的 c3p0 方式:

hibernate.connection.driver_class = org.postgresql.Driver
hibernate.connection.url = jdbc:postgresql://localhost/mydatabase
hibernate.connection.username = myuser
hibernate.connection.password = secret
hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=20
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50
hibernate.dialect = org.hibernate.dialect.PostgreSQL82Dialect

##比如:hibernate.properties 的 JNDI 方式:

hibernate.connection.datasource = java:/comp/env/jdbc/test
hibernate.transaction.factory_class = \org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.manager_lookup_class = \ org.hibernate.transaction.JBossTransactionManagerLookup
hibernate.dialect = org.hibernate.dialect.PostgreSQL82Dialect

##比如 Apache Shiro 的 ini 配置

[users]
root = secret, admin
guest = guest, guest
presidentskroob = 12345, president
darkhelmet = ludicrousspeed, darklord, schwartz
lonestarr = vespa, goodguy, schwartz

[roles]
admin = *
schwartz = lightsaber:*
goodguy = winnebago:drive:eagle5

##Hibernate通过代码配置

Configuration cfg = new Configuration()
    .addClass(org.hibernate.auction.Item.class)
    .addClass(org.hibernate.auction.Bid.class)
    .setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect")
    .setProperty("hibernate.connection.datasource", "java:comp/env/jdbc/test")
    .setProperty("hibernate.order_updates", "true");

##Gradle 替代 Maven 采用 Maven

<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-core</artifactId>
   <version>4.3.6.Final</version>
</dependency>

采用 Gradle 只需一行

org.hibernate:hibernate-core:4.3.6.Final

#通过注解约定其含义来减少配置数量

##spring注解 Spring会自动搜索某些路径下的Java类,并将这些java类注册为Bean实例,这样就省去了将所有 bean 都在 XML 配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context.xsd">

	<context:component-scan base-package="com.waylau.rest"/>

</beans>

注意:如果配置了<context:component-scan/>那么<context:annotation-config/>标签就可以不用在 xml 中配置了,因为前者包含了后者。另外<context:component-scan/>还提供了两个子标签<context:include-filter> <context:exclude-filter>用来控制扫描文件的颗粒度,例如

<beans>
	<context:component-scan base-package="com.waylau.rest">
	<context:include-filter type="regex" expression=".*Stub.*Repository"/>
	<context:exclude-filter type="annotation"expression="org.springframework.stereotype.Repository"/>
	</context:component-scan>
</beans>

代码实现

public static void main(String[] args) {
	AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
	ctx.scan("com.waylau.rest");
	ctx.refresh();
	MyService myService = ctx.getBean(MyService.class);
}

Spring会合适的将显示指定路径下的类全部注册成Spring Bean。 Spring通过使用特殊的Annotation来标注Bean类。

  • @Component :标注一个普通的Spring Bean类。
  • @Controller : 标注一个控制器组件类。
  • @Service: 标注一个业务逻辑组件类。
  • @Repository : 标注一个DAO组件类。

##Hibernate注解 表与实体映射

@Entity
@Table(name="TBL_FLIGHT", 
       schema="AIR_COMMAND", 
       uniqueConstraints=
           @UniqueConstraint(
               name="flight_number", 
               columnNames={"comp_prefix", "flight_number"} ) )
public class Flight implements Serializable {
    @Column(name="comp_prefix")
    public String getCompagnyPrefix() { return companyPrefix; }

    @Column(name="flight_number")
    public String getNumber() { return number; }
}

甚至 SQL 也可以注解

@Entity
@Table(name="CHAOS")
@SQLInsert( sql="INSERT INTO CHAOS(size, name, nickname, id) VALUES(?,upper(?),?,?)")
@SQLUpdate( sql="UPDATE CHAOS SET size = ?, name = upper(?), nickname = ? WHERE id = ?")
@SQLDelete( sql="DELETE CHAOS WHERE id = ?")
@SQLDeleteAll( sql="DELETE CHAOS")
@Loader(namedQuery = "chaos")
@NamedNativeQuery(name="chaos", query="select id, size, name, lower( nickname ) as nickname from CHAOS where xml:id= ?", resultClass = Chaos.class)
public class Chaos {
    @Id
    private Long id;
    private Long size;
    private String name;
    private String nickname;
	//...
} ##Jersey 2.X 实现 REST 和 MVC

@POST
@Produces({"text/html”}) 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
@Template(name = "/short-link”) @ErrorTemplate(name = "/error-form") 
@Valid
public ShortenedLink createLink(@NotEmpty @FormParam("link") final String link) { 
    // ... 
}

##Shiro 的注解

没有注解的情况

//get the current Subject
Subject currentUser =
    SecurityUtils.getSubject();

if (currentUser.hasRole(“administrator”)) {
   //do something in here that only a administrator‏
} else {
    //don’t  do ‏
}

用了注解,简洁很多

@RequiresRoles( “administrator” )
public void openAccount( Account acct ) { 
    //do something in here that only a administrator
} ##Struts 2.x 注解

package com.waylau.actions;
 
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
 
@Results({
  @Result(name="failure", location="fail.jsp")
})
public class HelloWorld extends ActionSupport {
  @Action(value="/different/url",
    [email protected](name="success", location="http://struts.apache.org", type="redirect")}
  )
  public String execute() {
    return SUCCESS;
  }
 
  @Action("/another/url")
 
  public String doSomething() {
    return SUCCESS;
  }
}

#参考


$(window).resize() 执行延迟

2014-08-19 HTML

#问题 ` $(window).resize() 是监听窗口大小缩放,而后执行动作。最近在用echarts`报表时,发现表报的缩放跟不上窗口的缩放节奏,比窗口的缩放总是慢一步。代码

$(window).resize(function(){

    myChart.resize();

});

#解决 加个时间,延迟执行就好了

var timer = 0;

$(window).resize(function(){

    clearTimeout(timer);

    timer = setTimeout(function() {
        myChart.resize();

    }, 200);

});

HTML 颜色块图标

2014-08-18 HTML

html颜色块图标醒目大方。

本文详解颜色块图标的CSS实现。

#设计界面元素 在把主页面的 html 的元素规定好。主要由四个图标组成。如下:

<body>
<div class="container">
    <div class="bgblue"> 0#柴油<br/><h1>7.84</h1></div>
    <div class="bgblue"> 90#柴油<br/><h1>8.26</h1></div>
    <div class="bgblue"> 93#柴油<br/><h1>7.80</h1></div>
    <div class="bgblue"> 97#柴油<br/><h1>8.45</h1></div>
</div>

<div id="buttom_id">
    更多示例访问:<a href="http://wwww.waylau.com" target="_blank">http://wwww.waylau.com</a>
</div>
</body>

图标直接用的是div

#样式 ##图标样式 底色

background:#123456;

字体颜色(白色)

color:#fff;

文本布局(垂直居中)

vertical-align: middle;
text-align: center;
 	float: left;
padding: 20px;
margin-left: 20px;

效果 整体效果

#圆形图标 可以将图标设置成圆形或者任意角度弧形 增加样式:

border:4px solid;
border-radius:55px;

其中 border-radius 控制div角度,border是边框

#整体效果

整体效果2

源码下载


HTML 透明登录框的实现

2014-08-17 HTML

html登录界面,看似简单,无非就是一个底图,一个名称,一个登录,一些底部信息,在没有美工的情况下,纯代码实现还是有些坑。

本文详解透明的登录框的CSS实现。

#设计界面元素 在把主页面的 html 的元素规定好。主要由底图、名称、登录表单、底部信息组成。如下:

<img  src="img/bg.jpg"  />
<div id="login_id">
    <h1>wwww.waylau.com<br/>信息管理系统</h1>
    <form id="login_form">
        <input name="loginname" type="text" class="loginuser"    placeholder="用户名"   />
        <input name="password" type="password" class="loginpwd"   placeholder="密码"  />
        <input id="login" type="button" class="loginbtn" value="登录" />
    </form>
</div>

<div id="buttom_id">
    版权所有:<a href="http://wwww.waylau.com" target="_blank">http://wwww.waylau.com</a>
</div>

body 的 底图我的需求是整张图拉伸铺满,而不是重复显示,或者留空。虽然 bodybackground:url(xxx) 可以插入底图,但是 设为no-repeat的话,如果图太小,会留空,background-size设置没有达到预期效果。所以直接用了img.

#样式 ##整体样式 整体是居中的

body {
    text-align: center;
    margin: 0;
}

##底图的样式

img {
    width:100% ;height:100%;position:absolute;
	top:0;left:0;right:100;bottom:500;z-index:-1;
}

拉伸图片填充整个界面,其中z-index:-1; 就是让图片的深度降一级,意思是说,图片是在所有元素的后面。

##表单样式 输入表单,我的需求是要透明(正常的input简直俗透了),只显示一个底部输入线条

#login_form input {
    border: 0;
    BACKGROUND-COLOR: transparent;
    BORDER-BOTTOM: #ffffff 1px solid;
    BORDER-LEFT: #ffffff 1px solid;
    COLOR: #ffffff;
    HEIGHT: 18px;
    font-size: 12pt
}

border: 0;就是不要显示输入框的边框。

BACKGROUND-COLOR: transparent;这里是设置了透明。

BORDER-BOTTOM就是 用来显示底线的,同理BORDER-LEFT BORDER-RIGHTBORDER-TOP就是设置上下左右的边框线条。

#整体效果

整体效果

么么滴,相册的水印真讨厌。╯﹏╰

另外底图来自《星际争霸》原画,当年最爱的游戏Y(^_^)Y

源码下载


将SVN服务器里面的项目删除

2014-08-04 SVN

平常用 svn 插件进行项目开发管理,如果要删除项目,就需要安装TortoiseSVN.

安装成功后,右键 就可以看到TortoiseSVN TortoiseSVN

提示要求输入服务器或者项目的地址 地址

需要用户名、密码 验证

右击项目,点击delete delete

日志里写点啥吧~,点击OK即可 OK


Hibernate tools介绍、安装、使用

2014-08-02 Hibernate

##介绍 http://hibernate.org/tools/

##版本 http://tools.jboss.org/downloads/overview.html

选择对应的版本

至今(2014-12-14) Eclipse Luna 4.4的最新版本是 `JBoss Tools 4.2.1.Final

##下载

下载安装方式有如下三种:

###1.从marketplace

http://tools.jboss.org/downloads/jbosstools/luna/4.2.0.Beta3.html#marketplace

###2.URL站点更新

http://tools.jboss.org/downloads/jbosstools/luna/4.2.0.Beta3.html#update_site

###3.插件下载

http://tools.jboss.org/downloads/jbosstools/luna/4.2.0.Beta3.html#zips

##使用

htools7.jpg

###1. 创建Hibernate Configuration File(cfg.xml)

根据要求填入相关配置,测试下能否连接上数据库就行了

###2. 创建Hibernate Console Configuration

选择项目和数据库连接(连接 emsc 在上一步中已经创建了)

htools8.jpg

选择方言

htools9.jpg

###3. 使用 Hibernate Code Generation Configurations 自动生成实体

htools3.jpg

选择 上一步中创建好的 Console Configuration,填写包名

htool.jpg

选择要生成的的文件类型

htools2.jpg

会有一个 “The serializable class SdUser does not declare a static final serialVersionUID field of type long” 的警告

htools4.jpg

用 eclipse 自动处理这个警告,生成一个 serial version ID 即可

htools5.jpg

完成

htools6.jpg

##错误解决

Problems while reading database schema

org.hibernate.HibernateException: could not instantiate RegionFactory 

换个项目没有问题。jar 冲突。换不了jar 就再另外一个项目里面把bean ,xml 给生成完了再把代码移回原项目

##参考


SQLserver不同数据库不同表之间的复制

2014-08-01 SQLServer

1.将EEMS库中的Dec_TownInfo表中的数据 复制到 OEM库的c_townInfo中(c_townInfo表事先存在),先要将表的主键设为自增长类型,且列出列名

SET IDENTITY_INSERT  [OEM].[dbo].[c_townInfo] ON

insert into  [OEM].[dbo].[c_townInfo] (id,name,city_id,code,logo) select * FROM [EEMS].[dbo].[Dec_TownInfo]

2.将EEMS库中的Dec_TownInfo表中的数据 复制到 OEM库的c_townInfo中(c_townInfo表事先不存在)

SELECT * INTO  [OEM].[dbo].[c_townInfo] FROM [EEMS].[dbo].[Dec_TownInfo]