SpringMVC 注解方式 配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Stephen_mu/article/details/88079497

首先按照 SpringMVC框架原理 需要先配置前端控制器

前端控制器配置 DispatcherServlet

    前端控制器DispatcherServlet
    在web.xml里面配置前端控制器 DispatcherServlet
          <!--配置SpringMVC前端控制器 -->
          <servlet>
              <servlet-name>springMVC</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <!--为前端控制器指定各种handler映射器,handler适配器,视图解析器,语言环境解析器,异常解析器 -->
              <!--如果不配置ContextConfigLocation 默认加载的是WEB-INF/servlet名称-servlet.xml (springmvc-servlet.xml) -->
              <init-param>
                  <param-name>ContextConfigLocation</param-name>
              <!--此配置文件内部配置handler映射器,handler适配器,视图解析器,语言环境解析器,异常解析器的bean,交由IOC容器管理 -->
                  <param-value>classpath:resources/springMVC/SpringMVCBeans.xml</param-value>
              </init-param>
           </servlet>
                
           <!--配置url和DispatcherServlet之间的映射规则 -->
           <servlet-mapping>
                <servlet-name>springMVC</servlet-name>
                <!--url-pattern:第一种: *.action 表示 所有以.action结尾的请求由DispatcherServlet进行解析 -->
                <!--第二种: / 表示所有地址都由DispatcherServlet进行解析,这种方法可以实现RESTful风格的url -->
                <!--第三种: /* 这种配置存在问题,使用这种配置,在转发到jsp页面时,DispatcherServlet会jsp地址,不能根据jsp页面找到handler -->
                <url-pattern>/</url-pattern>
            </servlet-mapping>

补充 :前端控制器的执行流程

    1.接收用户请求,执行doDispatch方法
        doDispatch(HttpServletRequest request, HttpServletResponse response)

    2.通过HandlerMapping对象为当前请求指定Handler(Controller)
        mappedHandler = getHandler(processedRequest);

    3.找到url对应的Handler后,通过该Handler找到适合当前Handler的HandlerAdapter对象
        HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
	
    4.经过一系列验证之后,通过HandlerAdapter对象执行当前的Handler(Controller)并且返回一个ModelAndView
        mv = ha.handle(processedRequest, response, mappedHandler.getHandler())	

    5.拿着上一步返回的ModelAndView进行视图的解析(1),返回View,然后视图渲染(2)将Model中的数据填充到request域
        1.解析视图,返回View
            1.processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException)
            2.render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response)
            3.view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
   
        2.视图渲染,将Model中的数据填充到request域
            1.view.render(mv.getModelInternal(), request, response);
            2.renderMergedOutputModel(mergedModel, request, response);
            3.exposeModelAsRequestAttributes(model, requestToExpose);

配置处理器映射器HandlerMapping

处理器适配器和处理器映射器(注解)
         处理器映射器
		 Spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping作为(注解)处理器映射器HandlerMapping
		 Spring3.1之后使用org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping作为(注解)处理器映射器HandlerMapping
			 <!--注解的 处理器映射器 -->
	         <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>

处理器适配器配置 HandlerAdapter

处理器适配器
        Spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter最为(注解)处理器适配器HandlerAdapter
        Spring3.1之后使用org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter作为(注解) 处理器适配器 HandlerAdapter
                 <!--注解的 处理器适配器 -->
	         <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>

快速标签(一键代替(注解)处理器映射器和(注解)处理器适配器)

快速标签(一键代替(注解)处理器映射器和(注解)处理器适配器)  
		 <!--mvc注解驱动配置(一键代替(注解)处理器映射器和(注解)处理器适配器)  -->
	         <!--在实际开发中使用,因为该标签默认绑定了许多参数绑定方法,比如json转换解析器....-->
	         <mvc:annotation-driven></mvc:annotation-driven>

编写Handler(Controller)

@Controller 
//注解方式配置MVC时必须用Controller,使用@Component无法进行Url映射
public class CelebrityController{

   
	@Autowired
    //对于有多个实现类的接口可以采用@Qualifier("InterfaceName")注解注入
	private CelebrityService celebrityService;
	
	/* (non-Javadoc)
	 * @see com.ncs.controller.ICelebrityController#saveAndView()
	 */
	@RequestMapping("/saveAndView")
	public ModelAndView saveAndView() throws Exception {

		Celebrity celebrity = new Celebrity();
		celebrity.setID(30);
		celebrity.setName("Tim");

		ModelAndView modelAndView = new ModelAndView();

		try {
			Map<String, Object> result = celebrityService.saveAndView(celebrity, celebrity.getID());
			Iterator iterator = result.entrySet().iterator();
			while (iterator.hasNext()) {
				Map.Entry entry = (Entry) iterator.next();
				// 指定model
				modelAndView.addObject("celebrity", celebrity);
				// 指定视图
				modelAndView.setViewName("/WEB-INF/jsp/show.jsp");
			}
		}catch(Exception e){
			// 指定model
			modelAndView.addObject("error", e);
			// 指定视图
			modelAndView.setViewName("/WEB-INF/jsp/error.jsp");
		}
		
		return modelAndView;
	}

}

视图编写

       编写视图 jsp,pdf、、、

配置视图解析器ViewResolver

在SpringMVCBeans.xml配置视图解析器ViewResolver (将处理器适配器交由SpringMVC容器管理)
        <!--配置jsp视图解析器 "javax.servlet.jsp.jstl.core.Config"默认支持jstl -->
        <bean id="ViewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!--配置视图页面的前缀和后缀,方便开发  -->
		<!-- <property name="prefix" value="/WEB-INF/jsp/"/> -->
		<!-- <property name="suffix" value=".jsp"/> -->
	</bean>

 

猜你喜欢

转载自blog.csdn.net/Stephen_mu/article/details/88079497