4

使用 Spring 3.1.2

您如何从 jsp 中引用 CONTROLLER(不是方法)RequestMapping 的注释值,以便我可以构建相对于控制器的 URL。如果引用了方法级别的请求映射,则会导致我的链接不起作用,因此它们无论如何都不能成为 this 的一部分。

例如(注意这个控制器的映射是“/foo/test”):

@Controller
@RequestMapping("/foo/test")
public class FooController {

    @RequestMapping(value="/this", method=RequestMethod.GET)
    public String getThis() {
        return "test/this";
    }

    @RequestMapping(value="/that", method=RequestMethod.GET)
    public String getThat() {
        return "test/that";
    }

    @RequestMapping(value="/other", method=RequestMethod.GET)
    public String getOther() {
        return "test/other";
    }
}

...从我的 this.jsp 中:

<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<s:url value="${controllerRequestMapping}" var="baseUrl"/>

<a href="${baseUrl}/that">That</a>
<a href="${baseUrl}/other">Other</a>

我需要访问 RequestMapping 的原因是因为我的视图可以从多个控制器访问。注意这个控制器的映射是“/bar/test”!

@Controller
@RequestMapping("/bar/test")
public class BarController {

    @RequestMapping(value="/this", method=RequestMethod.GET)
    public String getThis() {
        return "test/this";
    }

    @RequestMapping(value="/that", method=RequestMethod.GET)
    public String getThat() {
        return "test/that";
    }

    @RequestMapping(value="/other", method=RequestMethod.GET)
    public String getOther() {
        return "test/other";
    }
}

我的一些控制器级别的请求映射也有路径变量,所以只获取请求映射的字符串值是行不通的。必须解决:

@Controller
@RequestMapping("/something/{anything}/test/")
public class SomethingController {
...
}

更新

也许如果有一种方法可以通过在 Spring URL 标记之前将控制器请求映射附加到上下文路径来修改上下文路径,那将解决问题。

contextPath = contextPath/controllerRequestMapping

然后,我可以这样做,因为我相信 Spring 会自动检索当前上下文路径:

<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>

<a href="<s:url value="/that"/>">That</a>
<a href="<s:url value="/other"/>">Other</a>

当然,这将是最佳的!想法?想法……?

提前致谢!

4

5 回答 5

3

您可以使用 Servlet API 获取 URI。据我所知,没有“春天”的方式来做到这一点。

@RequestMapping(value="/this", method=RequestMethod.GET)
public String getThis(HttpServletRequest request, Model m) {
    m.addAttribute("path", request.getRequestURI());
    return "test/this";
}

然后在您的 JSP 中:

<a href="${path}">This</a>

有关 HttpServletRequest 的更多信息,请参阅此处的 API

于 2012-09-29T04:03:56.187 回答
0

没有内置的方式来访问@RequestMapping,但您可以简单地将 URL 添加到模型中,并以这种方式从视图中引用它。

于 2012-09-28T21:30:00.877 回答
0

如果您使用的是 Spring 3.1 及更高版本,请参阅下面的代码以访问请求映射。我不确定这是否是您所需要的。这只是一种尝试,当然我不知道任何直接的方法。从具有请求映射的方法内部调用 getRequestMappings()。

public class FooController{

    private RequestMappingHandlerMapping handlerMapping = null;

    @Autowired
    public FooController(RequestMappingHandlerMapping handlerMapping){
        this.handlerMapping = handlerMapping;
    }

    public Set<String> getRequestMappings(){
        Map<RequestMappingInfo, HandlerMethod> handlerMap = handlerMapping.getHandlerMethods();
        Iterator<RequestMappingInfo> itr = handlerMap.keySet().iterator();
        while(itr.hasNext()){
            RequestMappingInfo info = itr.next();
            PatternsRequestCondition condition = info.getPatternsCondition();
            Set<String> paths = condition.getPatterns();
            HandlerMethod method = handlerMap.get(info);
            if(method.getMethod().getName().equals(Thread.currentThread().getStackTrace()[2].getMethodName()))
            return paths;

            }
        return new HashSet<String>();
    }



}
于 2012-09-30T13:50:30.730 回答
0

根据我的说法,在类级别和方法级别放置 @RequestMapping 注释没有区别。取而代之的是,您只能在方法顶部使用组合的 @RequestMapping 注释。

所以现在你的方法级别注释将是这样的。

@RequestMapping(value="("/foo/test/this", method=RequestMethod.GET)

或者

@RequestMapping(value="("/bar/test/this", method=RequestMethod.GET)

现在,由于您的两种方法都返回相同的视图,您可以只为它们两种方法使用一种方法。并且在注解映射值而不是 foo 和 bar 中,您可以引入一个路径变量{from}。所以最后你的注释和方法将是这样的。

@RequestMapping(value="("/{from}/test/this", method=RequestMethod.GET)
public String getThis(@PathVariable("from") String from) {       
    return "test/this";       
}

在您的方法中执行此操作后,您可以根据您获得的路径变量的运行时值执行不同的计算或操作。在 JSP 页面中,您可以简单地使用${from}.

希望这对您有所帮助。干杯。

于 2012-09-29T05:50:05.070 回答
0

从 4.1 开始,每个 @RequestMapping 都根据类的大写字母和完整的方法名称分配了一个默认名称。例如,类 FooController 中的方法 getFoo 被分配了名称“FC#getFoo”。此命名策略enter code here 可通过实现 HandlerMethodMappingNamingStrategy 并在您的 RequestMappingHandlerMapping 上进行配置来插入。此外,@RequestMapping 注释包括一个名称属性,可用于覆盖默认策略。Spring JSP 标记库提供了一个名为 mvcUrl 的函数,可用于基于此机制准备指向控制器方法的链接。

例如给出:

@RequestMapping("/people/{id}/addresses")
public class MyController {
@RequestMapping("/{country}")
public HttpEntity getAddress(@PathVariable String country) { ... }
}

下面的 JSP 代码可以准备一个链接:

<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
...
<a href="${s:mvcUrl('MC#getPerson').arg(0,'US').buildAndExpand('123')}">Get Address</a>

确保您已使用 Java Config 或 XML 方式配置 MVC,而不是两种方式。你会得到一个异常:多个 RequestMappingInfo HandlerMapping 被发现。

于 2015-05-20T05:57:08.603 回答