SpringMVC亂碼解決、前端傳遞普通類型參數或對象、return轉發與重定向

1、springMVC回顧

在這裏插入圖片描述

@RequestMapping()註解的位置區別

  • 只在方法上

    那就是@RequestMapping()括號內的URL請求地址

  • 類上+方法上

    將類上與方法上的@RequestMapping()註解的參數進行拼接,請求得到的URL地址

  • 所以視圖是可以重用的

  • WEB-INF目錄下的所有資源,只能夠被servlet或Controller訪問(被程序訪問),保證安全

@Controller和@RestController區別

  • @Controller跳轉視圖,會經過視圖解析器解析稱一個前端頁面
  • @RestController返回對應的文本內容

return返回

後臺可以使用Model給前端傳值

  • 默認爲轉發(URL不變化)

  • 變成重定向:redirect

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/spring")
public class HelloController {

    //實際請求的是/spring/hello,也就是類映射路徑加上方法的映射路徑
    // 當請求/hello這個URL的時候,返回/WEB-INF/jsp/hello.jsp頁面
    @RequestMapping("/hello1")
    public String hello1(Model model) {
        model.addAttribute("msg", "hello1,springmvc");
        //請求轉發到/WEB-INF/jsp/hello.jsp頁面
        return "hello";
    }

    @RequestMapping("/hello2")
    public String hello2(Model model) {
        model.addAttribute("msg", "hello2,springmvc");
        //重定向到index界面
        return "redirect:/index.jsp";
    }
}

2、前端普通類型和對象傳值

1、普通字符串

登錄界面:index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登錄</title>
</head>
<body>
<
<form action="/login" method="post">
    <p>用戶名
        <input type="text" name="name">
    </p>
    <p>
        <input type="password" name="password">
    </p>
    <input type="submit">
</form>
</body>
</html>

保證請求的字段(form表單中的name屬性)要和方法接收到的參數名一致

Controller類:LoginController

@Controller
public class LoginController {

    //@RequestParam("name")將前端的參數其別名爲後端的參數
    //name是前端的變量名
    //username是後端的變量名
    @RequestMapping("/login")
    public String login(@RequestParam("name") String username, String password, Model model) {
        System.out.println("接收到了username:" + username + ",password:" + password);
        model.addAttribute("msg", username);
        return "hello";
    }
}

2、中文亂碼問題

這個時候我們發現在頁面上會有中文亂碼問題,SpringMVC給我們提供了一個亂碼過濾器

在web.xml中進行配置

<!--添加亂碼過濾器-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <!--這裏我們使用的是spring自帶的過濾器,當然你也可以自己寫一個過濾器類,將這個過濾器類設置到下面-->
    <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>
<!--
    /   表示過濾所有的請求,不包括jsp
    /*  表示過濾所有的請求,包括jsp
-->
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3、傳遞對象

添加Lombok依賴

實體類:User

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String username;
    private String password;
}

如果參數比較多,就把這些參數封裝成一個對象,保證前端傳遞的參數名和對象的屬性名一致就可以

@RequestMapping("/login2")
//在這兒,參數是一個對象,那麼我們只需要使用對象的屬性就可以了
public String login2(User user, Model model) {
    System.out.println("接收到了username:" + user.getUsername() + ",password:" + user.getPassword());
    model.addAttribute("msg", user.getUsername());
    return "hello";
}

如果前端的參數與後臺的參數名稱不一致,那麼可以使用註解@RequestParam(“前端參數名”),將前端傳遞的參數映射爲後端的參數名,解決前端參數和後臺參數名稱不一致的問題

//@RequestParam("name")將前端的參數其別名爲後端的參數
//name是前端的變量名
//username是後端的變量名
@RequestMapping("/login")
//將前端參數name映射到後臺參數username
public String login(@RequestParam("name") String username, String password, Model model) {
    System.out.println("接收到了username:" + username + ",password:" + password);
    model.addAttribute("msg", username);
    return "hello";
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章