• S 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中使用较多。

    原文来自链接,更多内容请点击链接!

  • 相关阅读:
    元旦发布DayPilot Pro 5.8源代码
    新年新开端
    PWA 2007 过期解决办法
    Document Library Explorer 2007 源代码更新下载
    发布DayPilotPro5.5.1780 SP1源代码
    MOSS自带调查列表结果图形化展示
    自定义PWA报工界面:隐藏加班项
    学习Document Library Explorer 2007源代码
    WSS&MOSS SP3 Now Available
    SQL Server 2008安装失败
  • 原文地址:https://www.cnblogs.com/lucky1024/p/11119028.html
Copyright © 2020-2023  润新知