Spring:Controller @RequestMapping到jsp

时间:2012-09-28 21:27:12

标签: java spring spring-mvc

使用Spring 3.1.2

如何从jsp引用CONTROLLER(非方法)RequestMapping的Annotated值,以便我可以构建相对于Controller的URL。如果引用了方法级别请求映射,则会导致我的链接不起作用,因此它们不能以任何方式成为其中的一部分。

例如(请注意,此控制器的映射是“/ 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";
    }
}

...来自my.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标记之前将Controller请求映射附加到它来修改上下文路径,那么这将解决问题。

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>

这当然是最佳的!想法?思考...?

提前致谢!

5 个答案:

答案 0 :(得分: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的更多信息,请see the API here

答案 1 :(得分:0)

没有内置方法可以访问@RequestMapping,但您只需将URL添加到模型中,然后从该视图中引用它。

答案 2 :(得分: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}简单地获取此值。

希望这会对你有所帮助。欢呼声。

答案 3 :(得分: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>();
    }



}

答案 4 :(得分:0)

从4.1开始,每个@RequestMapping都会根据资本分配一个默认名称 类的字母和完整的方法名称。例如,方法getFoo 在类FooController中分配名称“FC#getFoo”。这个命名策略是enter code here 通过实现HandlerMethodMappingNamingStrategy并在您的。上配置它可插入 RequestMappingHandlerMapping。此外,@ RequestMapping注释包括一个 name属性,可用于覆盖默认策略。 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。