自学内容网 自学内容网

Java阶段三07

第3章-第7节

一、知识点

常见传参类型、文件上传、获取put的参数、SpringMVC的响应、拦截器、lombok

二、目标

  • 掌握常见的传参类型和接收数据的方式

  • 理解SpringMVC的响应方式

  • 掌握拦截器的使用

  • 掌握lombok的使用

三、内容分析

  • 重点

    • 掌握常见的传参类型和接收数据的方式

    • 理解SpringMVC的响应方式

    • 掌握拦截器的使用

    • 掌握lombok的使用

  • 难点

    • 掌握常见的传参类型和接收数据的方式

    • 理解SpringMVC的响应方式

四、内容

1、常见的传参类型

1.1 application/x-www-form-urlencoded(默认的,不用做任何操作)

最常见的 POST 提交数据的方式了。浏览器的原生 <form> 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。 此方式的编码方式:首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。

@PostMapping("/update")
public void query(Student s) {
    System.out.println(s);
}
1.2 multipart/form-data(主要用于上传文件)

使用表单上传文件时,必须让 <form> 表单的 enctype 等于 multipart/form-data。 Content-Type 里指明了数据是以 multipart/form-data 来编码,上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段标准中原生 <form> 表单也只支持这两种方式(通过 <form> 元素的 enctype 属性指定,默认为 application/x-www-form-urlencoded。其实 enctype 还支持 text/plain,不过用得非常少)。

@PostMapping("/upload")
public void upload(MultipartFile file) throws IOException {
    // 发现整个报错,获取不到文件
}
配置文件解析器
<!--  配置文件解析器 注意:id必须是multipartResolver  -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize">
        <!-- 以字节B为单位  5M -->
        <value>5242880</value>
    </property>
</bean>
配置依赖
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>
测试(保存上传的文件)
@PostMapping("/upload")
public void upload(MultipartFile file) throws IOException {
    // 获取文件名
    String name = file.getOriginalFilename();
    // 创建文件对象
    File file1 = new File("D/work/教案/JAVA/教案2/ssm/ssm05/src/public/image/" + name);
    if (!file1.exists()){ 
        file1.mkdirs();
    }
    // 把传输的内容保存到新文件中
    file.transferTo(file1);
}
1.3 application/json(使用@RequestBody)
@PostMapping("/update2")
public void update(@RequestBody Student s) {
    System.out.println(s);
}
// 发现无法使用
springmvc.xml中添加一些配置
<!--  初始化的时候自动生成一些对象  -->
<!--  可以理解为告诉Spring框架要启用注解的方式来处理HTTP请求和响应,因此@RequestBody才会生效  -->
<mvc:annotation-driven></mvc:annotation-driven>
处理响应数据中文乱码
<!-- mvc:message-converters设置数据转换规则的,当我们的应用需要在HTTP请求和响应之间传递字符串信息时,这些“转换器”会负责将字符串正确编码和解码 -->
<mvc:message-converters register-defaults="true">
    <!-- 这个转换器的作用是确保所有通过HTTP传输的字符串都使用“UTF-8”字符集 -->
    <bean class="org.springframework.http.converter.StringHttpMessageConverter">
        <constructor-arg value="UTF-8"/>
    </bean>
</mvc:message-converters>
配置pom.xml的jackson依赖
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.1</version>
</dependency>

2、响应内容

2.1 没有返回值

 

// 没有设置返回值会去找jsp页面,根据我们配置的视图解析器去找
// /teacher/test1 会去找 视图解析器前缀/teacher/test1.jsp文件
@GetMapping("/test1")
public void test1() {
    System.out.println(getClass().getName() + " test1");
}
2.2 返回字符串

 

2.2.1 返回文件
// 根据字符串找对应的jsp
// myString 会去找 视图解析器前缀/myString.jsp文件
@GetMapping("/test2")
public String test2() {
    System.out.println(getClass().getName() + " test2");
    return "myString";
}
2.2.2 重定向
@GetMapping("/test2")
public String test2() {
    System.out.println(getClass().getName() + " test2");
    return "redirect:myString"; // 使用redirect:开头表示重定向
}
2.2.3 转发
@GetMapping("/test2")
public String test2() {
    System.out.println(getClass().getName() + " test2");
    return "forward:myString"; // 使用forward:开头表示请求转发
}
2.3 返回ModelAndView(可以给页面传参)

 

@GetMapping("/test3")
public ModelAndView test3() {
    System.out.println(getClass().getName() + " test3");
    ModelAndView modelAndView = new ModelAndView();
    // 打开哪个jsp
    modelAndView.setViewName("test"); 
    // 传数据
    modelAndView.addObject("username", "张三");
    return modelAndView;
}
jsp记得开启EL表达式
<%@ page isELIgnored="false" %>
<h1>${username}</h1>
2.4 返回数据

上面三种不常用,现在流行的是前后端分离的开发方式

2.4.1 使用@ResponseBody
@GetMapping("/test4")
@ResponseBody // 代表当前接口返回的数据,不是jsp页面了
public String test4() {
    System.out.println(getClass().getName() + " test4");
    return "DATA";
}
@GetMapping("/test5")
@ResponseBody
public List<Student> test5() {
    System.out.println(getClass().getName() + " test5");
    List<Student> students = new ArrayList<>();
    students.add(new Student(1001, "张三", "男"));
    students.add(new Student(1002, "李四", "女"));
    return students;
}
2.4.5 统一配置
// 在controller的类加@RestController
@RestController // 里面的所有方法都是返回数据,下面的@ResponseBody就可以不写了
@RequestMapping("/class")
public class ClassController {
    @GetMapping("/test1")
    public String test1() {
        System.out.println(getClass().getName() + " test1");
        return "DATA 这是数据";
    }
​
    @GetMapping("/test2")
    public List<Student> test2() {
        System.out.println(getClass().getName() + " test2");
        List<Student> students = new ArrayList<>();
        students.add(new Student(1001, "张三", "男"));
        students.add(new Student(1002, "李四", "女"));
        return students;
    }
}

3、拦截器

3.1 概念

拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行

SpringMVC的拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。

  • Filter(过滤器)

    使用范围是servlet规范中的一部分,任何 Java Web工程都可以使用

  • Interceptor(拦截器)

    使用范围是 SpringMVC框架内,只有使用了 SpringMVC框架的工程才能用

3.2 三个方法
  • preHandle

    该方法在请求处理前执行,返回值是Boolean类型的,当结果为false时,它后续的Interceptor和Controller都不会执行,当结果为true时,会继续往下指向

  • postHandle

    该方法在请求处理之后执行,会在DispatcherServelt进行视图返回渲染之前被调用,所以可以用这个方法对Controller处理之后的ModelAndView对象进行操作。

  • afterCompletion

    该方法在整个请求结束后执行,也就是在DispatcherServlet进行完视图渲染后

3.3 创建类,实现拦截器接口
interceptor/MyInterceptor.java

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(xx) throws Exception {
        System.out.println("进入Controller之前执行的");
        // 返回true表示放行,false表示不放行
        return true;
    }
    @Override
    public void postHandle(xx) throws Exception {
        System.out.println("执行完Controller之后执行的");
    }
    @Override
    public void afterCompletion(xx) throws Exception {
        System.out.println("页面解析完成后执行的");
    }
}
​
3.4 配置springmvc.xml文件
<mvc:interceptors>
    <mvc:interceptor>
        <!-- 指定要拦截的请求 /** 拦截所有请求-->
        <mvc:mapping path="/**"/>
        <!-- 排除哪些请求不需要拦截,个别请求可能不需要拦截,用这个排除 -->
        <mvc:exclude-mapping path="/class/*"/> <!-- /class开头的都不拦截 -->
        <bean id="myInterceptor" class="com.company.interceptor.MyInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

4、lombok

4.1 概念

  Lombok是一个插件,其主要用途是提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码,提高编码效率,使代码更简洁。

  Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量,一旦修改属性,就容易出现忘记修改对应方法的失误。

  Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。

4.2 环境准备
  • 插件市场安装lombok,解決提示会报错
  • 配置pom.xml文件
    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.22</version>
        <scope>provided</scope>
    </dependency>

4.3 注解
@Getter/@Setter

为字段生成Getter和Setter方法,可以注解到字段或者类上(注解在类上会为类中的所有字段生成Getter和Setter方法),默认是public类型的,如果需要的话可以修改方法的访问级别

@NonNull

为字段赋值时(即调用字段的setter方法时),如果传的参数为null,则会抛出空异常NullPointerException,生成setter方法时会对参数是否为空检查

@NoArgsConstructor

生成一个无参构造方法。当类中有final字段没有被初始化时,编译器会报错,此时可用@NoArgsConstructor(force = true),然后就会为没有初始化的final字段设置默认值 0 / false / null, 这样编译器就不会报错。对于具有约束的字段(例如@NonNull字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些约束无效

@RequiredArgsConstructor

生成构造方法(可能带参数也可能不带参数),如果带参数,这参数只能是以final修饰的未经初始化的字段,或者是以@NonNull注解的未经初始化的字段。把@NonNull注解和final修饰的字段做成一个构造器,因为有可能没有这些符合条件的字段,所以和无参构造器冲突

@RequiredArgsConstructor(staticName = “of”)会生成一个of()的静态方法,并把构造方法设置为私有的

@AllArgsConstructor

生成一个全参数的构造方法

@ToString

生成toString()方法,默认情况下它会按顺序(以逗号分隔)打印你的类名称以及每个字段。可以这样设置不包含哪些字段,可以指定一个也可以指定多个@ToString(exclude = “id”) / @ToString(exclude = {“id”,“name”})

如果继承的有父类的话,可以设置callSuper 让其调用父类的toString()方法,例如:@ToString(callSuper = true)

@EqualsAndHashCode

生成hashCode()和equals()方法,默认情况下,它将使用所有非静态,非transient字段。但可以通过在可选的exclude参数中来排除更多字段。或者,通过在of参数中命名它们来准确指定希望使用哪些字段。

// exclude 排除字段

@EqualsAndHashCode(exclude = {“password”, “salt”})

// of 指定要包含的字段

@EqualsAndHashCode(of = {“id”, “phone”, “password”})

@Data

@Data 包含了 @ToString、@EqualsAndHashCode、@Getter / @Setter和@RequiredArgsConstructor的功能

4.4 测试
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student{
    private String name;
    private int age;
}
​
public stait void main(String[] args){
    Student student = new Student("张三",18);
    System.out.println(student); // 输出正确结果
}

5、小结

本章节我们除了学习常见传参类型、文件上传、获取put的参数、SpringMVC的响应、拦截器这些在SpringMVC中必须的知识点以外,还补充了lombok这个插件的使用,既掌握了SpringMVC的只是点还学习了能够提高我们开发效率的插件,可谓是收获颇丰啊。

下一节中,我们将进行SSM第三部分Mybatis的学习,在这一节中,我们将会学习到如何在Spring项目中连接数据库,以及Mybatis进行数据持久化操作和JDBC的不同。


原文地址:https://blog.csdn.net/qq_40508161/article/details/144311045

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!