有关Spring MVC知识点的总结
Spring MVC
五大组件
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)来生成相应的页面.
使用注解开发基于springmvc的web应用
步骤:
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"; }