文章目錄
跳轉方式(轉發和重定向)
ModelAndView
- 設置ModelAndView對象 , 根據view的名稱 , 和視圖解析器跳到指定的頁面 .
- 頁面 : {視圖解析器前綴} + viewName +{視圖解析器後綴}
<!-- 視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!-- 前綴 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 後綴 -->
<property name="suffix" value=".jsp" />
</bean>
- 對應的controller類
public class ControllerTest1 implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//返回一個模型視圖對象
ModelAndView mv = new ModelAndView();
mv.addObject("msg","ControllerTest1");
mv.setViewName("test");
return mv;
}
}
ServletAPI
- 通過設置ServletAPI , 不需要視圖解析器
@Controller
public class ResultGo {
@RequestMapping("/result/t1")
public void test1(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
//1. 通過HttpServletResponse進行輸出
rsp.getWriter().println("Hello,Spring BY servlet API");
}
@RequestMapping("/result/t2")
public void test2(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
//2. 通過HttpServletResponse實現重定向
rsp.sendRedirect("/index.jsp");
}
@RequestMapping("/result/t3")
public void test3(HttpServletRequest req, HttpServletResponse rsp) throws Exception {
//3. 通過HttpServletResponse實現轉發
req.setAttribute("msg","/result/t3");
req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,rsp);
}
}
SpringMVC做法
- 通過SpringMVC來實現轉發和重定向----無視圖解析器。
- 要先把
springmvc-servlet.xml
配置文件中的視圖解析器注掉
@Controller
public class ResultSpringMVC {
@RequestMapping("/rsm/t1")
public String test1(){
//轉發
return "/index.jsp";
}
@RequestMapping("/rsm/t2")
public String test2(){
//轉發二
return "forward:/index.jsp";
}
@RequestMapping("/rsm/t3")
public String test3(){
//重定向
return "redirect:/index.jsp";
}
}
- 通過SpringMVC來實現轉發和重定向---- 有視圖解析器。
重定向 , 不需要視圖解析器 , 本質就是重新請求一個新地方嘛 , 所以注意路徑問題.
可以重定向到另外一個請求實現 .
@Controller
public class ResultSpringMVC2 {
@RequestMapping("/rsm2/t1")
public String test1(){
//轉發
return "test";
}
@RequestMapping("/rsm2/t2")
public String test2(){
//重定向
return "redirect:/index.jsp";
//return "redirect:hello.do"; //hello.do爲另一個請求/
}
}
數據處理(處理和顯示)
處理提交的數據
提交的域名稱和處理方法的參數名一致
提交數據 : http://localhost:8080/hello?name=daq
處理方法 :
@RequestMapping("/hello")
public String hello(String name){
System.out.println(name);//後臺顯示
return "hello";
}
後臺輸出 : daq,來自輸入框中獲取的數據
提交的域名稱和處理方法的參數名不一致
提交數據 : http://localhost:8080/hello?username=daq
處理方法 :
//@RequestParam("username") : username提交的域的名稱 .
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name){
System.out.println(name);
return "hello";
}
後臺輸出 : daq
提交的是一個對象
要求提交的表單域和對象的屬性名一致 , 參數使用對象即可
1、實體類
public class User {
private int id;
private String name;
private int age;
//構造,get/set,tostring()
}
-
提交數據 :
http://localhost:8080/mvc04/user?name=daq&id=1&age=21
-
處理方法 :
@RequestMapping("/user")
public String user(User user){
System.out.println(user);
return "hello";
}
後臺輸出 : User { id=1, name=‘daq’, age=21 }
補充:如果使用對象的話,前端傳遞的參數名和對象名必須一致,否則就是null。
數據顯示到前端
第一種 : 通過ModelAndView**----(麻煩)
public class ControllerTest1 implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//返回一個模型視圖對象
ModelAndView mv = new ModelAndView();
mv.addObject("msg","ControllerTest1");
mv.setViewName("test");
return mv;
}
}
第二種:通過ModelMap
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, ModelMap model){
//封裝要顯示到視圖中的數據
//相當於req.setAttribute("name",name);
model.addAttribute("name",name);
System.out.println(name);
return "hello";
}
第三種 : 通過Model
@RequestMapping("/ct2/hello")
public String hello(@RequestParam("username") String name, Model model){
//封裝要顯示到視圖中的數據
//相當於req.setAttribute("name",name);
model.addAttribute("msg",name);
System.out.println(name);
return "test";
}
三者對比
- Model 只有寥寥幾個方法只適合用於儲存數據,簡化了對於Model對象的操作和理解
- ModelMap 繼承了 LinkedMap ,除了實現了自身的一些方法,同樣的繼承 LinkedMap 的方法和特性。
- ModelAndView 可以在儲存數據的同時,可以進行設置返回的邏輯視圖,進行控制展示層的跳轉。
亂碼問題
- SpringMVC提供了一個過濾器 , 可以在
web.xml
中配置 .以解決亂碼問題 。 - 亂碼問題,需要平時多注意,在能設置編碼的地方,都設置爲統一編碼
UTF-8
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>