标签:utf-8 row col 处理 名称 void monkey 定义 www
在实际开发中通过会在spring MVC的Controller里面接收表单提交过来的参数,这块代码该怎么去编写呢?
示例:
编写一个带有表单的jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="/regist1.do" method="post"> 姓名:<input type="text" name="username"><br> 年龄:<input type="text" name="age"><br> <input type="submit" value="提交"> </form> </body> </html>
之后创建一个controller来接收这个表单提交的值:
package com.monkey1024.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class RegistController { @RequestMapping("/regist1.do") public ModelAndView regist1(String username, int age) throws Exception{ ModelAndView mv = new ModelAndView(); mv.addObject("username", username); mv.addObject("age", age); mv.setViewName("result"); return mv; } }
创建result.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 用户名:${username} <br> 年龄:${age} </body> </html>
在上面的controller中,我们在regist1方法后面的参数列表中写上了两个参数username和age,因为这两个参数与表单中input中的name一致,所以spring MVC会自动为其赋值,通过这种方式就可以在controller中获取表单提价的数据了。
此时你可能会发现一个问题,在之前我们写的controller中的方法参数列表里面我们都写上了request和response,而这里却没有写,其实这不会影响spring mvc的工作,也就是说在controller的方法里面,我们可以写多个参数,也可以一个都不写,不过spring mvc只会自动为以下五个参数进行自动赋值:
当前示例其实就是spring mvc将请求携带参数进行赋值,这样子我就可以直接获取表单提交的数据了。其他的以后在介绍。
在上面的示例中,倘若你输入了中文,那很有可能出现乱码问题,我们可以使用spring MVC为开发者提供的CharacterEncodingFilter来解决乱码问题,这个其实就是一个过滤器。我们需要在web.xml文件中进行配置,最好将其设置在其他过滤器之前,因为过滤器是按照web.xml中的顺序执行的:
<!--字符编码过滤器--> <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> <!--强制指定字符编码,即如果在request中指定了字符编码,那么也会为其强制指定当前设置的字符编码--> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
这里可以通过springmvc的源码中看到forceEncoding如果设置为true的话,那么不论你是否在request中设置了字符编码,spring mvc都会强制将其字符编码设置为我们在web.xml文件中写的字符编码。
在实际开发中有可能会有这样的问题,就是表单中input的name和spring mvc方法中的参数名不一致,这时可以使用@RequestParam()注解来解决这个问题,这个注解中有三个属性:
在之前的示例基础上进行修改:
表单内容不变:
<form action="/regist1.do" method="post"> 姓名:<input type="text" name="username"><br> 年龄:<input type="text" name="age"><br> <input type="submit" value="提交"> </form>
在controller的方法中的参数名与表单中的参数名不一致,使用@RequestParam:
@RequestMapping("/regist.do") public ModelAndView regist(@RequestParam(name="username") String t_username, @RequestParam(name="age") int t_age) throws Exception{ ModelAndView mv = new ModelAndView(); mv.addObject("username", t_username); mv.addObject("age", t_age); mv.setViewName("result"); return mv; }
设置defaultValue属性,当在jsp中没有填写年龄时,spring mvc会默认将其赋值为18
@RequestMapping("/regist.do") public ModelAndView regist(@RequestParam(name="username") String t_username, @RequestParam(name="age",defaultValue = "18") int t_age) throws Exception{ ModelAndView mv = new ModelAndView(); mv.addObject("username", t_username); mv.addObject("age", t_age); mv.setViewName("result"); return mv; }
设置required=true,此时系统会报出400的错误,因为请求参数中没有sex。
@RequestMapping("/regist.do") public ModelAndView regist(@RequestParam(name="username") String t_username, @RequestParam(name="age",defaultValue = "18") int t_age, @RequestParam(required = true) String sex) throws Exception{ ModelAndView mv = new ModelAndView(); mv.addObject("username", t_username); mv.addObject("age", t_age); mv.setViewName("result"); return mv; }
在之前的接收表单提交参数的示例中有个问题,倘若表单中的参数较多的话,需要在controller的方法里面把这些参数都写上,这样就不太方便了,我们可以定义一个javabean,将表单中的参数都写到javabean的属性里面,然后将这个bean作为参数写到controller的方法中。
示例:
定义一个Student类,里面的属性名跟表单的name保持一致
package com.monkey1024.bean; public class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
定义Controller,在方法中将Student作为参数传入:
package com.monkey1024.controller; import com.monkey1024.bean.Student; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class RegistController02 { @RequestMapping("/regist.do") public ModelAndView regist(Student student) throws Exception{ ModelAndView mv = new ModelAndView(); mv.addObject("name", student.getName()); mv.addObject("age", student.getAge()); mv.setViewName("result"); return mv; } }
通过这种方式,我们可以更方便的接收表单提交的数据了。
当请求中的参数是一个对象属性中的属性时,我们可以在表单中的name中写上对象属性.属性的方式进行处理。
定义一个School类:
package com.monkey1024.bean; public class School { private String schoolName; private String address; public String getSchoolName() { return schoolName; } public void setSchoolName(String schoolName) { this.schoolName = schoolName; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
定义一个Student类,里面添加School对象属性:
package com.monkey1024.bean; public class Student { private String name; private int age; private School school; public School getSchool() { return school; } public void setSchool(School school) { this.school = school; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
修改regist.jsp:
<form action="/regist.do" method="post"> 姓名:<input type="text" name="name"><br> 年龄:<input type="text" name="age"><br> 学校名称:<input type="text" name="school.schoolName"><br> 学校地址:<input type="text" name="school.address"><br> <input type="submit" value="提交"> </form>
修改RegistController02
package com.monkey1024.controller; import com.monkey1024.bean.Student; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class RegistController02 { @RequestMapping("/regist.do") public ModelAndView regist(Student student) throws Exception{ ModelAndView mv = new ModelAndView(); mv.addObject("name", student.getName()); mv.addObject("age", student.getAge()); mv.addObject("schoolName", student.getSchool().getSchoolName()); mv.addObject("address", student.getSchool().getAddress()); mv.setViewName("result"); return mv; } }
result.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 用户名:${name} <br> 年龄:${age} <br> 密码:${password} <br> 学校名称:${schoolName} <br> 学校地址:${address} </body> </html>
Controller除了可以接收表单提交的数据之外,还可以获取url中携带的变量,即路径变量,此时需要使用@PathVariable注解来设置,其中包含下面几个属性。
创建Controller,注意@RequestMapping注解中的写法
package com.monkey1024.controller; import com.monkey1024.bean.Student; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class RegistController03 { @RequestMapping("/{username}/{age}/regist.do") public ModelAndView regist(@PathVariable("username") String name,@PathVariable int age) throws Exception{ ModelAndView mv = new ModelAndView(); mv.addObject("name", name); mv.addObject("age", age); mv.setViewName("result"); return mv; } }
之后,在浏览器的地址栏里面直接输入:
localhost:8080/jack/19/regist.do
此时可以直接获取url中的jack和19的值。
这种方式在restful风格的url中使用较多。
原文来自链接,更多内容请点击链接!
标签:utf-8 row col 处理 名称 void monkey 定义 www
原文地址:https://www.cnblogs.com/lucky1024/p/11119028.html