###一:SpingMVC:結果跳轉方式 SpringMVC: 通過SpringMVC來實現轉發和重定向-無需視圖解析器 測試前需要將視圖解析器註掉: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springfram ...
一:SpingMVC:結果跳轉方式
SpringMVC:
通過SpringMVC來實現轉發和重定向-無需視圖解析器
測試前需要將視圖解析器註掉:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans//spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--自動掃描包,讓指定包下的註解生效,由IOC容器統一管理-->
<context:component-scan base-package="com.kuang.controller"/>
<!--預設的資源過濾:像.css .js .html .mp3 .mp4這樣的資源預設讓他們不經過視圖解析器-->
<!--<mvc:default-servlet-handler/>
<!–
支持mvc註解驅動
在spring中一般採用@RequestMapping註解來完成映射關係
要想使@RequestMapping註解生效
必須要向上下文中註冊DefaultAnnotationHandlerMapping和一個AnnotationMethodHandlerAdapter實例
以後直接就使用annotation-driven配置來幫助我們自動完成上述兩個實例的註入
–>
<mvc:annotation-driven/>-->
<!--<!–視圖解析器–>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!–首碼–>
<property name="prefix" value="/WEB-INF/jsp/"/>
<!–尾碼–>
<property name="suffix" value=".jsp"/>
</bean>-->
<!-- <bean name="/t1" class="com.kuang.controller.ControllerTest"/>-->
</beans>
測試:
@Controller
public class MoodelTest {
@RequestMapping("/m1/t1")
public String test1(Model model){
model.addAttribute("msg","MoldelTest");
//轉發一
return "/WEB-INF/jsp/hello.jsp";
}
@RequestMapping("/m1/t2")
public String test(Model model){
model.addAttribute("msg","MoldelTest");
//轉發二
return "forward:/WEB-INF/jsp/hello.jsp";
}
@RequestMapping("/m1/t3")
public String test1(Model model){
model.addAttribute("msg","ModelTest");
//重定向,url地址會發生改變
return "redirect:/index.jsp";
}
}
通過SpringMVC來實現轉發和重定向-有視圖解析器
重定向,不需要視圖解析器,本質就是重新請求一個新地方,所以要註意路徑問題
@Controller
public class MoodelTest {
@RequestMapping("/m1/t1")
public String test1(Model model){
model.addAttribute("msg","MoldelTest");
//轉發
return "test";
}
@RequestMapping("/m1/t2")
public String test1(Model model){
model.addAttribute("msg","ModelTest");
//重定向,url地址會發生改變
return "redirect:/index.jsp";
//return "redirect:hello.do"; //hello.do為另一個請求
}
}
二:SpringMVC數據處理
處理提交的數據:
1:提交的功能變數名稱名稱和處理方法的參數名一致
提交數據:http://localhost:8080/hello?name=kuangshen
處理方法
package com.kuang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/user")
public class UserController {
//localhost:8080/user/t1 ? name = xxx
@GetMapping("/t1")
public String test(String name, Model model){
//1:接收前端參數
System.out.println("接收到的前端參數為:"+name);
//2:將返回的結果傳遞給前段,使用Model
model.addAttribute("msg","UserController");
//3:視圖跳轉
return "hello";
}
}
後臺輸出:
2:提交的功能變數名稱名稱和處理方法的參數名不一致:
提交數據:http://localhost:8080/hello?username=kuangshen
處理辦法:
@GetMapping("/t1")
public String test(@RequestParam("username") String name, Model model){
//1:接收前端參數
System.out.println("接收到的前端參數為:"+name);
//2:將返回的結果傳遞給前端,使用Model
model.addAttribute("msg","UserController");
//3:視圖跳轉
return "hello";
}
後臺輸出kuangshen
3:提交的是一個對象
要求提交的表單功能變數名稱和對象的屬性名一致,參數使用對象即可
(1):實體類
package com.kuang.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private int age;
}
(2):提交數據:http://localhost:8080/user/t2?name=kuangshen&age=12&id=3
(3):處理方法:
//前端接收的是一個對象:id,name,age
/*
* 1:接收前端用戶傳遞的參數,判斷參數的名字,假設名字直接在方法的參數上,則可以直接使用,否則用@RequestParam即可
* 2:假設傳遞的是一個對象User,匹配User對象中的欄位名;如果名字一致則OK,否則匹配不到!
*
* */
@GetMapping("/t2")
public String test2(User user, Model model){
//1:接收前端參數
System.out.println("從前端接收的參數為"+user);
//2:將返回結果傳遞給前端,使用Model
model.addAttribute("msg","UserTest");
//3:視圖跳轉
return "hello";
}
後臺輸出:
說明:如果使用對象的話,前端傳遞的參數名和對象名必須一致,否則就是null
數據顯示到前端:
第一種:通過ModelAndView
我們前面一直都是如此。就不過多解釋:
public class ControllerTest implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView();
//封裝對象
modelAndView.addObject("msg","ControllerTest");
// 封裝要跳轉的視圖
modelAndView.setViewName("test");
return modelAndView;
}
}
第二種:通過ModelMap
//ModelMap
@GetMapping("/t3")
public String test3(ModelMap modelMap){
//1:將返回結果傳遞給前端,使用ModelMap
modelMap.addAttribute("msg","UserTest");
//2:視圖跳轉
return "hello";
}
第三種:通過Model
@GetMapping("/t2")
public String test2(User user, Model model){
//1:接收前端參數
System.out.println("從前端接收的參數為"+user);
//2:將返回結果傳遞給前端,使用Model
model.addAttribute("msg","UserTest");
//3:視圖跳轉
return "hello";
}
對比:
對於新手而言簡單來說使用區別就是:
Model:只有寥寥幾個方法適用於儲存數據,簡化了新手對Model對象的操作和理解
ModelMap:繼承了 LinkedMap,除了實現自身的一些方法,同樣的繼承了LinkedMap的方法和特性;
ModelAndView:可以在儲存數據的同時,可以進行設置返回的邏輯視圖,進行控制展示層的跳轉。
當然更多的以後開發考慮的更多的是性能和優化,就不能單單僅限於對此的瞭解。
框架的官方文檔永遠是最好的教程。