SpringMVC(九):作用域传参

举报
Lansonli 发表于 2022/12/27 11:52:28 2022/12/27
【摘要】 作用域传参PageContext对象作用域范围:当前jsp页面内有效request对象作用域范围:一次请求内。作用: 解决了一次请求内的资源的数据共享问题session对象作用域范围:一次会话内有效。说明:浏览器不关闭,并且后台的session不失效,在任意请求中都可以获取到同一个session对象。作用:解决了一个用户不同请求的数据共享问题。application(ServletConte...

作用域传参

PageContext对象

  • 作用域范围:当前jsp页面内有效

request对象

  • 作用域范围:一次请求内。
  • 作用: 解决了一次请求内的资源的数据共享问题

session对象

  • 作用域范围:一次会话内有效。
  • 说明:浏览器不关闭,并且后台的session不失效,在任意请求中都可以获取到同一个session对象。
  • 作用:解决了一个用户不同请求的数据共享问题。

application(ServletContext)对象

  • 作用域范围:整个项目内有效。
  • 特点:一个项目只有一个,在服务器启动的时候即完成初始化创建无论如何获取都是同一个项目
  • 作用:解决了不同用户的数据共享问题。

一、传统方式传递数据

定义Controller

package com.lanson.controller;
import com.lanson.pojo.User;
import com.lanson.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpSession;
import java.util.List;
/**
 * @Author: Lansonli
 * @Description: MircoMessage:Mark_7001
 */
@Controller
public class ScopeController {
    @Autowired
    private UserService userService;
    /*
    * request,session 这两个域直接放在参数列表上即可,SpringMVC就可以给我们注入
    * ServletContext对象(application域) 不能直接放在参数列表上的
    * */
    @RequestMapping("setData")
    public String setData(HttpServletRequest req,HttpSession session){
        List<User> users = userService.findAllUser();
        // 向三个域中放入数据
        req.setAttribute("message", "reqMessage");
        req.setAttribute("users", users);
        session.setAttribute("message", "sesssionMessage");
        session.setAttribute("users", users);
        ServletContext application = req.getServletContext();
        application.setAttribute("message", "applictionMessage");
        application.setAttribute("users", users);
        // 跳转至showDataPage
        return "/showDataPage.jsp";
    }
}


定义showDataPage.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--域中的数据--%>
requestScope :message:${requestScope.message} ,uname:${requestScope.users[0].uname} <br/>
sessionScope :message:${sessionScope.message} ,uname:${sessionScope.users[0].uname} <br/>
applicationScope :message:${applicationScope.message} ,uname:${applicationScope.users[0].uname} <br/>
<%--请求参数--%>
requestParam:${param.message}
</body>
</html>


二、使用Model传递数据

    /*model对象addAttribute
    * 主要是对请求域传递数据进行了API上的封装
    * 降低controller和Servlet之间的耦合度
    * 重定向下,没法使用model传递域中的数据
    * model中的字符串类型的键值对信息会转换为请求参数,转发给目标组件
    * */
    @RequestMapping("setData2")
    public String setData2(Model model){
        List<User> users = userService.findAllUser();
        // 向域中放入数据
        model.addAttribute("message", "reqMessage");
        model.addAttribute("users", users);
        // 跳转至showDataPage
                    // return "forward:/showDataPage.jsp";
        return "redirect:/showDataPage.jsp";
    }


三、使用ModelAndView传递数据

    /*
    * ModelAndView
    * Model数据
    * View 视图
    * */
    @RequestMapping("setData3")
    public ModelAndView setData3(){
        ModelAndView mv=new ModelAndView();
        Map<String, Object> model = mv.getModel();
        // 向request域中放入数据
        List<User> users = userService.findAllUser();
        model.put("message", "reqMessage");
        model.put("users", users);
        // 设置视图
        //mv.setViewName("forward:/showDataPage.jsp");
        mv.setViewName("redirect:/showDataPage.jsp");
        return mv;
    }
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。