Javaweb常见问题以及解决办法(持续更新)

文章列举了JavaWeb开发中遇到的各种问题,如端口占用、CSS样式不生效、Mapper接口多参数使用、IDEA配置Tomcat的URL路径问题、过滤器导致的资源加载失败、Tomcat日志乱码,以及请求和响应中文乱码的处理。还涉及图片加载、JS异步渲染、MyBatisSQL查看和上传图片后需重启服务器的问题,以及表单连续刷新的解决策略。
摘要由CSDN通过智能技术生成

目录

1.端口被占用

2.CSS样式无法生效

3.Mapper接口中多个参数使用时,容易出现的问题

4.IDEA中配置本地Tomcat,项目中url路径问题

5.添加完过滤器之后,页面的css样式,图片等不能生效

6.Tomcat日志中文乱码问题

7.解决响应数据和请求数据中文乱码的问题

7.1 response中文乱码

7.2 request中文乱码

8.Javaweb项目中,图片无法加载

1.打开Tomcat配置

2.部署外部源,选择项目下保存图片的文件夹

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的主要用途一般是运用在无刷新提交数据并做出响应的场景.可以保证页面不会自动刷新,数据能够正常提交.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值