目录
9.JS异步渲染到页面中的元素,写在window.onload里面无法获取到的原因以及解决办法
10.使用MyBatis框架,查看最终执行的SQL语句的方法
11.JavaWeb从本地磁盘上传图片之后,必须重启服务器才能显示的解决方法.(上传方法在另一篇博客,可以参考)
12.提交表单数据页面连续刷新两次,数据无法提交的解决办法.
1.端口被占用
注意:不要使用cmd快捷命令打开黑窗口,否则会产生权限不够的问题.以管理员身份运行.
2.CSS样式无法生效
浏览器会缓存原有的CSS样式,导致新改的样式无法生效,清除浏览器的缓存即可.
3.Mapper接口中多个参数使用时,容易出现的问题
参数无法识别,需要在每个参数前面加上@Param()注解
即使用多个参数时,需要加上@Param()注解
4.IDEA中配置本地Tomcat,项目中url路径问题
该处的路径,是访问项目中资源的路径.
5.添加完过滤器之后,页面的css样式,图片等不能生效
添加过滤器之后,项目访问外部css样式,图片的路径也会被过滤器拦截,导致样式,图片失效.
解决办法:
可以将需要放行的资源路径存在数组里面,如果当前访问的资源路径,包含数组里存的路径,则放行.
6.Tomcat日志中文乱码问题
1.找到apache-tomcat目录下的conf目录,找到里面的logging.properties文件.
2.将文件出现的UTF-GBK,或注释掉里面出现UTF-8的语句,两种方法都可以.
7.解决响应数据和请求数据中文乱码的问题
前端页面获取后台的响应数据中如果包含中文,会产生乱码问题.并且前端页面请求体中如果包含中文,后端获取的数据也会有中文乱码.
两种中文乱码解决方式如下
7.1 response中文乱码
resp.setContentType("text/html;charset=utf-8");
7.2 request中文乱码
//获取请求数据
BufferedReader br = req.getReader();
String json = br.readLine(); //JSON字符串
//解决请求参数中文乱码问题
byte[] CN = json.getBytes(StandardCharsets.ISO_8859_1);
json = new String(CN, StandardCharsets.UTF_8);
8.Javaweb项目中,图片无法加载
环境:本地Tomcat服务器.
1.打开Tomcat配置
2.部署外部源,选择项目下保存图片的文件夹
9.JS异步渲染到页面中的元素,写在window.onload里面无法获取到的原因以及解决办法
let shoppingAccount1;
axios({
method: "get",
url:"http://localhost:8080/Java_war/user/indexshow"
}).then(function (resp){
shoppingAccount1 = resp.data;
//查询用户已经支付的商品的信息
axios({
method:"get",
url:"http://localhost:8080/Java_war/shopping/selectFinishMoneyServlet?shoppingAccount="+shoppingAccount1
}).then(function (resp){
let formData = resp.data;
for(let i = 0 ; i < formData.length ; i++){
bookList.push(formData[i]);
}
// 已经支付
finishData(pageNum)
})
})
//end
// 更新已经支付订单的页面数据
function finishData(n){
const listGroup = document.querySelector(".has-gutter-information");
const pagination = document.getElementById("pagination");
// 清空所有数据
listGroup.innerHTML = '';
// 循环遍历每一条数据
for (let i = (n - 1) * limit; i < n * limit; i++) {
const obj = bookList[i];
maxPage = Math.ceil(bookList.length / limit);
// 如果有值才添加到元素中。
// 防止在最后一页时,数据条数小于limit,获取的obj为undefind,出现报错。
obj && (listGroup.insertAdjacentHTML(
"beforeend",
`<tr class="isContents contentFinish">
<th colspan="1" rowspan="1" class="el-table_1_column_1 el-table-column--selection is-leaf">
<div class="cell">
<input type="checkbox" aria-hidden="false" class="el-checkbox__original" value="">
</div>
</th>
<th colspan="1" rowspan="1" class="el-table_1_column_2 is-leaf">
<div class="cell">
<img src="${obj.brandImg}" alt="" class="brandCarImg">
</div>
</th>
<th colspan="1" rowspan="1" class="el-table_1_column_3 is-leaf">
<div class="cell">${obj.brandName}</div>
</th>
<th colspan="1" rowspan="1" class="el-table_1_column_4 is-leaf">
<div class="cell">${obj.receiptAddress}</div>
</th>
<th colspan="1" rowspan="1" class="el-table_1_column_5 is-leaf">
<div class="cell">${obj.price}</div>
</th>
<th colspan="1" rowspan="1" class="el-table_1_column_6 is-leaf">
<div class="cell">${obj.addressee}</div>
</th>
<th colspan="1" rowspan="1" class="el-table_1_column_7 is-leaf">
<div class="cell">${obj.brandNumber}</div>
</th>
<th colspan="1" rowspan="1" class="el-table_1_column_8 is-leaf">
<button class="table_btn finish_remove">删除</button>
</th>
<th class="gutter" style="width: 0px; display: none;"></th>
</tr>
`)
)
}
console.log("支付页面加载完毕");
// 更新当前页数和总页数
pagination.innerHTML = `共${maxPage}页,当前${pageNum}页`
// 执行完之后的方法
getList()
}
通过axios发送异步请求,查询数据,并渲染到页面中之后,使用window.onload是无法获取到动态渲染上的数据的.
原因: 数据是动态异步加载的,必须要等数据加载完毕之后再去获取渲染到页面上的元素,要把获取写在页面执行之后.
解决办法:在渲染页面的方法最后获取添加的元素.
//当页面全部加载完成之后,开始实现功能
let getList = function(){
console.log("全部页面加载完成");
//已经完成页面
//获取删除按钮 已经该删除按钮所对应的全部的商品信息
const finishRemoves = document.querySelectorAll(".finish_remove");
const contentFinishs = document.querySelectorAll(".contentFinish");
console.log(finishRemoves.length);
console.log(contentFinishs.length);
for(let i = 0 ; i < finishRemoves.length ; i++){
console.log(i);
}
}
10.使用MyBatis框架,查看最终执行的SQL语句的方法
在mybatis的XML文件中,添加一句话
<settings>
<!-- 打印查询语句 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<configuration>
<!-- 打印执行的Sql语句-->
<settings>
<!-- 打印查询语句 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
</configuration>
11.JavaWeb从本地磁盘上传图片之后,必须重启服务器才能显示的解决方法.(上传方法在另一篇博客,可以参考)
原因:因为在启动服务器进行时,上传的文件夹里面并没有该图片.需要重启服务器之后才能显示上传的图片.
解决办法:
/**
* @ClassName StaticFileServlet
* @Description TODO
* @Author Geordie
* @Date 2023/7/8 20:25
* @Version 1.0
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class StaticFileServlet extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String filePath = request.getPathInfo();
//文件存放地址,
String realPath = "存放图片的文件夹的路径" + filePath;
File file = new File(realPath);
if (file.exists() && file.isFile())
{
String mimeType = Files.probeContentType(Path.of(realPath));
response.setContentType(mimeType);
response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\"");
response.setContentLength((int) file.length());
//读取文件
//获取response字节输出流
try (InputStream inputStream = new FileInputStream(file);
OutputStream outputStream = response.getOutputStream())
{
//完成流的copy
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1)
{
outputStream.write(buffer, 0, bytesRead);
}
}
}
else
{
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
}
并且在web.xml中配置Servlet的访问路径
<servlet>
<!-- Servlet的名称-->
<servlet-name>StaticFileServlet</servlet-name>
<!-- Servlet的全类名-->
<servlet-class>com.zyf.web.servlet.StaticFileServlet</servlet-class>
</servlet>
<!-- Servlet访问路径-->
<servlet-mapping>
<!-- Servlet的名称-->
<servlet-name>StaticFileServlet</servlet-name>
<!-- Servlet的访问路径-->
<url-pattern>/upload/images/*</url-pattern>
</servlet-mapping>
12.提交表单数据页面连续刷新两次,数据无法提交的解决办法.
form表单会有一个默认的提交行为,会导致页面刷新.可以做一个表单假提交来解决这个问题.
<iframe src="" frameborder="0" name="iframeName" style="display: none;"></iframe>
<form target="iframeName">
<button>提交</button>
</form>
iframe的主要用途一般是运用在无刷新提交数据并做出响应的场景.可以保证页面不会自动刷新,数据能够正常提交.