@ResponseBody
注解了在精河等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需求定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),成都營銷網(wǎng)站建設(shè),外貿(mào)網(wǎng)站制作,精河網(wǎng)站建設(shè)費(fèi)用合理。🍎一. 返回?cái)?shù)據(jù)
🍒1.1 返回靜態(tài)頁面我們先創(chuàng)建一個(gè)前端輸出的文字的頁面,最后來通過Controller來進(jìn)行訪問
hello,spring mvc Hello,Spring MVC.
//訪問靜態(tài)頁面
@RequestMapping("/sayhi")
public String sayHi(){
return "/hello.html";
}
🍒1.2 返回一個(gè)非靜態(tài)頁面@ResponseBody是修飾類或方法的注解,作用是返回當(dāng)前類中或方法中的非靜態(tài)頁面
//訪問非靜態(tài)頁面
@ResponseBody
@RequestMapping("/sayhi")
public String sayHi(){
return "/hello.html";
}
🍒1.3 返回text/html類型頁面這個(gè)和返回靜態(tài)頁面的區(qū)別就是,需要用@ResponseBody,并且需要使用
前端標(biāo)題符@RequestMapping("/m7")
@ResponseBody
public String method_7() {
return "Hello,HTML~";
}
🍒1.4 返回JSON對(duì)象@RequestMapping("/m8")
@ResponseBody
public HashMapmethod_8() {
HashMapmap = new HashMap<>();
map.put("Java", "Java Value");
map.put("MySQL", "MySQL Value");
map.put("Redis", "Redis Value");
return map;
}
🍒1.5 實(shí)現(xiàn)計(jì)算器功能可使? postman 傳遞參數(shù),或使? form 表單的?式提交參數(shù)
前端??:
計(jì)算器示例
后端頁面:
@RestController
public class CalcController {
@RequestMapping("/calc")
public String calc(Integer num1,Integer num2){
if (num1 == null || num2==null) {
if (num1 == null || num2 == null) return "參數(shù)錯(cuò)誤!返回";
}
return "結(jié)果:" + (num1+num2) +"";
}
}
前端代碼:
Document 登錄
用戶:
密碼:
后端代碼:
@RequestMapping("/login3")
public HashMaplogin2(String username, String password){
HashMapresult = new HashMap<>();
int state = 200; //狀態(tài)碼
int data = -1; //等于1,登陸成功,否則登陸失敗
String msg = "未知錯(cuò)誤";
//使用Spring提供的方法tringUtils.hasLength方法就可以同時(shí)判斷username是否是"空"和null了
if (StringUtils.hasLength(username) && StringUtils.hasLength(password) && username.equals("admin") && password.equals("admin") ){
if ( username.equals("admin") && password.equals("admin")) {
data = 1;
msg = "";
}else {
msg = "用戶名或密碼錯(cuò)誤";
}
}else {
// 參數(shù)為空
msg = "非法參數(shù)";
}
result.put("state",state);
result.put("data",data);
result.put("msg",msg);
return result;
}
🍎二.請(qǐng)求轉(zhuǎn)發(fā)與請(qǐng)求重定向return 不但可以返回?個(gè)視圖,還可以實(shí)現(xiàn)跳轉(zhuǎn),跳轉(zhuǎn)的?式有兩種:
●forward
是請(qǐng)求轉(zhuǎn)發(fā)
●redirect
:請(qǐng)求重定向
forward(請(qǐng)求轉(zhuǎn)發(fā))和 redirect(請(qǐng)求重定向)的區(qū)別,舉例來說,例如:
你告訴你媽媽,你想吃辣條,如果你媽媽,說好,我?guī)湍闳ベI,這就是 forward 請(qǐng)求轉(zhuǎn)發(fā);
如果你媽媽讓你??去買,那么就是請(qǐng)求 redirect 重定向
代碼示例:
// [請(qǐng)求轉(zhuǎn)發(fā)]
// 實(shí)現(xiàn)方法(1)
@RequestMapping("/fw")
public String myForward(){
return "forward:/hello.html";
}
// 實(shí)現(xiàn)方法(2)
@RequestMapping("/fw2")
public void myFoward2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/hello.html").forward(request,response);
}
我們可以使用fiddler來進(jìn)行抓包驗(yàn)證,我們可以發(fā)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)客戶端只是訪問了一次,而轉(zhuǎn)發(fā)的過程中是由服務(wù)器內(nèi)部進(jìn)行訪問靜態(tài)頁面后返回?cái)?shù)據(jù)給服務(wù)端的
代碼示例:
// [請(qǐng)求重定向]
// 實(shí)現(xiàn)方法(1)
@RequestMapping("/rd")
public String myRedirect(){
return "redirect:/hello.html";
}
// 實(shí)現(xiàn)方法(2)
@RequestMapping("/rd2")
public void myRedirect(HttpServletResponse response) throws IOException {
response.sendRedirect("/hello.html");
}
我們可以使用fiddler來進(jìn)行抓包驗(yàn)證,我們可以發(fā)現(xiàn)請(qǐng)求1轉(zhuǎn)發(fā)客戶端是先訪問服務(wù)器,而服務(wù)器內(nèi)部會(huì)響應(yīng)客戶端的請(qǐng)求1,之后客戶端會(huì)進(jìn)行請(qǐng)求2,服務(wù)器進(jìn)行進(jìn)行訪問靜態(tài)頁面后返回?cái)?shù)據(jù)給客戶端的,我們看到頁面就了解了,重定向會(huì)將頁面地址最后跳轉(zhuǎn)到我們需要訪問的靜態(tài)頁面地址
請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向主要區(qū)別,包含以下 5 點(diǎn):
● 定義不同
● 跳轉(zhuǎn)方不同
● 數(shù)據(jù)共享不同
● 最終 URL 地址不同
● 代碼實(shí)現(xiàn)不同
請(qǐng)求轉(zhuǎn)發(fā)(Forward):發(fā)生在服務(wù)端程序內(nèi)部,當(dāng)服務(wù)器端收到一個(gè)客戶端的請(qǐng)求之后,會(huì)先將請(qǐng)求,轉(zhuǎn)發(fā)給目標(biāo)地址,再將目標(biāo)地址返回的結(jié)果轉(zhuǎn)發(fā)給客戶端
請(qǐng)求重定向(Redirect):請(qǐng)求重定向指的是服務(wù)器端接收到客戶端的請(qǐng)求之后,會(huì)給客戶端返回了一個(gè)臨時(shí)響應(yīng)頭,這個(gè)臨時(shí)響應(yīng)頭中記錄了,客戶端需要再次發(fā)送請(qǐng)求(重定向)的 URL 地址,客戶端再收到了地址之后,會(huì)將請(qǐng)求發(fā)送到新的地址上,這就是請(qǐng)求重定向
🍒3.2 跳轉(zhuǎn)方不同請(qǐng)求轉(zhuǎn)發(fā)是服務(wù)器端的行為,服務(wù)器端代替客戶端發(fā)送請(qǐng)求,并將結(jié)果返回給客戶端;
而請(qǐng)求重定向是客戶端的行為,它們的交互流程
如下圖所示:
請(qǐng)求轉(zhuǎn)發(fā)是服務(wù)器端實(shí)現(xiàn)的,所以整個(gè)執(zhí)行流程中,客戶端(瀏覽器端)只需要發(fā)送一次請(qǐng)求,因此整個(gè)交互過程中使用的都是同一個(gè) Request 請(qǐng)求對(duì)象和一個(gè) Response 響應(yīng)對(duì)象,所以整個(gè)請(qǐng)求過程中,請(qǐng)求和返回的數(shù)據(jù)是共享的;而請(qǐng)求重定向客戶端發(fā)送兩次完全不同的請(qǐng)求,所以兩次請(qǐng)求中的數(shù)據(jù)是不同的
🍒3.4 最終 URL 地址不同請(qǐng)求轉(zhuǎn)發(fā)是服務(wù)器端實(shí)現(xiàn)的,所以整個(gè)執(zhí)行流程中,客戶端(瀏覽器端)只需要發(fā)送一次請(qǐng)求,因此整個(gè)交互過程中使用的都是同一個(gè) Request 請(qǐng)求對(duì)象和一個(gè) Response 響應(yīng)對(duì)象,所以整個(gè)請(qǐng)求過程中,請(qǐng)求和返回的數(shù)據(jù)是共享的;而請(qǐng)求重定向客戶端發(fā)送兩次完全不同的請(qǐng)求,所以兩次請(qǐng)求中的數(shù)據(jù)是不同的
請(qǐng)求轉(zhuǎn)發(fā):
請(qǐng)求重定向:
// [請(qǐng)求轉(zhuǎn)發(fā)]
// 實(shí)現(xiàn)方法(1)
@RequestMapping("/fw")
public String myForward(){
return "forward:/hello.html";
}
// 實(shí)現(xiàn)方法(2)
@RequestMapping("/fw2")
public void myFoward2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/hello.html").forward(request,response);
}
// [請(qǐng)求重定向]
// 實(shí)現(xiàn)方法(1)
@RequestMapping("/rd")
public String myRedirect(){
return "redirect:/hello.html";
}
// 實(shí)現(xiàn)方法(2)
@RequestMapping("/rd2")
public void myRedirect(HttpServletResponse response) throws IOException {
response.sendRedirect("/hello.html");
}
🍒3.6 轉(zhuǎn)發(fā)和重定向的選擇1、重定向的速度比轉(zhuǎn)發(fā)慢,因?yàn)闉g覽器還得發(fā)出一個(gè)新的請(qǐng)求,如果在使用轉(zhuǎn)發(fā)和重定向都無所謂的時(shí)候建議使用轉(zhuǎn)發(fā)
2、因?yàn)檗D(zhuǎn)發(fā)只能訪問當(dāng)前web的應(yīng)用程序,所以不同web應(yīng)用程序之間的訪問,特別是要訪問到另外一個(gè)web站點(diǎn)上的資源的情況,這個(gè)時(shí)候就只能使用重定向了
3、另外,重定向還有一個(gè)應(yīng)用場景:避免在用戶重新加載頁面時(shí)兩次調(diào)用相同的動(dòng)作
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧