程序员的春天-SpringMVC02

程序员的春天-SpringMVC02

注解开发

环境起步设置配置文件

注解扫描器

springmvc.xml文件中添加

<context:component-scan base-package="top.byfree.controller"/>

base-package写要扫描的包名

注册驱动

<mvc:annotation-driven/>

这行配置可以帮我们自动注册处理器映射器和处理器适配器两个bean

基础注解介绍

注解名作用
@Controller写在类上,表明这个类由spring容器管理
@Scope设置类的实例创建是单例还是原型模式,默认是单例的
@RequestMapping在类上使用,起到限定范围作用。在方法上使用,设置访问路径。最终的访问路径是类上的+方法上的
@RequestParam用于校订参数
@RequestHeader获取请求头中的信息
@RequestBody用于请求json的传参,在方法体上是相应json,在参数前是接收参数,具体使用需要导包,具体细节下面讲解

传参

方式一:逐个接收

案例演示

请求

<a href="springMvc/a?name=jelly&age=17">点击我吖!</a>

接收

    @RequestMapping("/a") // 设置请求路径
    public String handleRequest(
            String name,
            int age,
            Model model
    ){
        model.addAttribute("name", name);
        model.addAttribute("age", age);
        return "WEB-INF/pages/success.jsp";
    }

这里的Model是固有参数,可以向服务器存储数据,在跳转的页面可以使用el表达式获取
name和age就是逐个传递的参数

跳转

<html>
<head>
    <title>success</title>
</head>
<body>
    <h3>跳转成功</h3>
    <h3>${name}</h3>
    <h3>${age}</h3>
</body>
</html>

细节:请求的参数和接收的参数名称必须对应一致
那我就是想让他们不一样可不可以
可以使用@RequestParam矫正参数

    @RequestMapping("/a") // 设置请求路径
    public String handleRequest(
            @RequestParam("name") String n,
            @RequestParam("age") int a,
            Model model
    ){
        model.addAttribute("name", n);
        model.addAttribute("age", a);
        return "WEB-INF/pages/success.jsp";
    }

真正的参数名变成了n和a只需要在注解@RequestParam设置和请求对应的参数就可以了

方式二:集合或者数组接收

请求复选框请求

<form action="springMvc/b" method="post">
    <input type="checkbox" name="ch1" value="ch1">吃饭
    <input type="checkbox" name="ch1" value="ch2">睡觉
    <input type="checkbox" name="ch1" value="ch3">玩游戏
    <input type="checkbox" name="ch1" value="ch4">呵呵呵
    <input type="submit" value="提交">
</form>

数组接收

    @RequestMapping(value = "/b") // 设置请求路径
    public String ck(
            @RequestParam("ch1") String[] a,
            Model model
    ){
        model.addAttribute("s", a);
        return "/WEB-INF/pages/success.jsp";
    }

集合接收

    @RequestMapping(value = "/b") // 设置请求路径
    public String ck(
            @RequestParam List<String> ch1,
            Model model
    ){
        model.addAttribute("s", ch1);
        return "/WEB-INF/pages/success.jsp";
    }

必须要添加@RequestParam注解不然会找不到用那个集合

方式三:bean接收

大白话就是将请求来的数据映射到一个对象中

请求

<form action="springMvc/b" method="post">
    <input type="text" name="uname">姓名
    <input type="text" name="age">年龄
    <input type="submit" value="提交">
</form>

实体类

public class User implements Serializable {
    private String uname;
    private Integer age;
}

略写了get/set方法,实际情况不可以省略不然没法自动映射

接收

    @RequestMapping(value = "/b") // 设置请求路径
    public String ck(
            User user,
            Model model
    ){
        model.addAttribute("user", user);
        return "/WEB-INF/pages/success.jsp";
    }

这样传进来的uname和age会自动映射成一个user对象,注意这里的uname和age必须和user类的属性对应

方式四:bean接收域属性问题(就是引用对象)

大白话就是接收的属性中有几个属性是对象的属性,但是这个对象又是一个属性

这种解决方式,是在前段表单中写表达式实现的。其实这个表达式功能很强大,之前的集合传参也可以使用这个表达式实现,具体不在赘述

请求

<form action="springMvc/b" method="post">
    <input type="text" name="uname">姓名
    <input type="text" name="age">年龄
    <input type="text" name="p.name">对象
    <input type="submit" value="提交">
</form>

p.name p代表的是在user类中的属性的类Partner的名称name是Partner的属性

实体类

public class User implements Serializable {
    private String uname;
    private Integer age;
    private Partner p;
}
public class Partner implements Serializable {
    private String name;
}

记得写get/set方法

接收

    @RequestMapping(value = "/b") // 设置请求路径
    public String ck(
            User user,
            Model model
    ){
        model.addAttribute("user", user);
        return "/WEB-INF/pages/success.jsp";
    }

方式五:路径传参(restful风格传参)

请求地址

http://localhost:8080/springMvc/jelly/17/b

要接收的就是这里的jelly和17

接收

    @RequestMapping(value = "/{name}/{age}/b") // 设置请求路径
    public String ck(
            @PathVariable("name") String n,
            @PathVariable("age") int a,
            Model model
    ){
        System.out.println(n + "---" + a);
        return "/WEB-INF/pages/success.jsp";
    }

使用的是@PathVariable注解,这个注解也可以矫正参数

方式六:json接收

需要引入解析json的包jackson

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.10.3</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.10.3</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.10.3</version>
    </dependency>

需要前段发起ajax请求

<html>
<head>
    <title>ajax</title>
    <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery.min.js"></script>
    <script>
        var jq=jQuery.noConflict();
        jq(function () {
            jq("#myBtn").click(function () {
                var data = {
                    uname : "jelly",
                    age : "23"
                };
                jq.ajax({
                    url: "${pageContext.request.contextPath}/springMvc/a",
                    type: "POST",
                    contentType: "application/json",
                    data: JSON.stringify(data)
                });
            })
        })
    </script>
</head>
<body>
<button id="myBtn">点我啊</button>
</body>
</html>

接收并封装成一个user对象

    @RequestMapping(value = "/a")
    public void handleRequest(
            @RequestBody User a
    ){
        System.out.println(a);
    }

接收时只需要在参数前加一个@RequestBody注解即可

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.byfree.top/archives/springmvc02