4.SpringMvc-响应处理

1.内置的视图解析器

InternalResourceViewResolver:Controller中的方法 在返回字符串时,可以通过视图解析器来增加 前缀和后缀,让controller中的方法 返回的值更精简。

在spring容器配置中 加入

  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/"></property>
        <property name="suffix" value=".jsp"></property>
   </bean>

2.MVC 视图控制器

某些放在web-inf下的jsp视图 我们希望可以直接访问,不经过Controller,那么可以通过 视图控制器 直接配置

<mvc:view-controller path="/访问的路径" view-name="视图的名字">

1.如何把数据 传回到jsp页面

方式1:

通过获取Servlet API 调用 相应setAttribute方法 按照Servlet的方式 把数据存放到 对应的 作用域

获取Request对象:方法中 直接声明一个 request对象

    @RequestMapping("/users")
    public String showUsers(HttpServletRequest request){
        request.setAttribute("username","shufen");
        return "user";
    }

方式2:

通过 Model map modelMap传输数据到页面

在方法中 加入参数 参数可以是 Model Map ModelMap三种类型

通过 model.addAttribute(key,value);

map.put(key,value)

modelMap.addAttribute(key,value)

modelMap.put(key,value) 把值 实际上还是放到 request域中

前端页面 通过 el表达式 {requestScope.key} 取出

   @RequestMapping("/modeltest")
    public String showUsers2(Model model){
       model.addAttribute("username","cuihua");
       return "user";
    }
​
​
    @RequestMapping("/maptest")
    public String showUsers2(Map map){
        map.put("username","zhangsan");
        return "user";
    }
​
    @RequestMapping("/modelMapTest")
    public String showUsers2(ModelMap modelMap){
        modelMap.addAttribute("username","lisi");
        modelMap.put("username","wangwu");
        return "user";
    }

方式3:

通过 ModelAndView 对象 传递参数到页面

controller中的方法 返回值类型 改成 ModelAndView

ModelAndView中包含 视图名和数据两部分

 @RequestMapping("/mvtest")
    public ModelAndView showUsers4(){
        // 新建要返回的 视图模型对象 构造方法的参数为 视图的名字
        ModelAndView mv = new ModelAndView("user");
        // addObject 方法可以往模型中 存放数据
        mv.addObject("username","jianguo");
        //通过setViewName 设置 要跳转的 视图的名字
        mv.setViewName("user");
        //方法 直接返回一个 ModelAndView对象 会被 视图解析器解析。
        return mv;
    }

addObject

setViewName

前面三种方法实际上还会把,请求参数绑定 默认放到request域中去

2.向session中添加输入 并在页面获取:

a.直接在 controller的方法中 声明一个参数 HttpSession session即可,页面上通过 el表达式直接取出

b.在Controller 类的内部 声明一个 成员变量 通过 @Autowired 进行自动注入

@Autowired
private HttpSession session;

c.先获取到request对象 再通过 request对象获取 session

 @RequestMapping("/users")
    public String showUsers(HttpServletRequest request){
       Http session= request.getSession();
        return "user";
    }

d.通过@SessionAttributes() 注解加在类上,作用是

当向model map modelMap 中添加数据时,如果 数据的key 和 @SessionAttributes("key") 一致,那么会自动的把key-value 存入到 session作用域中去

package com.edu.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

@Controller
@SessionAttributes("username")
public class UserController {
    @RequestMapping("/model")
    public String userLogin2(String username, String password, Model model){
        model.addAttribute("username",username);
        model.addAttribute("password",password);
        return "success";
    }

    @RequestMapping("/map")
    public String userLogin3(String username, String password, Map map){
        map.put("username",username);
        map.put("password",password);
        return "success";
    }

    @RequestMapping("/modelMap")
    public String userLogin4(String username, String password, ModelMap modelMap){
        modelMap.put("username",username);
        modelMap.put("password",password);
        return "success";
    }
}
1// 从model中获取指定的属性写入session中
2 // 底层会从model中去找一个叫做type的属性
3 // 找到了会将type设置一份到session中
4 // 这种方式是依赖model的
5 // 当前控制器下所有的处理方法 都会将model指定的属性写入session

e.通过 @SessionAttribute() 注解 加在方法 的 参数上,表示 从session中 取出 指定key的 value 并赋值给 参数.

@SessionAttribute() 的属性 required 表示 session中的这个参数 是否是必须的。

   @RequestMapping("/session")
    public String session(@SessionAttribute("user") User user){
        // do something
        return "index";
    }
1 * required 用来设置session中某个属性必须存在 , 
不存在则会报错:HTTP Status 400 ‐ Missing session attribute 'type' of type String
2 * model和session是互通的:session可以通过model中去获取写入指定的属性, model
也会从session中自动写入指定的属性
阅读剩余
THE END