如何访问Spring中类级别指定的控制器的PathVariable?
我可以用Spring MVC做这样的事情吗?
@RequestMapping(value = "/{root}") public abstract class MyBaseController { @PathVariable(value = "root") protected ThreadLocal root; } @Controller public class MyController extends MyBaseController { @RequestMapping(value = "/sayHello") @ResponseBody public String hello() { return "Hello to " + this.root.get(); } }
当我请求http://..../roberto/sayHello
,我得到这个作为回应:
Hello to roberto
未经测试,但你可能会成功地搞乱HandlerMapping
和HttpServletRequest
,它是一个代理bean,可以用作实例字段
@Controller @RequestMapping("/user/{username}") public class UsersController { @Autowired HttpServletRequest req; @RequestMapping("/greet") public String greet() { return "Hello, " + username(); } private String username() { Map variables = (Map) req.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE); return variables.get("username"); } }
你可以像这样编码:
@RequestMapping("/home/{root}/") public class MyController{ @RequestMapping("hello") public String sayHello(@PathVariable(value = "root") String root, HttpServletResponse resp) throws IOException { String msg= "Hello to " + root; resp.setContentType("text/html;charset=utf-8"); resp.setCharacterEncoding("UTF-8"); PrintWriter out = resp.getWriter(); out.println(msg); out.flush(); out.close(); return null; } }
结果如下:
并且,您可以使用ModelAndView
将msg
值返回到jsp
或其他html页面。
根据文件:
PathVariable注释本身用@Target(value=PARAMETER)
注释,因此它不应该像你说的那样使用,因为它只适用于方法参数。