JavaWeb阶段性项目1:系统的servlet优化3
前置知识
前置准备
知识准备
已掌握JavaSE/MySQL/JDBC+HTML/CSS/JavaScript基础
并已完成了Javaweb前置知识的学习
04-JavaScript基础应用-鼠标悬浮/离开表格格式变化
05-JavaWeb-Tomcat8安装、Servlet初识
06-JavaWeb-Servlet方法/生命周期、HTTP/会话session
09-JavaWeb-阶段性项目1:最简单的后台库存管理系统
10-JavaWeb阶段性项目1:系统的servlet优化1
11-JavaWeb阶段性项目1:系统的servlet优化2
资源准备
教学资源
https://pan.baidu.com/s/1TS7QJ_a2vHHmXkggAs8RMQ
提取码:yyds
debug
首先检查一下单词拼写、字符标点有没有错误,通常IDEA会自动提示
运行
BUG1-404
DispatcherServlet的34行:InputStream cannot be null
解决方法:把applicationContext放在src目录下
BUG2-页面为空白
报错信息和视频中开头一样
在DispatcherServlet类中加上 method.setAccessible(true);
改this为controllerBeanObj
try {
Method method = controllerBeanObj.getClass().getDeclaredMethod(operate,HttpServletRequest.class,HttpServletResponse.class);
if (method != null){
method.setAccessible(true);
method.invoke(controllerBeanObj,req,resp);
}else {
throw new RuntimeException("operate值非法!");
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
BUG3-空指针异常
FruitController的177行出现空指针
super.processTemplate("index",request,response);
分析,首先FruitController不是servlet了,service方法也不会调用,就不能自动调用父类ViewBaseServlet的init方法,需要自己传ServletContext。通过xml文件,在fruitController对应的文件,用反射给它传入值。不过这个bug可以避免,但不是在这次的优化中。
//之前FruitServlet是一个Sevlet组件,那么其中的init方法一定会被调用
//之前的init方法内部会出现一句话:super.init();
private ServletContext servletContext ;
public void setServletContext(ServletContext servletContext) throws ServletException {
this.servletContext = servletContext;
super.init(servletContext);
}
经过以上优化,最终我们得到了一个DispatcherServlet,它作为真正的Servlet组件,处理所有以.do结尾的请求;再从servletpath里得到/fruit.do,调用fruitcontroller里一个个的方法,通过反射调用。
接下来会进行进一步优化