Spring中使用到的各个对象的详细介绍

七、Spring中使用到的各个对象的详细介绍:

  1.DispatcherServlet:

DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。

DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:


1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
    2、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器)
3、通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
4、通过ViewResolver解析逻辑视图名到具体视图实现;
5、本地化解析;
6、渲染具体的视图等;
7、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析


对于DispatcherServlet对象来说,他就是一个真的HttpServlet对象,那么他的配置需要遵循Servlet的配置过程,所以我们是在web.xml文件中进行的配置,此时需要注意配置如下:
<servlet>
<servlet-name>smvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc_core.xml</param-value>
</init-param>
 </servlet>
 <servlet-mapping>
<servlet-name>smvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
【Note】:
1).对于SpringMVC执行的时候,也是需要有上下文环境的,默认使用WebApplicationContext作为上下文环境,所以他也要初始化这个环境,在初始话的时候需要读取配置文件,默认使用/WEB-INF/[servlet-name]-servlet.xml文件,如果需要更改,设置servlet的init-param,给param-name设置contextConfigLoaction,param-value设置为你所使用的xml文件的位置。如果源文件位于src下,那么可以写classpath:xxx.xml.
2).对于servlet的urlPattern的配置:
urlPattern是指,当服务器接收到请求之后,由服务器根据所有的urlPattern来决定当前要调用来处理请求的Servlet是哪一个。对于urlPattern可以精确指定,也可以统配:
1.如果直接写/test.do,那么只有当输入的url为/test.do的时候才能匹配上。
2.如果写为/*,这个是前缀匹配,所有的url都能统配
3.如果写为*.action,那么只要输入的url后缀为.action,就能匹配上(而且服务器会自动帮我们添加后缀为.jsp,.jspx的后缀匹配)。
4.匹配welcome中指定的路径。
5.如果写为/,那么匹配所有不能被上边的url匹配的url。
   匹配规则,由上到下。
 一般在配置DispatcherServlet的url的时候,会指定为/,使用这种方式可以实现RESTful风格的url。但是这个路径配置不会指定转到静态资源,因此,如果这样配置,需要设置静态资源处理。
3)url设置为/之后,静态资源的访问处理:
 方案一:激活 Tomcat 的 defaultServlet 来处理静态资源 
<servlet-mapping>  
 <servlet-name>default</servlet-name>  
 <url-pattern>/css/*</url-pattern>  
</servlet-mapping>  
<servlet-mapping>  
 <servlet-name>default</servlet-name>  
 <url-pattern>/js/*</url-pattern>  
</servlet-mapping>  
<servlet-mapping>  
 <servlet-name>default</servlet-name>  
 <url-pattern>/image/*</url-pattern>  
</servlet-mapping>  


每种类型的静态资源需要分别配置一个servlet-mapping,
 方案二:在spring的配置文件中启用mvc 这个schema(Spring 3.0.4 以后版本提供了 <mvc:resources /> )
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
其中 location指的是静态资源的位置。使用 <mvc:resources /> 元素,会把 mapping 的 URI 注册到 SimpleUrlHandlerMapping 的 urlMap 中,key 为 mapping 的 URI pattern 值,而 value 为 ResourceHttpRequestHandler,这样就巧妙的把对静态资源的访问由 HandlerMapping 转到 ResourceHttpRequestHandler 处理并返回,所以就支持 classpath 目录, jar 包内静态资源的访问。 
 方案三:使用 <mvc:default-servlet-handler /> 
<mvc:default-servlet-handler /> 会把 "/**" url 注册到 SimpleUrlHandlerMapping 的 urlMap 中,把对静态资源的访问由 HandlerMapping 转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回。DefaultServletHttpRequestHandler 使用就是各个 Servlet 容器自己的默认 Servlet
性能最好的应该是直接利用容器的DefaultServlet,让它最先拦截静态资源请求,这样就避免了后续的转发等操作,提高了性能,但是无法访问classpath下的资源文件。而通过mvc:resources标签可以简单配置匹配规则和资源文件路径,应该说是最简单快捷的一种方式,当然这大概也是mvc命名空间设计的初衷。

2. Controller
Controller控制器,是MVC中的部分C,这里说部分是因为此处的控制器主要负责功能处理部分:
  1、收集、验证请求参数并绑定到命令对象;
  2、将命令对象交给业务对象,由业务对象处理并返回模型数据;
  3、返回ModelAndView(Model部分是业务对象返回的模型数据,视图部分为逻辑视图名)。
而上边我们看到的DispatcherServlet,要负责整体的控制流程的调度部分。所以SpringMVC完整的C应该是DispatcherServlet+Controller
 
Spring Web MVC支持多种类型的控制器,比如实现Controller接口,从Spring2.5开始支持注解方式的控制器(如@Controller、@RequestMapping、@RequestParam、@ModelAttribute等),我们也可以自己实现相应的控制器(只需要定义相应的HandlerMapping和HandlerAdapter即可)

  我们上边定义的Controller,就是采用的实现接口的形式。现在大部分采用的是基于annotation的配置, 后续我们会详细讲,现在先看看基于接口实现的方式。
  
  Controller接口:
package org.springframework.web.servlet.mvc;
public interface Controller {
  ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
这是控制器接口,此处只有一个方法handleRequest,用于进行请求的功能处理,处理完请求后返回ModelAndView(Model模型数据部分 和 View视图部分)。

【Note】:通过request取请求参数时,如果客户端发送请求的类型为Post,那么获取参数可能乱码,此时需要处理乱码:
1.request.setCharacterEncoding("UTF-8");
2.SpringMVC提供了一个专门用来处理乱码的过滤器,我们可以直接设置这个过滤器编码
<filter>
<filter-name>encode</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encode</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

Spring还提供了一些基于Controller接口的实现,以方便我们做操作。但是从Spring3.0之后基本都加了@Deprecated,也就是不推荐使用的。大部分还是使用@Annotation的注解。
比如,实现Controller,我们得自己从request取请求参数,如果不想去,SpringMVC提供了一个AbstractCommandController,我们继承这个Controller可以让spring自动帮我们设置参数信息:
public class FormRegist extends AbstractCommandController {
public FormRegist() {
//设置需要Spring帮我们封装的数据类型。
setCommandClass(User.class);
}
protected ModelAndView handle(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
User u = (User)command;
ModelAndView mv = new ModelAndView();
mv.addObject(u);
mv.setViewName("success.jsp");
System.out.println(u);
return mv;
}
}



八、SpringMVC框架的搭建(基于注解)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">
Spring2.5时加入了注解的支持。Spring3.0的功能更加强大。
使用基于注解的配置可以省略很多操作,更方便。如上我们所看到的的所有的操作如果替换成基于注解的操作只需要在spring的xml文件中做如下配置:
<!-- 此配置可以重写很多DispatcherServlet对象的默认配置,支持基于annotation的配置  -->
<mvc:annotation-driven></mvc:annotation-driven>

在使用此配置之前需要现在spring的头标签<beans>标签中加入mvc这个namespace。<mvc:annotation-driven/>覆盖了DispatcherServlet对象的很多默认配置信息,相当于注册一个RequestMappingHandlerMapping,一个RequestMappingHandlerAdapter给后边使用到的@RequestMapping等注解提供了支持,并提供很多其他类似数据绑定等的功能。如上描述的处理器适配器,处理器映射器,视图解析器等的配置也都可以省略。

如果处理器的配置也希望以注解的形式体现,那么可以结合原来spring ioc的annotation的配置。希望作为处理器来用的,可以再类体声明上方使用@Controller标注,业务逻辑可以使用@Service,如果是持久成可以使用@Repository分别标注

<!-- 指明使用了注解的类都在base-package所指明的包下 -->
<context:component-scan base-package="com.briup.controller”/>
这样作为xml文件中的配置就非常简单了,如果视图配置不想使用默认配置,需要自己设定,可以单独配置(详细配置如5.8的配置)

8.1 基于注解的Controller的实现
  和单纯xml的配置相比,加入了annotation配置之后的处理器的配置也变的更简单了,不需要再实现特定的接口,任意一个javaBean对象都可以当做处理器对象。对象中任意一个方法都可以作为处理器方法,而不需要再像非注解注释一样实现特定的方法。
可以结合Spring提供的@Controller注释表明当前类是一个处理器类,当处理器有了之后,就要指明当有什么样的url请求过来时,使用指定处理器中的方法来执行。

@Controller
public class AnnoControll{

}

8.2 定义处理器方法
SpringMVC提供的处理器方法的签名非常灵活,方法名可以随意定义,支持丰富多样的方法参数和返回类型。
当处理器和处理器方法都有了之后,就需要使用到@RequestMapping类完成处理器映射:

@Controller
public class AnnoControll{
@RequestMapping("/annotaFirst.action")
public ModelAndView annotationFirst(){
System.out.println("第一个annotation的注释");
ModelAndView mv = new ModelAndView();
mv.setViewName("/index.jsp");
return mv;
}
}
如上代码,使用@Controller表明class AnnoControll类是一个处理器类,通过@RequestMapping(“/annotaFirst.action”)表明当url请求名为annotaFirst时,调用annotationFirst方法执行处理,当处理完成之后返回的ModelAndView对象就是返回的业务逻辑视图和数据模型。(因为DipstacherServlet对象配置拦截的请求为.action请求,所以当请求名为annotaFirst.action时请求被拦截)。在ModelAndView中设置viewName为index.jsp,当请求处理完成之后,自动跳转到Index.jsp页面。

十、基于注解的控制器实现:
Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMapping注解定义我们的处理器类。并且提供了一组强大的注解,对于这些注解的解析是在spring容器中注册了,处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter,以此来开启支持@Controller 和@RequestMapping注解的处理器。


和单纯xml的配置相比,加入了annotation配置之后的处理器的配置也变的更简单了,不需要再实现特定的接口,任意一个javaBean对象都可以当做处理器对象。对象中任意一个方法都可以作为处理器方法,而不需要再像非注解注释一样实现特定的方法。可以结合Spring提供的@Controller注释表明当前类是一个处理器类,当处理器有了之后 ,就要指明当有什么样的url请求过来时,使用指定处理器中的方法来执行。

推荐使用这种方式声明处理器,它和我们的@Service、@Repository很好的对应了我们常见的三层开发架构的组件。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值