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