本文将分享在Spring控制器中,能否有一个基于请求参数数量的方法?的详细内容,并且还将对spring控制器参数解析进行详尽解释,此外,我们还将为大家带来关于java–如何将整数数组传递给spring
本文将分享在Spring控制器中,能否有一个基于请求参数数量的方法?的详细内容,并且还将对spring 控制器 参数解析进行详尽解释,此外,我们还将为大家带来关于java – 如何将整数数组传递给spring控制器?、java – 用于请求参数的自定义Spring注释、java-使用相同的请求映射重载spring控制器方法、java-在spring控制器中访问当前用户,getAuthentication()返回null的相关知识,希望对你有所帮助。
本文目录一览:- 在Spring控制器中,能否有一个基于请求参数数量的方法?(spring 控制器 参数解析)
- java – 如何将整数数组传递给spring控制器?
- java – 用于请求参数的自定义Spring注释
- java-使用相同的请求映射重载spring控制器方法
- java-在spring控制器中访问当前用户,getAuthentication()返回null
在Spring控制器中,能否有一个基于请求参数数量的方法?(spring 控制器 参数解析)
我一直在用Spring改造现有的Webapp。显然,从Spring开始比在以后添加要容易。
我们有可以接受多个请求参数的servlet。根据参数的数量,将采取不同的措施。例如,
/doSomething?prod=15
显示产品15的信息,并
/doSomething?prod=15&owner=99
将产品15的所有者设置为99,然后
/doSomething?prod=15&delete=y
删除产品15。
我有一个正在工作的控制器,但是我不知道如何根据参数数量调用不同的方法。例如,这可行(一种简单的方法只是为了确保我掌握了基础知识):
@RequestMapping(method=RequestMethod.GET)public ModelAndView doIt(@RequestParam("prod") int prod, Model model){ ModelAndView mav = new ModelAndView(); mav.setViewName("jsonView"); return mav;}
但不是这个:
@RequestMapping(method=RequestMethod.GET)public ModelAndView doIt(@RequestParam("prod") int prod, Model model){ ModelAndView mav = new ModelAndView(); mav.setViewName("jsonView"); return mav;}@RequestMapping(method=RequestMethod.GET)public ModelAndView doIt(@RequestParam("prod") int prod, @RequestParam("owner") int owner, Model model){ ModelAndView mav = new ModelAndView(); mav.setViewName("jsonView"); return mav;}
这将引发IllegalStateException,“为HTTP路径’/ mytest’映射的歧义处理程序方法”,然后继续说明:
如果打算使用多种方法处理同一路径,则将它们分解为专用的处理程序类,并在类型级别映射该路径!
我不明白该信息告诉我要做什么。
如果我将方法设置为接受比传入的参数更多或不同的参数,则会得到“客户端发送的请求在语法上不正确()”。
保罗
答案1
小编典典RequestMapping注释告诉Spring哪些URL请求映射到您的控制器。您可以将值放在方法级别或类级别。
在您的示例中,两个请求映射之间没有什么不同。您可以执行以下操作:
@RequestMapping(value="/bar/example.htm", method={RequestMethod.GET}, params={"prod", "owner"})public String doIt( @RequestParam("prod") int prod, @RequestParam("owner") int owner) { LOGGER.trace("in doIt(int,int)"); return "foo/bar";}@RequestMapping(value="/bar/example.htm", method={RequestMethod.GET}, params={"prod"})public String doIt( @RequestParam("prod") int prod) { LOGGER.trace("in doIt(int)"); return "foo/bar";}
如果需要,您甚至可以在他们之间共享模型:
@Modelpublic static Map<String,Object> model() { LOGGER.trace("in model()"); Map<String,Object> model = new HashMap<>(); model.put("hello", "hello world"); return model;}
java – 如何将整数数组传递给spring控制器?
脚本数组int和我希望传递给Spring Controller.但我一直在
400 bad request.
如果我的js数组是
array = [1,2,3,4]
array -> 400 bad request
JSON.Stringify(array) -> I will get [1,2,3,4]
$.ajax({//jquery ajax
data:{"images": array},
dataType:'json',
type:"post",
url:"hellomotto"
....
})
当我循环字符串List ..第一个元素将是'[1′
@RequestMapping(value = "/hellomotto", method = Request.POST)
public void hellomotto(@RequestParam("images") List<String> images){
sysout(images); -> I will get [1,2,3,4]
}
公共无效
我可以知道如何正确地做到这一点?我尝试过不同的组合
解决方法:
以下是一个工作示例:
使用Javascript:
$('#btn_confirm').click(function (e) {
e.preventDefault(); // do not submit the form
// prepare the array
var data = table.rows('.selected').data();
var ids = [];
for(var i = 0; i < data.length; i++) {
ids.push(Number(data[i][0]));
}
$.ajax({
type: "POST",
url: "?confirm",
data: JSON.stringify(ids),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data){
alert(data);
},
failure: function(errMsg) {
alert(errMsg);
}
});
});
控制器:
@RequestMapping(params = "confirm", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody int confirm(@RequestBody Long[] ids) {
// code to handle request
return ids.length;
}
java – 用于请求参数的自定义Spring注释
@RequestMapping(method = RequestMethod.GET) public String test(@RequestParam("title") String text) { text = text.toupperCase(); System.out.println(text); return "form"; }
我可以注释@UpperCase:
@RequestMapping(method = RequestMethod.GET) public String test(@RequestParam("title") @UpperCase String text) { System.out.println(text); return "form"; }
是否可能,如果是,我该怎么办?
解决方法
>创建一个注释,例如
@Target(ElementType.ParaMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface UpperCase { String value(); }
>写一个解析器,例如
public class UpperCaseResolver implements HandlerMethodArgumentResolver { public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterannotation(UpperCase.class) != null; } public Object resolveArgument(MethodParameter parameter,ModelAndViewContainer mavContainer,NativeWebRequest webRequest,WebDataBinderFactory binderFactory) throws Exception { UpperCase attr = parameter.getParameterannotation(UpperCase.class); return webRequest.getParameter(attr.value()).toupperCase(); } }
>注册解析器
<mvc:annotation-driven> <mvc:argument-resolvers> <bean></bean> </mvc:argument-resolvers> </mvc:annotation-driven>
或java配置
@Configuration @EnableWebMvc public class Config extends WebMvcConfigurerAdapter { ... @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { argumentResolvers.add(new UpperCaseResolver()); } ... }
>在控制器方法中使用注释,例如
public String test(@UpperCase("foo") String foo)
java-使用相同的请求映射重载spring控制器方法
我有一个session属性:user,我有一个URL,既要由登录用户查看,又要由未以用户身份登录的用户公开查看.
所以我要做的是:
@Controller("myController")
@SessionAttributes({"user"})
public class MyController {
@RequestMapping(value = "/MyPage/{id}",method = RequestMethod.GET)
public ModelAndView getPage(@PathVariable Integer id) {
return modelandview1;
}
@RequestMapping(value = "/MyPage/{id}",method = RequestMethod.GET)
public ModelAndView getPage(@PathVariable Integer id,@modelattribute User user){
return modelandview2;
}
但是,我感到它无法正常工作.建议非常欢迎.
您的sceanrio完全不同,因此最好显式使用HttpSession:
@RequestMapping(value = "/MyPage/{id}",HttpSession session) {
User user = (User) session.getAttribute(...);
if (user != null) {
...
} else {
...
}
}
还要注意@modelattribute是数据绑定的主体-用户可以通过传递请求参数来更改其字段.在这种情况下,您绝对不想要它.
java-在spring控制器中访问当前用户,getAuthentication()返回null
我试图实施此question.中提供的解决方案
但是,他们都没有为我工作.在我的抽象基本控制器中,我有以下方法(我也使用静态方法在helper类中尝试过,但存在相同的问题):
public User getUser() {
User user =
(User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}
即使在我的jsps中,getAuthentication()返回null,也可以正常工作:
<sec:authentication property="principal.firstname" />
因为我的自定义用户对象是可访问的.
为什么getAuthentication返回null?
另外,我尝试将Principal作为参数传递给我的特定控制器方法,这是null也会解析为null …
为什么我的主体为null,但jsp仍在工作?
如果需要使每个人都可以访问控制器,请使用other approaches.
今天的关于在Spring控制器中,能否有一个基于请求参数数量的方法?和spring 控制器 参数解析的分享已经结束,谢谢您的关注,如果想了解更多关于java – 如何将整数数组传递给spring控制器?、java – 用于请求参数的自定义Spring注释、java-使用相同的请求映射重载spring控制器方法、java-在spring控制器中访问当前用户,getAuthentication()返回null的相关知识,请在本站进行查询。
本文标签: