Spring MVC 基础入门二
Posted lucky1024
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC 基础入门二相关的知识,希望对你有一定的参考价值。
单个接收表单提交的参数
在实际开发中通过会在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只会自动为以下五个参数进行自动赋值:
- HttpServletRequest
- HttpServletResponse
- HttpSession
- 请求携带的参数
- 用于承载数据的Model
当前示例其实就是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()注解来解决这个问题,这个注解中有三个属性:
- value:指定请求参数的名称,即表单中input的name值。
- name:同value,两者只能使用一个
- required:指定该参数是否是必须传入的,boolean类型。若为 true,则表示请求中所携带的参数中必须包含当前参数。若为 false,则表示有没有均可。
- defaultValue:指定当前参数的默认值。如果请求中没有该参数,则当前方法参数将取该默认值。
在之前的示例基础上进行修改:
表单内容不变:
<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>
PathVariable
Controller除了可以接收表单提交的数据之外,还可以获取url中携带的变量,即路径变量,此时需要使用@PathVariable注解来设置,其中包含下面几个属性。
- value:指定请求参数的名称,即url中的值,当url中的名称和方法参数名称不一致时,可以使用该属性解决。
- name:同value,两者只能使用一个
- required:指定该参数是否是必须传入的,boolean类型。若为 true,则表示请求中所携带的参数中必须包含当前参数。若为 false,则表示有没有均可。
创建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中使用较多。
原文来自链接,更多内容请点击链接!
以上是关于Spring MVC 基础入门二的主要内容,如果未能解决你的问题,请参考以下文章
[Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.