一:好言
最重要的是一开始的选择,最难的是之后所有的坚持
二、背景
最近开始重构之前的项目,说实话这项目太渣了,从框架到代码风格,都是很差,最要命的是一行log都没有,苍天呀,代码可读性太差了。之前还是http的,所以今天开始把项目改为分布式dubbo的。纪录纪录遇到的一点问题。
三、内容
3.1 、有的页面既需要跳转页面可能另外一种情况需要返回数据,这个我首先想到的就是重定向,然后返回返回null,如果是值得花直接写json出去。
3.2 、我们经常使用ModelAndView这个类,这个类返回是可以带对象跳转页面,那么我们可不可以根据返回类型来做不同效果。所以我们可以重写ModelAndView中的getView方法
3.3 、 复写ModelAndView中的方法,具体代码如下
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.View;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
public class JsonDataModelAndView extends ModelAndView {
private Object objectJson;
private static Gson gson = new Gson();
public JsonModelAndView(Object objectJson){
super();
this.objectJson= objectjson;
}
@Override
public View getView(){
return new View() {
@Override
public String getContentType() {
return "application/json;charset=utf-8";
}
@Override
public void render(Map<String, ?> map, HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws Exception {
httpServletResponse.setContentType(getContentType());
ServletOutputStream out = httpServletResponse.getOutputStream();
try
{
if(objectJson != null)
{
String json = gson .toJson(objectjson);
byte[] byte = json.getBytes("utf-8");
out.write(byte );
out.flush();
}
}finally
{
if(out != null)
{
out.close();
}
}
}
};
}
}
返回json代码
Map<String, Object> map = new HashMap<String, Object>();
map.put("flag", "123");
return new JsonDataModelAndView (map )
结果如下图所示
跳转,需要使用ModelAndView,如果自己页面做了映射比如WEB-INF/view/index.jsp,那么下面的url可以换成index,会跳转到index.jsp页面
String url = "index";
return new ModelAndView(new RedirectView("https://www.baidu.com/"));
如果使用JsonDataModelAndView 则返回如下截图
3.4、用流写json
JSONObject jsonObject=new JSONObject();
jsonObject.put("flag", "123");
jsonObject.put("name", "Mahone");
WriteJsonUtil.writeJson(jsonObject.toJSONString(),response);
public class WriteJsonUtil {
public static void writeJson(Object object, HttpServletResponse response){
response.setContentType("application/json" );
try {
response.getWriter().write(object.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.5、用注解返回json
@ResponseBody
@RequestMapping("test/{id}")
public Map<String, Object> TEST(@PathVariable String id, HttpServletRequest req){
return testService.test(id,req);
}
<mvc:annotation-driven />
如果你的类是接口,那么你可以直接使用@RestController来做处理。这样方法上不用写 @ResponseBody
@RestController
public class TestController{
@RequestMapping("test/{id}")
public Map<String, Object> test(@PathVariable String id, HttpServletRequest req){
return testService.test(id,req);
}
}