0
点赞
收藏
分享

微信扫一扫

springMVC获得请求参数

千行 2022-03-14 阅读 92

一. 获得基本数据类型

UserController中的方法:

@RequestMapping("/quick8")
@ResponseBody
public void save8(String name,int age) {
    System.out.println(name);
    System.out.println(age);

}

网页中网址:

http://localhost:8080/springioc_mvc_war_exploded/user/quick8?name=zhangsan&age=333

得到:
在这里插入图片描述

二. 获得POJO数据类型

UserController中的方法:

@RequestMapping("/quick8")
@ResponseBody
public void save8(User user) {
    System.out.println(user);
    System.out.println(user.getName());
    System.out.println(user.getAge());
}

网页中网址,网址中的属性名称和bean中的属性名称一样,springMVC就会自动封装:

http://localhost:8080/springioc_mvc_war_exploded/user/quick8?name=zhangsan&age=123

得到

三. 获得数组类型

UserController中的方法:

@RequestMapping("/quick9")
@ResponseBody
public void save8(User user) {
    System.out.println(user);
    System.out.println(user.getName());
    System.out.println(user.getAge());
}

网页中网址,网址中的数组名称和接受的数组名称一样,springMVC就会自动封装:

http://localhost:8080/springioc_mvc_war_exploded/user/quick9?strs=1&strs=11&strs=111

得到:
在这里插入图片描述

四. 集合类型

1. 实现

在success.jsp中写上表单:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>success</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/user/quick10" method="post">
<%--        name中的属性名必须和VO中list的对象名一样--%>
        <input type="text" name="userList[0].name"/><br/>
        <input type="text" name="userList[0].age"/><br/>
        <input type="text" name="userList[1].name"/><br/>
        <input type="text" name="userList[1].age"/><br/>
        <input type="submit" value="提交">
    </form>
</body>
</html>

界面:
在这里插入图片描述

VO.java

public class VO {
    //
    private List<User> userList;

    public List<User> getUserList() {
        return userList;
    }

    public void setUserList(List<User> userList) {
        this.userList = userList;
    }

    @Override
    public String toString() {
        return "VO{" +
                "userList=" + userList +
                '}';
    }
}

userController.java:

@RequestMapping("/quick10")
@ResponseBody
public void save10(VO vo) {
    System.out.println(Arrays.asList(vo));
}

在网页界面中提交表单之后就能看到:
在这里插入图片描述

2. 中文乱码问题

如果输入数据是中文
在这里插入图片描述
就会出现乱码:
在这里插入图片描述

解决方法是在web.xml中配置一个filter,让去往后端的数据全部转成utf-8格式:

  <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>

五. 接收ajax数据

先创建一个ajax.jsp的前端页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
<%--    加载jquery--%>
    <script src="${pageContext.request.contextPath}/statics/jquery-3.6.0.js"></script>
    <script>
        var userList=new Array();
        // 在userList数组中放入json,表示用户
        userList.push({name:"zhangsan",age:22});
        userList.push({name:"lisi",age:222});

        $.ajax({
            type:"post",
            // ajax提交到的页面
            url:"${pageContext.request.contextPath}/user/quick11",
            // 提交json格式的参数
            data:JSON.stringify(userList),
            // 自定义传输的数据类型
            contentType:"application/json;charset=utf-8"
        })
    </script>
</head>
<body>

</body>
</html>

配置userController.java:

@RequestMapping("/quick11")
@ResponseBody
//    这里必须要加RequestBody的注解才能将json封装到userList
public void save11(@RequestBody List<User> userList) {
    System.out.println(userList);
}

访问ajax.jsp会发现报错:

在这里插入图片描述
为什么会找不到jquery?
因为访问ajax.jsp后,前端会向后端发送找jquery包的请求。这个请求是发送到servlet那里去了。他会先搜索@requestmapping看有没有配置好的servlet,如果没有,就自动去找前端控制器。前端控制器一般都是配的缺省地址,也就是 <url-pattern>/</url-pattern>。这个地址显然也不是jquery在的地方。

解决办法:

在spring-mvc.xml中配置:

<!--    开放资源的访问-->
<!--    我的jquery放在了webapp/statics/中-->
<!--    发送的请求只要满足mapping的格式,他就会去扫描location中的资源,看是否匹配-->
<mvc:resources mapping="/statics/**" location="/statics/"></mvc:resources>

或者:

<!--    如果没有找到资源,就会去询问tomcat服务器,tomcat是能找到静态资源的-->
    <mvc:default-servlet-handler/>

六. 参数映射

UserController.java:

    @RequestMapping("/quick12")
    @ResponseBody
    public void save12(@RequestParam("name") String username) {
        System.out.println(username);
    }

如果不要@requestparam,直接在网页中输入

http://localhost:8080/springioc_mvc_war_exploded/user/quick12?name=张三

会报错,得用username才行。这里用了@requestparam就建立了name到username的映射。

七. Restful风格

可以直接在网址中写上

http://localhost:8080/springioc_mvc_war_exploded/user/quick12/张三

就可以把张三作为username传到后端。

实现方法是:

//    {}表示占位符,其中的名称需要与@PathVariable的value参数一致
    @RequestMapping("/quick13/{username}")
    @ResponseBody
    //    @PathVariable注解,指定要映射的参数
    public void save13(@PathVariable(value = "username") String username) {
        System.out.println(username);
    }

然后输入上述网址,就可以实现:
在这里插入图片描述

八. 类型转换器

前端送到后端的数据,都会被转成字符串形式,但是在后端接收的时候,用int也能接受到数字,这说明springMVC自动做了一些类型转换。但有的类型是不进行自动转换的,比如日期
这就需要自定义类型转换器:

首先定义一个DataConverter.java:

//范型:<原本的类型,要转成的类型>
public class DataConverter implements Converter<String, Date> {
    @Override
//    source:原本的数据
    public Date convert(String source) {
//        日期格式转换,yyyy-MM-dd表示可以在网址中输入的日期格式
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
        Date parse = null;
        try {
            parse = simpleDateFormat.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return parse;
    }
}

告诉springMVC我有这个转换器,在springMVC.xml中配置:

    <bean id="ConversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<!--        这个类中有一个converters参数,即转换器列表-->
        <property name="converters">
            <list>
                <bean class="com.guazicola.converter.DataConverter"></bean>
            </list>
        </property>
    </bean>

将这个类配置到<mvc:annotation-driven/>:

    <mvc:annotation-driven conversion-service="ConversionService"/>

浏览器输入地址:

http://localhost:8080/springioc_mvc_war_exploded/user/quick14?date=2022-03-03

就可以得到:
在这里插入图片描述

九. 获得servlet相关API

springMVC会自动为请求的方法注入servletAPI:
userController.java:

@RequestMapping("/quick15")
    @ResponseBody
    public void save15(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        System.out.println(request);
        System.out.println(response);
        System.out.println(session);
    }

访问后得到:
在这里插入图片描述

举报

相关推荐

0 条评论