1. 程式人生 > 實用技巧 >03-SpringMVC之頁面返回以及作用域放值

03-SpringMVC之頁面返回以及作用域放值

頁面返回以及作用域放值

1、檢視解析器

<!--xml配置檔案(檢視解析器部分,spring配置檔案中)-->
<!--檢視解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>

<!--
	檢視解析器首先會進行一個判斷,判斷這個地址(檢視名稱,字串)是否是以"redirect"或者"forward"開頭,如果是則會將檢視的url設定為重定向或者請求轉發,反之如果不是以這兩個字串開頭,則會將檢視設定為請求轉發並設定url為配置的字首加檢視名稱加上字尾,比如這裡就是/WEB-INF/pages/xxxx.jsp
-->

2、返回值為ModelAndView(org.springframework.web.servlet.ModelAndView)

簡介

這是一個Spring中的資料型別,裡面包含了資料(Model)-----資料定義了跳轉到頁面後傳入到作用域中的資料;檢視(View)-----檢視定義了將會跳轉到那個頁面

程式碼

@RequestMapping(value = "/findAll")
public ModelAndView findAll(){
    // 建立ModelAndView物件
    ModelAndView mv = new ModelAndView();
    // 進行一系列操作
    // 將操作結果儲存到mv中,實際上也是儲存到request作用域(預設)中
    mv.addObject("MSG","msg");
    
    // 跳轉哪一頁面(檢視名稱),預設為請求轉發進行頁面載入(沒有以redirect:以及forward:開頭就會自己加上路徑的字首以及字尾),這是最常用的方法
    mv.setViewName("success");
    // 請求轉發到某個controller的方法中
    mv.setViewName("forward:/user/login");
    // 不使用預設的頁面跳轉,指定進行請求轉發
    mv.setViewName("forward:/WEB-INF/pages/userList.jsp");
    // 使用重定向,這裡需要注意的是,重定向是不能訪問/WEB-INF目錄下的檔案的,只能訪問/WEB-INF上一級目錄下的檔案
    mv.setViewName("redirect:index.jsp");
    // 重定向到某個controller的方法中
    mv.setViewName("redirect:/user/login");
    
    // 頁面跳轉選一個進行跳轉即可
    return mv;
}

3、返回值為String

簡介

表面上返回值為String,實際上就是將ModelAndView進行了拆分,Model作為引數傳入,View以字串返回值的形式,實際上最終還是會將Model以及View封裝成ModelAndView進行執行

請求轉發

// Controller方法一
@RequestMapping("/findAll")
public String findAll(Model model){
    List<Car> list = carService.findAll();
    // 將list這個列表封裝到request這個作用域的list物件中
    model.addAttribute("list",list);
    // 實際上預設為請求轉發進行頁面載入(forward:/WEB-INF/pages/xxxx.jsp),字首字尾在之前的檢視解析器中進行配置
    return "list";
}
// Controller方法二,通過Map進行放值,實際上和通過Model效果相同
@RequestMapping("/findAll")
public String findAll(Map<String,Object> map){
    List<Car> list = carService.findAll();
    map.add("list",list);
    return "list";
}
<!--從作用域中拿出list物件並展示出來-->
<c:forEach items="${list}" var="car">
    ${car.id}<br>
    ${car.carNum}<br>
</c:forEach>

4、返回值是void型別

沒有寫任何跳轉操作

@Controller
@RequestMapping("/car")
public class CarController {
	// 此處將會根據檢視解析器預設跳轉到car/aaa.jsp(/WEB-INF/pages/car/aaa.jsp)
    @RequestMapping(value = "/aaa")
    public void Login(User user){
        System.out.println(user);
    }
}

中途有跳轉操作(使用原生的ServletAPI)

// 注意這種方法進行跳轉後,將不會經過檢視解析器,可以理解成一個普通的Servlet
@RequestMapping(value = "/findAll")
public void findAll(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    //設定編碼格式
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    //請求轉發
    request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
    //重定向,注意重定向後success.jsp檔案是在WEB-INF目錄下的,而不是/WEB-INF/pages目錄下
    response.sendRedirect(request.getContextPath()+"success.jsp");
    //直接響應
    response.getWriter.print("hello");
}

5、資料傳輸(同一Controller的不同方法)@SessionAttributes

@SessionAttribute
作用:
	用於多次執行控制器方法間的引數共享
屬性:
	value:用於指定存入的屬性名稱
	type:用於指定存入的屬性型別
使用:
註釋在類上,可以將某一個引數供給所有的方法使用
@Controller
@RequestMapping("/user")
@SessionAttributes(value={"loginMsg"})
public class UserController {
    @Autowired
    private IUserService userService;

    /**
     * @Author whether
     * @Description 使用者登入
     * @param: 作用域物件
     * @return 請求轉發到登入介面
     **/
    @RequestMapping(value = "/login",method= {RequestMethod.GET})
    public ModelAndView login(){
        System.out.println("login");
        ModelAndView mv = new ModelAndView();
        mv.setViewName("login");
        return mv;
    }

    /**
     * @Author whether
     * @Description 驗證使用者登入
     * @param: user:前端提交的使用者資訊
     * @return 登入成功跳轉首頁,不通過繼續留在登入介面
     **/
    @RequestMapping(value = "/checkLogin",method= {RequestMethod.POST})
    public ModelAndView checkLogin(User user, HttpSession session, RedirectAttributes attributes){
        ModelAndView mv = new ModelAndView();
        if(!user.getUsername().equals("") && !user.getPassword().equals("")){
            //驗證通過
            if (userService.checkUser(user)){
                session.setAttribute("USER_SESSION", user);
                mv.setViewName("redirect:/index.jsp");
            }else {
                attributes.addFlashAttribute("loginMsg","賬號或密碼錯誤!");
                mv.setViewName("redirect:/user/login");
            }
        }else{
            attributes.addFlashAttribute("loginMsg","賬號密碼為空!");
            mv.setViewName("redirect:/user/login");
        }
        return mv;
    }
}
JSP中取值既可以通過取requestScope.msg,也可以通過取sessionScope.msg