前言
最近在写个安卓私人助手应用,“关于本软件”页面我想直接加载一个网页,没想到接下来的事情让我很不解:输入网页的地址,没有报任何错,但是页面一直是空白的。按F12打开开发人员工具,如下图,也不见有什么报错呀!
其实这里已经有一点线索了,那就是响应头中Content-Type居然是application/json。纳尼?我不是要打开一个网页吗?为什么服务端给我返回application/json的数据,而不是text/html?
不过一开始我并没有抓住好这个关键点,就一直百度百度百度再百度。。。有说是过滤器的问题,有说是jar包冲突的问题,有说是Application contex的问题…总之五花八门,但就是和我的问题不沾边。无奈之下,我只能采用测试大法了。
测试寻找问题的过程
- 首先,我新建了一个web项目,里面没有什么内容,跑起来是可以打开网页的,由此可以推断,我的电脑环境没有什么问题。
- 然后尝试在里面导入所需的jar包,跑起来也没有什么问题,还是能打开网页。由此可以推断跟什么jar包冲突没有关系。
- 复制原来的项目中src下的所有代码至测试项目,再跑起来,发现打开的网页是空白的。没错,问题就在这了,是我写的代码有问题。
- 到这里其实我已经猜到bug在哪里了,就是我写了一个Servlet的基类,代码如下:
@WebServlet("/*")
public class LyyBaseServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("application/json;chartset=utf-8");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
protected void jsonResponse(HttpServletResponse response,Object o) throws IOException {
ObjectMapper mapper=new ObjectMapper();
mapper.writeValue(response.getOutputStream(),o);
}
}
为了减少重复代码,我把一些常用方法写在这个基类里了,但是这个类的注解@WebServlet("/*")是不应该写上的,你写上了的话,你访问的jsp、html其实都会进入到这个基类,这个基类没有返回任何内容,里面的application/json;chartset=utf-8就是F12开发人员工具里面的Content-Type。
结论
问题出现的原因是我写了一个Servlet的基类,并加上了WebServlet注解。解决页面空白的方法,就是去掉这个注解,与过滤器Filter无关。