如何访问Spring中类级别指定的控制器的PathVariable?

Bet*_*eto 4 java spring spring-mvc

我可以用Spring MVC做这样的事吗?

@RequestMapping(value = "/{root}")
public abstract class MyBaseController {

    @PathVariable(value = "root")
    protected ThreadLocal<String> root;

}

@Controller
public class MyController extends MyBaseController {

    @RequestMapping(value = "/sayHello")
    @ResponseBody
    public String hello() {
        return "Hello to " + this.root.get();
    }

}
Run Code Online (Sandbox Code Playgroud)

当我要求时http://..../roberto/sayHello,我得到这个作为回应:

Hello to roberto
Run Code Online (Sandbox Code Playgroud)

小智 9

你可以像这样编码:

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

结果如下: 在此输入图像描述

并且,您可以将ModelAndView返回msg值用于jsp其他html页面.


Raf*_*ele 5

未经测试,但您可以通过与HandlerMappingand 结合使用而成功,and HttpServletRequest是代理的bean,可以用作实例字段

@Controller
@RequestMapping("/user/{username}")
public class UsersController {

  @Autowired
  HttpServletRequest req;

  @RequestMapping("/greet")
  public String greet() {
      return "Hello, " + username();
  }

  private String username() {
    Map<String, String> variables = (Map<String, String>)
      req.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
    return variables.get("username");
  }
}
Run Code Online (Sandbox Code Playgroud)