Bootstrap

Java EE问题、知识点整合(持续更新)

目录

The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone

tomcat安装-startup文件一闪而过

错误原因:

报错java.lang.NoSuchMethodError: javax.servlet.http.HttpServletResponse.getStatus()I

怎么样在方法里面得到 Request,或者 Session?

Spring+mybatis错误:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding. 

SpringMVC从一个controller跳转到另一个controller的方法 

1.MyBatis Generator自动生成的mapper只有insert方法

2.MyBatis Generator自动生成的实体类有一大堆奇奇怪怪的表

清空session中保存的内容 

equals和==在用于String类型时的区别

SpringMVC的forward和redirect

在项目中修改了js/css文件,重部署调试项目时却不刷新

 JSP页面向Servlet传值方法

java: 不兼容的类型: java.lang.String无法转换为com.sun.org.apache.xpath.internal.operations.String

[Mybatis] java.lang.UnsupportedOperationException异常

记录一个好玩的题外小知识

前端页面中如何使用emoji?

java中List集合为空与List集合为null的区别

java中string和int互相转化

java向上向下取整方法的问题

如果文本框中是空的,那么request.getParameter得到的什么值?

dispatcherServlet拦截所有请求时,requestMapping中的请求路径没有打错,却报404错

IDEA编译器创建web项目时没有web.xml文件

Eclipse编译器安装SVN的几种方式 

报错:HttpServletResponse cannot be resolved to a type 

mysql导入数据时报:

Using a password on the command line interface can be insecure.

乐观锁、悲观锁的解释和实现原理

IDEA 'Error:java: 无效的源发行版: 10' 解决方案

IDEA错误:Cannot start compilation: the output path is not specified for module "poi". Specify the out

Unsupported major.minor version 52.0

 java中int型和Long型的互相转换

javax.persistence.Table.indexes()

java.lang.OutOfMemoryError: Java heap space异常

Spring 的@Column 注解 及其属性参数


The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone

错误原因:

使用原mysql5.1.38不会出现该问题
因使用了Mysql最新版驱动所以报错

解决方案:

方案1:在项目代码-数据库连接URL后,加上 (注意大小写必须一致)
?serverTimezone=UTC

jdbc:mysql://localhost:3306/loldb?serverTimezone=UTC

方案2:直接把新版本的mysql驱动改用回旧版本

参考:https://www.cnblogs.com/shanelau/p/7041293.html


tomcat安装-startup文件一闪而过

错误原因:

tomcat在启动时,会读取环境变量的信息,需要一个CATALINA_HOME 与JAVA_HOME的信息,CATALINA_HOME即tomcat的主目录,JAVA_HOME即java安装的主目录,jdk的主目录,本次我是缺少了JAVA_HOME环境变量

解决方案:

在系统环境变量中添加JAVA_HOME变量,变量值如上所述 

参考:https://blog.csdn.net/znn626/article/details/7893555


报错java.lang.NoSuchMethodError: javax.servlet.http.HttpServletResponse.getStatus()I

错误原因:

Spring V4.1.0+的版本在不支持Servlet3.0的应用服务器上跑时会报以下错误:

NoSuchMethodError: javax.servlet.http.HttpServletResponse.getStatus()I 

比如说:tomcat 7以下的版本、jboss 4.2.3以下的版本

解决方案:

方案1:退回到Spring V4.0.7

方案2:升级应用服务器到支持Servlet3的应用服务器。(比如tomcat7+(最好是tomcat8+)、jboss as 7+)

 参考:https://www.cnblogs.com/guanghuiqq/p/6639164.html


怎么样在方法里面得到 Request,或者 Session?

在方法的形参中声明HttpServletRequest

(注:前提需要Servlet-api包,否则会报Cannot resolve symbol错)


Spring+mybatis错误:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding. 

错误原因:

忘了使用@Param。当只有一个参数时,Mapper中可以不使用:

public void insertAdmin(String username);

但是有多个参数时必须用:

public void insertAdmin(@Param("username")String username,@Param("password")String password);

 解决办法:

在方法的参数前加上@Param注解

参考:https://www.cnblogs.com/jpfss/p/6957647.html


SpringMVC从一个controller跳转到另一个controller的方法 

错误原因:

方法返回值直接返回了"toLogin.do"

解决办法:

使用forward跳转,即将方法返回值改为"forward:toLogin.do" 


1.MyBatis Generator自动生成的mapper只有insert方法

2.MyBatis Generator自动生成的实体类有一大堆奇奇怪怪的表

错误原因:

用了较高版本的mysql-connector驱动包导致的(坑)

解决办法:

换成较低版本的,本次换成了5.1.21后就不再有这些问题 


清空session中保存的内容 

问题背景:

不知道如何清除session里保存的所有内容

解决办法:

  • 用getAttributeNames来得到所有属性名,然后再removeAttribute
     private void initSession(HttpServletRequest request){
      Enumeration em = request.getSession().getAttributeNames();
      while(em.hasMoreElements()){
       request.getSession().removeAttribute(em.nextElement().toString());
      }
     }

     

  • 直接使用session.invalidate()是让SESSION失效

参考:https://www.cnblogs.com/ning-blogs/p/4670049.html 


equals和==在用于String类型时的区别

问题背景:

做用户名匹配时逻辑表达式写的user.getName()=="test",而返回值却是false

解决办法:

在Java中,String类型在使用==进行判断时并非判断两个字符串的值,而是判断两个字符串存放的地址是否相同

而使用equals进行判断时则是判断两个字符串的值是否相同

故此处改为user.getName().equals("test")后返回true

其余数据类型的==和equals区别参考此博客:https://www.cnblogs.com/dolphin0520/p/3592500.html


SpringMVC的forward和redirect

参考:https://blog.csdn.net/lxn39830435731415926/article/details/46434241 


在项目中修改了js/css文件,重部署调试项目时却不刷新

问题背景:

做了一个表单验证的js,但是判断语句打错了,反复在后台修改,页面上反馈始终无果,得知是js文件没有刷新

解决办法:

1)Ctrl+F5,清除浏览器缓存(等同于浏览器-->历史数据-->删除cookies)注意:如果是利用F12中的Disable cache,则需要F12打开控制台才能生效

2)在js或css后加版本号,这时候浏览器客户端会认为这是不同版本的js或者css文件,会自动重新刷新下载(浏览器会缓存下载页面js和css文件)(对应我选择的解决办法)

  2.1)形如:.css?v=x  或者 css?version=x     <link rel="stylesheet"  href="xx/xx.css?version=x.x.x" type="text/css" />  

  2.2)形如:.js?v=x  或者 css?version=x  <script type="text/javascript" src=../...js?v=x ></script>

3)使用gulp等进行前端构建(不太明白什么是gulp) 

参考:https://www.cnblogs.com/hihao/p/6502745.html


 JSP页面向Servlet传值方法

问题背景:

单纯知识点记录

解决办法:
  ①超链接,在href='servletAction?id=xxx'(多个参数时格式如下 servletAction?param1=xxx&param2=xxx&...)
  ②form表单提交,当点击submit时,action="servletAction" method='get/post'
  ③就是利用ajax,url='servletActionz',当然了,这里也有get和post两种情况,get直接在url后面加问号传参,post会把参数放在实体内容里面。

以上方法,在servlet那边 用 request.getParameter("参数名");就可以拿到了


java: 不兼容的类型: java.lang.String无法转换为com.sun.org.apache.xpath.internal.operations.String

问题背景:

一次操作后整个Class的String类参数、方法等等全部“见红”,后来发现是导入String包时误导入了apache的String包而不是java自己的String包(怪尴尬的哈哈哈)

解决办法:

把apache的String包导入删掉就可以啦,记得把java自己的导进来 


[Mybatis] java.lang.UnsupportedOperationException异常

问题背景:

做从数据库取所有用户信息时,在UserMapper.xml文件写了一条查询如下

(代码1)
<select id="getAllUser" resultType="java.lang.List">
    select *
    from user
</select>

 在之后的代码中调用了它对应的实现方法后如题报错

解决办法:

看到resultType中的值了吗?因为select所有信息,所以取出来的肯定是一个List,List集合中存放的是实体User对象。

如果sql语句是

(代码2)
select userid from user

我们知道resultType要写 java.lang.Integer,因为查出来的肯定是一个整数数据集合。那么如代码1一般的查找,查出来的是个List,所以resultType不就自然就要写List了吗?

不是的!

resultType表示的是返回的内容的数据类型,查id,返回整型,所以是java.lang.Integer。查全部,返回的是存着许多个User对象的List,但并不是写java.lang.List!而应该写User实体类所在的位置,我的User类在domain包下,所以此处写 domain.User,告诉它接下来返回集合装的是User对象

总结:

resultType该写的是集合存放的元素的类型,而不是集合自己


记录一个好玩的题外小知识

前端页面中如何使用emoji?

参考:https://blog.csdn.net/z69183787/article/details/77573575

emoji代码大全:http://www.oicqzone.com/tool/emoji/


java中List集合为空与List集合为null的区别

问题背景:

从数据库取出数据时,SQL语句有where判断,因此会有取出0条数据的可能。于是在项目中写了如果取出0条数据(即集合为空)的话进行一些操作

//声明List时是这样声明的
//getUsersByClassId返回类型为List<User>
List<User> testList = userServiceImpl.getUsersByClassId(101);

if(testList==null){
    //进行一些操作
}

 然鹅,即使我进行了绝对取出0条数据的测试操作,运行时if语句里的内容始终不会运行

问题原因:

查阅网上资料后发现如下 

List==null 和 List.size()==0 是两码事

引用
举个形象的例子,我有一个空着的水杯(list),而你没有,那你是null,我的size为0。你想装水就需要自己去买个水杯(new ArrayList();),但是我就可以直接装水(list.add(水))。你要是没有杯子直接倒水,水就流出去啦(空指针异常)。

判断
那么,我们什么时候用null,什么时候用isEmpty()或list.size()呢?

空集合
isEmpty() 或者(list.size() == 0)用于判断List内容是否为空,即表里一个元素也没有, 但是使用isEmpty()和size()的前提是,list是一个空集合,而不是null,所以为了避免异常,建议在使用或赋值list集合之前,做一次空集合创建处理,进行内存空间分配,即:

List list2 = new ArrayList();


list.isEmpty()和list.size()==0 没有区别, isEmpty()判断有没有元素,而size()返回有几个元素,如果判断一个集合有无元素,建议用isEmpty()方法. 这清晰,简明

null判断 
list等于null,可理解为没有对list集合分配内存空间,实际上压根就不存在。
 

参考:https://blog.csdn.net/changqing5818/article/details/52373569


EL表达式获取Map/List集合中的值

问题背景:

纯知识点记录

知识点:

Map

1.当Map的键是String类型时

1.1使用${map1["a"]}${map1.a}取值

//后台部分
Map<String, String> map1 = new HashMap<String, String>();

map1.put("a", "b");

map1.put("aa", "bb");

map1.put("aaa", "bbb");


//前台部分,两个都可以
${map1["a"]}

${map1.a}

//返回
b b

1.2使用jstl的<forEach>标签取值(原作者表示不清楚为什么输出顺序和设定键值对顺序不同)

<c:forEach items="${map1}" var="item">

    key:<c:out value="${item.key}" /> &nbsp;&nbsp;&nbsp;

    value:<c:out value="${item.value}" /> <br/>

</c:forEach>

返回

key:aa   value:bb
key:aaa   value:bbb
key:a   value:b

2.当Map的键是Integer类型的时候

HashMap<Integer, String> map2 = new HashMap<Integer, String>();

map2.put(1, "b");

map2.put(2, "bb");

map2.put(3, "bbb");

2.1使用EL表达式取值

使用${map1[1]}${map1.1}(这种写法直接就是错误的)取值均无法取到!

原因如下:

EL表达式在解析Integer类型数字的时候,会自动把数字转换成Long类型,后台使用Integer类型作为key值,进行判断的时候Integer与Long对象不相等。导致无法取出key值

解决办法:

把Map的键改成Long型就好了 

List(无论List中存放的是String或是Integer,以下两种方式都可以成功取到值)

后台代码:

List<String> list1 = new ArrayList<String>();

list1.add("a");

list1.add("b");

list1.add("c");

list1.add("d");

前台使用EL表达式取值:

${list1[下标]}
例如
${list1[1]}

输出

a

使用forEach取值

<c:forEach items="${list1 }" var="item">

    <c:out value="${item}"></c:out> <br/>

</c:forEach>

输出

a
b
c
d

参考:https://www.cnblogs.com/huangwenjie/p/5724102.html

参考:https://blog.csdn.net/qq1012421396/article/details/62444429


 

java中string和int互相转化

参考: https://blog.csdn.net/memray/article/details/7312817/

讲得很清楚,还有一些区别和原理

 


java向上向下取整方法的问题

问题背景:

 做分页时时使用 总条数 ÷ 每页数据量  并向上取整的方法求总页数,但发现每次都少了一页,后发现是ceil中参数给了两个int型去除

int totalRecords = 100;

int totalPages = Math.ceil( totalRecords / 6);

解决办法:

查了帮助手册

ceil方法中参数要求为double型参数,而我的参数中给出的是两个int型取商数,取出的是整型。而ceil返回的是离所给double类型参数最近的第一个整数,如果参数里直接给了一个int型的数据,并不会报错,且会正确返回,返回值为参数自己。因此我们只需要把 totalRecords 或者 6 这两个整型数据随便将之一转换为double型即可正确返回向上取整

 

int totalPages = Math.ceil( totalRecords / 6.0);

如果文本框中是空的,那么request.getParameter得到的什么值?

问题背景:

无,纯知识点记录。

记录内容:

得到的是""(空值),不是null
如果文本框被DISABLED了,则是NULL 

参考:https://bbs.csdn.net/topics/70145022


dispatcherServlet拦截所有请求时,requestMapping中的请求路径没有打错,却报404错

问题背景:

web.xml中配置dispatcherServlet的url-pattern为

<url-pattern>/*</url-pattern>

 controller中内容为

@Controller
public class RequestController {
    @RequestMapping("testRequest")
    @ResponseBody
    public String test(){
        return this.toString();
    }
}

tomcat中应用上下文(application context)内容为

/class008

路径为

http://127.0.0.1:8080/class008/testRequest

结局:报错404

错误原因:

 首先了解url-pattern的匹配规则:

servlet容器会先从路径中去掉应用上下文然后把剩下的部分作为url映射

那么此处我们的应用上下文内容是“/class008”,我们的url是“127.0.0.1:8080/class008/testRequest”。

dispatcherServlet接收到此url后,去掉应用上下文部分(/class008),剩下了"/testRequest"。

因为dispatcherServlet拦截"/"后的所有内容,

所以剩下的"/testRequest"成功被dispatcherServlet拦截并在controller中寻找对应的mapping,

而我们的mapping中匹配的是"testRequest"而不是"/testRequest"(多了一个斜杠),

因此对应不上这个mapping,

但也没有别的mapping和它匹配,因此就报了404错

解决办法:

把应用上下文的内容由

/class008

改成

/class008/

 这样在去掉上下文后剩下的就是"testRequest"了,就可以成功匹配上mapping并显示返回内容了

参考:https://www.cnblogs.com/51kata/p/5152400.html 


IDEA编译器创建web项目时没有web.xml文件

参考:https://blog.csdn.net/wjc19871222/article/details/79667375


Eclipse编译器安装SVN的几种方式 

参考:https://www.cnblogs.com/alamps/p/6155963.html


报错:HttpServletResponse cannot be resolved to a type 

环境:

Eclipse编译器

问题原因:

没有配置Tomcat服务器

解决办法:

Window->Preferences->Server->Runtime Environment配置好Tomcat

详细配置流程参考:https://blog.csdn.net/qq_41665015/article/details/82921478


mysql导入数据时报:

Using a password on the command line interface can be insecure.

 

 参考:https://blog.csdn.net/tksnail/article/details/79696066


乐观锁、悲观锁的解释和实现原理

篇幅较长,参考:https://www.cnblogs.com/cyhbyw/p/8869855.html


IDEA 'Error:java: 无效的源发行版: 10' 解决方案

问题原因:

主机JDK版本与项目语言级别不同造成的

例如:本机JDK是1.8版本,但项目语言级别是10或是7 

解决办法:

将二者对应起来就好,1.8JDK就对应级别8,1.7对应级别7


IDEA错误:Cannot start compilation: the output path is not specified for module "poi". Specify the out

问题原因:

没有设置项目的output路径造成的

解决办法:

设置output路径,项目路径+/out即可


Unsupported major.minor version 52.0

问题原因:

你项目用JDK1.8运行过,现在又在本地的eclipse等开发工具或者本地环境变量为低版本的jdk1.7或者jdk1.6下运行 

解决办法

stanford parser和jdk版本对应关系如下:

J2SE 8 = 52,
J2SE 7 = 51,
J2SE 6.0 = 50,
J2SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45

改一下JDK版本至对应即可

参考:https://www.cnblogs.com/jpfss/p/9036645.html


 java中int型和Long型的互相转换

一.将long型转化为int型,这里的long型是基础类型:

long   a = 10;     int b = (int)a;   

二.将Long型转换为int 型的,这里的Long型是包装类型:

Long a = 10; int b=a.intValue();

三.将int型转化为long型,这里的int型是基础类型:

int a = 10;long b = (int)a;

四.将Integer型转化为long型,这里的Integer型是包装类型:

int a = 10;Long b = a.longValue();

参考:https://www.cnblogs.com/zhangzongle/p/5866594.html


javax.persistence.Table.indexes()

本问题步骤较为繁琐,请直接查阅此文章

https://my.oschina.net/JasonZhang/blog/539095


java.lang.OutOfMemoryError: Java heap space异常

这个问题是由于内存不足引起的,所以大部分情况下,将内存扩大基本就能解决。扩大步骤如下:

方法一:
找到eclipse/eclipse.ini,打开,在其上加上
-vmargs
-Xms128m
-Xmx512m
-XX:permSize=64M
-XX:MaxPermSize=128M
方法二:
打开eclipse,选择Window--Preferences--Java--Installed JREs,在右边选择前面有对勾的JRE,单击Edit,出现一个EditJRE的对话框,在其中的Default VM Arguments框中输入-Xms128m -Xmx512m。
这样设置java虚拟机内存使用最小是128M,最大是512M。

参考:https://bbs.csdn.net/topics/390411231

3楼的回答 

如果以上情况无法解决问题,附上全面一些的解析:http://outofmemory.cn/java/OutOfMemoryError/PermGen-space-Java-heap-space-unable-create-new-native-thread


Spring 的@Column 注解 及其属性参数

http://www.360doc.com/content/14/0409/16/10630456_367528401.shtml


HTTP动词中,PATCH和PUT的区别

patch方法用来更新局部资源,这句话我们该如何理解?

假设我们有一个UserInfo,里面有userIduserNameuserGender等10个字段。可你的编辑功能因为需求,在某个特别的页面里只能修改userName,这时候的更新怎么做?

人们通常(为徒省事)把一个包含了修改后userName的完整userInfo对象传给后端,做完整更新。但仔细想想,这种做法感觉有点二,而且真心浪费带宽(纯技术上讲,你不关心带宽那是你土豪)。

于是patch诞生,只传一个userName到指定资源去,表示该请求是一个局部更新,后端仅更新接收到的字段。

put虽然也是更新资源,但要求前端提供的一定是一个完整的资源对象,理论上说,如果你用了put,但却没有提供完整的UserInfo,那么缺了的那些字段应该被清空

补充:

最后再补充一句,restful只是标准,标准的意思是如果在大家都依此行事的话,沟通成本会很低,开发效率就高。但并非强制(也没人强制得了),所以你说在你的程序里把方法名从put改成patch没有任何影响,那是自然,因为你的后端程序并没有按照标准对两个方法做不同处理,她的表现自然是一样的

 


SpringBoot 部署项目正常但访问报404

在使用Spring官网提供的快速创建项目向导后,SpringBoot的启动类一般会放在src/main/java/<项目名>包下,此时要留意你的controller、service、dao等包是否也在此文件夹下,如不在,则将启动类拉出与dao等包同级,因为启动类会扫描该类所在包下的所有类


SpringBoot整合Mybatis,部署项目时报找不到Mapper文件错

在启动类中加上注解@MapperScan("包所在位置")
例如

@MapperScan("xxx.xxx.dao")

 

;