id相同显示出现问题
**********************************************************************************
id相同,页面显示很奇特:
查看页面元素,div也正常,但是就是其中的图片变小了:
改变id:
可以了:
别看现在看起来很简单的问题,实际遇到了半天找不到原因。。。。
怎么实现HTML中得到java后台的信息
**********************************************************************************
如果信息量比较大,可以使用ajax传json串的形式(js)
如果比较小,可以使用session等获得
1)jsp原始页面中(不通过js)可以jsp几大内置对象获得
即在Java后台将信息put进session中,jsp前台再取出来
2)html原始页面中,可以使用struts和web.xml合作的形式,获得。
即在web.xml建立好html到servlet映射之后:
struts中将跳转对象由html改为servlet:
原来:
现在:
这样,html中就可以像jsp一样取到使用像${sessionScope.userNow}这种方式取到后台数据了:
注意!!! 一定要写对路径,比如上面,是将/WEB-INF/manufact.html 映射到 /manufact.servlet,那么在action配置时,就要写 /manufact.servlet,千万不能写成 /WEB-INF/manufact.servlet了(血的教训)
3)将信息携带在放回的url中
?
点击提交表单(form)后总是打开新页面,原页面结果也正确
**********************************************************************************
重现:
提交后:
js:
insertUsers()方法:
为void,struts.xml也没有映射
那么为什么总是跳转呢???
查看html,发现了问题:
因为是复用别人的代码,加了这个target属性没有发现,这个属性添加提交表单后跳转的目标(新打开页面),去掉之后,可以了
getHibernateTemplate().save()和getHibernateTemplate().delete()总是报错
**********************************************************************************
Exception occurred during processing request: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
e.g.
这个底层是调用getHibernateTemplate().delete():
总是报错,试了各种方法:
如
1)web.xml修改OpenSessionInViewFilter的flushMode属性:
2)spring配置文件中修改事务(transaction)属性:
或者:
都不顶用,最后在解决一个不想关的问题上找到了解决方法:
https://www.cnblogs.com/zeng1994/p/7778145.html
① spring配置文件中,配置事务注解(这样在java代码中就可以使用事务注解功能了):
② 在报错的地方(原属性为Read-only不允许write的地方),使用事务注解改变属性:
搞定!!!
明明是Web项目,从IDEA移植到Eclipse就没有RUN AS on the server
**********************************************************************************
hql要用“OOP”的思想去写:hql语句中的属性用类属性而不是表字段
**********************************************************************************
而User类中:
数据库中:
相当于Hibernate对数据库做了封装——数据库数据到OOP的转换,所以使用Hibernate API时,使用OPP的属性,而不是仍停留在面向数据库的思想。在hql使用OOP时,Hibernate通过.hbm.xml完成映射。
所以将hql中NAME改为name即可
① MySQL中没有建对应的数据库就直接导入.sql文件,会报找不到database的错误(也可以反过来推测.sql只有建表Insert语句,第一句没有create table)
②
代码重用:
<i><img src="${ctx}/appMenu/ES.png" width="32px" height="32px"></i>
页面就是
1.浏览器的console报错说adminpage.js blablala错误:
猜测:加载这个js时错了,直接卡住了,停了下来,没有继续加载其余的DOM
(其实这个必然不对,因为是先加载DOM的,就算是有些DOM会依赖js,但这个是一张图片而已,不会影响的)
删除了这个js之后,还是不行
2. 还是报找不到的错误,但是可以看到报找不到
/ManNew/%783%/appMenu/ES.png的错误,应该是{ctx}的问题
回到原来copy这句代码的地方,发现那个jsp里面并没有定义ctx是什么
。
。
。
再仔细看,发现那个jsp竟然包含了多个其他的jsp,什么"base.jsp",“left.jsp”等等,应该在这里
结果在base.jsp中发现了
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
果然是要先定义,再使用
移植过去时候,突然意识到,这个c应该是个标签,一找,果然有一句:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
原来是jstl的标签库
所以这两句一起复制到html中,发现竟然还是找不到,路径乱码。
突然意识到,标签库是jsp用的,html不能用!!!
所以,根本不能用ctx,直接写死路径,OK!
**********************************************************************************
从别的项目迁移过来的代码,明明别人用的Hibernate5 代码就不报错,我的就报错:
其实,报错本身已经说明问题了!!
明明说了,是Springframework的问题!
所以除了要使用hibernate5以外,还要去看Spring 的核心jar包,应该是Spring不兼容导致的,比如Spring版本太低,发布时Hibernate5根本还没出来,你在使用这些jar包的前提下去import Hibernate5的class,不是找死么。
去找一下spring-orm-3.2.5的包,里面对应的是org.springframework的内容。
故,去看原项目用的啥版本的Spring,替换一下即可。
**********************************************************************************
非常奇怪的现象,用/MN/userAction!login提示找不到action
用这种"/MN/userAction_login.action"就可以
************************************************************************************************
修改html中fileinput_div的位置:
网页:
HTML:
怎么改位置都是:
试了各种方法,都不行。猜测是不是网页调用的是不是另外一个模态框,查找了模态框ID,不是。页面的元素审查显示的就是页面定义的ID而且只有一个。排除。
元素审查中子元素叫fileinput_div,父元素都对,那此div应该也不会错,显示就是此处的html定义的div。。。
最后全局查找fileinput_div,结果真的发现还有其他的叫fileinput_div的东西!!! 原来当时的逻辑是,直接通过Jquery改变模态框的子元素(如label,input)之后其位置会发生不可预见的变化,只好在js中“重绘“fileinput_div:
所以网页中看到的的确也是fileinput_div,但是不是html定义的div,而是js中重绘的div!!,改了所以重绘中的位置参数,OK!!
教训:页中展示的元素除了html中直接的定义的除外,还有可能是js重绘的:
① 用网页中展示的ID去全局搜索一下基本可以找到原因,就是
************************************************************************************************
使用hql查询时,总是报错:
结果。。。
改成Pointtable立马好,原因:
Hql找table时是区分大小写的,而且是按照Entity的名字作映射
************************************************************************************************
运行时候高亮行,总是直接报空指针错误:
但是追踪断点发现,p.getMachineName()明明取到值了,又思考是不是HashCode的问题,但是machineName定义时候明明是String类型,hashcode明明是java自己写的(sum(ai * 31^i) ),很久没有解决。
最后发现nm是因为:
将machinename定义为了Set类型,而java中的Set
是接口!!
太坑爹了!!
① Map是类,不是接口,很容易让人自然而然的拿过来用Set
Map也是接口!!初始化用HashMap
② 程序没有直接报machinename空指针错误。
看一个有趣的例子:
连实体类的引用没有初始化时去使用都会报错,接口就更不要说了(上面的Set也说明了接口的确也不行)。那么问题来了,为什么在上面的报错中没有直接报错呢,按说在编译之前就应该高亮报错了,更不要说运行时候报一个不清不楚的NullPointerException了。继续看下面的例子:
在成员方法中对成员变量的操作就不会检查是否被初始化!!
原因其实也很好理解,成员变量是类“共有的”,某个成员方法本身并不能判断自己在操作成员变量之前其他方法对它做了一些什么,它自己都不知道什么时候被调用,也不知道什么时候调用其他方法。
所以判断的是否初始化的工作不可能交给成员方法来做,所以它们只管操作,而不管成员变量前面的状态的如何。通过这个分析,也很好得出两个东西:
① 为了严瑾,成员变量在操作之前应检查一下状态(就比如Pop实现出栈前检查一下是否为空一样),看是否本方法的操作的前提成不成立(如add之前是否为null。。。。有点扯哈)
② 成员变量检查不了之前的状态,只能检查自己从头到尾负责的变量:本方法的局部变量,因为这样的变量自己知道什么时候生成,什么时候初始化,这也是为什么上例中main函数StringBuilder和Set回报错的原因。
************************************************************************************************
数据库驱动可以去相应的数据库官网下载,甚至时不同语言的驱动(肯定都会提供API的,且官网的API肯定更可靠),但是
配置数据连接池(dataSource)的时候要指明用的时哪个类,经常用到C3P0连接池,HIbernate-optional提供了C3P0的连接池,但是看到下载的mysql-connect也有C3P0 jar包,那么这个到底跟哪个有关系,还是都没有关系,只是为了方便给的?
自己的理解:
连接池(mysql和redis都有连接池),说的直白一点,就是对数据库/redis的连接做一个缓存,避免每次建立连接进行query操作都要真正地完整执行Connection—statement—Query(ps:若关闭自动提交,则还需要手动提交:conn.commit),其中如果真的从0到有获得Connection则是非常耗时的操作,连接池是上承数据库/redis,下连java 程序的中间件,它其中“可以”缓存很多connection,java程序中如果要执行数据库操作,可以直接向连接池中取得连接。从而加快速度。
而我们注意到,在使用Hibernate时,我们一般都使用了hibernate为我们封装好的JDBC API,如下面在Hibernate中我们实际进行的数据库查询操作
即在上面说到的“下连java程序”,在使用hibernate框架时这个“java程序”并不是我们见到的程序了,我们连接池向下的API已经被hibernate用了,无论是使用hibernate的Query(上面的),session:
还是HibernateTemplate:
这都不是原始的JDBC,获得Connection—>statement—>Query这些原始JDBC操作都被Hibernate封装了,那么C3P0的连接Cache向下提供的API其实都是给Hibernate用了(具体怎么用的比如探究一下执行一个hibernate 的 Query导入进入了哪些层有空再深究。。)
所以关于原始问题的答案也差不多出来了:
C3P0上接mysql数据库,下接Hibernate,所以和两个的版本都有关系
mysql带的C3P0的jar包肯定是和当前mysql兼容的,“向下”兼容若干hibernate版本;hibernate带的jar包和当前hibernate兼容,“向上”兼容若干hibernate版本。但是一般而言任意版本的mysql和hibernate带的C3P0 jar包都有很大的“交集”:
一般不用担心不兼容的问题。
经常用的另外一种<bean id =“dataSource”name =“dataSource”class =“com.alibaba.druid.pool.DruidDataSource”对应的又是哪个jar包?
**********************************************************************************
JSP页面:
没报错,但就是没数据。
排查
1)最好的是从 数据库表中——DAO —— Service —— Action —— JSP,看到底哪一层出来问题(实际操作,看数据库,然后各层数据出口设置一个断点,next breaking point这样一个一个看数据到哪了)。但是不知怎么回事,DAO层的数据出口并不停下,于是直接看action数据出口:
2)
结果:
所以问题出在JSP:反复比较,没问题啊。。。
结果!!因为防止jsp前面不一样,是直接复制前面的,没有加s标签库!
加上,可以了
结果:
*********************************************************************************************************************************