1. servlet中@webServlet注解出错导致404
问题描述:我自己写了一个jsp的表格用post请求访问Servlet,但是不管路径怎么写都不对,一直报404错误
bug原因及解决方法:@WebServlet注解里的name属性对应着<servlet-name>,我只写了name,没有配置<url-pattern>(路径就对应于这个),<url-pattern>对应的注解是urlpatterns或者value,value介意省略不写。所以修改@WebServlet里面的值就好了。
@WebServlet(name="Cservlet",urlpatterns="/CServlet"); //第一种写法,使用urlpatterns属性
@WebServlet("/CServlet") //第二种写法,使用value属性
更多字段可以去官网查询 https://docs.oracle.com/javaee/7/api/ 查找javax.servlet.annotation中的WebServletbin
2.在远程登录服务器安装tomcat cd进入bin目录失败,提示Permission denied
解决方法:获取root权限
命令行输入:sudo -i
3. ubuntu安装tomcat9失败,shutdown关闭失败
如图所示,我在腾讯云购买的服务器上安装jdk11和tomcat,安装完成后显示tomcat start(查看线程发现并没有运行),但是关闭时失败。显示 ./catalina.sh: 1: eval: /usr/local/java/jdk-11.0.2/jre/bin/java: not found
打开tomcat的图片
关闭tomcat的图片
bug原因:jre的目录不存在,因为jdk11包含了jre,不在另外安装jre目录了。
解决方法:把环境变量里的jre删除(或者把JRE_HOME=JAVA_HOME),环境变量里只需要填JAVA_HOME和PATH。我是这么做的
在/etc/profile.d下创建javajdk.sh文件并编辑环境变量,点击i是输入模式,按esc再按:wq保存退出 ctrl+G是跳转到最后一行
vim /etc/profile.d/javajdk.sh
输入下列配置
export PATH=$PATH:/usr/local/java/jdk-11.0.2/bin
export JAVA_HOME=/usr/local/java/jdk-11.0.2
export J2SDKDIR=/usr/local/java/jdk-11.0.2
使配置文件生效
source javajdk.sh
重新打开tomcat和关闭的截图
下面这张图是查看tomcat进程
4 . intellij idea创建多后缀目录时不在同一级的问题
我是刚用上intellij来创建项目,本来应该是在src下创建三个同级的包(cn.svllen.user.dao,xn.svllen.user.domain,cn.svllen.user.servlet)但是发现竟然创建的好几个包不是同级的,而是被折叠了 ,如下图所示
解决方法:点击project右边的长得像“设置”的按钮,单击“Flatten Packages”,勾选上这个选项,就可以了。效果在第二张图
ps:我的版本是2018 3.1版本,之前的版本好像是另一个选项,但是也在设置按钮中,选项名称是“Hide Empty Middle packages” 。详情请看csdn的用户 朱智胜 的文章https://blog.csdn.net/wo541075754/article/details/76735019
5.intellij 导入jstl
在我写关于jsp的例子时,在写core标签库时爆红,最后发现是没有导入jstl。
首先是下载jstl的包,这个直接百度吧。我也提供了我使用的版本(解压缩的)
链接:https://pan.baidu.com/s/1LUdwy6l15ocDvAyL1Db9NQ
提取码:6l17
ctrl+Alt+s打开Settings界面---》导航框里直接输入DtD,打开Schemas and DtD选项
点击右边的+号,出现文件选择框
URL中输入http://java.sum.com/jsp/jstl/core,File:是你下载的jstl包中的c.tld位置,具体路径看下图
接下来就是将jstl的lib目录下的两个jar包导入到项目中,怎么导我这里就不说了,谷歌一下intellij 怎么导包就知道了。或者参考我的另外一篇文章https://blog.csdn.net/Vibugs/article/details/85246420
6.hibernate配置核心文件(hibernate.cfg.xml)时填写driver的值com.mysql.jdbc.Driver报红
如标题所示的问题,最后解决了,原来是我没有导入mysql包
解决方法:导入mysql的jar包,导包方法可以参考我另外一篇文章里讲述的https://blog.csdn.net/Vibugs/article/details/85246420
7. 使用hibernate配置数据库连接时失败报错
报错语句:aused by: java.sql.SQLNonTransientConnectionException: Cannot load connection class because of underlying exception: com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the connection string near '=Asia/Shanghai'.
我使用的是hibernate 5.1.17的版本,mysql是8.0.11.我之前项目平时使用的DRIVER和url都是连接正常的,但是到了hibernate就不对了
我平时使用的
Driver:com.mysql.cj.jdbc.Driver
url:jdbc:mysql://localhost:3306/hibernate?useSSL=false&serverTimezone=Asia/Shanghai
问题所在:反正肯定是Driver和URL错了,最后发现是URl错了(在hibernate错,不代表其他地方是错的)
解决方法:
hibernate.cfg.xml 将url更改为:
jdbc:mysql://localhost:3306/hibernate?useSSL=false&serverTimezone=UTC
完整的hibernate.cfg.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--连接数据库的基本参数 -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?useSSL=false&serverTimezone=UTC</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">mima</property>
<!--配置hibernate的方言 指定这是哪个数据库-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 下面是可选参数-->
<!-- 打印sql,可以实现将sql语句打印到后台-->
<property name="hibernate.show_sql">true</property>
<!--格式化sql:让上面打印的sql语句更好看,不然默认是都整合为一行 -->
<property name="hibernate.format_sql">true</property>
<!-- 告诉hibernate你的映射文件在那里-->
<mapping resource="com/svllen/hibernate/demo/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
你如果使用的hibernate是5.3的话,可能你连接数据库的方法有错误(我也没验证过,是在一篇博客中发现的)。以下是解决方法
更改你的调用数据库方法
注释的代码都是之前的代码
//1.加载Hibernate的核心配置文件:hibernate.cfg.xml
//Configuration configuration = new Configuration().configure();
// configuration.addResource("com/svllen/hibernate/demo/Customer.hbm.xml");
StandardServiceRegistry sr=new StandardServiceRegistryBuilder().configure().build();
SessionFactory sessionFactory=new MetadataSources(sr).buildMetadata().buildSessionFactory();
//2.创建一个SessionFactory对象:类似于JDBC中连接池
//SessionFactory sessionFactory = configuration.buildSessionFactory();
//3.通过SessionFactory获取到Session对象:类似于JDBC中的Connection
Session session = sessionFactory.openSession();
//4.手动开启事务
Transaction transaction = session.beginTransaction();
//5.编写代码
Customer customer = new Customer();
customer.setCust_name("张三");
customer.setCust_industry("农业");
customer.setCust_phone("12345");
customer.setCust_level("老总");
session.save(customer);
//6.提交事务
transaction.commit();
//7.资源释放
session.close();
sessionFactory.close();
}
8.struts2配置出错,报struts-core的jar错误。tomcat运行显示500状态码
如图所示
我的struts版本为:2.3.37 jdk:11 tomcat:9
问题所在:应该是jdk的版本跟struts2的版本冲突(但是我为啥另一个项目没有报错呢。。。也是struts2的项目)
解决:将这个项目的jdk版本改为1.8.
打开Project Structure-Modules,更改当前项目的jdk版本
如果这一步改了报错:Error:java: 无效的源发行版: 11。那就将project的jdk一起改了
解决了。不知道更改struts2的版本有没有效。
9.Mybatis一对一中resultMap对两个表的id识别错误
这说的有点拗口。其实就是我在试Mybatis实现一对一关系时,创建两张表(user和orders),两张表的主键id都是一样的名称“id”。然后调用resultMap显示时,因为显示两张表的内容,我已经规定好了表的类型了,但是还是错误了。user的主键变成了orders的主键(上图看错误地方吧)
SQL语句
错误结果:User中的id应该为1
表中的数据
挺纳闷的,我在resultMap中都指定了type了,不应该错啊。不知道算不算mybatis的bug
问题所在:应该是混淆了id,分不清哪个是哪个
解决方法:两种,一种是修改数据库中id主键的名字,这样就不会混淆了。第二种就是查询的时候赋予两个表的主键不一样的别名。推荐第二种吧
修改sql语句
SELECT
o.id as order_id,
user_id, number, createtime, note,
u.id as user_id,
username, birthday, sex, address
FROM orders o, user u WHERE o.user_id = u.id and o.id=#{id}
修改resultMap映射中的内容,将id那一列的column都换成上面起的别名(如图,本来两个都是id的)
10.查询数据报错:bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'unite_rp.b.LOGIN_NAME' which is not functionally dependent on columns in GROUP BY clause
这个bug出现的也比较坑 我使用了
11. 对象参数中某个值后端无法接受
---
问题描述:
我最近在修改一个接口,这个接口是POST接口,参数封装在类中。需要在类里面添加几个参数,然后有一个类后端始终接受不到,为null
问题原因:原来是这个参数的名称格式问题 第一个大写字母前不能就一个小写
解决:改个名称 反正不能是首字母小写后马上跟一个大小字母