SpringMVC必掌握的知识
一、Spring MVC 背景介绍:
Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架。通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText 和 POI。Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
二、核心原理:
- 用户发送请求给服务器。
- 服务器收到请求。发现DispatchServlet可以处理。于是调用DispatchServlet。
- DispatchServlet内部,通过HandleMapping检查这个url有没有对应的Controller。如果有,则调用Controller。
- Controller开始执行。
- Controller执行完毕后,如果返回字符串,则ViewResolver将字符串转化成相应的视图对象;如果返回ModelAndView对象,该对象本身就包含了视图对象信息。
- DispatchServlet将执视图对象中的数据,输出给服务器。
- 服务器将数据输出给客户端。
三、spring相关包含义:
四、注解的使用:
-
@Component、@Controller、@service、@Repository
只需要在对应的类上加上一个@Component注解,就将该类定义为一个Bean了,相当于配置文件中的<bean id="" class=""/>
使用@Component注解定义的Bean,默认的名称(id)是小写开头的非限定类名。如UserDaoImpl类默认的Bean名称就是userDaoImpl。可以自己指定Bean的名称: @Component("userDao") , 它可代替@Controller、@service、@Repository,但不推荐使用,因为spring还提供了更加细化的注解形式:@Repository、@Service、@Controller,它们分别对应存储层Bean,业务层 Bean,和展示层Bean。在Spring以后的版本中可能会给它们追加更多的语义。所以,推荐使用@Repository、@Service、@Controller来替代@Component。 -
@RequestMapping
@RequestMapping ( "/roles" )
在类前面定义,则将url和类绑定。
@RequestMapping ( "/test" )
在方法前面定义,则将url和类的方法绑定。可混合使用想调用具体方法则/roles/test
-
@RequestParam
一般用于将指定的请求参数付给方法中形参。示例代码如下://@RequestMapping(params="method=test1") //上面这种写法表示在类上做了url了,通过/roles?method=test1这样去访问 @RequestMapping ( "/test1" ) public String reg5(@RequestParam("username")String name) { System.out.println("HelloController.handleRequest()"); System.out.println(uname); return "index"; }
这样,就会将前台username参数的值赋给name了。当然,如果请求参数名称和形参名称保持一致,则不需要这种写法。
-
@SessionAttributes
将ModelMap中指定的属性放到session中。示例代码如下:@Controller @RequestMapping ( "/roles" ) @SessionAttributes({"user","test"}) public class RolesController { @RequestMapping ( "/test1" ) public String test1(ModelMap map) { User u=new User(); u.setUsername("测试"); map.addAttribute("user",u); //因为定义的@SessionAttributes中包含user, //这里赋值给ModelMap后自动赋值给了session域中也叫user return "index"; } }
HTML代码:
<body> <h1>**********${requestScope.user.username}</h1> <h1>**********${sessionScope.user.username}</h1> </body>
-
@ModelAttribute
这个注解可以跟@SessionAttributes配合在一起用。使用的前提是session域中已经有值才可以,session的值通过该注解自动赋给指定变量。@RequestMapping ( "/test2" ) public String test2(@ModelAttribute("user")User u) { System.out.println(u.getUsername()); return "redirect:/index.jsp"; }
通过上面@ModelAttribute("user")自动将session中的user对象赋值给了形参u对象,在方法内部可直接使用。
五、转发和重定向的使用
-
转发:在SpringMVC中默认的请求处理就是转发,代码写法:
@RequestMapping ( "/test3" ) public String test3() { return "forward:test2"; //forward:即可设置转发,不写默认就是转发 }
-
重定向:使用关键字“redirect:”代码写法:
@RequestMapping ( "/test4" ) public String test4() { return "redirect:/index.jsp"; }
六、ModelMap
ModelMap是map的实现,可以在其中存放属性,作用域同request。下面这个示例,我们可以在modelMap中放入数据,然后在forward的页面上显示这些数据。通过el表达式、JSTL、java代码均可。
七、ModelAndView模型视图类
见名知意,从名字上我们可以知道ModelAndView中的Model代表模型,View代表视图。即,这个类把要显示的数据存储到了Model属性中,要跳转的视图信息存储到了view属性。
经查看源码发现:
view是一个object对象,一般用来存放视图名称
model是一个ModelMap的对象,是个Map实现,具体可参考第六点。