Velocity Macro(宏)

定义宏和使用宏

#macro指令用于定义一个VTL模板的重复代码块——宏。下面是一个简单的定义宏的例子:

#macro( d )
#end

这段代码定义了一个宏,名字为d,没有参数。下面是使用这个宏的代码:

#d()

Velocity在遇到#d()的时候,会用”<tr><td></td></tr>”替代上面的#d()这一行。

宏的参数:
宏也可以带参数,而且是任意多个参数。不过,宏定义时有几个参数,宏调用时就要提供同样数目的参数。

#macro( d $name)
$name
#end

使用:

#d("name1")

宏的参数可以是以下VTL元素中的任意一种:引用、字符串字面值、数值字面值、整数范围(比如[1 .. 10]、[$start .. $end])、数组、布尔值true或者false。

内联的宏

当宏是在一个Velocity模板中定义时,这个宏(是inline的)只能被该模板使用,同一个网站下的其他模板是不能用的。如果是在一个Velocity宏模板库中定义的宏,就可以被任何同一网站下的模板使用。

其他一些注意点

宏必须在第一次使用它之前定义。当#Parse()一个模板文件时,尤其要注意这一点。

好的写法:

#macro(link $linkHref $linkId)
    <a href="$!linkHref"#if($linkId) id="$linkId"#end>$bodyContent</a>
#end

参考:
http://www.cnblogs.com/yuepeng/archive/2010/11/23/1885700.html
http://my.oschina.net/tinyframework/blog/221930

HTTP1.1协议详解

例:
请求行 GET /App1/1.html HTTP/1.1
GET:请求方式,默认的请求方式。其他常用的请求方式还有POST。

GET的特点:
把表单的请求的数据放在了请求的URI的后面。例:
/App1/c.html?username=sdsfds&password=234324
这样不好:暴露数据;请求行长度有限。

POST的特点(经常使用的):
借助HTML中的form表单。
<form action=”c.html” method=”post”>
请求参数出现在正文部分。长度木有限制。相对安全。
—————————
/App1/1.html:请求的资源的URI。
—————————

HTTP/1.1:客户端使用的协议的版本

例:
响应行 HTTP/1.1 200 OK
HTTP/1.1:服务器用的协议版本
200:正常响应码。

响应码代表服务器处理的结果的一种表示
200:正常
302/307:重定向
304:服务器的资源没有被修改
404:请求的资源不存在
500:服务器报错了
OK:响应码描述

请求消息头:向服务器传递附加信息
Accept:通知服务器,浏览器可以接受的MIME类型。(文件系统中用文件扩展名区分数据的类型。网络上用MIME类型来区分数据类型。Tomcat\conf\web.mxl)
MIME类型名称:大类型/小类型
Accept-Charset:通知服务器,浏览器支持的字符集
Accept-Encoding:通知服务器,浏览器能够解码的数据压缩方式。比如:gzip
Accept-language:通知服务器,所希望的语言

Host:请求的主机和端口
*Referer:是一个URL地址。取值是当前页面之前的那个页面地址的。防盗链
*Content-Type:通知服务器,请求正文的MIME类型。
取值:application/x-www-form-urlencoded默认值
对应的是form表单的enctype属性
If-Modified-Since:通知服务器,缓存的文件的最后修改时间。
User-Agent:通知服务器,浏览器类型.
Content-Length:表示请求消息正文的长度
Connection:表示是否需要持久连接。如果服务器看到这里的值为“Keep -Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接

Cookie:这是最重要的请求头信息之一(会话有关)

响应消息头:
*Location:通知客户端,指示新的资源的位置(结合302/307来用。请求重定向)
Server:通知客户端,服务器的类型
*Content-Encoding:通知客户端,响应正文的压缩编码方式。常用的是gzip。
*Content-Length:通知客户端响应正文的数据大小
*Content-Type:通知客户端响应正文的MIME类型
*Refresh:让浏览器自动刷新。取值为整数(刷新的时间间隔,单位是秒)
Refresh:3
Refresh:3;URL=其他资源的URI
*Content-Disposition:通知客户端,以下载的方式打开资源。
Content-Disposition:attachment;filename=1.jpg
*****Set-Cookie:SS=Q0=5Lb_nQ; path=/search服务器端发送的Cookie(会话有关)

*Expires: -1 网页的有效时间。单位是毫秒
*Cache-Control: no-cache (1.1)
*Pragma: no-cache (1.0) 通知客户端不要缓存

转自:http://www.cnblogs.com/javahyj/p/5538533.html

使用Fiddler调试手机页面请求

从事前端开发的同学一定对Fiddler不陌生,它是一个非常强大的http(s)协议分析工具,如果你不知道它是什么,可以自行google一下,本文不再作科普,简单的说它可以代替Chrome开发人员工具中Network面板或Firefox的HttpWatch插件的功能。

官网地址:http://www.telerik.com/fiddler

我们知道如何在电脑上调试页面请求,但在手机端你没有这么多强大好用的调试工具来调试你的webapp,如果你需要查看在手机上打开页面时,所产生的http请求却又不知道怎么做,那就继续往下看。(当然,大部分情况下,你可以直接在电脑上用Chrome或Firefox模拟手机浏览器来看)

Fiddler支持代理的功能,也就是说你所有的http请求都可以通过它来转发,Fiddler代理默认使用端口8888,不知道的同学有可能因此无法使用翻墙,因为端口冲突。

利用这点,我们可以在手机端设置http代理为Fiddler的代理服务器,使得手机应用的请求都通过Fiddler来转发,从而实现查看手机端页面请求的功能。

首先我们打开Fiddler->Tools->Telerik Fiddler Options…在Connection面板里将Allow remote computers to connect勾选起来,确定后,关闭Fiddler并重新打开Fiddler。

2016-07-28_165958

此时,为了确保代理是正常工作的,我们可以在cmd里执行netstat -anop tcp查看Fiddler进程是否正常监听8888端口,如果服务没有正常开启,可以尝试使用其他端口,端口修改的位置,如上图位置。

fiddler_proxy

从上图我们看到,进程ID为8392的Fiddler正在监听8888端口,说明代理已经在工作了。那么接下来我们要把手机端的代理设置为Fiddler的代理,代理设置需要一个ip和一个端口,ip就是Fiddler所运行的电脑的局域网ip地址,端口默认是Fiddler代理的端口8888,请确保手机所在的网段可以访问到电脑所在的网段,同一个局域网里一般没什么问题。

2016-07-28_170405

正如我们所期望的,你可以开始调试你的手机端webapp请求了。

github的pull request是指什么意思?

有一个仓库,叫Repo A。你如果要往里贡献代码,首先要Fork这个Repo,于是在你的Github账号下有了一个Repo A2,。然后你在这个A2下工作,Commit,push等。然后你希望原始仓库Repo A合并你的工作,你可以在Github上发起一个Pull Request,意思是请求Repo A的所有者从你的A2合并分支。如果被审核通过并正式合并,这样你就为项目A做贡献了

作者:匿名用户
链接:https://www.zhihu.com/question/21682976/answer/20835845

几个linux常用命令记录

使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地,与ssh有关的两个命令可以提供很方便的操作:
sz:将选定的文件发送(send)到本地机器
rz:运行该命令会弹出一个文件选择窗口,从本地选择文件上传到服务器(receive)

参数:
-b binary 用binary的方式上传下载,不解释字符为ascii

注:rz/sz 通过Zmodem协议传输数据,适合中小文件。我(客户端)上传,你(服务器)接收(RZ),我下载(客户端),你(服务器)发送(SZ)。

find命令——查找文件名

1.在某目录下查找名为“elm.cc”的文件

find /home/lijiajia/ -name elm.cc

2.查找文件名中包含某字符(如”elm”)的文件

find /home/lijiajia/ -name ‘*elm*’

find /home/lijiajia/ -name ‘elm*’

find /home/lijiajia/ -name ‘*elm’

 

bootstrap-datetimepicker如何只显示到日期

bootstrap-datetimepicker 一般都是设置到时分秒,有时候并不需要,怎么处理呢?

minView: “month”, //选择日期后,不会再跳转去选择时分秒

// 日历
$('.form_datetime').datetimepicker({
    minView: "month", //选择日期后,不会再跳转去选择时分秒 
    language:  'zh-CN',
    format: 'yyyy-mm-dd',
    todayBtn:  true,
    autoclose: true
});

RESTful API示例

HTTP动词

对于资源的具体操作,由HTTP动词表示
常用的HTTP动词包括一下几个,括号里是对应的SQL命令:

  • GET(SELECT): 从服务器取出资源(一个或多个)
  • POST(CREATE): 在服务器新建一个资源
  • PUT(UPDATE): 在服务器更新资源(客户端提供改变后的完整资源,即更新整一个资源)
  • PATCH(UPDATE): 在服务器更新资源(客户端提供改变的属性,即更新资源的部分属性)
  • DELETE(DELETE): 从服务器删除资源

还有两个不常用的HTTP动词

  • HEAD: 获取资源的元数据
  • OPTIONS: 获取信息,关于资源的哪些属性是客户端可以改变的

下面是若干例子:

  • GET /zoos:列出所有动物园
  • POST /zoos:新建一个动物园
  • GET /zoos/ID:获取某个指定动物园的信息
  • PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
  • PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
  • DELETE /zoos/ID:删除某个动物园
  • GET /zoos/ID/animals:列出某个指定动物园的所有动物
  • DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物

 

文/Harrison(简书作者)
原文链接:http://www.jianshu.com/p/00631797a60d

RESTful与jQuery ajax方法对应

访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。

互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生”状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是”表现层状态转化”。

客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

(1)每一个URI代表一种资源;
(2)客户端和服务器之间,传递这种资源的某种表现层;
(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现”表现层状态转化”。

Jquery里的POST和GET都是对ajax方法的封装,你可以自己进行封装。

$.ajax({
  url: 'www.website.com',
  type: 'DELETE',
  data: {}
});

执行后就会有Request Method:DELETE的http头被传到后端。OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE都是可以使用的Http1.1(连IE7都支持,其他浏览器不可能不支持)。至于你说的实现问题,我认为不存在,只是你服务端有没有做相应的处理,HTTP是协议不是技术。

方法GET和HEAD应该被所有的通用WEB服务器支持,其他所有方法的实现是可选的。
W3C有明确的说明。
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

参考:
http://www.ruanyifeng.com/blog/2011/09/restful
https://segmentfault.com/q/1010000002581227