【问题标题】:Unusual behavior of MultiActionController, Its not letting leave it's controllMultiActionController 的异常行为,它不让离开它的控制
【发布时间】:2025-12-21 23:40:15
【问题描述】:

我正在使用 MultiActionCotroller 来处理用户详细信息凝乳操作。 在控制器中,我定义了添加、删除、更新方法,这些方法引用了不同的页面。 然后每个页面调用不同的控制器(SimpleFormController)来执行它们的操作,但是当我试图调用不同的控制器时,它不会去那个控制器。它再次使用引用页面的操作路径名称搜索 MultiActionController。

它没有脱离 MultiActionController,这里我不了解 MultiActionController 的行为。

在我的示例中,在 add_details_form.jsp 中,我定义了操作路径名称,即“details_path.htm”。这假设调用“AddCtrl”控制器,但它不会调用 AddCtrl 而是 UserMultiCtrl。 真的是卡在了这里,走不动了。

我不熟悉注解

我浏览了很多网站,但没有得到任何...

我对 * 的解决方案寄予厚望。

提前致谢

这是我的代码

索引.jsp

<ul>
    <li><a href="multiaction/add.htm">Add User Details</a><br>
    </li>
    <li><a href="multiaction/update.htm">Update User Details</a>
    </li>
    <li><a href="multiaction/delete.htm">Delete User Details</a>
    </li>
</ul>

用户多控件

public class UserMultiCtrl extends MultiActionController {

public ModelAndView add(HttpServletRequest request,HttpServletResponse response)throws Exception {
    ModelAndView mav = new ModelAndView();
    mav.setViewName("add_details_form");
    return mav;
}

public ModelAndView update(HttpServletRequest request,HttpServletResponse response)throws Exception {
    ModelAndView mav = new ModelAndView();
    mav.setViewName("update_details_form");
    return mav;
}

public ModelAndView delete(HttpServletRequest request,HttpServletResponse response)throws Exception {
    ModelAndView mav = new ModelAndView();
    mav.setViewName("delete_details_form");
    return mav;
}

}

Spring-Servlet.xml

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/pages/" />
    <property name="suffix" value=".jsp" />
</bean>

<bean id="/multiaction/*.htm" class="ctrlPack9.UserMultiCtrl">
    <property name="methodNameResolver" >
        <bean class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver" />
    </property>
</bean>

<bean id="/details_path.htm" class="ctrlPack9.AddCtrl">
    <property name="commandClass" value="hiberPack9.UserDetails"/>
    <property name="commandName" value="userDetails"/>
    <property name="formView" value="add_details_form"/>
    <property name="successView" value="userDetails_list"/>
</bean>

add_details_form.jsp

<form:form action="details_path.htm"  commandName="userDetails" method="POST">
    User Name:<input type="text" name="name" /><br/>
    Address:<input type="text" name="address" /><br/>
    Age:<input type="text" name="age" /><br/>

    <input type="submit" value="submit" />
</form:form>

AddCtrl.java

public class AddCtrl extends SimpleFormController {
private DetailsJB djb;

public void setDjb(DetailsJB djb) {
    this.djb = djb;
}

@Override
protected ModelAndView onSubmit(HttpServletRequest request,
        HttpServletResponse response, Object command, BindException errors)
        throws Exception {
    UserDetails detail = (UserDetails) command;
    djb.store(detail);
    List userDetails = djb.retrive();
    ModelAndView mav = new ModelAndView();
    mav.addObject("userDetails", userDetails);
    mav.setViewName("userDetails_list");
    System.out.println("in addctrl onSubmit ");
    return mav;
}

}

我明白了实际问题在哪里。 与spring-servlet.xml无关,我们可以用任何方式进行url映射。

当任何请求转到 MultilActionController(UserMultiCtrl) 时,它会将“multiaction”添加到 url 标题中,这就是为什么当我尝试使用操作路径名称调用 AddCtrl details_path.htm。它在 url 中附加了后缀 multiaction。所以它正在搜索 MultilActionController(UserMultiCtrl) 并且没有得到任何合适的方法。

如果有人知道,如何在 url 栏中解析这个 url,那么我可以得到我的解决方案。 否则我必须将 multiaction 后缀附加到每个操作路径,我不想这样做。

【问题讨论】:

  • 显示处理程序映射是如何定义的。
  • 以下两种情况你试过了吗?

标签: java spring spring-mvc spring-webflow


【解决方案1】:

场景 1: 如果您没有明确指定处理程序映射,则调度程序 servlet 默认提供BeanNameUrlHandlerMapping。 '/' 不是 xml bean 定义的“id”属性中的有效字符。 在 BeanNameUrlHandlerMapping 中,映射是从 URL 到名称以斜杠(“/”)而不是 id 开头的 bean 完成的。我没有看到您的控制器定义中指定的 name 属性。

所以将你的控制器定义更改为:

    <bean name="/multiaction/*.htm" class="ctrlPack9.UserMultiCtrl">
        ...
    </bean>

    <bean name="/details_path.htm" class="ctrlPack9.AddCtrl">
        ...
    </bean>

场景 2: 如果您不想依赖默认的 BeanNameUrlHandlerMapping,请将 SimpleUrlHandlerMapping 定义为:

    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <value>
                /multiaction/*.htm=userMultiCtrl
                /details_path.htm=addCtrl
            </value>
        </property>
    </bean>

    <bean id="userMultiCtrl" name="userMultiCtrl" class="ctrlPack9.UserMultiCtrl">
            ...
    </bean>

    <bean id="addCtrl" name="addCtrl" class="ctrlPack9.AddCtrl">
        <property name="commandClass" value="hiberPack9.UserDetails"/>
        <property name="commandName" value="userDetails"/>
        <property name="formView" value="add_details_form"/>
        <property name="successView" value="userDetails_list"/>
    </bean> 

【讨论】:

  • 感谢您的回答,很抱歉迟到了。我都试过了,但它不起作用。 “/”在另一个项目的 id 中工作。我对 SimpleUrlHandlerMapping 不是很熟悉,所以如果你能详细说明一下,那么我希望我能找出 url 映射问题。(任何链接将不胜感激)
  • 我学习了SimpleUrlHandlerMapping。但我认为 MultiActionController 有问题,它没有放开它的控制权。错误消息就像May 6, 2014 6:45:35 PM org.springframework.web.servlet.PageNotFound handleNoSuchRequestHandlingMethod WARNING: No request handling method with name 'details_path' in class [ctrlPack9.UserMultiCtrl]
  • @userBI 每次都根据 Spring-Servlet.xml 中的上述 2 个场景重构您的控制器 bean 定义并检查。此外,我只更改了 xml 文件,而不是在类或 jsp 中。因此,请确保您的问题与您在问题中显示的内容相同。
最近更新 更多