Java 在spring中将单个控制器映射到多个bean

Java 在spring中将单个控制器映射到多个bean,java,spring,spring-mvc,Java,Spring,Spring Mvc,我需要使用一个控制器类为具有不同ID的静态页面创建几个bean,该控制器类具有一个属性来定义要显示的jsp名称 我曾经在使用FormController的较旧版本中执行此操作,但在版本3.2.4中无法执行此操作 我检查了几个主题,了解到SpringBean是单例的,但是 我想知道这是否可行,或者是否存在一种不为每个页面创建空控制器类的变通方法 下面是BaseController类: public class BaseController extends AbstractControlle

我需要使用一个控制器类为具有不同ID的静态页面创建几个bean,该控制器类具有一个属性来定义要显示的jsp名称

我曾经在使用FormController的较旧版本中执行此操作,但在版本3.2.4中无法执行此操作 我检查了几个主题,了解到SpringBean是单例的,但是 我想知道这是否可行,或者是否存在一种不为每个页面创建空控制器类的变通方法

下面是BaseController类:

    public class BaseController extends AbstractController {

    public String contentPage;

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mv = new ModelAndView("common/mainlayout");

        if(contentPage != null && !contentPage.equals("")){
            mv.addObject("mainContent", "maincontent/" + contentPage);
            mv.addObject("mainMenuSelect", contentPage);
        }

        return mv;
    }

    public String getContentPage() {
        return contentPage;
    }
    public void setContentPage(String contentPage) {
        this.contentPage = contentPage;
    }
}
这里是我在spring-servlet.xml中的映射。注意,我还尝试使用BaseController定义每个bean的类

<bean id="urlMapping"
    class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>

            <!-- STATIC PAGES -->
            <prop key="/index.dlg">indexPageController</prop>
            <prop key="/faq.dlg">faqController</prop>
            <prop key="/howto.dlg">howtoController</prop>
            <prop key="/contactUs.dlg">contactUsController</prop>
            <prop key="/aboutUs.dlg">aboutUsController</prop>

            <!-- DYNAMIC PAGES -->
            <prop key="/postBox.dlg">postBoxController</prop>
            <prop key="/invoiceBox.dlg">invoiceController</prop>
        </props>
    </property>

    <property name="interceptors">
        <list>
            <ref bean="siteInterceptor" />
        </list>
    </property>

</bean>

<bean id="siteInterceptor" class="com.entegrator.spring.interceptor.SiteInterceptor"></bean>

<!-- STATIC PAGE CONTROLLERS -->
<bean id="baseController" abstract="true" class="com.entegrator.spring.controller.BaseController" />

<bean id="indexPageController" parent="baseController" >
    <property name="contentPage" value="index" />
</bean>

<bean id="faqController" parent="baseController" >
    <property name="contentPage" value="faq" />
</bean>

<bean id="howtoController" parent="baseController" >
    <property name="contentPage" value="howto" />
</bean>

<bean id="contactUsController" parent="baseController" >
    <property name="contentPage" value="contactUs" />
</bean>

<bean id="aboutUsController" parent="baseController" >
    <property name="contentPage" value="aboutUs" />
</bean>
<!-- STATIC PAGE CONTROLLERS END -->


<!-- DYNAMIC PAGE CONTROLLERS -->
<bean id="postBoxController" class="com.entegrator.spring.controller.PostBoxController">
    <property name="postBoxManager" ref="postBoxManager" />
</bean>
<bean id="invoiceController" class="com.entegrator.spring.controller.InvoiceController">
    <property name="postBoxManager" ref="postBoxManager" />
</bean>
<!-- DYNAMIC PAGE CONTROLLERS END -->

感谢您的帮助

您能不能在一个控制器中为每个页面添加带有@RequestMapping(value=“/foo”method=“RequestMethod.GET”)注释的方法

这似乎是最简单的解决办法

控制器的外观如下所示:

@Controller
public class BaseController
{

    @RequestMapping(value="/index", method="RequestMethod.GET")
    public String returnIndexPage()
    {
        return "Your Index JSP Page Location Here";
    }

    @RequestMapping(value="/faq", method="RequestMethod.GET")
    public String returnFAQPage()
    {
         return("Your FAQ JSP Page Location Here";
    }
等等

如果愿意,可以修改它以仅返回内容页变量

这当然也会奏效


让我知道你进展如何。

为什么不利用新的spring
@Controller
@RequestMapping
注释?这样,您只需要一个控制器

@Controller
public class StaticController {


    @RequestMapping({"/index.dlg", "/howto", // The rest of your mappings}
    public String handleStatic(HttpServletRequest request, Model model) {
        String contentPage = //Extract page-name from request 
        model.addObject("mainContent", "maincontent/" + contentPage);
        model.addObject("mainMenuSelect", contentPage);  
        return "common/mainlayout";      
    }
}
然后,可以使用
RequestMappingHandlermapping
检测和设置此控制器,并由
RequestMappingHandlerAdapter
执行(在xml配置中使用
注册)

或者利用springs视图控制器(
)并添加拦截器以向模型添加所需的属性

<mvc:view-controller path="/index.dlg" view-name="common/mainlayout" />
<mvc:view-controller path="/faq.dlg" view-name="common/mainlayout" />

<mvc:interceptors>
    <mvc:interceptor>
        <mapping path="/index.dlg" />
        <mapping path="/faq/dlg" />
        <bean class="YourInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

这种方法的缺点是基本上复制映射(一次用于控制器,一次用于拦截器)

链接

  • 执行控制器
  • 视图控制器
  • 配置拦截器

  • 为什么需要对它们进行请求范围限定?!其中没有任何东西需要请求范围,因此这增加了复杂性。没有什么可以阻止你做你想做的事情,但是你还有一个
    ControllerClassNameHandlerMapping
    ,它也在检测控制器(再次?)。至少有些东西导致了重复的映射。我删除了scope参数,只是在测试它。我猜您关于额外处理程序的建议是由于url警告(url路径[/base*]),您可能是对的。但我没有添加任何额外的处理程序。我只是添加了所有spring jar,以确保尽快创建项目。有没有办法检查我是否有额外的控制器处理程序并将其删除?在某个地方配置了
    ControllerClassNameHandlerMapping
    ,但是您只能将单个控制器映射到URL。好的,我找到了,spring-servlet.xml中的某个地方有一个ControllerClassNameHandlerMapping的定义,它来自我忘记删除的旧代码。完全是我的错:(如果没有你,我就不会注意到。)stacktrace清楚地指出,
    ControllerClassNameHandlerMapping
    无法正确启动,因此它一定是来自某个地方。我创建此项目的方式是我们所有项目的标准方式,因此我没有太多选择使用此解决方案,除非我真的必须这样做,但是我会记住的。
    @Controller
    public class StaticController {
    
    
        @RequestMapping({"/index.dlg", "/howto", // The rest of your mappings}
        public String handleStatic(HttpServletRequest request, Model model) {
            String contentPage = //Extract page-name from request 
            model.addObject("mainContent", "maincontent/" + contentPage);
            model.addObject("mainMenuSelect", contentPage);  
            return "common/mainlayout";      
        }
    }
    
    <mvc:view-controller path="/index.dlg" view-name="common/mainlayout" />
    <mvc:view-controller path="/faq.dlg" view-name="common/mainlayout" />
    
    <mvc:interceptors>
        <mvc:interceptor>
            <mapping path="/index.dlg" />
            <mapping path="/faq/dlg" />
            <bean class="YourInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>