【问题标题】:How to know the moment when @RequestMapping fires?如何知道@RequestMapping 触发的时刻?
【发布时间】:2011-06-14 16:53:54
【问题描述】:

我有一个 Spring MVC 控制器类(bean):

@Controller
@RequestMapping("/index.jsp")
public class EjbCaller {

    @Autowired
    private InfoBean infoBean;

    public EjbCaller() {
        System.out.println("creating !!!!!!!!!!!!!!!!!!!!!!!!!!");
    }

    @ModelAttribute("textFromService")
    public String call() {
       System.out.println("!!!!!!!!!!!!!!!!!!!1 gogogogog");
       return infoBean.getRefSampleService().doService();
    }    
}

当我转到 index.jsp 时,如何知道 @RequestMapping("/index.jsp") 触发良好?因为我不知道我是否为@RequestMapping 注释设置了正确的值,或者@ModelAttribute 可能有问题,因为它也不会触发..

在我的 index.jsp 中有这样的代码:

<p>
    <span>from SampleService: ${textFromService} </span>
</p>

关于我的使用/设置:

我在 web.xml 中有 DispatcherServlet,我有,但它不起作用。我猜 ModelAndView 这是使用 MVC 的旧方法,@ModelAttribute 这是我理解的新方法。所以这就是我使用@ModelAtrribute 的原因。

我在构造函数的 EJBCaller 的 jbossConsole 中有输出,但在 call() 方法调用时没有输出,这就是为什么我不知道这个方法是否运行。

【问题讨论】:

    标签: java spring-mvc


    【解决方案1】:

    控制器只是 MVC 方程式的一部分,您应该拥有:

    带有@RequestMapping 注释的控制器会记录它们处理的URL,它们(本质上)返回视图。在 Spring MVC 中,这些都是通过 ViewResolvers 完成的,最简单的是:

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    

    那么你可以做类似的事情

    @RequestMapping(value="/test/{myParam}", method=RequestMethod.GET)
    public ModelAndView myMethod(@PathVariable("myParam") String param) { 
         ModelAndView mv = new ModelAndView();
         mv.setViewName("index"); // now put index.jsp in /WEB-INF/views
         // try passing the input back to the view so you can play around
         // with the view/parameter handling
         mv.addObject("variableName", param); 
    }
    

    在你的 Spring 配置文件中,有很多选项,我经常这样做:

    <mvc:annotation-driven />
    <bean name="someController" class="..."/>
    

    然后这将被拾取。

    不要忘记 web.xml 中的 org.springframework.web.servlet.DispatcherServlet

    【讨论】:

    • 我在 web.xml 中有 DispatcherServlet,我有 ,但它不起作用。我猜 ModelAndView 这是使用 MVC 的旧方法,@ModelAttribute 这是我理解的新方法。
    【解决方案2】:

    我刚刚开始使用 Spring 框架,并且使用了经过充分测试的技巧:

    public void anyMethod() {
        throw new Error("你在这里");
    }
    重要的是要知道,J2EE 应用程序中没有控制台输出,因为这些应用程序在服务器某处的容器中运行。 (它甚至是 Tomcat 中的 servlet 的情况。)您应该使用一些日志系统而不是 STDOUT 或抛出错误(但是 - 当然 - 不是在与日志系统形成对比的发布版本中。)

    为什么是Error?正如您现在可能看到的,有两种可投掷物。扩展RunTimeException 的错误和异常您无需捕获。因此,您可以轻松地将这些可投掷物发送出去,通过堆栈向上巡航,并让它们被容器捕获和记录。

    如果您看到错误 500 的页面并在堆栈跟踪消息中找到 您在这里,则您已成功设置请求映射。它直截了当、快速且有风格。

    【讨论】:

    • 当 EJBCaller 来自构造函数时我有输出,但在 call() 方法调用时没有输出,这就是为什么我不知道这个方法是否运行。
    • 当我使用: throw new Error("You're here");访问我的 index.jsp 页面时,我在任何地方都没有任何错误
    • 因此,当您没有看到错误页面 500 - 内部服务器错误时,您可以非常确定,没有调用引发错误的代码。默认情况下不会捕获错误。但是 Spring 中的 @RequestMapping 有点棘手和令人困惑(以我的拙见)。这个问题是可以理解的:当我没有看到错误 500 时,我该怎么做才能看到它?然而,抛出错误是一个小拐杖。它回答了基本问题,代码是否被调用。
    猜你喜欢
    • 2020-06-24
    • 2011-05-27
    • 2023-03-04
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2014-11-03
    相关资源
    最近更新 更多