在web項目中一般常見的五種返回形式:
代碼見:https://github.com/BenMario315/SpringBootLearn,demo
- 返回頁面,使用模板引擎,spring boot推薦使用thymeleaf,類似的還有freemarker等。
- 返回字符串(json),一般用於完全的前后端分離開發,或者提供接口服務。
- 返回重定向,一些較少的業務需求。
- 轉發,一些較少的業務需求。
- 流輸出,常用於下載文件。
方法前代碼:
package cn.mario.springboot.controller;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.util.StringUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
/**
* @PackageName cn.mario.springboot.controller
* @ClassName TestController
* @Author BenMario
* @Date 2018/5/23 3:16
* @Description test controoler
* @Version 1.0
**/
@Controller
public class TestController {
private Logger logger = LoggerFactory.getLogger(TestController.class);
1.返回頁面:使用spring boot 推薦的thymeleaf,默認模板路徑:resources/templates/*.html
代碼:
/**
* retrun page
* @param request HttpServletRequest
* @param response HttpServletResponse
* @return test page
*/
@RequestMapping(value = "/testReturnPage")
public String testReturnPage(HttpServletRequest request, HttpServletResponse response) {
logger.debug("into testReturnPage function");
System.out.println("into testReturnPage function");
return "test";
}
2.1返回普通字符串
代碼:
/**
* retrun general string
* @param request HttpServletRequest
* @param response HttpServletResponse
* @return str
*/
@ResponseBody
@RequestMapping(value = "/testReturnString")
public String testReturnString(HttpServletRequest request, HttpServletResponse response) {
logger.debug("into testReturnString function");
System.out.println("into testReturnString function");
String str = "RETRUN STRING";
return str;
}
2.2返回json字符串
代碼:
/**
* retrun json string
* @param request HttpServletRequest
* @param response HttpServletResponse
* @return JSONObject to string
*/
@ResponseBody
@RequestMapping(value = "/testReturnJSONObject")
public String testReturnJSONObject(HttpServletRequest request, HttpServletResponse response) {
logger.debug("into testReturnJSONObject function");
System.out.println("into testReturnJSONObject functioin");
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("name_1", StringUtils.toString(1));
jsonObject.put("name_2", 1);
} catch (JSONException e) {
e.printStackTrace();
}
return jsonObject.toString();
}
3.1.1利用關鍵字“redirect”跨web服務重定向
代碼:
/**
* retrun cross web project redirect
* @param request HttpServletRequest
* @param response HttpServletResponse
* @return redirect cross web project
*/
@RequestMapping(value = "/testRedirect_1")
public String testRedirect_1(HttpServletRequest request, HttpServletResponse response) {
logger.debug("inot testRedirect_1 function");
System.out.println("into testRedirect_1 function");
String url = "http://www.baidu.com";
return "redirect:" + url;
}
3.1.2利用關鍵字“redirect”同web服務重定向
代碼:
/**
* retrun same web project redirect
* @param request HttpServletRequest
* @param response HttpServletResponse
* @return redirect same web project
*/
@RequestMapping(value = "/testRedirect_2")
public String testRedirect_2(HttpServletRequest request, HttpServletResponse response) {
logger.debug("into testRedirect_2 function");
System.out.println("into testRedirect_2 function");
String url = "/testRedirect_1";
return "redirect:" + url;
}
3.2.1利用HttpServletRespons對象跨web服務重定向
代碼:
/**
* retrun cross web project redirect
* @param request HttpServletRequest
* @param response HttpServletResponse
* @return redirect cross web project
*/
@RequestMapping(value = "/testRedirect_3")
public void testRedirect_3(HttpServletRequest request, HttpServletResponse response) {
logger.debug("into testRedirect_3 function");
System.out.println("into testRedirect_3 function");
String url = "http://www.baidu.com";
try {
response.sendRedirect(url);
} catch (IOException e) {
e.printStackTrace();
}
}
3.2.2利用HttpServletRespons對象同web服務重定向
代碼:
/**
* retrun same web project redirect
* @param request HttpServletRequest
* @param response HttpServletResponse
* @return redirect same web project
*/
@RequestMapping(value = "/testRedirect_4")
public void testRedirect_4(HttpServletRequest request, HttpServletResponse response) {
logger.debug("into TestController中的testRedirect_4 function");
System.out.println("into TestController中的testRedirect_4 function");
String url = "/testRedirect_3";
try {
response.sendRedirect(url);
} catch (IOException e) {
e.printStackTrace();
}
}
4.1跨web項目不能轉發
代碼:
/**
* retrun cross web project forward
* @param request HttpServletRequest
* @param response HttpServletResponse
* @return forward cross web project
* @note fail. Only the same web project forwarding
*/
@RequestMapping(value = "/testForward_1")
public void testForward_1(HttpServletRequest request, HttpServletResponse response) {
logger.debug("into testForward_1 function");
System.out.println("into testForward_1 function");
String url = "http://www.baidu.com";
try {
request.getRequestDispatcher(url).forward(request, response);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("After the forwarding is completed,the code can also run.");
}
4.2同web項目轉發
代碼:
/**
* retrun same web project forward
* @param request HttpServletRequest
* @param response HttpServletResponse
* @return forward same web project
*/
@RequestMapping(value = "/testForward_2")
public void testForward_2(HttpServletRequest request, HttpServletResponse response) {
logger.debug("into testForward_2 function");
System.out.println("into testForward_2 function");
String url = "/testReturnPage";
try {
request.getRequestDispatcher(url).forward(request, response);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("After the forwarding is completed,the code can also run.");
}
5.1流輸出,用於下載文件
代碼:
/**
* retrun stream for downlaod file
* @param request HttpServletRequest
* @param response HttpServletResponse
*/
@RequestMapping(value = "/testReturnStream")
public void testReturnStream(HttpServletRequest request, HttpServletResponse response) {
logger.debug("into testReturnStream function");
System.out.println("into testReturnStream function");
byte[] bts = new byte[8192];
int len = -1;
try {
// set type is dawnload
response.setHeader("content-Type", "application/force-download");
// set file name and charset
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("test.log", "utf-8"));
OutputStream output = response.getOutputStream();
File file = new File("./logs/log.log");
FileInputStream input = new FileInputStream(file);
while ((len = input.read(bts)) != -1) {
output.write(bts, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
方法后代碼:
}
對於一般的web項目來說, 以上五種返回形式應該是比較全面了。幾乎也都說明了每種返回形式的應用場景。如有疏漏或錯誤,請不吝指出。
