SpringMVC讲师:佟刚概述•Spring为展现层提供了提供了优秀的Web框架–SpringMVC。•和众多其他MVC框架一样,它基于MVC设计理念•SpringMVC采用了松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵活性•SpringMVC通过一套MVC注解,可以让POJO成为处理请求的控制器,无须实现任何借口。HelloWorld•步骤:–加入jar包–在web.xml中配置DispatcherServlet–加入SpringMVC的配置文件–编写处理请求的处理器,并标识为处理器–编写视图对象HelloWorld:加入jar包•jar包:–commons-logging-1.1.1.jar–org.springframework.asm-3.1.1.RELEASE.jar–org.springframework.beans-3.1.1.RELEASE.jar–org.springframework.context-3.1.1.RELEASE.jar–org.springframework.core-3.1.1.RELEASE.jar–org.springframework.expression-3.1.1.RELEASE.jar–org.springframework.web-3.1.1.RELEASE.jar–org.springframework.web.servlet-3.1.1.RELEASE.jarHelloWorld:配置web.xml•配置DispatcherServlet:HelloWorld:创建SpringMVC配置文件•配置自动扫描的包•配置视图解析器HelloWorld:创建请求处理器类配置SpringMVC配置文件•DispatcherServlet默认自动加载/WEB-INF/servlet-Name-servlet.xml的Spring的配置文件,启动WEB层的Spring容器。可以为DispatcherServlet配置名称为contextConfigLocation的初始化参数指定配置文件的名称和位置在SpringMVC配置文件中引用业务层的Bean•多个SpringIOC容器之间可以设置为父子关系,以实现良好的解耦。•SpringMVCWEB层容器可作为“业务层”Spring容器的子容器:即WEB层容器可以引用业务层容器的Bean,而业务层容器却访问不到WEB层容器的Bean使用@RequestMapping映射请求•SpringMVC使用@RequestMapping注解为控制器指定可以处理哪些URL请求•在控制器的类定义及方法定义处都可标注@RequestMapping–类定义处:提供初步的请求映射信息。相对于WEB应用的根目录–方法处:提供进一步的细分映射信息。相对于类定义处的URL。若类定义处未标注@RequestMapping,则方法处标记的URL相对于WEB应用的根目录•DispatcherServlet截获请求后,就通过控制器上@RequestMapping提供的映射信息确定请求所对应的处理方法。使用@RequestMapping映射请求示例类定义处标记的@RequestMapping限定了处理器类可以处理所有URI为/hello的请求,它相对于WEB容器部署的根路径处理器类可以定义多个处理方法,处理来自/hello下的请求使用@RequestMapping映射请求•@RequestMapping还支持Ant风格的URL:–/user/*/createUser:匹配/user/aaa/createUser、/user/bbb/createUser等URL–/user/**/createUser:匹配/user/createUser、/user/aaa/bbb/createUser等URL–/user/createUser??:匹配/user/createUseraa、/user/createUserbb等URL通过请求参数、请求方法或请求头进行映射•标准的HTTP请求报头①请求方法②请求URL③HTTP协议及版本④报文头⑤报文体通过请求参数、请求方法或请求头进行映射•@RequestMapping除了可以使用请求URL映射请求外,还可以使用请求方法、请求参数及请求头映射请求•@RequestMapping的value、method、params及heads分别表示请求URL、请求方法、请求参数及请求报头的映射条件,他们之间是与的关系,联合使用多个条件可让请求映射更加精确化。•params和headers支持简单的表达式:–param1:表示请求必须包含名为param1的请求参数–!param1:表示请求不能包含名为param1的请求参数–param1!=value1:表示请求包含名为param1的请求参数,但其值不能为value1–”{“param1=value1,“param2”}:请求必须包含名为param1和param2的两个请求参数,且param1参数的值必须为value1通过请求参数、请求方法或请求头进行映射示例请求处理方法签名•SpringMVC通过分析处理方法的签名,将HTTP请求信息绑定到处理方法的相应入参中。•SpringMVC对控制器处理方法签名的限制是很宽松的,几乎可以按喜欢的任何方式对方法进行签名。•必要时可以对方法及方法入参标注相应的注解(@RequestParam、@RequestHeader等)、SpringMVC框架会将HTTP请求的信息绑定到相应的方法入参中,并根据方法的返回值类型做出相应的后续处理。请求处理方法签名示例-1请求参数按名称匹配的方式绑定到方法的入参中,方法返回的字符串代表逻辑视图名将Cookie值及请求报头属性绑定到入参中请求处理方法签名示例-2请求参数按名称匹配的方式绑定到user属性中直接将HTTP请求对象传递给处理方法使用@RequestParam绑定请求参数值•在处理方法入参处使用@RequestParam可以把请求参数传递给请求方法–Value:参数名–Required:是否必须。默认为true,表示请求参数中必须包含对应的参数,若不存在,将抛出异常使用@CookieValue绑定请求中的Cookie值•@CookieValue可让处理方法入参绑定某个Cookie值使用@RequestHeader绑定请求报头的属性值•请求报头包含了若干个属性,服务器可据此获知客户端的信息,通过@RequestHeader即可将报头属性值绑定到处理方法的入参中使用POJO对象绑定请求参数值•SpringMVC会按请求参数名和POJO属性名进行自动匹配,自动为该对象填充属性值。支持级联属性。如:dept.deptId、dept.address.tel等使用ServletAPI作为入参使用IO对象作为入参•Servlet的ServletRequest拥有getInputStream()和getReader()的方法,可以通过它们读取请求信息。相应Servlet的ServletResponse的getOuputStream()和getWriter()方法,可以通过它们输出响应信息。•SpringMVC允许控制器的方法使用InputStream/Reader、OutputStream/Writer作为方法的入参。HttpMessageConverterT•HttpMessageConverterT是Spring3.0新添加的一个接口,负责将请求信息转换为一个对象(类型为T),将对象(类型为T)输出为响应信息•HttpMessageConverterT接口定义的方法:–BooleancanRead(Class?clazz,MediaTypemediaType):指定转换器可以读取的对象类型,即转换器是否可将请求信息转换为clazz类型的对象,同时指定支持MIME类型(text/html,applaiction/json等)–BooleancanWrite(Class?clazz,MediaTypemediaType):指定转换器是否可将clazz类型的对象写到响应流中,响应流支持的媒体类型在MediaType中定义。–LIstMediaTypegetSupportMediaTypes():该转换器支持的媒体类型。–Tread(Class?extendsTclazz,HttpInputMessageinputMessage):将请求信息流转换为T类型的对象。–voidwrite(Tt,MediaTypecontnetType,HttpOutputMessgaeoutputMessage):将T类型的对象写到响应流中,同时指定相应的媒体类型为contentType。HttpMessageConverterT的实现类HttpMessageConverterT•DispatcherServlet默认使用AnnotationMethodHandlerAdapter作为HandlerAdapter的组件实现类,而AnnotationMethodHandlerAdapter默认装配如下HttpMessageConverter:–StringHttpMessageConverter–ByteArrayHttpMessageConverter–SourceHttpMessageConverter–XmlAwareFormHttpMessageConverterHttpMessageConverterT•如果需要装配其他类型的HttpMessageConverter,可在Spring的WEB容器上下文中自行定义一个AnnotationMethodHandlerAdapter•如果再SpringWEB容器中显式定义了一个AnnotationMethodHandlerAdapter,则SpringMVC将使用它覆盖的AnnotationMethodHandlerAdapter使用HttpMessageConverterT•使用HttpMessageConverterT将请求信息转化并绑定到处理方法的入参中,Spring提供了两种途径:–使用@RequestBody/@ResponseBody对处理方法进行标注–使用HttpEntityT/ResponseEntityT作为处理方法的入参或返回值@RequestBody、@ResponseBody示例HttnEntity、ResponseEntity示例处理JSON•只要在SpringWEB容器中为AnnotationMethodHandlerAdapter装配好相应的处理JSON的HttpMessageConverter,并在交互中通过请求的Accept指定MIME类型,SpringMVC就可使服务端的处理方法和客户端透明通过JSON格式的消息进行通信。处理模型数据•SpringMVC提供了以下几种途径输出模型数据:–ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据–@ModelAttribute:方法入参标注该注解后,入参的对象就会放到数据模型中–Map及Model:入参为org.springframework.ui.Model、org.springframework.ui.ModelMap或java.uti.Map时,处理方法返回时,Map中的数据会自动添加到模型中。–@SessionAttributes:将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性ModelAndView•控制器处理方法的返回值如果为ModelAndView,则其既包含视图信息,也包含模型数据信息。•添加模型数据:–MoelAndViewaddObject(StringattributeName,ObjectattributeValue)–ModelAndVi