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";
}