Velocity

基本语法

  • ”#”用来标识Velocity的脚本语句,包括#set、#if 、#else、#end、#foreach、#end、#iinclude、#parse、#macro等,如:
#if($info.images)
    <img src="$info.images">
#else
    <img src="noPhoto.jpg">
#end
  • ”$”用来标识一个变量,如
$i
$msg.errorNum
  • ”!”用来强制把不存在的变量显示为空白
$!msg
  • 注释,如:
## 这是一行注释,不会输出
#* xxxx
多行注释
xxxx *#

具体语法可参考[官网] (http://velocity.apache.org/engine/devel/user-guide.html)

语法详解

  • 变量赋值输出
Welcome $name to halo9pan.cn!
today is $date.
tdday is $mydae.//未被定义的变量将当成字符串
  • 设置变量值,所有变量都以$开头
#set( $iAmVariable = "good!" )
Welcome $name to halo9pan.cn!
today is $date.
$iAmVariable
  • if,else判断
#set ($admin = "admin")
#set ($user = "user")
#if ($admin == $user)
    Welcome admin! 
#else
    Welcome user!
#end
  • 迭代数据List ($velocityCount为列举序号,默认从1开始)
#foreach( $product in $allProducts ) 
    <li>$velocityCount $product.title</li>
#end
  • 迭代数据get key
#foreach($key in $myProducts.keySet() )
    $key `s value: $myProducts.get($key)
#end
  • 导入其它文件,可输入多个
#parse("vm_a.vm")
#parse("vm_b.vm")
  • 简单遍历多个div
#foreach( $i in [1,2,3,4] )
<div>$i</div>
#end
  • 双引号与单引号
#set ($var="helo")
test"$var" 返回testhello
test'$var' 返回test'$var'

可以通过设置 stringliterals.interpolate=false改变默认处理方式

  • Range
#foreach( $foo in [1..5] )
  • 定义宏macros,相当于函数
#macro( d )
  <tr><td></td></tr>
#end
调用
#d() 
  • 带参数的宏
#macro( tablerows $color $somelist )
  #foreach( $something in $somelist )
  <tr><td bgcolor=$color>$something</td></tr>
  #end
#end

Freemarker

基础语法

  • 变量
data = {
	"user": "halo9pan"	
}
  • 模板
<h1>Hello ${user}</h1>
  • 字符串链接
${"Hello,${user}!"}
${"Hello,"+user+"!"};

${..}只能用于文本部分,下面的代码是错误的:

<#if ${isBig}>Wow!</#if>
<#if "${isBig}">Wow!</#if>

应该写成:

<#if isBig>Wow!</#if>

具体语法可参考[官网] (http://freemarker.incubator.apache.org/docs/index.html)

内建函数

  1. html:对字符串进行HTML编码
  2. cap_first:将字符串第一个字母成大写
  3. lower_case:将字符串转换成小写
  4. upper_case:将字符串转换成大写
  5. trim: 去掉字符串前后的空白字符
  6. size: 获得序列中元素的数目
  7. int 取得数字的整数部分

指令

  • if
data = {
	"user": "halo9pan",
	"isNewGuys": true
}
<h1><#if user == "halo9pan">Your are hero.</#if></h1>
<p>
	<#if isNewGuys>
		new guys!
	<#else>
		old
	</#if>
</p>
  • list
data = [
	{
		"user": "halo9pan",
		"gender": "male"
	},
	{
		"user": "panhao",
		"gender": "male"
	}
]
<ul>
	<#list data as item
	<li>name:${item.user};Gender:${item.gender}</li>
	</#list>
</ul>
  • include
<#include "/xxx.html">
  • 空值的处理
<h1>Welcome ${user!"default"}!</h1>

如果user不存在或者为null,最后模板会输出 default这个值
反之,输出user的真实值!

<#if user??><h1>hello ${user}</h1></#if>

如果,user 存在则输出包括的内容!
反之,则忽略整条模板内容!


安装

初始化

my.cnf/my.ini

[client]
user                    = root
password                = XXXXXXXX
port                    = 11806
socket                  = F:/Eris/mysql/socket
default-character-set   = utf8

# The MySQL server
[mysqld]
basedir                 = F:/Luna/mysql/
datadir                 = F:/Eris/mysql/data
port                    = 11806
socket                  = F:/Eris/mariadb/socket
key_buffer_size         = 16K
max_allowed_packet      = 1M
table_open_cache        = 4
sort_buffer_size        = 64K
read_buffer_size        = 256K
read_rnd_buffer_size    = 256K
net_buffer_length       = 2K
thread_stack            = 128K
sql_mode                = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
skip-external-locking
character-set-server    = utf8
collation-server        = utf8_unicode_ci
lower_case_table_names  = 1

# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (using the "enable-named-pipe" option) will render mysqld useless!
# 
#skip-networking
server-id	              = 1

# Uncomment the following if you want to log updates
#log-bin=mysql-bin

# binary logging format - mixed recommended
#binlog_format=mixed

# Causes updates to non-transactional engines using statement format to be
# written directly to binary log. Before using this option make sure that
# there are no dependencies between transactional and non-transactional
# tables such as in the statement INSERT INTO t_myisam SELECT * FROM
# t_innodb; otherwise, slaves may diverge from the master.
#binlog_direct_non_transactional_updates=TRUE

# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir               = F:/Eris/mysql/data
#innodb_data_file_path              = ibdata1:10M:autoextend
#innodb_log_group_home_dir          = F:/Eris/mysql/data
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
innodb_buffer_pool_size             = 16M
# innodb_additional_mem_pool_size   = 2M
# Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size                = 5M
innodb_log_buffer_size              = 8M
#innodb_flush_log_at_trx_commit     = 1
#innodb_lock_wait_timeout           = 50

[mysqldump]
quick
max_allowed_packet      = 16M

[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
default-character-set   = utf8

初始化root密码

mysqladmin -u root -p flush-privileges password "new_pwd"
mysqladmin -u root -p flush-privileges password

执行SQL

mysql -u root -p -e ""

更新root密码

SELECT User,Host FROM mysql.user;

SET PASSWORD FOR 'root'@'127.0.0.1' PASSWORD('new_pwd');
SET PASSWORD FOR 'root'@'localhost' PASSWORD('new_pwd');

root本地登录、移除匿名用户

SELECT User,Host FROM mysql.user;

DROP USER 'root'@'%';
DROP USER ''@'localhost';

创建用户

GRANT USAGE ON *.*
TO 'hello'@'localhost'
IDENTIFIED BY 'pass9USE';

GRANT SELECT ON *.* TO 'hello'@'localhost';

SHOW GRANTS FOR 'hello'@'localhost' \g

GRANT ALL ON *.* TO 'hello'@'localhost';

常用命令

SHOW DATABASES;
CREATE TABLE test.hello (hello_id INT, word TEXT);

SHOW TABLES FROM test;

USE test;
SHOW TABLES;
DESCRIBE hello;
INSERT INTO hello VALUES(100, 'World');
INSERT INTO hello VALUES(101, 'Welt');
INSERT INTO hello VALUES(102, 'Monde');
--INSERT INTO hello VALUES(101, '世界');
SOURCE ???.sql

数据库创建

CREATE DATABASE hello;

DROP DATABASE hello;
CREATE DATABASE hello
CHARACTER SET utf8
COLLATE utf8_unicode_ci;

创建表

CREATE TABLE guest (
id INT AUTO_INCREMENT PRIMARY KEY,
nick_name CHAR(64) UNIQUE,
visit_time INT);

DESCRIBE guest;

SHOW CREATE TABLE guest \g
CREATE TABLE vocabulary (
id BIGINT DEFAULT 0,
word CHAR(16) UNIQUE,
emotion_joy SMALLINT DEFAULT 0,
emotion_sad SMALLINT DEFAULT 0,
emotion_anger SMALLINT DEFAULT 0,
emotion_fear SMALLINT DEFAULT 0,
emotion_trust SMALLINT DEFAULT 0,
emotion_suspect SMALLINT DEFAULT 0,
emotion_expect SMALLINT DEFAULT 0,
emotion_surprised SMALLINT DEFAULT 0,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);

DESCRIBE vocabulary;

SHOW CREATE TABLE vocabulary \g
CREATE TABLE guest_isam (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nick_name CHAR(64) UNIQUE,
  visit_time INT NOT NULL DEFAULT 0
) ENGINE=MyISAM AUTO_INCREMENT=1000 DEFAULT CHARSET=gbk COLLATE=gbk_chinese_ci;
SHOW FULL COLUMNS
FROM guest LIKE 'nick' \g

备份数据

mysqldump

mysqldump --user='hello' -p hello guest > hello-guest.sql
mysqldump --user='hello' -p hello > hello.sql
mysqldump --single-transaction --user='hello' -p hello > hello.sql

还原数据

mysql --user='hello' -p hello guest < hello-guest.sql
mysql --user='hello' -p hello < hello.sql

修改表

ALTER TABLE guest
ADD COLUMN description TEXT;
DESCRIBE guest;

ALTER TABLE vocabulary
ADD COLUMN description VARCHAR(255);
DESCRIBE vocabulary;
CREATE TABLE guest_like LIKE guest;
DESCRIBE guest_like;

INSERT INTO guest_like
SELECT * FROM guest;
SELECT * FROM guest_like;
DROP TABLE guest_like;

CREATE TABLE guest_create
SELECT * FROM guest;
DESCRIBE guest_create;
SELECT * FROM guest_create;
DROP TABLE guest_create;
ALTER TABLE guest
DROP COLUMN description;
DESCRIBE guest;
ALTER TABLE guest
ADD COLUMN nick_type CHAR(2) AFTER nick_name;
DESCRIBE guest;
ALTER TABLE guest
CHANGE COLUMN nick_type nick_type CHAR(4);
DESCRIBE guest;
ALTER TABLE guest
MODIFY COLUMN nick_type
ENUM('Auto','Manual')
AFTER nick_name;
DESCRIBE guest;
UPDATE guest SET visit_time=0 WHERE visit_time IS NULL;

ALTER TABLE guest MODIFY COLUMN visit_time INT NOT NULL DEFAULT 0;
DESCRIBE guest;
ALTER TABLE guest
AUTO_INCREMENT = 100;
INSERT INTO guest (nick_name, visit_time)
VALUES ('Garnett', 1),
('Messi', 3);
INSERT INTO guest (nick_name)
VALUES ('Ronaldo ');
SELECT * FROM guest;

数据操作

插入数据

INSERT INTO guest (nick_name)
VALUES ('Ada'),
('David'),
('Robbie');

INSERT INTO guest (nick_name, visit_time)
VALUES ('Johnson', 1),
('John', 0),
('James', 0);

SELECT * FROM guest;
CREATE TABLE guest_new LIKE guest;
DESCRIBE guest_new;

ALTER TABLE guest_new
ADD COLUMN nick_name_new VARCHAR(127);

INSERT IGNORE INTO guest_new
(nick_name, nick_name_new, visit_time)
SELECT nick_name, nick_name, visit_time FROM guest;

SELECT * FROM guest_new;
REPLACE INTO guest (nick_name)
VALUES ('Ada'),
('David'),
('Robbie');

REPLACE INTO guest (nick_name, visit_time)
VALUES ('Johnson', 101),
('John', 100),
('James', 100);

REPLACE INTO guest (nick_name, nick_type)
VALUES ('Ada', 1),
('David', 1),
('Robbie',1 );

SELECT * FROM guest;
INSERT LOW_PRIORITY INTO guest (nick_name)
VALUES ('Aaric'),
('Aart'),
('Abbeygail');

-- INSERT DELAYED INTO guest (nick_name)
-- VALUES ('Abbot'), ('Abbott'), ('Abeodan');

INSERT INTO guest (nick_name) VALUES ('Aaric')
  ON DUPLICATE KEY UPDATE nick_name = CONCAT('!', nick_name);
SELECT * FROM guest;

DELETE FROM guest WHERE nick_name LIKE '!%';
SELECT * FROM guest;
ALTER TABLE guest
ADD COLUMN nick_name_used SMALLINT NOT NULL DEFAULT 1;
DESCRIBE guest;

INSERT INTO guest (nick_name) VALUES ('Aaric')
  ON DUPLICATE KEY UPDATE nick_name_used = nick_name_used + 1;

SELECT * FROM guest;

查询数据

SELECT * FROM guest;

SELECT * FROM guest WHERE visit_time=1;
SELECT * FROM guest WHERE visit_time IN (1, 100);
SELECT * FROM guest WHERE nick_name LIKE 'A%';
SELECT * FROM guest WHERE nick_name REGEXP 'i|o';
SELECT * FROM guest WHERE nick_name NOT REGEXP 'i|o';
SELECT * FROM guest WHERE visit_time=1 AND nick_name LIKE 'A%';
SELECT * FROM guest WHERE visit_time=1 OR nick_name LIKE 'A%';

SELECT * FROM guest ORDER BY visit_time;

SELECT * FROM guest WHERE visit_time>=1 ORDER BY visit_time LIMIT 5;
SELECT * FROM guest WHERE visit_time>=1 ORDER BY visit_time DESC LIMIT 2;

SELECT COUNT(*) FROM guest;
SELECT * FROM guest GROUP BY visit_time;

SELECT nick_name, visit_time FROM guest;
SELECT nick_name AS 'Nick Name', visit_time AS 'Visit Times' FROM guest;

SELECT visit_time AS 'Visit Times',
COUNT(*) AS 'Number'
FROM guest
GROUP BY visit_time;

更新数据

SELECT * FROM guest;
UPDATE guest
SET visit_time = 10
WHERE nick_name_used > 1;
SELECT * FROM guest;

删除数据

SELECT * FROM guest;
DELETE FROM guest
WHERE visit_time = 0
AND nick_name_used = 1;
SELECT * FROM guest;

联合查询



Christian Bauer
Gavin King

实体、映射

配置

SessionFactory 和Session

事务(Transactions)

表(Tables)

关联映射

  • 一对一
  • 一对多
  • 多对多
  • 组合

jQuery API

jQuery 使用场景

DOM Traversal and Manipulation

Get the <button> element with the class ‘continue’ and change its HTML to ‘Next Step…’

$( "button.continue" ).html( "Next Step..." )

Event Handling

Show the #banner-message element that is hidden with display:none in its CSS when any button in #button-container is clicked.

var hiddenBox = $( "#banner-message" );
$( "#button-container button" ).on( "click", function( event ) {
  hiddenBox.show();
});

Ajax

Call a local script on the server /api/getWeather with the query parameter zipcode=97201 and replace the element #weather-temp’s html with the returned text.

$.ajax({
  url: "/api/getWeather",
  data: {
    zipcode: 97201
  },
  success: function( data ) {
    $( "#weather-temp" ).html( "<strong>" + data + "</strong> degrees" );
  }
});

CSS 选择器

选择器 例子 例子描述 CSS
.class .intro 选择 class=”intro” 的所有元素 1
#id #firstname 选择 id=”firstname” 的所有元素 1
* * 选择所有元素 2
element p 选择所有 <p> 元素 1
element,element div,p 选择所有 <div> 元素和所有 <p> 元素 1
element element div p 选择 <div> 元素内部的所有 <p> 元素 1
element>element div>p 选择父元素为 <div> 元素的所有 <p> 元素 2
element+element div+p 选择紧接在 <div> 元素之后的所有 <p> 元素 2
[attribute] [target] 选择带有 target 属性所有元素 2
[attribute=value] [target=_blank] 选择 target=”_blank” 的所有元素 2
[attribute~=value] [title~=flower] 选择 title 属性包含单词 “flower” 的所有元素 2
[attr|=value] [lang|=en] 选择 lang 属性值以 “en” 开头的所有元素 2
:link a:link 选择所有未被访问的链接 1
:visited a:visited 选择所有已被访问的链接 1
:active a:active 选择活动链接 1
:hover a:hover 选择鼠标指针位于其上的链接 1
:focus input:focus 选择获得焦点的 input 元素 2
:first-letter p:first-letter 选择每个 <p> 元素的首字母 1
:first-line p:first-line 选择每个 <p> 元素的首行 1
:first-child p:first-child 选择属于父元素的第一个子元素的每个 <p> 元素 2
:before p:before 在每个 <p> 元素的内容之前插入内容 2
:after p:after 在每个 <p> 元素的内容之后插入内容 2
:lang(language) p:lang(it) 选择带有以 it 开头的 lang 属性值的每个 <p> 元素 2
element1~element2 p~ul 选择前面有 <p> 元素的每个 <ul> 元素 3
[attribute^=value] a[src^=”https”] 选择其 src 属性值以 “https” 开头的每个 <a> 元素 3
[attribute$=value] a[src$=”.pdf”] 选择其 src 属性以 “.pdf” 结尾的所有 <a> 元素 3
[attribute*=value] a[src*=”abc”] 选择其 src 属性中包含 “abc” 子串的每个 <a> 元素 3
:first-of-type p:first-of-type 选择属于其父元素的首个 <p> 元素的每个 <p> 元素 3
:last-of-type p:last-of-type 选择属于其父元素的最后 <p> 元素的每个 <p> 元素 3
:only-of-type p:only-of-type 选择属于其父元素唯一的 <p> 元素的每个 <p> 元素 3
:only-child p:only-child 选择属于其父元素的唯一子元素的每个 <p> 元素 3
:nth-child(n) p:nth-child(2) 选择属于其父元素的第二个子元素的每个 <p> 元素 3
:nth-last-child(n) p:nth-last-child(2) 同上,从最后一个子元素开始计数 3
:nth-of-type(n) p:nth-of-type(2) 选择属于其父元素第二个 <p> 元素的每个 <p> 元素 3
:nth-last-of-type(n) p:nth-last-of-type(2) 同上,但是从最后一个子元素开始计数 3
:last-child p:last-child 选择属于其父元素最后一个子元素每个 <p> 元素 3
:root :root 选择文档的根元素 3
:empty p:empty 选择没有子元素的每个 <p> 元素(包括文本节点) 3
:target #news:target 选择当前活动的 #news 元素 3
:enabled input:enabled 选择每个启用的 <input> 元素 3
:disabled input:disabled 选择每个禁用的 <input> 元素 3
:checked input:checked 选择每个被选中的 <input> 元素 3
:not(selector) :not(p) 选择非 <p> 元素的每个元素 3
::selection ::selection 选择被用户选取的元素部分 3
console.group("jQuery");
var allArticles = $('article[id^="post"]')
allArticles.each(function(index, article){
    var content = $('header>h1>a', article).text().trim();
    var href = $('header>h1>a', article).attr("href");
    console.log("[%s](%s)  ", content, href);
});
console.groupEnd();

jQuery 选择器

Category: Selectors [All Selector (“*”)](//api.jquery.com/all-selector/)
:animated Selector
Attribute Contains Prefix Selector [name|=”value”]
Attribute Contains Selector [name*=”value”]
Attribute Contains Word Selector [name~=”value”]
Attribute Ends With Selector [name$=”value”]
Attribute Equals Selector [name=”value”]
Attribute Not Equal Selector [name!=”value”]
Attribute Starts With Selector [name^=”value”]
:button Selector
:checkbox Selector
:checked Selector
Child Selector (“parent > child”)
Class Selector (“.class”)
:contains() Selector
Descendant Selector (“ancestor descendant”)
:disabled Selector
Element Selector (“element”)
:empty Selector
:enabled Selector
:eq() Selector
:even Selector
:file Selector
:first-child Selector
:first-of-type Selector
:first Selector
:focus Selector
:gt() Selector
Has Attribute Selector [name]
:has() Selector
:header Selector
:hidden Selector
ID Selector (“#id”)
:image Selector
:input Selector
:lang() Selector
:last-child Selector
:last-of-type Selector
:last Selector
:lt() Selector
Multiple Attribute Selector [name=”value”][name2=”value2″]
Multiple Selector (“selector1, selector2, selectorN”)
Next Adjacent Selector (“prev + next”)
Next Siblings Selector (“prev ~ siblings”)
:not() Selector
:nth-child() Selector
:nth-last-child() Selector
:nth-last-of-type() Selector
:nth-of-type() Selector
:odd Selector
:only-child Selector
:only-of-type Selector
:parent Selector
:password Selector
:radio Selector
:reset Selector
:root Selector
:selected Selector
:submit Selector
:target Selector
:text Selector
:visible Selector

jQuery 事件

.bind()
.blur()
.change()
.click()
.dblclick()
.delegate()
.die()
.error()
event.currentTarget
event.data
event.delegateTarget
event.isDefaultPrevented()
event.isImmediatePropagationStopped()
event.isPropagationStopped()
event.metaKey
event.namespace
event.pageX
event.pageY
event.preventDefault()
event.relatedTarget
event.result
event.stopImmediatePropagation()
event.stopPropagation()
event.target
event.timeStamp
event.type
event.which
.focus()
.focusin()
.focusout()
.hover()
jQuery.proxy()
.keydown()
.keypress()
.keyup()
.live()
.load()
.mousedown()
.mouseenter()
.mouseleave()
.mousemove()
.mouseout()
.mouseover()
.mouseup()
.off()
.on()
.one()
.ready()
.resize()
.scroll()
.select()
.submit()
.toggle()
.trigger()
.triggerHandler()
.unbind()
.undelegate()
.unload()

Ajax 请求

.ajaxComplete()
.ajaxError()
.ajaxSend()
.ajaxStart()
.ajaxStop()
.ajaxSuccess()
jQuery.ajax()
jQuery.ajaxPrefilter()
jQuery.ajaxSetup()
jQuery.ajaxTransport()
jQuery.get()
jQuery.getJSON()
jQuery.getScript()
jQuery.param()
jQuery.post()
.load()
.serialize()
.serializeArray()