JavaWeb阶段性项目1:系统的servlet优化3

前置知识

前置准备

知识准备

已掌握JavaSE/MySQL/JDBC+HTML/CSS/JavaScript基础

并已完成了Javaweb前置知识的学习

01-JavaWeb-HTML初识

02-JavaWeb-CSS初识

03-JavaWeb-JavaScript初识

04-JavaScript基础应用-鼠标悬浮/离开表格格式变化

05-JavaWeb-Tomcat8安装、Servlet初识

06-JavaWeb-Servlet方法/生命周期、HTTP/会话session

07-JavaWeb-视图模板技术Thymeleaf的使用

08-JavaWeb-Servlet保存作用域

09-JavaWeb-阶段性项目1:最简单的后台库存管理系统

10-JavaWeb阶段性项目1:系统的servlet优化1 

11-JavaWeb阶段性项目1:系统的servlet优化2

资源准备

尚硅谷丨2022版JavaWeb教程视频

教学资源

https://pan.baidu.com/s/1TS7QJ_a2vHHmXkggAs8RMQ

提取码:yyds

servlet优化的过程3

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里一个个的方法,通过反射调用。

接下来会进行进一步优化

posted @ 2022-08-10 23:58  Fancy[love]  阅读(67)  评论(0编辑  收藏  举报