从spring3.0开始,springMVC加入了@PathVariable 用来映射 URL 绑定的占位符。
也就是说在请求的url比如/example/test
后台接口:
@RequestMapping("/example/{environment}")
@ResponseBody
public String test(HttpServletResponse response, HttpServletRequest request,
@PathVariable("environment") String environment){
System.out.println(environment);
return null;
}
此时后台能够打印出test字符串。
有了@PathVariable,就可以很方便的拿到请求的url里的某些字段,而不用写多个接口。
比如最近有个需求,客户远程访问应用拿数据,对应不同的url拿不同的数据库表里的数据,url就是表名。
如果按照普通的做法,拿20个表对应20个不同的url,那就要写20个接口,但是处理逻辑其实都是一样的,这种情况@PathVariable就格外方便了,只需要写一个接口:
@GetMapping("/{id}")
@ResponseBody
public String getTableData(HttpServletResponse response, HttpServletRequest request,
@PathVariable("id") String id) {
List<String> list = new ArrayList<String>();
try {
list = IOUtil.readPropertiesValueList("sendTable.properties");
} catch (IOException e) {
e.printStackTrace();
}
String dataType = "error";
for (int i = 0; i < list.size(); i++) {
if (id.equals(list.get(i))) {
dataType = id;
break;
}
}
if ("error".equals(dataType)) {
return "无效的链接!";
}
// final String DATATYPE = "DM_DEALER_NET_PRICE_DATE";
return download(response, request, dataType);
}
其中的id为不同的表名,这样就可以匹配不同的url了,把不同的表名写到properties文件里统一管理,java读取properties,一个接口就可以搞定,根据获取的id不同,下载不同的信息。
IOUtil.java
package com.test.app.utils;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class IOUtil {
public static Map<String,String> readProperties(String path) throws IOException{
Map<String,String> result = new HashMap<String,String>();
InputStream in = null;
try{
in = new BufferedInputStream (new FileInputStream(path));
Properties prop = new Properties();
prop.load(in);
Iterator<String> it = prop.stringPropertyNames().iterator();
while(it.hasNext()){
String key = it.next();
String value = prop.getProperty(key);
result.put(key, value);
}
}catch(Exception e){
System.out.println(e.getMessage());
}finally{
in.close();
}
return result;
}
public static List<String> readPropertiesValueList(String path) throws IOException{
List<String> list = new ArrayList<String>();
InputStream in = null;
try{
in = new BufferedInputStream (IOUtil.class.getClassLoader().getResourceAsStream(path));
Properties prop = new Properties();
prop.load(in);
Iterator<String> it = prop.stringPropertyNames().iterator();
while(it.hasNext()){
String key = it.next();
String value = prop.getProperty(key);
list.add(value);
}
}catch(Exception e){
System.out.println(e.getMessage());
}finally{
in.close();
}
return list;
}
public static String readFile(String path){
StringBuffer sb = new StringBuffer();
File file = new File(path);
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
String line = "";
while ((line = reader.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
return sb.toString();
}
public static void writeFile(String path ,String text)throws IOException{
OutputStreamWriter osw = null;
try {
osw = new OutputStreamWriter(new FileOutputStream(path,true), "UTF-8");
osw.write(text);
osw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
osw.close();
}
}
}
网友评论