之前的实习--关于Web部分的笔记
之前实习的时候做的是关于Web的,主要做的是CRM这类企业项目,比较传统,技术用的也比较传统,是典型的SSH架构,如今不再从事Web开发,但是之前实习的一些笔记进行简单记录下,都是实际项目中真实遇到的问题,希望以后能够用的着。
1、poi POI提供API给Java程序对Microsoft Office格式档案读和写的功能
2、在html中a标签的href中调用js函数
<a href="javascript:jumpPage()"></a>
3、在javascript 里怎样实现html中的 target=”_top” 这个功能
parent.location.href=”submitChangePwd.action”;
在js中设置
类似于设置target=”_top”
注意:location.href在框架中的使用target,如果只是简单的设置location.href=”“,会使得整个页面显示在子框架中,导致出现重叠框架。
解决办法:
window.top.framename.location.href = url;
window.parent.location.href=url;
mainframe.location.href=url;
4、datagrid和jqGrid的区别
5、Hibernate.initialize(Obj)用法
initialize(true) –》表示强制加载
initialize(true)–》简单理解:执行该方法后,可以将当前表关联的另一张表的数据查询出来
hibernate一个重要的特性:懒加载
懒加载:懒加载(延迟加载)机制是为了避免一些无谓的性能开销而提出来的,
所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。
例如下面的配置:
<hibernate-mapping>
......
<class name=”com.neusoft.entity.User” table=”user”>
<set name=”addresses” table=”address” lazy=”true” inverse=”true”>
<key column=”user_id”/>
<one-to-many class=”com.neusoft.entity.Arrderss”/>
</set>
</class>
</hibernate-mapping>
默认情况下,是支持懒加载的。–》Hibernate中load方法是懒加载,get方法不是。
–>引申hibernate中对象的的三种状态
6、ajax请求中的同步和异步问题
jquery的async:false,这个属性
默认是true:异步,false:同步。
$.ajax({
type: "post",
url: "path",
cache:false,
async:false,
dataType: ($.browser.msie) ? "text" : "xml",
success: function(xmlobj){
}
});
在这里,async默认的设置值为true,这种情况为异步方式,就是说当ajax发送请求后,
在等待server端返回的这个过程中,前台会继续 执行ajax块后面的脚本,
直到server端返回正确的结果才会去执行success,也就是说这时候执行的是两个线程,
ajax块发出请求后一个线程 和ajax块后面的脚本(另一个线程)
7、Hibernate中Criteria的完整用法–》Hibernate的QBC查询方式 (Query By Criteria)
Criteria是比hql查询更面向对象的一种方式。
–》http://blog.csdn.net/h_gao/article/details/49614531
8、BeanUtils中方法copyProperties(Object source, Object target, String[] ignoreProperties)
Copy the property values of the given source bean into the given target bean,
ignoring the given “ignoreProperties”.
即实现从一个实体到另一个实体的数据拷贝,不包括后面的String数组中的属性
9、js的push方法
将新元素添加到一个数组中,并返回数组的新长度值
jquery中的empty()方法和remove方法
empty方法–》清空div中的innerHTML,注意此时div还是存在的
remove方法–》删除整个div节,div已经不存在了
10、JSON.parse()和JSON.stringify()
parse用于从一个字符串中解析出json对象 stringify()用于从一个对象解析出字符串
url:http://blog.csdn.net/wangxiaohu__/article/details/7254598
11、通过addActionMessage添加的信息怎么显示出来
12、对js中this的理解,以及对于回调方法的理解
随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对象
对js面向对象的理解:如js的继承机制,js的闭包等
13、jQuery事件-trigger()方法 –》trigger() 方法触发被选元素的指定事件类型
如:
触发 input 元素的 select 事件:
(“button”).click(function()$(“input”).trigger(“select”););attr()方法设置或返回被选元素的属性值。根据该方法不同的参数,其工作方式也有所差异。改变图像的width属性:(“button”).click(function(){
$(“img”).attr(“width”,”180”);
});
attr()方法和prop()方法的区别
attr()方法操作的是文档节点的属性,因此设置的属性值只能是字符串类型。
如果不是字符串类型,也会调用toString()方法将其转换为字符串类型。
prop()方法操作的是js对象的属性,因此设置的属性值可以是包括数组和对象在内的任意类型。
Query认为:attribute的checked、selected、disabled就是表示该属性初始状态的值,
property的checked、selected、disabled才表示该属性实时状态的值(值为true或false)。
在jQuery 1.6及以后版本中,请使用prop()函数来设置或获取checked、selected、disabled等属性。
对于其它能够用prop()实现的操作,也尽量使用prop()函数。
14、JNDI(Java Naming and Directory Interface) Java命名和目录接口,它对应于J2SE中的javax.naming包
这套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称
以后程序想获得Java对象,只需通过名称检索即可。
其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象.
15、html应用的CSS只能是class,cssClass是在某些动态编程(网络设计)语言中的控件属性
并非html的标签属性,虽然最终仍会解析成class,但是在设计之初仍然要用cssClass
16、for update 数据库的悲观锁
当Oracle中出现数据表时被锁的情况时,可以用下面的命令找出未关闭的session,执行相关语句关闭session
选择最后一个KILL_SESS中的语句关闭相应的session
Select /*+ rule */
s.Username
,Decode(l.Type, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', Null) Lock_Level
,o.Owner,o.Object_Name,o.Object_Type,s.Sid
,s.Serial#,s.Terminal,s.Machine,s.Program,s.Osuser
,s.Module,s.Action
,'ALTER SYSTEM KILL SESSION ''' || s.Sid || ',' || s.Serial# || ''';' Kill_Sess
From V$session s, V$lock l, Dba_Objects o
Where l.Sid = s.Sid
And l.Id1 = o.Object_Id(+)
And s.Username Is Not Null
And s.Terminal Is Not Null
Order By s.Machine, s.Terminal;
17、在Oracle中,对char和varchar2字段来说,”“就是null,即空字符串会以null的形式存在数据库中
18、
StringUtils.equals()方法
StringUtils.equals("", ""); //结果是true
StringUtils.equals(null, null);//结果是true
StringUtils.equals(null, ""); //结果是false
StringUtils.equals("",null); //结果是false
StringUtils.equals(null,""); //结果是false
StringUtils.isNotBlank()方法
StringUtils.isNotBlank(null) = false
StringUtils.isNotBlank("") = false
StringUtils.isNotBlank(" ") = false
StringUtils.isNotBlank("/t /n /f /r") = false
StringUtils.isNotBlank("/b") = true
StringUtils.isNotBlank("bob") = true
StringUtils.isNotBlank(" bob ") = true
StringUtils.isNotEmpty()方法
StringUtils.isNotEmpty(null) = false
StringUtils.isNotEmpty("") = false
StringUtils.isNotEmpty(" ") = true
StringUtils.isNotEmpty(" ") = true
StringUtils.isNotEmpty("bob") = true
StringUtils.isNotEmpty(" bob ") = true
19、window.open(pageURL,name,parameters)
其中:
pageURL 为子窗口路径
name 为子窗口句柄
parameters 为窗口参数(各参数用逗号分隔)
实例:
window.open("/MecoxCRM/jsp/util/initUserSelection.action", "",
'height=' + iHeight + ',innerHeight=' + iHeight + ',width=' + iWidth + ',innerWidth=' + iWidth
+ ',top=' + iTop + ',left=' + iLeft + ',toolbar=no,menubar=no,scrollbars=auto,resizeable=no,location=no,status=no');
$("#memberVo\\.primeSalesId",window.opener.document).val(users[0].userId);
将弹出的子窗口中的值传回到父窗口中
20、s:radio的取值问题
通过id获取radio选中值
var cT = $('input[id="sc_ct"]').filter(':checked').val(); ==>通过id查找的时候总是取不出来值,这个地方不太清楚
通过name获取radio选中值
"condition.marriage" : $('input[name="condition\\.marriage"]:checked').val();
var cT = $('input[name="ct"]').filter(':checked').val();
21、
$("#memberVo\\.primeSalesId",window.opener.document).val(users[0].userId);
$("#memberVo\\.primeSalesId",window.opener.document).html(users[0].userId);
将弹出的子窗口中的值传回到父窗口中
这里注意.val和点html的区别,如果父窗口的标签是span,则用.html来进行传值
22、小技巧:如果js有错(有的时候alert的信息不出来),可以按F12进入控制台查看js脚本是否有错
23、在JBoss上配置数据库的连接池对应的配置文件路径 jboss_home/server/deploy/oracle-ds.xml
24、
<input type="text" name="name" value="xxx" disabled="true"/>
<input type="text" name="name" value="xxx" readonly="true"/>
这两种写法都会使显示出来的文本框不能输入文字,但disabled会使文本框变灰,
而且通过request.getParameter("name")得不到文本框中的内容(如果有的话),form表单方式也不能传递数据
而readonly只是使文本框不能输入,外观没有变化,而且通过request.getParameter("name")可以得到内容。
25、Integer类型的数据比较容易出错
Integer temp;
“0”.equals(temp) –>”0” 与 Integer in = new Ingeger(0) –》不一样
26、http://www.cnblogs.com/jackcxd/archive/2010/04/29/1723688.html
–》js弹出子窗口更新父窗口
27、sql中的exists关键字
–》exists (sql 返回结果集为真) not exists (sql 不返回结果集为真)
SELECT * FROM (
SELECT r.*, rownum rn FROM (
SELECT M.MEMBER_ID,'' FROM mm_member M
where exists (select * from sl_order o,sl_order_item s where o.member_id=m.member_id and s.order_no=o.order_no and s.sku=? and s.shipping_date between To_date(?, 'YYYY/MM/DD HH24:MI:SS') and To_date(?, 'YYYY/MM/DD HH24:MI:SS') )
order by M.MEMBER_ID ) r ) where rn Between ? And ?
28、oracle中的哈希连接 –》http://blog.csdn.net/yuan22003/article/details/6713240
29、 –》OnUnload事件–》当用户卸载文档时执行一段 JavaScript
30、java中的ThreadLocal和FutureTask
线程局部量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。
java提供ThreadLocal类来支持线程局部变量,是一种实现线程安全的方式。
31、Oracle中的查询分页问题–》http://www.itpub.net/thread-824147-1-1.html
Mysql中的分页比较简单,由于有limit这种关键字:select * from table limit M,N (注:MySQL的limit关键字,这个表示返回第M+1到第第M+N行的记录)
Oracle中没有limit关键字,通过使用rownum来实现
但是对于rownum有一个问题:
很多资料都说不支持>,>=,=,between…and,只能用以上符号(<、<=、!=),
并非说用>,>=,=,between..and 时会提示SQL语法错误,而是经常是查不出一条记录来。
解释:
ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。
它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between…and这些条件,
因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,
可是它的rownum还是1,又被删除,依次类推,便没有了数据。
因为这样,所以需要通过嵌套子查询来实现
select * from (
select rownum r_,row_.* from (select * from mm_member mm) row_
where rownum <=20
) where r_>=5
最内层是不进行翻页的原始查询语句,在这个查询上添加序列rownum作为一个新列名为r_
这样带出来的这一列r_就可以进行>=的操作,即可以设定查询的起始位置。
32、策略设计模式
33、Hibernate的抓取策略
34、面向对象设计的SOLID原则
S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写。
SRP—》The Single Responsibility Principle—》单一责任原则
让一个类只做一种类型责任,当这个类需要承当其他类型的责任的时候,就需要分解这个类。
OCP—》The Open Closed Principle—》开放封闭原则
软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。
这个原则是诸多面向对象编程原则中最抽象、最难理解的一个。
LSP—》The Liskov Substitution Principle—》里氏替换原则
当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系。
DIP—》The Dependency Inversion Principle—》依赖倒置原则
1. 高层模块不应该依赖于低层模块,二者都应该依赖于抽象
2. 抽象不应该依赖于细节,细节应该依赖于抽象
ISP—》The Interface Segregation Principle—》接口分离原则
不能强迫用户去依赖那些他们不使用的接口。换句话说,使用多个专门的接口比使用单一的总接口总要好
35、Java种的WeakReference与SoftReference的区别
WeakReference和SoftReference都有利于提高GC和内存的效率,但是WeakReference一旦失去最后一个强引用,就会被GC回收
而软引用虽然不能阻止被回收,但是可以延迟到JVM内存不足的时候。
finalize 方法是在对象被回收之前调用的方法,给对象自己最后一个复活的机会,但是什么时候调用 finalize 没有保证。
36、问题场景:hibernate中两个对象进行关联,配置的是一对多 one to many
主对象通过getXXXSet().add()的方式更新与其关联的从对象
那么通过这种方式来更新数据是在什么时候发出sql语句?这是个问题,毕竟是框架内部的操作
问题:当页面上同时新增两条数据,两条数据都是通过getSet().add()的方式保存
并且两条数据之间对从表的数据有查询操作,这时在查询操作时发出了update语句
–》这是问题:为什么在查询的的时候将上面通过set方式储存的数据更新到了数据库中(发出了update语句)
@Override
@Transactional
public void saveBcExchangeSalesSkuCriteria(String activityId,
Collection<EvSalesSkuCriteriaVo> salesSkuCriterias,
String modifierId, String modifierName) throws Exception {
Date sysTime = DateUtil.getNow();
BcExchange entity = bcExchangeDao.loadByExchangeId(activityId, true);
List<EvSalesSkuCriteria> tempList = new ArrayList<EvSalesSkuCriteria>();
for(EvSalesSkuCriteriaVo salesSkuCriteriaVo : salesSkuCriterias) {
//儲存交易條件
EvSalesSkuCriteria salesSkuCriteria = null;
if(StringUtils.isNotBlank(salesSkuCriteriaVo.getOid())) {
//修改讀取 oid 相同
for(EvSalesSkuCriteria model : entity.getEvSalesSkuCriteriaSet()) {
if(model.getOid().equals(salesSkuCriteriaVo.getOid())) {
Integer skuType = model.getSkuType();
if (StringUtils.isNotBlank(salesSkuCriteriaVo
.getSkuNo())) {
if (skuType.equals(EvActivity._SKU_TYPE_NO)) {
if (!model.getSkuNo().equals(
salesSkuCriteriaVo.getSkuNo())
&& model.getSkuNo() != null) {
checkRepeatData(salesSkuCriteriaVo,
activityId);
}
}
}
if (StringUtils.isNotBlank(salesSkuCriteriaVo
.getDeptId())) {
String skuVoClassify = salesSkuCriteriaVo
.getDeptId()
+ salesSkuCriteriaVo.getSubDeptId()
+ salesSkuCriteriaVo.getClassId()
+ salesSkuCriteriaVo.getSubClassId();
String skuModelClassify = nvl(model.getDeptId())
+ nvl(model.getSubDeptId())
+ nvl(model.getClassId())
+ nvl(model.getSubClassId());
if (skuType.equals(EvActivity._SKU_TYPE_CLASS)) {
if (!skuVoClassify.equals(skuModelClassify)
&& model.getDeptId() != null) {
checkRepeatData(salesSkuCriteriaVo,
activityId);
}
}
}
if (StringUtils.isNotBlank(salesSkuCriteriaVo
.getBrand())) {
if (skuType.equals(EvActivity._SKU_TYPE_BRAND)
&& model.getBrand() != null) {
if (!salesSkuCriteriaVo.getBrand().equals(
model.getBrand())) {
checkRepeatData(salesSkuCriteriaVo,
activityId);
}
}
}
salesSkuCriteria = model;
break;
}
}
} else {
// 检核新增数据是否重复 add by Jason
checkRepeatData(salesSkuCriteriaVo, activityId);
//新增
salesSkuCriteria = new EvSalesSkuCriteria();
salesSkuCriteria.setCreateTime(sysTime);
salesSkuCriteria.setCreator(modifierId);
salesSkuCriteria.setCreatorName(modifierName);
}
salesSkuCriteria.setModifyTime(sysTime);
salesSkuCriteria.setModifier(modifierId);
salesSkuCriteria.setModifierName(modifierName);
salesSkuCriteriaVo.mergeVoToModel(salesSkuCriteria);
//放回 set 自動儲存
//modify by Jason 由于在检核重复数据的时候进行查询会发出sql语句,导致activityId为空
//这里用tempList来缓存需要更新的数据,在循环结束后一次性保存
//entity.getEvSalesSkuCriteriaSet().add(salesSkuCriteria);
tempList.add(salesSkuCriteria);
}
entity.getEvSalesSkuCriteriaSet().addAll(tempList);
List<EvSalesSkuCriteria> list = new ArrayList<EvSalesSkuCriteria>();
list.addAll(entity.getEvSalesSkuCriteriaSet());
this.sortSalesSkuCriteria(list);
int seq = 0;
for(EvSalesSkuCriteria model : list) {
model.setSeq(++seq);
}
}