在做系统的时候,也是遇到了一些坑,开始不是很熟练,然后慢慢查找资料慢慢解决了,这里将其列出来,以便以后可以绕开这些坑。
1、前端ajax、jQuery等问题
(1)在ajax与java后端传递数据的时候,传递给ajax的是一个data对象,ajax中调用对象中的属性的时候,属性名要一致,调用对象的数组属性的时候直接用data.num[i]的形式即可。主要是属性名要一致。
(2) 后端与ajax传递数据的时候,实体类的属性名首字母最好小写,这样不容易出错。
(3)ajax向后端传递参数的时候,在开始定义一个params,多个参数之间用逗号隔开。格式如下:
var params={
"num" : 1,//传递一个整数num,值为1
"string ": "dsfs",//传递一个字符串,值为dafs
};
(4)js中是无法使用Thymeleaf语法的,只能使用HTML语言
在js中,如果要跳转至某个页面,直接href=""或者链接src就行,不用th:href="",这样的形式。使用href表示的是向后端传递数据,因此内容是控制端的名称
(5)在使用webuploader插件进行文件的上传的时候,jQuery中设计到几个变量,uploader方法是实行文件的上传的具体方法。其方法中涉及到一个swf,这是webupload插件的一个插件,先要下载将其导入本项目中,然后在js里面设置swf为该文件的路径。另外,还有一个server,这个应该是一个PHP方法,即调入后台控制端,类似于ajax的URL一样,通过调入后台控制端将文件保存在项目中,或者保存在服务器中。
(6)控制端向js传递数据,可以现在后端将数据放在model中,然后在HTML中获取,并将其隐藏,然后再在js中获取其值。
HTML:<input type="hidden" th:value="${blogId}" id="Blog_ID"/>
js:var url_param = $("#Blog_ID").val();
(7)在js引用路径的时候,src中是不需要开头加一个/的,加不加效果都一样
(8)文件上传至项目中指定文件夹,但是文件夹内的内容不是瞬间更新,因此,当前端ajax调用这些文件的时候,是无法找到该文件的,只有当项目更新了文件夹里面有这些文件的时候才可以获取到。
(9)onclick出发事件的参数为this表示传递的参数为此标签本身。如
<a class="fancybox" href="javascript:void(0);"><img οnclick="selectImgPath(this)" style="width: 190px; height: 115px;float:left;margin-right:3px;" alt="image" src="www.baidu.com" /></a>
然后传递的参数就可以访问src的内容。如传递的参数为msg,调用src为msg.src表示的就是www.baidu.com
(10)src和href的区别:src用于替换当前元素,href用于在当前文档和引用资源之间确立联系。
src是source的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素。如<script src ="js.js"></script>当浏览器解析到该元素时,会暂停其他资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等元素也如此,类似于将所指向资源嵌入当前标签内。这也是为什么将js脚本放在底部而不是头部。
href是Hypertext Reference的缩写,指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接,如果我们在文档中添加<link href="common.css" rel="stylesheet"/>那么浏览器会识别该文档为css文件,就会并行下载资源并且不会停止对当前文档的处理。这也是为什么建议使用link方式来加载css,而不是使用@import方式。
2、Jpa分页的问题
(1) jpa进行分页查询的时候,按照某个属性列来进行查询的方法为;
@Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1 ORDER BY ?#{#pageable}",countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1", nativeQuery = true)Page<User> findByLastname(String lastname, Pageable pageable);
(2) 在调用查询所有进行分页的时候,是可以直接调用jpa的findAll方法的,参数为pageable,但是这里的以什么为正序倒序和上面不同,上面的是表明,这里的是对象的主键名,这里的名称要和对象中的属性名要一致,不然就会出现问题。也就是这里要为blogid(对象中的主键名就为blogid)
(3)jpa根据某列查询,并且查询得到的结果集是根据某具体页得到的结果
这种情况是和之前查询所有的结果集是不一样的,之前的是获取所有的结果传到表格中,表格中显示规定大小的数据集,点击下一页的时候自动显示相关页的数据。但是这里穿的参数是具体的某页,也就是说想要的返回的结果集是根据某具体页查询得到的结果。这种情况下处理的代码:
@Query(value="select * from blog where status =?1 ",countQuery="select count(*) from blog where status=?1",nativeQuery=true)
public Page<Blog> getBlogsByStatusForList(int status,Pageable pageable);
与之前的区别是这里没有将pageable参数传递到query中去,这样返回的结果集就是根据某具体页查询得到的结果
(4)在进行分页查询的时候,整个表的数据共有12条,查询所有的时候不会出现异常,将全部的数据都设为同一状态,即这种状态共有12条数据,根据这种状态进行查询的时候,就会出现异常。但是将这种状态的数据改为有9条的时候就不会出现异常。异常:java.lang.IllegalArgumentException: Could not locate ordinal parameter [2], expecting one of [1]
(5)jpa进行模糊匹配,并且进行分页查询。
示例:
@Query(value="select * from blog where status =?1 and key_word like CONCAT('%',?2,'%')",countQuery="select count(*) from blog where status=?1",nativeQuery=true)
public Page<Blog> getBlogsByStatusForList(int status,String key_word,Pageable pageable);
(6)在将json的page格式的字符串格式的内容转换为json对象,需要将page<>具体化,即创建一个对象实现page接口和Serializable接口。
(7)在使用jpa层的时候出现了Unknown column 'blogId' in 'order clause'错误,查询了下,这是在使用分页进行查询的时候,顺序是按照blogId进行排序的,不过这里的查询的是按照表中的blog_id这一列来进行倒序或者正序的。因此,这里的在sort类的参数中应设置的值为:blog_id。源代码如下:
Sort sort=new Sort(Direction.ASC, "blog_id");
Pageable pageable=new PageRequest(pageNumber-1, pageSize, sort);
4、spring boot框架的问题
(1)添加微服务的依赖的时候,需要注意spring boot的版本和eureka的版本问题,spring boot的版本与eureka的版本是一一对应的,版本不对就会不兼容,就会出现问题。为了使项目能够支持比较新的技术,最好使用最新版的spring boot和eureka。版本对应关系:https://blog.csdn.net/russle/article/details/80865288。这里给出依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/libs-snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
如果老的版本有些功能是不能支持的,比如spring boot1.x.x版本的就不支持jpa的分页功能,因此最好使用最新版本的spring boot和eureka。
(2)spring boot在创建spring cloud支持的时候需要的spring boot2.0.0以上的版本 所以需要将默认的2.1版本的改为2.0.0以上的版本,而有些版本是有问题的,如果遇到版本更新pom文件后依然出现问题,可以更改2.0.X的数字,例如,2、3、4等版本型号
(3)项目的热部署依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>true</scope>
<optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
</dependency>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
</configuration>
</plugin>
(4)在两个项目中的,一个项目读取另一个项目中的图片信息时,如果对象只是保存着该图片的相对地址,则在显示的时候如果路径仅仅是相对路径,就会无法显示路径,因为在另一个项目中相对路径是相对于本项目中的相对路径。
(5)运用security后js css等静态文件默认是会被拦截的,解决方案:https://blog.csdn.net/malachi95/article/details/53641541