Java Web 相关:
Spring 框架相关:
Struts2中的action功能相当于一个servlet,只是使用起来比servlet灵活。在struts.xml配置中,有package的概念,一个package中可以存放多个action元素。问题在于: 这种方法调用一个action和调用一个类似乎没有太大的区别,那么这种设计是为了什么呢?
Action相当于MVC中的控制层
DOCTYPE标签可以指定如何解析文档内容
hibernate框架意味着不用自己写sql语句了
spring中@ResponseBody所标记的函数返回的就是json对象,因此在本地js中不用再对取得的数据进行解析。
springboot项目里面访问静态资源时:
如果路径前面加上”/“的话就能唯一地从static目录下找到静态资源(相当于绝对路径)如果不加的话就是相对路径访问,那么在static下就不一定能找到静态资源了
比如在页面”/staff/mainPage”下访问静态资源时采用”js/jquery.js”这种相对路径的方式,那么实际上框架会去”static/staff/js/“目录下查找这个jquery文件;而使用”/js/jquery.js”这种绝对路径的方式,那么框架会去”static/js/“目录下去查找这个jquery文件。
SpringMVC中ajax传递数据可以自动封装成对象传递到Controller中,使用原理?
SpringMVC通过ajax向后端传值,在ajax中指定传输的contentType,并且在后端使用@RequestBody接收,就可以自动组装成为一个对象。
使用spring-data-jpa的时候,实体类之间会有多对一的映射关系,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
"customer") (name =
public class Customer {
private int id;
private boolean isCompany;
private String tag;
private boolean isPotential;
private String address;
(cascade=CascadeType.ALL)
"contact_id") (name =
private Contact representative;
//多对一关系,一个salesman可以对接多个Customer对象
(cascade=CascadeType.ALL)
"salesman_id") (name =
private Staff salesman;
private String mainBusiness;
private String name;
private int type;
public Customer(){
}
}这个时候如果要新增或者更新一个Customer对象,那么在给Customer中的salesman对象赋值的时候,就会报如下错误:
detached entity passed to persist:
这个错误是因为Staff类的id项是用@GeneratedValue定义的,所以如果尝试给salesman的id赋值就会产生这个错误。但是实际上一个单独的实体类是可以给用@GeneratedValue定义的id赋值的,而且在spring-data-jpa中给出的update数据的方法就需要先给id赋值,之后再调用save()方法来进行更新操作。
最后的解决方法是把代码:
1
(cascade=CascadeType.ALL)
换成了:
1
(cascade=CascadeType.MERGE)
具体原因不是很清楚,应该是在使用ALL配置时的保存更新方案相对于MERGE来说更严格一点。顺便在此贴上级联种类的区别和功能:
CascadeType.MERGE级联更新:若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的merge方法。
CascadeType.PERSIST级联刷新:获取order对象里也同时也重新获取最新的items时的对象。对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据。
CascadeType.REFRESH级联保存:对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法。
CascadeType.REMOVE级联删除:对order对象删除也对items里的对象也会删除。对应EntityManager的remove方法。
CascadeType.ALL:包含上述所有配置。
spring-data-jpa中有@ManyToOne等类型的映射标签,需要谨记的是,如果一个类中并没有内嵌另一个类,或者说两个类之间没有强关联的话,尽量不要使用此类标签,因为此类标签的使用会使得在取出某个类的实体的时候顺带取出映射类的实体的全部信息,将给数据库造成很大负担。比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
"staff") (name =
public class Staff extends People{
private Integer id;
private String role;
private String password;
(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
"staff_id") (name =
private List<Route> routes;
}在取出这个Staff实体类的同时,会取出与这个Staff相关联的route的信息,但实际上并不是每次取出Staff类都会用到route类的,因此就会给数据库造成负担。
JS 前端相关:
ajax传递的data数据在SpringMVC中可以被封装成一个对象,这个思路可以参考 jquery传递对象参数到Spring Controller 这篇文章。
在参照这篇文章的时候,ajax传递data时会产生: Failed to load resource: the server responded with a status of 400 这个错误,一开始以为url写错了,后来发现不是404错误而是400,百度的结果是:表单提交的内容数据类型与实体的(也就是数据表字段)的数据类型不匹配导致的。
我根据这个提示修改了data中的数据类型,但还是出现这个问题,jquery的ajax代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22var isMale;
if ($("input[name='sex']:checked").val() == "man"){
isMale = true;
} else {
isMale = false;
}
$.ajax({
type : "POST",
url : "/staff/modifyStaff",
data : {
name : $('#name').val(),
age : parseInt($('#age').val()),
sex : isMale,
address : $('#address').val(),
email : $('#email').val(),
phoneNumber : $('#phoneNumber').val()
},
dataType : "json",
success : function (result) {
}
});实际上代码没有什么错误,但是因为session和ajax的问题,用ajax请求异步刷新页面以后,session并不会刷新
jquery中,较低的版本使用attr()方法来控制input等元素的属性,但是在较新的版本中,推荐使用prop()方法来代替attr()方法。因为在使用jquery的过程中,就有遇到使用attr()方法出现bug,而改为prop()方法以后bug就消失的情况。
在使用thymeleaf模板引擎的时候,遇到了解析js代码出错的情况,在console中的提示错误是:元素内容必须由格式正确的字符数据或标记组成。指示发生错误的代码行是:
1
for (y=1900; y<2017; y++){}
具体错误是 y<2017 的小于号,总之是个莫名其妙的错误。
解决方法是把原来的js代码当成外部文件引用进html中。在使用dataTables这个js plugin的时候,调用api的时候要使用.api()来调用,如果像官网上一样调用会报错。官网的调用如下:
1
2var table = $('#dataTables-example');
table.ajax.url('').load();正确的调用如下:
var table = $('#dataTables-example'); table.api().ajax.url('').load();
js函数传参,如果直接获取表单值进行传参可能导致null,这和js类型策略有关。。。。
在ajax的success函数中无法获取表单值
ajax的选项async表示是否异步处理,默认是异步,如果存在两个以上的ajax请求,那么多个ajax请求会同时处理,即不会顺序处理。
从后端传到前台的自定义类对象都会被js转换成json格式的数据。
通用知识点:
字段和属性的区别:
最主要的区别是属性可以有get和set方法(get、set访问器),而字段只是类内部的一个类成员。句柄的大概解释知乎链接
用例图,顾名思义最重要的是用例的表述,所以图中画出的应该都是用例,即应该是能够使用的一个功能。比如(活动信息)就不能作为一个用例,而应该改为(活动信息维护)或者(维护活动信息),大概的区别就是名词和动名词。
wireshark抓包只能抓到经过网卡的流量,而localhost是本地回环访问,因此不经过网卡,所以wireshark无法抓到本地的包,通过把winpcap换成npcap就可以了。
ping在同一个WiFi下的电脑,会无法ping到导致一直丢包,解决方法是在防火墙中开启入站规则(ICMP)等相应选项,具体操作可见百度经验。