Spring MVC – 高级 @RequestMapping 选项

  除了使用URL模板之外,@RequestMapping 注解也支持 Ant-style 风格的路径(例如:/myPath/*.do)。两种风格混合使用也是支持的(例如:/owners/*/pets/{petId})。

  如果路径没有明确指定映射,这时候就靠方法名来识别,依照 MethodNameResolver 类来处理(默认情况下是 InternalPathMethodNameResolver 类),这只适用于注解的路径不匹配请求的路径。换句话说,只用于减小其中一系列的匹配规则,不构成映射的首选。

  如果有一个没有指明映射路径的方法,那么同样所有的没有指明映射方法的请求都将调用它。如果有多个方法,也会依据方法名来选择。

  可以在请求路径中加入些参数来减小映射范围,例如加上"myParam=myValue"之类的参数(注:类似 struts 的method=methodName),这样请求就会映射到存在对应value参数的方法,例如:

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

  "myParam" 这样的参数风格是支持的,当在请求中的参数中包含的时候(可以使用任何的值)。最后说下,"!myParam"参数风格指定了它不应该出现在请求路径中。

  同样的,请求头(header)也能用于减小映射路径范围。

@Controller 
@RequestMapping("/owners/{ownerId}") 
public class RelativePathUriTemplateController {
  @RequestMapping(value = "/pets", method = RequestMethod.POST, headers="content-type=text/*") 
  public void addPet(Pet pet, @PathVariable String ownerId) {    
    // implementation omitted 
  } 
}

  在上面的例子中,addPet() 方法只在 content-type 匹配 text/* 才会被调用,例如:text/xml。

  原文:link

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,一直到文章的开头。

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