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