SpringMVC3.0深入核心原理1.用户发送请求给服务器。url:login.action2.服务器收到请求。发现DispatchServlet可以处理。于是调用DispatchServlet。3.DispatchServlet内部,通过HandleMapping检查这个url有没有对应的Controller。如果有,则调用Controller。4.Controller开始执行。5.Controller执行完毕后,如果返回字符串,则ViewResolver将字符串转化成相应的视图对象;如果返回ModelAndView对象,该对象本身就包含了视图对象信息。6.DispatchServlet将执视图对象中的数据,输出给服务器。7.服务器将数据输出给客户端。spring3.0中相关jar包的含义org.springframework.aop-3.0.3.RELEASE.jarspring的aop面向切面编程org.springframework.asm-3.0.3.RELEASE.jarspring独立的asm字节码生成程序org.springframework.beans-3.0.3.RELEASE.jarIOC的基础实现org.springframework.context-3.0.3.RELEASE.jarIOC基础上的扩展服务org.springframework.core-3.0.3.RELEASE.jarspring的核心包org.springframework.expression-3.0.3.RELEASE.jarspring的表达式语言org.springframework.web-3.0.3.RELEASE.jarweb工具包org.springframework.web.servlet-3.0.3.RELEASE.jarmvc工具包@Controller控制器定义和Struts1一样,Spring的Controller是Singleton的。这就意味着会被多个请求线程共享。因此,我们将控制器设计成无状态类。在spring3.0中,通过@controller标注即可将class定义为一个controller类。为使spring能找到定义为controller的bean,需要在spring-context配置文件中增加如下定义:context:component-scanbase-package=com.oracle.web/注:实际上,使用@component,也可以起到@Controller同样的作用。@RequestMapping在类前面定义,则将url和类绑定。在方法前面定义,则将url和类的方法绑定,如下所示:packagecom.oracle.web;importjavax.annotation.Resource;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importcom.oracle.service.UserService;@Controller@RequestMapping(/user.do)publicclassUserController{@ResourceprivateUserServiceuserService;//=reg&username=zzzz@RequestMapping(params=method=reg)publicStringreg(Stringusername){System.out.println(HelloController.handleRequest());userService.add(username);returnindex;}publicUserServicegetUserService(){returnuserService;}publicvoidsetUserService(UserServiceuserService){this.userService=userService;}}@RequestParam一般用于将指定的请求参数付给方法中形参。示例代码如下:@RequestMapping(params=method=reg5)publicStringreg5(@RequestParam(username)Stringuname,ModelMapmap){System.out.println(HelloController.handleRequest());System.out.println(username);returnindex;}这样,就会将name参数的值付给username。当然,如果请求参数名称和形参名称保持一致,则不需要这种写法。@SessionAttributes将ModelMap中指定的属性放到session中。示例代码如下:@Controller@RequestMapping(/user.do)@SessionAttributes({u,a})//将ModelMap中属性名字为u、a的再放入session中。这样,request和session中都有了。publicclassUserController{@RequestMapping(params=method=reg4)publicStringreg4(ModelMapmap){System.out.println(HelloController.handleRequest());map.addAttribute(u,uuuu);//将u放入request作用域中,这样转发页面也可以取到这个数据。returnindex;}}bodyh1**********${requestScope.u.username}/h1h1**********${sessionScope.u.username}/h1/body注:名字为”user”的属性再结合使用注解@SessionAttributes可能会报错。@ModelAttribute这个注解可以跟@SessionAttributes配合在一起用。可以将ModelMap中属性的值通过该注解自动赋给指定变量。示例代码如下:packagecom.oracle.web;importjavax.annotation.Resource;importorg.springframework.stereotype.Controller;importorg.springframework.ui.ModelMap;importorg.springframework.web.bind.annotation.ModelAttribute;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.SessionAttributes;@Controller@RequestMapping(/user.do)@SessionAttributes({u,a})publicclassUserController{@RequestMapping(params=method=reg4)publicStringreg4(ModelMapmap){System.out.println(HelloController.handleRequest());map.addAttribute(u,张三);returnindex;}@RequestMapping(params=method=reg5)publicStringreg5(@ModelAttribute(c)Stringusername,ModelMapmap){System.out.println(HelloController.handleRequest());System.out.println(username);returnindex;}}先调用reg4方法,再调用reg5方法。我们发现控制台打印出来:张三Controller类中方法参数的处理Controller类中方法返回值的处理1.返回string(建议)a)根据返回值找对应的显示页面。路径规则为:prefix前缀+返回值+suffix后缀组成b)代码如下:@RequestMapping(params=method=reg4)publicStringreg4(ModelMapmap){System.out.println(HelloController.handleRequest());returnindex;}前缀为:/WEB-INF/jsp/后缀是:.jsp在转发到:/WEB-INF/jsp/index.jsp2.也可以返回ModelMap、ModelAndView、map、List、Set、Object、无返回值。一般建议返回字符串!请求转发和重定向代码示例:packagecom.oracle.web;importjavax.annotation.Resource;importorg.springframework.stereotype.Controller;importorg.springframework.ui.ModelMap;importorg.springframework.web.bind.annotation.ModelAttribute;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.SessionAttributes;@Controller@RequestMapping(/user.do)publicclassUserController{@RequestMapping(params=method=reg4)publicStringreg4(ModelMapmap){System.out.println(HelloController.handleRequest());//returnforward:index.jsp;//returnforward:user.do?method=reg5;//转发//returnredirect:user.do?method=reg5;//重定向returnredirect:重定向}@RequestMapping(params=method=reg5)publicStringreg5(Stringusername,ModelMapmap){System.out.println(HelloController.handleRequest());System.out.println(username);returnindex;}}访问reg4方法,既可以看到效果。获得request对象、session对象普通的Controller类,示例代码如下:@Controller@RequestMapping(/user.do)publicclassUserController{@RequestMapping(params=method=reg2)publicStringreg2(Stringusername,HttpServletRequestreq,ModelMapmap){req.setAttribute(a,aa);req.getSession().setAttribute(b,bb);returnindex;}}ModelAndView