今天首次推开了Spring的大门,这个开发工具带给我的体验就是简化了以前非常多的流程,以前传数据什么的还需要进行转向,然后重定向回网页,现在直接略过这步了,直接采用映射的方式,有种数据库与后端映射的感觉了。
首先是映射过程
@RequestMapping(value = "/page2",method = {RequestMethod.GET,RequestMethod.POST})
public String page2(){
System.out.println("page2");
return "page2";
value = "/page2" - 定义URL路径,访问地址为 http://localhost:8080/page2
method = {RequestMethod.GET, RequestMethod.POST} - 支持GET和POST两种HTTP请求方式
return "page2" - 返回视图名称,Spring会查找名为"page2"的模板文件
上面是简单的映射,下面我们可以添加一些值传递,在controller中定义一个map通过键值对为前端赋值
public String page2(@RequestBody User user, Map<String, Object> map){
System.out.println("page2");
Map<String,String> dataMap = new ConcurrentHashMap<>();
dataMap.put("username", user.getUsername());
dataMap.put("password", user.getPassword());
map.put("dataMap",dataMap);
map.put("name","张三") ;
map.put("age",18) ;
map.put("sex",false) ;
List<String> nameList = List.of("mao1","mao2","mao3");
map.put("nameList",nameList);
return "page2";
}
}
通过map.put的方法为为名叫“name”的属性赋值,赋值的的结果作为value小祈
<div th:text="'你好'+${name}"></div>
<div th:if="${sex}">男</div>
<div th:unless="${sex}">女</div>
<div th:each="str:${nameList}">
<span th:text = "${str}"></span>
</div>
<div th:text="${dataMap.username}"></div>
<div th:text="${dataMap.password}"></div>
然后我们在html中通过th:text方式获取后端赋的值,如果不加这${}的话就只会得到name,像写前端网页一样了,然后可以通过if进行条件判断,unless作为java中的else,写法基本同java一致,但是如果赋值的话,一定要使用${},最后就是同样可以进行循环遍历,使用自定义的变量(变量名随便)然后逐行获取value值。
Map<String,String> dataMap = new ConcurrentHashMap<>();
dataMap.put("username", user.getUsername());
dataMap.put("password", user.getPassword());
map.put("dataMap",dataMap);
这部分允许我们使用前端写在地址栏的值然后经过后端传到前端显示给用户然后前端再从后端把值获取显示在html页面上
<div th:text="${dataMap.username}"></div>
<div th:text="${dataMap.password}"></div>
今天还学了一个比较重要的内容就是@requestbody和@responsebody,这两个注释允许允许解析json或者xml文件直接通过这两种文件形式来传值但只能通过apifox模拟来完成,如图所示

最后再来分享一下今天背的几道面试题:
1 构造器 Constructor 是否可被 override?
构造器不可以被重写但是可以被重载,因此可以在一个类里看到多个构造函数
2 重载和重写的区别
重载
重载发生在同一个类里,方法名必须相同,其他的比如说参数类型,顺序,个数可以不同,访问修饰符还有返回值可以不同
重写
重写是子类对于父类允许的方法进行重写编写,父类方法的外貌是不发生改变的,参数列表必须相同,访问修饰符应该大于等于父类,返回值和抛出异常的范围都要小于父类,也就是说重写不改变父类方法的外貌,改变了方法体和一些限制条件
貌并没有改变。
3 Java 面向对象编程三大特性
封装,继承,多态
4 String 为什么是不可变的?
=String类中使用了final关键字来修饰字符数组,
5 String、StringBuffer 和 StringBuilder 的区别是什么?
首先考虑可变性,由于String使用了final关键字来修饰字符数组,故不可变,而StringBuffer和StringBuilder是继承AbstractStringBuilder的,不使用final关键字,故可变,
然后考虑线程安全方面的问题,StringBuffer采用了同步锁,而StringBuilder并没有采用任何锁的机制所以StringBuffer线程安全
最后就是性能问题了,String在执行时,每次都重新创建一个新的String对象,性能最低,StringBuffer和StringBuilder是自己本身作为对象来引用,所以性能较高,但由于StringBuffer本身采用了同步锁的机制性能会稍微差一点,但也就比builder少%到%
6 自动装箱与拆
装箱:将基本类型用它们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;
7 接口和抽象类的区别是什么?
接口中的方法不能在接口中实现而抽象类没有限制,
一个类可以实现多个接口,但是一个类只能实现一个抽象类
接口中只能有static和final这两种变量,但是抽象没什么限制
接口中的访问修饰符默认为public但是抽象类允许除private之外的所有修饰符,至于为什么不要private是因为如果抽象类私有那么就没有存在的意义了
8 构造方法有哪些特性?
名字与类名相同,无返回值,但不能用void,创建类时自动调用
9 在调用子类构造方法之前会先调用父类没有参数的构造
方法,其目的是?
帮助子类初始化
10 == 与 equals 区别
本质上比较对象的地址是否相同,即这两个对象是否是同一个对象,而equals分为两种情况,一种是没有被类覆盖的情况,其作用与一样,但是若被类覆盖了则会直接比较内容而非地址了
11 你重写过 hashcode 和 equals 么,为什么重写 equals
时必须重写 hashCode 方法?
是为了提高效率,采取重写 hashcode 方法,先进行 hashcode 比较,如果不同,
那么就没必要在进行 equals 的比较了,这样就大大减少了 equals 比较的次数,