SpringMVC第二天(请求与相应)

发布时间:2024年01月22日

请求映射路径

名称:@RequestMapping

类型:方法注解/类注解

位置:SpringMVC控制器方法定义上方

作用:设置房钱控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀

先给出一个最基本示例:

@Controller
public class BookController {

    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("Book saving!");
        return "{'module' : 'book save'}";
    }
}

该示例在此时可以成功的访问?

可如果此时,我们再定义一个如下的Bean:

@Controller
public class UserController {

    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user saving!");
        return "{'module':'SpringMVC'}";
    }

    @RequestMapping("/delete")
    @ResponseBody
    public String delete(){
        System.out.println("User delete!");
        return "{'module' : 'user delete'}";
    }
}

我们会发现在userBean中也有一个路径为/save的方法,此时会与BookBean中的save方法冲突,这时我们就要给每个请求方法设置唯一的访问路径

方法有二:

第一种:给每一个方法都设置一个唯一路径

示例:

@Controller
public class UserController {

    @RequestMapping("/user/save")
    @ResponseBody
    public String save(){
        System.out.println("user saving!");
        return "{'module':'SpringMVC'}";
    }

    @RequestMapping("/user/delete")
    @ResponseBody
    public String delete(){
        System.out.println("User delete!");
        return "{'module' : 'user delete'}";
    }
}

?可以看到,我们给userBean中的每个方法都独立的设置了相应路径,保证了其路径的唯一

方法二:在类上设置路径前缀

示例:

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user saving!");
        return "{'module':'SpringMVC'}";
    }

    @RequestMapping("/delete")
    @ResponseBody
    public String delete(){
        System.out.println("User delete!");
        return "{'module' : 'user delete'}";
    }
}

可以看到,这种方法我们不需要对每一个请求方法的访问路径单独进行设置,只需要在类上用@RequestMapping设置一个路径前缀,这样类中的每个方法的访问路径都会是/user/..,也能保证其访问路径的唯一

请求方式

Get请求

普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数

Post请求

普通参数:form表单post请求传参,表单参数名与形参变量名相同,定义形参即可接收参数

Post请求中文乱码处理

为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }

请求参数

普通参数

url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数

???求参数与形参不同名解决方法:

????????例如,请求参数名为username,而形参名为name,那么我们就需要将name与username绑定,方法如下:

 public String save(@RequestParam("username") String name, String password){
        System.out.println("user saving!");

可以看到1,使用@ResquestParam注解即可绑定二者的关系?

POJO类型参数

请求参数名与形参对象属性名相同,定义pojo类型形参即可接收参数

例如:

    public String popo(User user){
        System.out.println("user:" + user);
        return "{'module' : 'pojo'}";
    }
public class User {
    private String name;
    private int age;

?

嵌套POJO类型参数

请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数

例如:

    public String popo(User user){
        System.out.println("user:" + user);
        return "{'module' : 'pojo'}";
    }
public class User {
    private String name;
    private int age;
    private Address address;

?

数组类型参数

请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型形参即可接收参数

    @RequestMapping("/students")
    @ResponseBody
    public void students(String[] name){
        System.out.println(Arrays.toString(name));
    }

集合类型参数

请求参数名与形参集合对象名相同且请求参数为多个,@RequesteParam绑定参数关系

    @RequestMapping("habits")
    @ResponseBody
    public void habits(@RequestParam List<String> hab){}

传递json数据

第一步、导入json坐标

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

第二步、在Spring核心配置文件中注解

@EnableWebMvc

json数组

    @RequestMapping("/list")
    @ResponseBody
    public String listjson(@RequestBody List<String> likes){

json对象(POJO)

json数据与形参对象属性名相同,定义POJO类型形参即可接收参数

    @RequestMapping("/pojo")
    @ResponseBody
    public String pojojson(@RequestBody User user){

json数组(POJO)

json数组数据与集合泛型属性名相同,定义List类型形参即可接收参数

    @RequestMapping("/pojolist")
    @ResponseBody
    public String listpojojson(@RequestBody List<User> list){

@RequestBody 与 @RequestParam

区别

@RequestParam用于接收url地址传参,表单传参[application/x-www-form-urlencoded]

@RequestBody用于接收json数据[application/json]

应用

后期开发中,发送json格式数据为主,@RequestBody应用较广

如果发送非json格式,选用@RequestParam格式接收请求参数

日期类型参数传递

????????日期类型数据基于系统不同格式也不尽相同

????????????????1999-01-02

????????????????1999/01/02

????????????????02/01/1999

默认格式yyyy/mm/dd

@RequestMapping("/date1")
@ResponseBody
public String date1(Date date ){

非默认格式,以yyyy-mm-dd为例

    @RequestMapping("/date2")
    @ResponseBody
    public String date2(@DateTimeFormat(pattern = "yyyy-mm-dd") Date date ){

?

带具体时间格式,以yyyy-mm-dd hh:mm:ss为例

    @RequestMapping("/date3")
    @ResponseBody
    public String date3(@DateTimeFormat(pattern = "yyyy-mm-dd hh:mm:ss") Date date ){

响应

响应页面

    @RequestMapping("/JumpPage")
    public String JumpPage(){
        System.out.println("跳转界面");
        return "page.jsp";
    }

响应数据

文本数据

    @RequestMapping("/Text")
    @ResponseBody
    public String Text(){
        System.out.println("返回纯文本数据");
        return "response text";
    }

json数据

POJO对象
    @RequestMapping("/POJO")
    @ResponseBody
    public User topojo(){
        System.out.println("返回POJO类型数据");
        User user = new User();
        user.setName("cacb");
        user.setAge(20);
        return user;
    }
POJO集合对象
    @RequestMapping("/POJOList")
    @ResponseBody
    public List<User> pojolist(){
        System.out.println("返回POJO集合数据");
        User user1 = new User();
        user1.setName("cacb");
        user1.setAge(20);

        User user2 = new User();
        user2.setName("bbbb");
        user2.setAge(11);

        List<User> userList =new ArrayList<User>();
        userList.add(user1);
        userList.add(user2);

        return userList;
    }
}

文章来源:https://blog.csdn.net/Cary_cacb/article/details/135750689
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。