当前位置 : 主页 > 编程语言 > 其它开发 >

JavaWeb书城项目遇到的一些问题

来源:互联网 收集:自由互联 发布时间:2022-05-30
遇到的问题因端口冲突Tomcat服务器启动失败 ​除了网上的常见问题外,我这边还有一个找了一上午才发现的问题:8080端口被 multisim 这个流氓软件占用,将 tomcat 配置修改为占用8081端口
遇到的问题 因端口冲突Tomcat服务器启动失败

​ 除了网上的常见问题外,我这边还有一个找了一上午才发现的问题: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/

转发和重定向的区别: 发生在浏览器还是服务器 "/" 的解析 转发[request] 发生在服务器端 http://localhost:8081/book/ 重定向[response] 发生在浏览器端 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
上一篇:设计原则之DRY原则
下一篇:没有了
网友评论