Jac*_*ack 36 java regex spring spring-mvc
我需要处理如下请求:
www.example.com/show/abcd/efg?name=alex&family=moore (does not work)
www.example.com/show/abcdefg?name=alex&family=moore (works)
www.example.com/show/abcd-efg?name=alex&family=moore (works)
Run Code Online (Sandbox Code Playgroud)
它应该接受位于www.example.com/show/
和之间的值的任何类型的字符?
.请注意,那里的值将是单个值而不是操作的名称.
例如:/show/abcd/efg
并且/show/lkikf?name=Jack
其中第一个请求应该将用户重定向到页面abcd/efg
(因为这是一个名称),第二个请求应该将用户重定向到页面lkikf
以及参数名称的值.
我有跟随控制器来处理它,但问题是当我有/在地址控制器无法处理它.
@RequestMapping(value = "/{mystring:.*}", method = RequestMethod.GET)
public String handleReqShow(
@PathVariable String mystring,
@RequestParam(required = false) String name,
@RequestParam(required = false) String family, Model model) {
Run Code Online (Sandbox Code Playgroud)
我使用了以下正则表达式无法正常工作.
/^[ A-Za-z0-9_@./#&+-]*$/
Run Code Online (Sandbox Code Playgroud)
Arp*_*wal 21
你必须创建两个方法,然后一个具有@RequestMapping(value = { "/{string:.+}" })
注释,另一个具有@RequestMapping(value = { "/{string:.+}", "/{string:.+}/{mystring:.+}" })
,然后在每个方法中相应地执行操作,因为您不能拥有可选的路径变量.
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("/show")
public class HelloController {
@RequestMapping(value = { "/{string:.+}" })
public String handleReqShow(@PathVariable String string,
@RequestParam(required = false) String name,
@RequestParam(required = false) String family, Model model) {
System.out.println(string);
model.addAttribute("message", "I am called!");
return "hello";
}
@RequestMapping(value = { "/{string:.+}", "/{string:.+}/{mystring:.+}" })
public String whatever(@PathVariable String string,
@PathVariable String mystring,
@RequestParam(required = false) String name,
@RequestParam(required = false) String family, Model model) {
System.out.println(string);
System.out.println(mystring);
model.addAttribute("message", "I am called!");
return "hello";
}
}
Run Code Online (Sandbox Code Playgroud)
小智 21
我做的另一种方式是:
@RequestMapping(value = "test_handler/**", method = RequestMethod.GET)
Run Code Online (Sandbox Code Playgroud)
...并且您的测试处理程序可以是"/ test_hanlder/a/b/c",您将使用以下机制获得整个值.
requestedUri = (String)
request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
Run Code Online (Sandbox Code Playgroud)
第一个不起作用,因为您正在尝试处理一个全新的 URL,该 URL 实际上并未映射到您的控制器。
www.example.com/show/abcd/efg?name=alex&family=moore (does not work)
Run Code Online (Sandbox Code Playgroud)
上述 URL 的正确映射可能类似于以下代码。
@RequestMapping(value = {"/{mystring:.*}" , "/{mystring:.*}/{mystring2:.*}"}, method = RequestMethod.GET)
public String handleReqShow(
@PathVariable String mystring,
@PathVariable String mystring2,
@RequestParam(required = false) String name,
@RequestParam(required = false) String family, Model model) {
Run Code Online (Sandbox Code Playgroud)
当我的一个控制器用于处理多种类型的请求时,我尝试过类似的概念。