1. 程式人生 > 其它 >SpingMVC:結果跳轉方式與資料處理

SpingMVC:結果跳轉方式與資料處理

一: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/>
    &lt;!&ndash;
    支援mvc註解驅動
        在spring中一般採用@RequestMapping註解來完成對映關係
        要想使@RequestMapping註解生效
        必須要向上下文中註冊DefaultAnnotationHandlerMapping和一個AnnotationMethodHandlerAdapter例項
        以後直接就使用annotation-driven配置來幫助我們自動完成上述兩個例項的注入
    &ndash;&gt;
    <mvc:annotation-driven/>-->
    <!--&lt;!&ndash;檢視解析器&ndash;&gt;
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        &lt;!&ndash;字首&ndash;&gt;
        <property name="prefix" value="/WEB-INF/jsp/"/>
        &lt;!&ndash;字尾&ndash;&gt;
        <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:可以在儲存資料的同時,可以進行設定返回的邏輯檢視,進行控制展示層的跳轉。

當然更多的以後開發考慮的更多的是效能和優化,就不能單單僅限於對此的瞭解。

框架的官方文件永遠是最好的教程。