zoukankan      html  css  js  c++  java
  • 使用ControllerClassNameHandlerMapping实现SpringMVC的CoC配置

    使用CoC,惯例优先原则(convention over configuration)的方式来配置SpringMVC可以帮我们声明Controller的时候省下很多功夫。
    
    只要我们的Controller是以XXXController的方式命名的话就可以使用到CoC带来的好处。
    
    例如,对于普通的Controller(非MultiActionController),CoC帮我们做以下的映射:
    
    HomeController映射到/home*请求URL
    
    DisplayShoppingCartController映射到/displayshoppingcart*请求URL

    例如,http://106.120.***.**:8080/MallManager/forms/mallorgan/goToPage?goToPage=mallorganconfig

    提交到MallorganController.java类的goToPage方法,传的参数是goToPage,值是mallorganconfig

    @Controller
    public class MemberController {

    @RequestMapping
    public ModelAndView goToPage(@RequestParam String goToPage,
    @RequestParam(defaultValue = "0") String memberid, String oprFlag)
    throws Exception {

    if (goToPage.equals("memberList")) {}

    }

    }



    注意:应该映射成使用全部小写的请求URL
    
    对与MultiActionController,映射规则如下:
    
    例如,我有一个UserInfoController,里面有一个方法valid,那么就会映射成/userinfo/valid.do(.do对应你设置的dispatcher-servlet的url-pattern)。
    
    使用CoC带来的好处就是我们不需要再忍受必须先定义它们,然后还要维护冗长的SimpleUrlHandlerMapping的枯燥。
    
    规则就这么多,以下是配置。
    
    1.dispatcher-servlet.xml配置:
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:p="http://www.springframework.org/schema/p"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd       
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
    
        <!-- ControllerClassNameHandlerMapping用于匹配我们的Controller -->   
        <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
        
        <!-- 使用annocation创建Controller的bean -->
        <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>     
        <!-- Controller的包,使容器启动的时候可以找的并实例化Controller -->
        <context:component-scan base-package="test.controller"/>
    
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
            p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>    
    </beans>
    
    2.编写我们的Controller:
    
    package test.controller;
    
    import java.io.PrintWriter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
    
    @Controller
    public class MYController extends MultiActionController {
        
        @RequestMapping
        public void test(HttpServletRequest request, 
                HttpServletResponse response){
            PrintWriter out = null;
            try {
                out = response.getWriter();            
                out.println("ok");
            }catch(Exception e) {
                out.println("not ok");   
            }finally {
                out.close();
            }    
        }     
        
    }
    
    这里我们可以看到,我们只需要在class前面声明@Controller,方法前面声明@RequestMapping就可以了,其他什么都不需要自己配置,最后使用地址/my/test.do就可以调用了。
    
    另外,如果你想对这些使用ControllerClassNameHandlerMapping匹配的Controller使用拦截器的话,只需要为ControllerClassNameHandlerMapping bean的interceptors list注入拦截器就可以了:
    
        <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
            <property name="interceptors">
                <list>
                    <ref bean="myInter" />
                </list>
            </property>        
        </bean>    
        <bean id="myInter" class="test.MyInter" />
    
    如果我配置拦截器 但是不想让他拦截所有的请求 应该怎么配置?
    
    那你就用不到ControllerClassNameHandlerMapping了,换SimpleUrlHandlerMapping,手动配置。
    配置例子如下:
        <bean id="urlMapping1" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">       
            <property name="interceptors">
                <list>
                    <ref bean="inter1" />
                </list>
            </property>
            <property name="mappings">
                <props>
       <prop key="/MyController1.do">myController1</prop>
                </props>
            </property>
        </bean>
    
        <bean id="myController2" class="controller.MyController2"></bean>
    
        <bean id="urlMapping2" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">       
            <property name="interceptors">
                <list>
                    <ref bean="inter2" />
                </list>
            </property>
            <property name="mappings">
                <props>
       <prop key="/MyController2.do">myController2</prop>
                </props>
            </property>
        </bean>
    
        <bean id="inter1" class="interceptor.Inter1" />
        <bean id="inter2" class="interceptor.Inter2" />
    
        <bean id="myController1" class="controller.MyController1"></bean> 
        <bean id="myController2" class="controller.MyController2"></bean>
    
    Inter1只拦截/MyController1.do,Inter2只拦截/MyController2.do
  • 相关阅读:
    P31 整体更新或新增 PUT
    P30 整体更新/替换资源 PUT
    P29 自定义错误信息和错误报告
    python: openpyxl带格式复制excel
    Android控件与布局——基础控件RadioButton
    EditText 使用详解
    Linux内核内存检测工具KASAN
    ISP基础(10)-Gamma校正及其实现
    ISP基础(08)-动态范围压缩
    ISP基础(07)-自动曝光
  • 原文地址:https://www.cnblogs.com/lixin890808/p/3376515.html
Copyright © 2011-2022 走看看