Servlet转发到html页面样式丢失的问题

在做书城项目的注册功能时需要实现: 在web层判断如果注册成功需要转发到注册成功页面regist_success.html

//调用service将用户信息保存到数据库
userService.registerUser(new User(null, username, password, email));
//跳转到注册成功页面
request.getRequestDispatcher("/pages/user/regist_success.html").forward(request,response);

但是转发到regist_success.html页面之后该页面原来的样式也丢失了

于是为了方面我使用get请求进行测试(浏览器地址栏中直接请求registerServlet:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/pages/user/regist_success.html").forward(request,response);
}

转发页面的结果如下:

这肯定是css样式文件路径的问题:

查看network中css文件的请求路径:

查看html代码中的请求路径:

<link type="text/css" rel="stylesheet" href="../../static/css/style.css" >

对比这三个路径可以发现html文件中的资源请求的相对路径是参照的浏览器地址栏中的地址:

http://localhost/book/registerServlet

这里由于服务端Servlet使用的是转发,所以浏览器地址栏中的请求地址没有改变,这也就导致了资源请求路径错误(我们预想注册成功的这个html页面是相对于自己在服务端的路径的)

项目路径:

解决方法:

  1. 在html的head标签中使用base标签,固定该页面中相对路径的参照路径
<base href="http://localhost/book/pages/user />
  1. Servlet中使用重定向:这样浏览器中的地址会与重定向的地址相同
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.sendRedirect("/book/pages/user/regist_success.html");
}
  1. 资源路径改为绝对路径(注意:如果是浏览器解析的地址,/ 表示 http://ip:port, 而在服务端 / 表示 http://ip:port/工程名)
<link type="text/css" rel="stylesheet" href="/book/static/css/style.css" >

PS:如果修改之后请求的结果还每个发生变化,要么就是改错了,要么就是浏览器有缓存

posted @ 2023-01-06 13:40  junlin623  阅读(98)  评论(0编辑  收藏  举报