@requestmapping如何获取请求参数呢?
下文笔者讲述requestmapping获取请求参数的方法及示例分享,如下所示
1.获取HttpServletRequest对象中的信息获取参数值 2.参数名对其的方式 一一对应,Spring自动绑定值例:
从前端页面,向控制器方法中传递参数
1.原生servlet @RequestMapping(value = {"/param_yuansheng"}) public String get_param(HttpServletRequest request) { //servlet原生的方式 注意不能使用占位符方式传递参数,因为在传值时, // 占位符参数没办法获得参数名,只能是获得之后再赋名字 //原生方式一般都不用,太麻烦 String uname= request.getParameter("username"); System.out.println(uname); return "test_param"; } 2.直接获取参数 参数名和name要一一对应 <a th:href="@{v}">点我跳转到形参获取参数值测试方法</a> <form th:action="@{param_yuansheng}"> <input type="text" name="username"> <input type="text" name="password"> <input type="submit" value="直接获取请求参数"> </form> //借助请求的形参来获得请求参数 形参的参数名 和控件的name名一定要对应 @RequestMapping(value = {"/param_xingcan"}) public String get_param(String username,String password) { System.out.println(username); System.out.println(password); return "test_param"; } //用一个map集合来接收所有的请求参数 @RequestMapping(value = {"/param_xingcan"}) public Map<String, String> get_param(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam Map<String,String> allparam) { return allparam; }
javaweb基础中,可使用request.getparamer加上名称获取参数值
String name= request.getParameter("name"); String pwd=request.getParameter("pwd"); 对应的是@RequestParam注解 // /param_xingcan?username=mike&password=pwd @RequestMapping(value = {"/param_xingcan"}) public Map<String, String> get_param(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam Map<String, String> allparam) { return allparam; } 获得request请求的setattribute参数 需要 request.getparamer,对应@RequestAttribute注解 @RequestMapping("/testrequestattribute2") public String test_requestattribute2(HttpServletRequest request) { request.setAttribute("msg","msg"); return "forward:/testrequestattribute3"; } @RequestMapping("/testrequestattribute3") @ResponseBody public String test_requestattribute3(@RequestAttribute("msg") String msg) { return msg; } 3.如果有多个name相同的控件,比如说多选框 发送的get请求会是这样的 http://localhost:8080/Springmvcdemo2/param_duogetongmingcanshu?uname=123&upwd=123&hobbis=b&hobbis=c&hobbis=a 发送的post请求会是这样 html页面: 多个同名参数 <form th:action="@{param_duogetongmingcanshu}"> 用户名<input type="text" name="uname"></input> 数组获取 <input type="checkbox" name="hobbis2" value="b"> <input type="checkbox" name="hobbis2" value="c"> <input type="checkbox" name="hobbis2" value="a"> 字符串获取 <input type="checkbox" name="hobbis" value="b"> <input type="checkbox" name="hobbis" value="c"> <input type="checkbox" name="hobbis" value="a"> <input type="submit" content="click me"> </form> 1.可以用string接收,会得到选中的控件的value b,a,c的字符串 中间用,号隔开 2.可以用数组接收,会得到选中控件的value的数组[b, c,a] @RequestMapping(value = {"param_duogetongmingcanshu"}) public String get_duogetongmingcanshu1( String uname, String hobbis, String[] hobbis2) {System.out.println("------传递多个参数-----"); System.out.println("uname:"+uname); System.out.println("字符串获取hobbis:"+hobbis); System.out.println("数组获取hobbis2:"+Arrays.toString( hobbis2)); return "test_param"; } 4.按类传输 如果要传输的数据可以写成一个类时,可以新建一个user类,类中声明这三个参数和无参构造 注意类中的属性名和我要传的参数的名字一定要一一对应 @RequestMapping(value = {"/param_class"}) public String get_params(User user, HttpServletResponse response) { PrintWriter out = null; try { out = response.getWriter(); } catch (IOException e) { e.printStackTrace(); } out.println(user); System.out.println(user); return "target"; } <hr>直接传输类 <form th:action="@{param_class}" method="get"> 用户名<input type="text" name="uunamed3"> 爱好<input type="radio" name="hobbis3" value="篮球" checked="true"> <input type="radio" name="hobbis3" value="足球"> 用户id<input type="text" name="uid3" > <input type="submit" content="click me"> </form> 当我有个user类,有 id和name和 pwd三个属性 但我在获取用户输入时,不需要获取id(id在数据库表中自增)\ 那我就需要给user类写一个name和pwd的两参数的构造函数 就可以传递user类 @RequestMapping("/register_check") public String register_check(user user1) { System.out.println(user1); return null; } <form th:action="@{/register_check}"> 用户名:<input type="text" name="userName"> 密码:<input type="text" name="userPwd"> <input type="submit"> </form> 当user类中有int类型的属性 会自动将该属性强转为int类型 如果可以转换 不报错 如果不能转换 如: 输入一个字符串,会报400 5. 用/传递参数 ,经常用于result风格的请求 SpringMVC支持路径中的占位符(重点) 原始方式:/deleteUser?id=1 restful方式:/deleteUser/1 SpringMVC路径中的占位符常用于Restful风格中 当请求路径中将某些数据通过路径的方式传输到服务器中 就可以在相应的@RequestMapping注解的value属性中 通过占位符{xxx}表示传输的数据 再通过@PathVariable注解 将占位符所表示的数据赋值给控制器方法的形参 @RequestMapping("/testRest/{id}/{username}") public String testRest(@PathVariable("id") String id, @PathVariable("username") String username){ System.out.println("id:"+id+",username:"+username); return "success"; } //最终输出的内容为-->id:1,username:uanme1 <a th:href="@{/testRest/1/uname1}">测试路径中的占位符-->/testRest</a><br> 如果路径中两个有参数中间夹着一个不是参数的,也是可以的 @RequestMapping("/pathvarible/{name1}/and/{name2}") public String post(@PathVariable("name1")String name1,@PathVariable("name2") String name2) { return name1+name2; } 6.@RequestHeader 可以获取所有的请求头信息 @RequestMapping("/pathvarible/{name1}/and/{name2}") public Map<String, String> post(@PathVariable("name1")String name1, @PathVariable("name2") String name2, @RequestHeader Map<String,String> header) { return header; } 7.@CookieValue 获取cookie的信息 @RequestMapping("/testcookie") public String testcookie(@CookieValue("_ga") String _ga) { return _ga; } 8.reuqsetbody 获取请求体信息 只能用于post请求,get请求没有请求体 @RequestMapping("/test") public String test(@RequestBody String body) { return body; } 9.解决获取请求参数的乱码问题 解决获取请求参数的乱码问题 可以使用SpringMVC提供的编码过滤器CharacterEncodingFilter 但是必须在web.xml中进行注册 拦截所有请求,并交给编码过滤器处理,将请求设置为param-value中指定的编码格式 <!--配置springMVC的编码过滤器--> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前,否则无效
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。