javaEE学习之bug汇总(持续更新03.28)

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&amp;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&amp;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

 

问题原因:原来是这个参数的名称格式问题 第一个大写字母前不能就一个小写

 

解决:改个名称 反正不能是首字母小写后马上跟一个大小字母

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值