除了网上的常见问题外,我这边还有一个找了一上午才发现的问题:8080端口被 multisim 这个流氓软件占用,将 tomcat 配置修改为占用8081端口就可以正常启动了。
在找不到问题并且 startup.bat 闪退时,可以用 notepad++ 在 startup.bat 最后一行加入 pause ,然后保存,再次运行,就可以看到闪退的原因。
IDEA启动Tomcat时控制台中文乱码1.在tomcat的VM Options中加入-Dfile.encoding=UTF-8。
2.IDEA 配置文件idea64.exe.vmoptions最后添加:-DFile.encoding=UTF-8
3.打开IDEA ,File->Settings->File Encodings ,编码统一UTF-8
请求和响应的中文乱码一定要在获取请求参数之前调用才有效
// 解决请求中文乱码问题
req.setCharacterEncoding("UTF-8");
// 解决响应中文乱码
resp.setContentType("text/html; charset=UTF-8");
请求转发和重定向
forward(转发):
是服务器请求资源,直接访问目标地址的URL,把URL对应的内容读取过来,再将这些内容发送给浏览器客户端。该URL必须是同一个web容器内的URL,并且可以访问到WEB-INF内的资源。因此转发是服务器行为
地址栏:由于跳转过程是在服务器内实现的,客户端并不知道这个跳转动作,客户端只做了一次请求,地址栏还是原来的地址。
数据共享:共用同一个request,可共享同一个request里面的数据。
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req, resp);
redirect(重定向):
服务器端向客户端发送302状态码和新的location,客户端发现是302响应,则自动重新发起一个新的http请求,该请求可访问服务器外的资源,但服务器内部的WEB-INF内的资源无法再访问。因此重定向是客户端行为
地址栏:每次重定向显示新的URL。
数据共享:浏览器至少发起两次请求,每次都是新的request,不能共享同一个request内的数据。
路径中 "/" 的解析在绝对路径中, “ / ” 的含义有两种解释:
(1)如果是服务器端解析,"/" 代表相对于当前web应用的绝对路径,即:协议名://服务器名(主机地址):端口号/项目名/,例如:http://localhost:8081/book/
(2)如果是浏览器端解析(出现在地址栏里的路径),"/" 代表相对于当前服务器的绝对路径,即:协议名://服务器名(主机地址):端口号/,例如:http://localhost:8081/
因此,在重定向时,需要获取当前项目的根路径,调用 req.getContextPath() 返回站点的根路径: /book。
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page");
然后将 /book/manager/bookServlet?action=page 交给浏览器解析,解析为 "http://localhost:8081/" + "book/manager/bookServlet?action=page",进而发起第二次请求。
浏览器刷新当用户提交完最后一次请求,浏览器会记录下最后一次请求。若此时用户使用功能键 F5(刷新网页),浏览器会再次发起记录下的最后一次请求。
用户在添加图书后会再显示新的图书列表,最后应该通过重定向发起list请求,与添加图书的请求分别为两个请求。则浏览器进行刷新时,只会重新发起list请求,而不会重复添加图书。
分页操作 MySQL的LIMIT begin, offset中的begin从0开始计数。
系统类加载器 在项目中加载jdbc.properties配置文件,初始化数据库连接池时需要使用 JdbcUtils.class.getClassLoader() 获取类加载器,不能使用ClassLoader.getSystemClassLoader() 获取类加载器。
Properties properties = new Properties();
// 读取 jdbc.properties属性配置文件
InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
// 从流中加载数据
properties.load(inputStream);
// 创建 数据库连接 池
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
因为 ClassLoader.getSystemClassLoader() 获得是 AppClassLoader,但是 tomcat 用的是 WebappClassLoader(打破双亲委派),资源目录在/WEB-INF/classes/下,想从 appClassLoader 实例上获取WebappClassLoader 上的资源是获取不到的,从而造成获取到的输入流 inputStream 是 null,程序运行到 properties.load(inputStream); 时会报空指针异常的错误。
java.lang.NullPointerException: inStream parameter is null