之前的实习--关于Web部分的笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/H_Gao/article/details/51582080

之前实习的时候做的是关于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添加的信息怎么显示出来
<s:property value=“actionMessages[0]}”/>

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);
			}
	}

欢迎关注我的公众号 ,不定期会有优质技术文章推送 。

微信扫一扫下方二维码即可关注
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/H_Gao/article/details/51582080