昨天使用 IDEA 写一个 jsp+servlet 的小项目,结果上午运行的好好的,晚上就突然样式全都乱掉了。
┗( T﹏T )┛ 我太难了。
问题描述:jsp无法显示 bootstrap 样式,但功能完好。
先说结论:设置的乱码过滤器有resp.setContentType(“text/html;charset=utf-8”); 使得页面响应时带有<html></html>
标签,详情可以看下面。不想看,去乱码过滤器删除上面这句就行了。
详情:
一开始我以为是我的 jsp 里面路径写的不对,但是仔细检查发现完全是正确路径。
百度一番发现,这个问题要么是说 jsp 里面 的 CSS 和 JS 路径不对,要么就是让我清除浏览器缓存。
然而并没有什么卵用。
排除了路径问题和缓存问题,我还是找不到问题所在,终极办法:重建一个项目,cv代码。
然而并没有什么卵用。
行吧,这次我一个个包复制过去,清一次缓存,复制一个运行一次,换个浏览器再验证一次,然后又新建了一个项目,一个个包终于让我试出来了,在com.cslg.fxh.filter (过滤器包)中终于让我找到了问题所在。
@WebFilter(value = {"/*"})
public class CodeFilter implements Filter {
public void destroy() {
System.out.println("乱码处理过滤器销毁!");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");//问题所在
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
System.out.println("乱码处理过滤器启动!");
}
}
乱码过滤器
resp.setContentType(“text/html;charset=utf-8”); 这句话让我的css样式过不去。
原因分析:这句代码是在响应页面时让浏览器将响应解读成 text/html 的格式,但是我有些页面是不写html标签的。
详情:这是我的 index.jsp 的大体分布图。
这是我的 header.jsp,这是没有html标签和body标签的!!!
如果你在过滤器中使用 resp.setContentType(“text/html;charset=utf-8”); 并且配置为全局使用。
在页面输出时会变成这样,你的 CSS和JS无法进入一个html页面。因为乱码过滤器把你的响应页面设置成了html页面,所以输出时带有<html></html>
标签。
所以删掉 resp.setContentType(“text/html;charset=utf-8”); 一切都解决了。
问题来了:这句话上午也存在,运行时怎么就能正常显示呢???浏览器这么强能一直给我缓存着页面???