学习request综合练习中的问题
在学习servlet的request的时候,我们编写了一个较为综合性的代码,要求如下:
一 要求
1.在html页面上创建两个输入框,分别输入用户名和密码,点击登录,访问数据库,
2. 用户名和密码如果存在,显示:xxx,欢迎你,如果不存在,显示登录失败 .
二 需求分析加代码
1.导入jar包(druid数据库连接池jar包(1个),Jdbctemplate对象简化JDBC操作的jar包(5个), JDBC注册驱动jar包(1个),BeanUtils工具jar包(1个))
2.准备html页面,表单里面包含2个输入框(用户名和密码)和一个提交按钮
3.创建数据库的表,表里面添加id,用户名,密码字段,并添加一些数据.
4.创建一个User用户实体类
5.写一个JDBCUtils工具类,用来获取数据库连接池对象和获取连接
6.写一个数据库操作的类,使用Jdbctemplate操作数据库
7.写一个测试类,测试一下上面的查询方法,正确状态下返回User对象,错误状态下返回null. 截止到这里,我们测试的结果是正确的,可以从数据库请求到对应的内容并封装为user对象,如果查询错误内容会返回null,满足我们的要求
8.编写Servlet类,继承HTTPServlet,重写dopost()和doget(),首先设置post获取方式的字符编码问题, 获取用户的请求数据,封装在一个map集合里面 使用BeanUtils(导包)工具类,使用apacher的类,使用存放数据的map集合和创建的一个空的User对象, BeanUtils.populate(user,map),将获取的参数封装成一个用户实体类对象,调用操作数据库类中的登录方法 获取返回值,做出判断.
在这servlet类中,调用loginCheck()方法,始终报错空指针异常
9.根据返回结果,使用request对象实现两种情况的请求转发 成功:请求转发到SucessServlet页面,并获取共享数据(用户名),显示:用户名,恭喜你登陆成功 失败:请求转发到FailServlet页面,显示登录失败
讨论的问题:
- 使用ClassLoader的静态方法getSystemResourceAsStream(String name)和使用 类名称.class.getClassloader.getResourceAsStream(String name)在加载字节码文件进内存获取输入流时候的区别?
- Tomcat部署web项目地址和工作空间地址的区别.
两个问题之间息息相关,是导致本次出错的主要原因.
解释:
在学习JDBC的时候,我们使用druid连接池去查询数据库的时候,使用的druid.properties文件,始终是放在项目的src文件下面,我们使用ClassLoader.getSystemResourceAsStream(“druid.properties”)获取到输入流对象,然后加载到Properties集合中,进而使用DruidDataSourceFactory.createDataSource(pro)获取到数据库连接池对象,进行查询,这一切都是没有问题的,这也验证了我们在第7步使用Junit单元测试的时候为什么获取的结果是正确的.
但是,在使用servlet调用这个方法的时候,我们无法获得返回的user对象,还报错空指针异常.我们先说一下工作空间和Tomcat部署的web项目位置的区别:
工作空间:web项目存在于电脑的位置.
Tomcat部署的web项目位置:在工作空间的out文件夹下面.里面包含了原src目录下的.xml文件和.properties文件以及编译之后生成的.java文件,也就是web项目下的web文件夹里面的内容.
也就是说,在服务器启动之后,原本src目录下的.java文件和.xml文件以及.properties文件都存放到web文件夹下面.
而使用ClassLoader的静态方法getSystemResourceAsStream(String name)只能获取到src目录下的配置文件,在服务器开启之后,.properties文件被存放到web文件夹下,使用该方法找不到对应的properties文件,所以会报错.在Junit单元测试里面,是没有开启服务器的,所以还可以找到该配置文件.
所以我们不可以使用这个方法,那么使用类名称.class.getClassloader.getResourceAsStream("/druid.properties")的方式,默认则是从ClassPath根下(WEB-INF\classes这个目录下)获取.