文章目录
- 参数传递
- 重定向与转发
- REST风格
参数传递
ModelAndView:包含视图信息和模型数据信息
public ModelAndView index1(){
// 返回页面
ModelAndView modelAndView = new ModelAndView("视图名");
// 或
// ModelAndView modelAndView = new ModelAndView();
// modelAndView.setViewName("视图名");
// 添加数据模型 可在视图中使用 作用域为请求范围(request scope)
modelAndView.addObject("键","值");
return modelAndView;
}
Model:以Map方式进行存储,用于向作用域中存值
public String index1(Model model){
// 在 Model 中增加模型数据 作用域为请求范围(request scope)
model.addAttribute("userName","张三");
return "/user.jsp";
}
在 Model 中增加模型数据,若不指定 key,则默认使用对象的类型作为 key
Map:以Map方式进行存储,用于向作用域中存值
public String index1(Map<String ,Object> map){
map.put("userName","张三");
return "/user.jsp";
}
使用 @ModelAttribute
和 @SessionAttributes
注解来处理模型数据和会话数据。
@ModelAttribute
注解用于将方法参数绑定到模型中,或者将方法返回值添加到模型中。它可以在方法级别或方法参数级别使用。
@Controller
public class UserController {
@RequestMapping(value = "/user")
public String index1(@ModelAttribute("user") User user) {
user.setUserName("张三");
System.out.println(user.getUserName());
return "/user.jsp";
}
}
@SessionAttributes
注解用于将特定的模型属性存储在 HTTP 会话中。它可以定义在控制器类上,以指定哪些模型属性需要存储在会话中。
@Controller
@SessionAttributes(value = {"userName"})
public class IndexController {
@RequestMapping("/user")
public ModelAndView index() {
ModelAndView modelAndView = new ModelAndView("/user.jsp");
// 存入 Request 作用域和 Session 作用域
modelAndView.addObject("userName", "张三");
return modelAndView;
}
}
@SessionAttributes
的不同用法
// 按属性名存储:将 model 中指定名称的模型属性存储在会话中。
@SessionAttributes(value = {"userName", "userPwd"})
// 按类型存储:将 model 中所有指定类型的模型属性存储在会话中。
@SessionAttributes(types = User.class)
@SessionAttributes(types = {User.class, Dept.class})
// 按属性名和类型存储:将 model 中所有指定名称和类型的模型属性存储在会话中。
@SessionAttributes(value = {"user1", "user2"}, types = {Dept.class})
// 组合存储:将 model 中多个属性名和类型的模型属性存储在会话中。
@SessionAttributes(value = {"user1", "user2"}, types = {User.class, Dept.class})
servlet 方式
<!-- 引入servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
public String cs(HttpServletRequest request
, HttpServletResponse response
, HttpSession session){
session.setAttribute("userName","123");
return "/user.jsp";
}
使用 Servlet 方式直接操作 HttpSession
对象,只存入 session 作用域中。
重定向与转发
@Controller
public class IndexController {
@RequestMapping(value = "/index1", method = RequestMethod.GET)
public String index1(User user, Model model) {
// 设置用户姓名
user.setUser_name("张三");
model.addAttribute("user", user);
// 重定向到 /user.jsp
// return "redirect:/user.jsp";
// 转发到 /user.jsp(forward:可省略)
return "forward:user";
}
}
配置视图解析器确保视图名称能够正确解析为视图文件。使用 InternalResourceViewResolver
示例配置:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
InternalResourceViewResolver
被配置为前缀为/WEB-INF/views/
,后缀为.jsp
,当控制器返回forward:user
时,视图解析器会将user
解析为/WEB-INF/views/user.jsp
。
@ResponseBody
:返回JSON数据 一般用于方法上
1、首先确保你的项目中已经包含了 Jackson 库
<!-- JSON依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.3</version>
</dependency>
2、在 User 实体类上添加注解,控制 JSON 序列化
使用 @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
来指定当属性为null时不序列化该属性。
@JsonInclude(JsonInclude.Include.NON_NULL) // 代替@JsonSerialize
public class User {}
前端也能判断,一般不加注解。
3、调整 Controller
确保 Controller 可以正确处理请求并返回 JSON 格式的数据
@RestController // @Controller + @ResponseBody
@RequestMapping("/api")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/testjson")
public User jsons(@RequestParam long userId) {
User user = this.userService.getUserById(userId);
return user; // 直接返回对象
}
}
使用 ResultJSON 工具类
public class ResultJSON<T> {
private Integer code;
private String msg;
private T data;
public ResultJSON(Integer code, String msg,T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public static <T> ResultJSON success(T data){
return new ResultJSON(200,"操作成功",data);
}
public static ResultJSON success(){
return new ResultJSON(200,"操作成功",null);
}
public static ResultJSON success(Integer code,String msg){
return new ResultJSON(code,msg,null);
}
public static ResultJSON error(){
return new ResultJSON(400,"操作失败",null);
}
public static ResultJSON error(Integer code,String msg){
return new ResultJSON(code,msg,null);
}
...
}
@RestController // @Controller + @ResponseBody
@RequestMapping("/provider")
public class ProviderController {
@RequestMapping(value = "/findProviderById", method = RequestMethod.GET)
public ResultJSON<Provider> findProviderById(@RequestParam Integer id) {
// 创建一个示例Provider对象
Provider provider = new Provider();
provider.setId(111);
provider.setProName("小米科技");
// 返回成功结果(JSON数据)
return ResultJSON.success(provider);
}
}
可以返回集合
List<Provider> list = Arrays.asList(provider,provider1,provider2);
return ResultJSON.success(list);
@DateTimeFormat
:用户对象属性,控制入参时日期类型转换
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") // 年月日时分秒
private Date userLoginEndtime;
@JsonFormat
:返回 JSON 数据时日期类型处理
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date userLoginEndtime;
最常用的还是把日期类型改为字符串(前端取到的数据是 String)
private String userLoginEndtime;
@RequestHeader
:获取请求头中的参数
@ResponseBody
@RequestMapping(value = "/index",method = RequestMethod.POST)
public User index(@RequestHeader(value = "token"
,defaultValue = "1"
,required = false) int tokenid){
......
}
从 HTTP 头中获取名为
token
的值。如果这个头部信息不存在,它将使用默认值1。
REST风格
REST(Representational State Transfer)设计风格基于 HTTP 协议,利用 HTTP 的方法(如GET、POST、PUT、DELETE等)来操作资源。
在REST中,每个事物都被视为一种资源,可以是一个实体(例如用户、产品)、集合(例如用户列表)或更抽象的概念。每个资源都有一个唯一的标识符(URI),客户端通过这个标识符来访问资源。
@Controller
public class UserController {
@RequestMapping(value = "/user/{userId}.html")
public String index1(@PathVariable("userId") Long userId) {
System.out.println("id : " + userId);
return "user"; // 返回视图名称
}
}
// 请求路径为:
.../user/userId.html 如 .../user/12.html