03-SpringMVC之頁面返回以及作用域放值
阿新 • • 發佈:2020-12-20
頁面返回以及作用域放值
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