五大組件
DispatcherService (前端控制器)
接受請求,請求配置在HandlerMapping中.基於HandlerMapping的配置,調用相應的模型來處理.
HandlerMapping
包含了請求路徑與模型的對應關係.告訴DispatcherService請求路徑與模型之間的關係.
Controller (處理器)
負責處理業務邏輯.model
ModelAndView
封裝了處理結果,需要將Controller封裝爲ModelAndView.
model表示處理結果,view表示視圖.處理結果除了數據之外,還可能有視圖名.
ViewResolver (視圖解析器)
視圖解析器. freemarker velocity ... 可以解析非jsp視圖.
DispatcherServlet依據ViewResolver的解析,告訴DispatcherService調用哪個試圖對象來生成相應的頁面.
五大組件之間的關係
1.DispatcherServlet根據HanderMapping的配置,調用相應的Controller來處理.
2.Controller將處理結果封裝成ModelAndView對象,然後返回給DispatcherServlet.
3.DispatcherServlet依據ViewResolver的解析,調用相應的視圖對象(比如某個jsp)來生成相應的頁面.
步驟:
step1:導包
step2:添加spring的配置文件
step3:配置前端控制器DispatcherServlet.
step4:寫Controller(處理器) 業務邏輯的處理
@Controller
多個方法
String ModelAndView
@RequestMapping
step5:jsp
step6:添加配置:
< context:component-scan base-package=""/ > <!-- 主鍵掃描 -->
< mvc:annotation-driver /> <!-- 視圖解析器 -->
讀取請求參數值:
1.通過請求對象讀取
將request對象作爲方法的入參即可.
"/toLogin.do") //告訴前端控制器請求路徑與處理器方法的對應關係,不需要配置HandlerMapping (public String login(HttpServletRequest request) { String username = request.getParameter("username"); System.out.println("username: " + username); String psd = request.getParameter("password"); System.out.println("password: " + psd); return "login"; }
2.使用@RequestParam註解得到參數的方法值.
將註解加到方法的形參前面,明確的告訴傳過來的值和參數之間的對應關係
"/login.do") (public String login(String username, ("password") String psd) { System.out.println("username: " + username + " password: " + psd); return "index"; }
3.使用javabean封裝請求參數值.
java類的屬性和請求參數名一致
"/login.do") (public String login(User user) { System.out.println("username: " + user.username + " password: " + user.password); return "index"; }
向頁面傳值的方式
1.使用request域,將值傳給頁面.
將數據綁定到request,然後轉發到某個jsp.
//向頁面傳值的第一種方式 使用request "/login1.do") (public String login1(User user, HttpServletRequest request) { System.out.println("login1"); String username = user.getUsername(); String password = user.getPassword(); //將數據綁定到request request.setAttribute("username", username); request.setAttribute("password", password); //spring默認使用轉發,會自動轉發到以return值爲jsp名的頁面. return "index"; }
<h1>登錄成功!</h1> <h1>${username}</h1> <h1>${password}</h1> <!-- EL表達式 -->
2.使用ModelAndView來給頁面傳值.
將數據先封裝到ModelAndView對象裏面,然後將該對象作爲方法的返回值.
//向頁面傳值的第二種方式 使用ModelAndView "/login2.do") (public ModelAndView login2(User user) { System.out.println(user.getUsername() + " " + user.getPassword()); Map<String,Object> map = new HashMap<>(); map.put("username", user.getUsername()); //相當於request.setAttribute("username", username); map.put("password", user.getPassword()); //構造ModelAndView對象 ModelAndView mav = new ModelAndView("index", map); return mav; }
3.使用ModelMap綁定
將該對象作爲方法的參數,然後將數據綁定到該對象
//向頁面傳值的第三種方式 使用ModelMap "/login3") (public String login3(User user, ModelMap mm) { System.out.println("login3()"); System.out.println(user.getUsername() + " " + user.getPassword()); mm.addAttribute("username", user.getUsername()); //相當於request.setAttribute.. return "index"; }
4.使用Session對象綁定
Session聲明週期長於Request.
//向頁面傳值的第四種方式 使用Session ("/login4") public String login4(User user, HttpSession session) { System.out.println(user.getUsername() + " " + user.getPassword()); session.setAttribute("username", user.getUsername()); return "index"; }
重定向
若方法返回值是String
在重定向地址前添加"redirect:"
"/login.do") (public String login() { return "redirect:index.toIndex.do"; } "/toIndex.do") (public String toIndex() { return "index"; }
若方法的返回值是ModelAndView
"/login.do") (public ModelAndView login() { RedirectView rv = new RedirectView("toIndex.do"); return new ModelAndView(rw); } "/toIndex.do") (public String toIndex() { return "index"; }