Spring MVC – URI Templates

  在spring mvc中通过url路径来访问控制器中的方法,可以在用@RequestMapping注解的路径中使用URI模板。使用@PathVariable注解来指明方法中的参数应该对应URI模板中的变量,如下例子:

@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)
public String findOwner(@PathVariable String ownerId, Model model) {
  Owner owner = ownerService.findOwner(ownerId);  
  model.addAttribute("owner", owner);  
  return "displayOwner"; 
}

  URI模板”/owners/{ownerId}”指定了变量名为ownerId。当方法被请求的时候ownerId的值会被赋值为请求的URI,比如一个请求为/owners/fred,那么方法中的ownerId参数会赋值为fred。必须保证参数名和URI模板变量名一致才能自动赋值,想自定义参数变量需要在@PathVariable注解中加入参数,如下:

@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)
public String findOwner(@PathVariable("ownerId") String theOwner, Model model) {
  // implementation omitted
}

  当然,也可以使用多个@PathVariable来绑定多个URI模板变量,如下:

@RequestMapping(value="/owners/{ownerId}/pets/{petId}", method=RequestMethod.GET)
public String findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
  Owner owner = ownerService.findOwner(ownderId);  
  Pet pet = owner.getPet(petId);  
  model.addAttribute("pet", pet);  
  return "displayPet"; 
}

  下面的代码展示使用变量作为相对路径,当请求为/owners/42/pets/21,会调用findPet()方法。

@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController {
  @RequestMapping("/pets/{petId}")
  public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {    
    // implementation omitted
  }
}

  @PathVariable和方法中的参数可以是任何简单数据类型,例如:int,long,Date,等等。spring会自动转换,如果不匹配则抛出TypeMismatchException。

  原文:link

java使用google网址缩短

package com.dorole.util;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;

public class Googl
{
	private static String googUrl = "https://www.googleapis.com/urlshortener/v1/url";

	public static String shorten(String longUrl)
	{
		String shortUrl = "";
		try
		{
			URLConnection conn = new URL(googUrl).openConnection();
			conn.setDoOutput(true);
			conn.setRequestProperty("Content-Type", "application/json");
			OutputStreamWriter osw = new OutputStreamWriter(
					conn.getOutputStream());
			osw.write("{\"longUrl\":\"" + longUrl + "\"}");
			osw.flush();

			BufferedReader br = new BufferedReader(new InputStreamReader(
					conn.getInputStream()));
			String line;
			while ((line = br.readLine()) != null)
			{
				if (line.indexOf("id") > -1)
				{
					shortUrl = line.substring(8, line.length() - 2);
					break;
				}
			}
			osw.close();
			br.close();
		} catch (Exception ex)
		{
			ex.printStackTrace();
		}
		return shortUrl;
	}

	public static void main(String[] args)
	{
		String url = Googl.shorten("http://dorole.com");
		System.out.println(url);
	}
}

需要的地方调用Googl.shorten(), 参考:link, 引自:link

无题

  最近新入了一副耳机,sony xb20ex,接替了使用了两年多的ex51。后者在一次洗衣服的时候忘了拿出来,晒干的时候才发现,结果声音明显变了,声音像是被摁住了纸盆,扁扁的。本来这种半机械化的东西进水也不是什么大事,擦掉附着的杂物应该就没事了,可惜ex51是个全密封的设计,没法拆开,作罢。虽然手头还有个n83的原装耳塞,素质到也不错,但又欠缺对低音的提升,一直很少用。

  挑选了许久,犹豫了许久,最后还是订了个xb20ex,对sony这个牌子印象不错。最开始接触sony的东西还是在中学的时候,同学的一个walkman,原配的就是ex51。在那个时代mp3才刚兴起,ex51的效果给我留下了深刻的印象,入耳式的设计密封性相当好,以至于上课听歌,老师来了都不知道,很厚有力的低音更是最大的亮点。后来线断了,被我拿来后修修补补一用就是近三年,竟在大学第一天晚自习放抽屉里忘了拿,不知被谁捡走了。……,后来在网上又入了个ex51,一直到文章的开头。

  一直以来对重低音都是情有独钟,无论是交响乐中的低音鼓还是古典乐中的低音弦,或是纯粹的舞曲,适当的提升都能带来一种震撼的效果,尤其是在电影中,更加身临其境。可惜玩意并不是每个人都能听到,谁又能知其中妙趣。低音器材向来都是烧钱的。

[音乐]爱的供养 – 何晟铭

《爱的供养》
演唱:何晟铭
把你捧在手上 虔诚地焚香
剪下一段烛光 将经纶点亮
不求荡气回肠 只求爱一场
爱到最后受了伤 哭得好绝望
我用尽一生一世 来将你供养
只期盼你停住 流转的目光
请赐予我无限爱 与被爱的力量
让我能安心在菩提下 静静的观想
把你放在心上 合起了手掌
默默乞求上苍 指引我方向
不求地久天长 只求在身旁
累了醉倒温柔乡 轻轻地梵唱
我用尽一生一世 来将你供养
只期盼你停住 流转的目光
请赐予我无限爱 与被爱的力量
让我能安心在菩提下 静静的观想
我用尽一生一世 来将你供养
人世间有太多的 烦恼要忘
苦海中飘荡着你 那旧时的模样
一回头发现 早已踏出了红尘万丈

}7MLMSE8XEK0QO}[0)V54%P

无奈的眼神,只有“过来”的人始终明白该如何正确选择,或者是对比下的一种成长。

和老四浑厚有力的唱腔放在一起,是否个性更显凄壮。

——《宫锁心玉》二十四集

在DD-WRT上调整PPPoE拨号参数

  继上次将路由刷到dd-wrt后,一直琢磨着如何绕过网管对路由的限制。开始以为是对非windows主机拨号都有限制,后来用wireshark抓包发现只是接入设备对echo请求没有响应,导致超时后自动断开。在windows下默认不发送请求,只回应来自对方的echo请求,大约6秒一次。找到问题的根源后,在ubuntu下修改了ppp配置选项,文件位于/etc/ppp/options,找到如下两行:

lcp-echo-interval 30

lcp-echo-failure 4

  这两个参数表示在一个lcp链路协议中,pppd会每隔30秒发出一个echo请求包到对方。一般来说对方在收到echo请求后需要回应一个echo应答。如果发送4次请求后都没有收到有效的回应,pppd便会中断这次连接,也就是在两分钟左右就会断网,与之前遇到的现象一致。既然用不到这两个参数,就可以在前面加#号注释掉,保存后重新拨号一切正常了。

  既然在ubuntu下成功了,那基于linux系统的TEW-652BRP路由器应该也是可以这样搞定,在web管理界面将路由器的广域网设置为PPPoE拨号上网,输入正确的账号密码,保存后再通过ssh登录,查看进程发现pppd已经运行了,后面的参数可以看到调用的配置文件路径。

root@Dorole Network:~# ps | grep ppp
1074 root      1324 S    pppd file /tmp/ppp/options.pppoe

  打开/tmp/ppp/options.pppoe

root@Dorole Network:~# cat /tmp/ppp/options.pppoe
plugin /usr/lib/rp-pppoe.so
nic-eth1
noccp
nomppc
noipdefault
noauth
defaultroute
noaccomp
nobsdcomp
nodeflate
nopcomp
nomppe
usepeerdns
user ‘…’
password ‘…’
default-asyncmap
mtu 1492
mru 1492
persist
lcp-echo-interval 5
lcp-echo-failure 10

  最后面的两行就是要修改的地方了,不过这里要修改比较麻烦。/tmp目录下的东西是在开机后自动生成的,每次重启都要修改那也太麻烦了,/etc/config目录下也有个配置文件存在,且无法修改,后来想把固件在电脑上解开修改完再刷进去,但是现有的工具只支持linksys的固件,拿源代码编译更麻烦。最后想到dd-wrt是支持脚本的,于是弄了一段shell让它每次开机都自动运行。

cat /tmp/ppp/options.pppoe | sed -e "s/lcp/#lcp/g" > /tmp/ppp/options.pppoe.new
if [ -f "/tmp/ppp/options.pppoe.new" ]; then
killall redial
killall pppd
sleep 10
/usr/sbin/pppd file /tmp/ppp/options.pppoe.new > /dev/null
fi

  将options.pppoe文件中的lcp替换成#lcp也就是注释了那两个参数,重启pppd加载新的配置文件,经过这样处理后上网正常了。