java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > springmvc请求参数的绑定

springmvc请求参数的绑定的项目实践

作者:sin2201

本文主要介绍了springmvc请求参数的绑定的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、创建项目,pom文件

​<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.qcby</groupId>
    <artifactId>springMVC12</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>5.0.2.RELEASE</spring.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>
​

二、web.xml

​<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--前端控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!--配置启动加载-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>
​

三、spring-mvc.xml

​<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 配置spring创建容器时要扫描的包 -->
    <context:component-scan base-package="com.qcby.controller"></context:component-scan>
    <!-- 配置视图解析器 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    <!-- 配置spring开启注解mvc的支持-->
<!--    <mvc:annotation-driven></mvc:annotation-driven>-->
</beans>
​

四、index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>请求参数绑定</title>
</head>
<body>
<form action="user/save1.do" method="post">
    姓名:<input type="text" name="username" />
    年龄:<input type="text" name="age" />
    <input type="submit" value="提交" />
</form>
<h3>请求参数绑定(封装到实体类)</h3>
<form action="user/save2.do" method="post">
    姓名:<input type="text" name="username" />
    年龄:<input type="text" name="age" />
    <input type="submit" value="提交" />
</form>
<h3>请求参数绑定(封装到实体类)</h3>
<form action="user/save3.do" method="post">
    姓名:<input type="text" name="username" />
    年龄:<input type="text" name="age" />
    金额:<input type="text" name="address.money" />
    <input type="submit" value="提交" />
</form>
<h3>请求参数绑定(封装到实体类,存在list集合)</h3>
<form action="user/save4.do" method="post">
    姓名:<input type="text" name="username" />
    年龄:<input type="text" name="age" />
    金额:<input type="text" name="address.money" />
    集合:<input type="text" name="list[0].money" />
    集合:<input type="text" name="list[1].money" />
    <input type="submit" value="提交" />
</form>
</body>
</html>

五、实体类

Address类

import java.io.Serializable;
public class Address implements Serializable {
    private Double money;
    public Double getMoney() {
        return money;
    }
    public void setMoney(Double money) {
        this.money = money;
    }
    @Override
    public String toString() {
        return "Address{" +
                "money=" + money +
                '}';
    }
}

User类

import java.io.Serializable;
import java.util.List;
public class User implements Serializable {
    private String username;
    private Integer age;
    // 引用对象
    private Address address;
    // list集合
    private List<Address> list;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public List<Address> getList() {
        return list;
    }
    public void setList(List<Address> list) {
        this.list = list;
    }
    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", address=" + address +
                ", list=" + list +
                '}';
    }
}

六、UserController类

import com.qcby.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/save1.do")
    public String save(String username,Integer age){
        System.out.println("姓名:"+username);
        System.out.println("年龄:"+age);
        return "success";
    }
    @RequestMapping("/save2.do")
    public String save2(User user){
        System.out.println("user对象:"+user);
        return "success";
    }
    @RequestMapping("/save3.do")
    public String save3(User user){
        System.out.println("user对象:"+user);
        return "success";
    }
    @RequestMapping("/save4.do")
    public String save4(User user){
        System.out.println("user对象:"+user);
        return "success";
    }
}

七、请求参数解决中文乱码

在web.xml中配置Spring提供的过滤器

​
<!-- 配置过滤器,解决中文乱码的问题 -->
<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>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
现在的web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- 配置过滤器,解决中文乱码的问题 -->
    <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>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--前端控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!--配置启动加载-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>
​

八、配置tomcat,然后启动tomcat

1.

2.

3.

4.

九、接收Map类型

1.直接接收Map类型

如果想直接接收前端传过来的map参数,应该使用两个注解(RequestBody或RequestParam;RequestParam--get和post请求都可以,RequestBody只能post请求,底层封装都是LinkedHashMap)

(1)Get请求

第一种情况,什么注解也没有

UserController类里加一个方法

@RequestMapping("/mapSave1.do")
public String mapSave1(Map<String, Objects> map){
    System.out.println("map:"+map);
    return "success";
}

没有JSP页面,启动tomcat

控制台:什么输出也没有,没有值

第二种情况:传个值

控制台:还是什么都没有

第三种情况:声明是get请求

UserController类的mapSave1()方法:

@RequestMapping(value = "/mapSave1.do",method = RequestMethod.GET)

public String mapSave1(Map<String, Objects> map){

    System.out.println("map:"+map);

    return "success";

}

再启动:

控制台:还是没有值

所以跟请求是什么没关系,要想接收就要加注解

第四种情况:加@RequestParam

@RequestMapping(value = "/mapSave1.do")

public String mapSave1(@RequestParam Map<String, Objects> map){

    System.out.println("map:"+map);

    return "success";

}

再运行:

所以,我传递一个map在后端接收,用get请求必须加@RequestParam注解

(2)post请求:

第一种情况:什么注解也没有

@RequestMapping(value = "/mapSave2.do")
public String mapSave1(Map<String, Objects> map){
    System.out.println("map:"+map);
    return "success";
}
前端页面:加一个表单
<h3>请求参数的绑定--map集合</h3>
<form action="user/mapSave2.do" method="post">
    map集合key:<input type="text" name="map.key" />
    map集合value:<input type="text" name="map.value" />
    <input type="submit" value="提交" />
</form>

运行

点提交

控制台:什么也没有

第二种情况:声明是post请求

@RequestMapping(value = "/mapSave2.do",method = RequestMethod.POST)
public String mapSave2(Map<String, Objects> map){
    System.out.println("map:"+map);
    return "success";
}

再运行:

点提交

控制台:

说明跟get的一样,不加注解是没有办法接收到的

第三种情况:加上@RequestParam注解

@RequestMapping(value = "/mapSave2.do",method = RequestMethod.POST)
public String mapSave2(@RequestParam Map<String, Objects> map){
    System.out.println("map:"+map);
    return "success";
}

运行:

点提交

控制台:

可以看出,get请求和post请求都可以用@RequestParam注解

表单和controller类中的方法改改(加个username)

表单:

<h3>请求参数的绑定--map集合</h3>
<form action="user/mapSave2.do" method="post">
    username:<input type="text" name="username">
    map集合:<input type="text" name="test1">
<%-- test1就是map的key,输入框中的就是map的value --%>
    <input type="submit" value="提交" />
</form>

方法:

@RequestMapping(value = "/mapSave2.do")
public String mapSave2(@RequestParam Map<String, Objects> map,String username){
    System.out.println("map:"+map);
    System.out.println("username:"+username);
    return "success";
}

运行:

点提交:

控制台:

可以看到:表单中的数据都被封装到了map集合中

第四种情况:加@RequestBody注解

但是这样的话,它只能接收json数据

现在用表单接收就会报错:

@RequestMapping(value = "/mapSave2.do")
public String mapSave2(@RequestBody Map<String, Objects> map, String username){
    System.out.println("map:"+map);
    System.out.println("username:"+username);
    return "success";
}

运行:

点提交:(报错)

总结:无注解时,什么都接收不了;@RequestParam注解时,将参数包装成LinkedHashMap对象,参数的key是Map的key,参数的值是Map的value,get和

post请求都支持;@RequestBody注解接收json类型的数据(跟表单不一样,表单传不了),也会包装成LinkedHashMap对象,该注解不支持get请求,get请求没有请求体,不能传json

2.用对象接收map

(1)User类里加一个map

private Map<String,Address> userMap;

(2)前端:

<h3>请求参数绑定(封装到实体类,存在map集合)</h3>
<form action="user/save5.do" method="post">
    姓名:<input type="text" name="username" />
    年龄:<input type="text" name="age" />
    金额:<input type="text" name="address.money" />
    Map集合:<input type="text" name="userMap['one'].money" />
    Map集合:<input type="text" name="userMap['two'].money" />
    <input type="submit" value="提交" />
</form>

(3)运行:

点提交:

控制台:

十、在控制器中使用原生的ServletAPI对象

只需要在控制器的方法参数定义HttpServletRequest和HttpServletResponse对象

UserController里加:

/*原生的API*/
@RequestMapping("/save6.do")
public String save6(HttpServletRequest request, HttpServletResponse response){
    System.out.println(request);
    // 获取到HttpSession对象
    HttpSession session = request.getSession();
    System.out.println(session);
    System.out.println(response);
    return "success";
}

运行:

控制台:

到此这篇关于springmvc请求参数的绑定的项目实践的文章就介绍到这了,更多相关springmvc请求参数的绑定内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文