============================J2SE================================
1.也算是一种操作经验吧，日期和String之间的转换：
	Date->String
		private static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");		/预订输入日期的格式
		String reDate=sdf.format(date);	
		Pattern p=Pattern.compile("-");
		String[] reList=p.split(reDate);
		将日期划分为三部分
	String->Date
		private static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");		/预订输入日期的格式
		try {
			reDate=sdf.parse(date);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
2.在类的方法内部变量，必须在定义的时候new（比如List类型的，同样是必须用new建立变量的，不能在用的时候建立），这里仅对Object类型的变量，基本变量会自动赋值

3.&& 便是和，&表示位运算；

4.集合操作的一个特性：addAll(Collection),表示将一个集合添加至另一个集合中，如：
	为了去掉List中的重复元素，可以将List全部添加到Set中。
	
=============================Hibernate===========================
1.Hibernate多对多映射：pojo类Sutdent中有一个Set属性，泛型属性为Teacher
	<set name="teachers" table="teacher_student">  
    	<key column="student_id"/>  
        <many-to-many class="Teacher" column="teacher_id"/>  
    </set>
    	a  要找此教师的学生，应该找到学生集合的属性名 students,依据<set name="students" table="teacher_student">
		b 在里面同时指定了要找的中间表，要知道中间表中教师的id对应的字段:	<key column="teacher_id"/>
		c  在此中间表中找到一条此教师id:teacher_id对应的学生的id：student_id;
		d 拿着此学生id到学生表中找到一条符合条件的记录（在对象模型中也就是一个学生对象）
		--------------------------------------
		Role类中，有一个Employee泛型的Set类型变量，employees，与Employee类中Role泛型的Set类型变量：roles，形成多对多关系：
		Role：
		<set name="employees" table="em_ro">		//table为生成中间表的名字
			<key column="role_id"></key> 	//在中间表中生成的本类的外键；
			<many-to-many class="Employee" column="employee_id"></many-to-many>		//指定映射的对方类，以及与之关联的字段：column；
		</set>
		
		Employee：
		<set name="roles" table="em_ro">		//table为生成中间表的名字
			<key column="employee_id"></key>		//在中间表中生成的本类的外键；
			<many-to-many class="Role" column="role_id"></many-to-many>		//指定映射的对方类，以及与之关联的字段：column；
		</set>
		

2.在多对多或者其他的映射中，有双向绑定的情况，在操作代码中，只要操作一次就可以了。不用从两端都绑定。

3.lock为Mysql中的保留字，不能在生成的table中有lock命名的字段；

4.一对多映射：Power类：
		<set name="roles">
			<key column="power_id"></key>	//在many的一端的表中，建立一个字段，为本类（one端）的外键
			<one-to-many class="Role"/>		//指出many端的类的类型
		</set>

5.多对一映射：Role类：
		<many-to-one name="power" column="power_id"></many-to-one> //name为Power中的所指定的属性名，column为在role类中映射的表中对应的字段，为外键
		
5.boolean类型在Hibernate中对应的字段属性：boolean, yes_no 和 true_false 都是 Java 中 boolean 或者 java.lang.Boolean 的另外说法
	

5.映射文件的格式：
	<?xml version="1.0" encoding="UTF-8"?>		//声明
	<!DOCTYPE hibernate-mapping PUBLIC  
   		"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
   		"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 		//映射文件的DTD；
	<hibernate-mapping package="com.desktophrm.domain">		//映射正文的开始，指定映射类所在的包；
	<class name="Role" table="hr_role" catalog="mis">		//映射的类，已经生产的表和所使用的数据库；
	<id name="id" column="id" length="5">		//指定类中id属性所对应的表中的字段名以及属性，generatro为说明id的生成方式，native为采取数据库自带的生成方式
			<generator class="native"></generator>
	</id>
	<property name="name" column="name" length="50"></property>		//类中属性映射的方式，指定在表中生成字段名以及字段的属性；
	
6.set中order-by的用法：
	当类中有一个Set的属性：private Set<Role> roles;		//set返回表是无顺序的
	映射之hbm文件中后，为了使返回的内容按照一定内容排序：
		<set name="dataSources" order-by="id">		//以表的id排序，这个id，是指对方表的id，即DataSource表的id；
			<key column="empl_id"></key>
			<one-to-many class="DataSource"></one-to-many>
		</set>
		
	注意一点，如果是多对多映射中，需要对返回的Set排序，这是因为多对多生成一个中间表，所以order-by的内容在三放表中没有id字段，而要使用表中的实际字段：
	<set name="roles" table="hr_em_ro" order-by="employee_id">	//employee_id就是表中的id，而不是类中的id属性。
			<key column="employee_id"></key>
			<many-to-many class="Role" column="role_id"></many-to-many>
		</set>
	
7.setProperties() 方法会自动将customer对象实例的属性值匹配到命名参数上，但是要求命名参数名称必须要与实体对象相应的属性同名。
	Customer customer=new Customer();  
	customer.setName(“pansl”);  
	customer.setAge(80);  
	Queryquery=session.createQuery(“from Customer c where c.name=:nameandc.age=:age”);  
	query.setProperties(customer); 
	
8.Hibernate 的实体查询存在着对继承关系的判定，比如我们前面讨论映射实体继承关系中的Employee实体对象，它有两个子类分别是 HourlyEmployee，SalariedEmployee,如果有这样的HQL语句：“fromEmployee”,当执行检索时 Hibernate会检索出所有Employee类型实体对象所对应的数据（包括它的子类 HourlyEmployee，SalariedEmployee对应的数据）

9.查询其中几个字段,添加new list(),注意list里的l是小写的。也不需要导入包，这样通过query.list()出来的list里存放的不再是默认的Object数组了，而是List集合了   
	  String hql = " select new list(name,passwd) from Users";   
10.修改默认查询结果(query.list())不以Object[]数组形式返回，以自定义类型返回
	String hql = " select new  com.domain.MyUser(name,passwd) from Users"; 所以必须要有接受2个参数的构造函数
	通过 query.list()出来的list里存放的不再是默认的Object数组了,而是自定义的类MyUser,必须加包名，String hql = "from Users";中的Users类也是必须加包名的，但是因为再Users.hbm.xml里< hibernate-mapping auto-import="true"> auto-import默认值为true（所以auto- import属性也可以不写）,自动导入了 
	
11.hql语句中的属性的属性用法：
	hql="update Position post set post.dept.id=115 where post.id=:postId and post.dept.id=:deptId";	//可以使用属性中的id
		Query q=s.createQuery(hql);
		q.setInteger("postId", postId);
		q.setInteger("deptId", deptId);
12.hql更新语句：
	hql="update Department dept set dept.deptName=:name, dept.description=:description where dept.id=:deptId";	//注意set后面有多个的使用，用“，”隔开，而不是“and”
	
13.hql中boolean的用法：
	hql="update Employee em set em.remove=false where em.id=:eeId and em.post.id=:postId";
	remove在类中为一个boolean变量，那么在映射文件中，type属性为Boolean。但是在更新语句中，是以remove=true/false来映射。
	在mysql数据库中，这个字段的属性为bit，只能存储0和1.
	且ture=1，false=0；
	注意，remove=true/false中的true/false不需要“”引用。
	
14.方法内的变量必须要初始化。而类中的变量则不必要；

15.如果一个boolean值在mysql中为null，那么通过hql获得这个对象时，就会抛出异常。org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.desktophrm.domain.Position.remove

16.session的update、saveOrUpdate方法的使用：
	s.update("Position", post);		//第一个参数为实体对象的名称；第二个参数为需要更新的对象；
	只要新对象的id不变，就是更新原对象；
	
17.Session 在commit后关闭的问题。在session，建立一个类变量s=HibernateUtil.getSession();当使用这个方法的时候并commit，会导致Session关闭。
	解决办法是，在每个方法中都赋值一次，就是说对s变量建立一个对象，这就是一个新的session对象，在别的方法中commit关闭后，此心变量不会受到影响，可以照常使用。
	
18.${#session.emId }属于jstl语法，所以无法使用#session.emId表达式。只有在<s:property value="#session.emName"/>中才能使用

19.在<a href>中使用session中的值的方法：<a href="emdata.action?flag=<s:property value='#session.emId' />">这里也可以使用jstl表达式，但是要复杂
	为<a href>中变量赋值的方法：，不用引号（”）将值引用；
	
20.在Action中的变量，可以获取<a href>中的变量，但是前提是Action中的变量有getter、setter方法。

21.double类型变量不能输入2/3这样的值，电脑无法计算。

22.in为html的保留字，所以在action中不能有in这样的对象。当然也有肯能是Action中不能有只有两个字母的变量，谨记

23.<s:hidden>用法：类似于textfield，不用将textfile包含在内。
	正确的用法：<s:hidden name="emId"></s:hidden><s:hidden name="inId"></s:hidden>
	错误的方法：<s:hidden><s:textfield name="emId" disabled="true"/></s:hidden><s:textfield name="inId" disabled="true"/>
	
24.java中日期的操作：
	使用Calendar类进行操作，java已经不建议使用Date进行操作。
	Calendar calendar=Calendar.getInstance();
	calendar.add(Calendar.MONTH,i);		//i为正数，为向前跳几个月，就是增加几个月；为负数，则为减少几个月。
	Date per=calendar.getTime();
	另有一个小窍门：java中的月份是从0-11的，这是指，如果使用getMonth，返回的月份会比实际的小1
	
25.传递参数的又一方法，在没有form的情况下面，从一个Action->jsp->action传值的方法：
	<a href="nextsrc?emId=<s:property value='emId'/>&perm=<s:property value='perm' />">NextMonth
	
26.%用法，用于将Action中的值传递到jsp中，当两个变量不一致时费用有用：
	<s:hidden name="emId" value="%{emId}"></s:hidden><s:hidden name="inId" value="%{inId}"></s:hidden>
	
27.提交多组数据的方法，在Action中使用List；
	Action：private List<IndiData> indiDataList		//IndiData本身就是一个封装了很多属性的类
	jsp：	<s:iterator value="inList" status="stat">		//status，用于得到List的指针
			 <s:textfield name="%{'indiDataList['+#stat.index+'].indiSrcValue'}"/>		//因为封装了属性，所以要指明属性：indiSrcValue
			 <s:textfield name="%{'indiDataList['+#stat.index+'].indiSrcCont'}"/>		//#stat.index获得数组的指针
			 <s:hidden name="%{'indiDataList['+#stat.index+'].inId'}" value="%{id}"/>
	conversion:ResultAction-conversion.properties
				Element_indiDataList=com.desktophrm.domain.IndiData			//indiDataList: 在Action中的List变量名；com.desktophrm.domain.IndiData：变量所对应的封装类
				
28.<s:if>和%符号用法：
	<s:if test="%{<s:property value='remove'/>}">已删除</s:if>		//test的表达式必须使用%{}引用，表示内部是一个条件测试等式
	其实，以上用法是不正确的，<s:property>获得的boolean，无法在<s:if>中使用，必须在iterator中使用id属性：
	<s:iterator value="deptList" status="stats" id="dept">
	<s:if test='%{#dept.remove}'>已删除</s:if>		//使用ognl表达式的#获得id的对系那个dept，再获取对象中的属性
	<s:else>正常</s:else>		//<s:else>是直接跟在后面的，不是包含关系。
	
29.<s:iterator>用法：
	<s:iterator value="deptList" status="stats">		//status参数用于获取数组、列表的指针
	<s:property value="#stats.index+1"/>		//获取列表指针序号，“+1”，因为数组都是从0开始。注意需要使用#符号，因为指针不是存放在ValueStack中的。
	
30.session.update()用法问题：
	如果一个表中引用了另一个表主键作为外键。那么更新另一个表的时候，不能使用update：
	dept.setId(deptId);
	s.saveOrUpdate("Department", dept);		//因为在Department的主键是post表的外键，因此在更新的时候，会报错，post的外键为空。
	因为这种更新的方法，会同时更新两个表
	----------------
	一个新发现：
	使用merge方法，可以避免这种问题，不会影响到其他的表。
	
31.Action中的类似execute的方法，最好不用用get这种形式，会非常麻烦，吃够的了苦头

32.<s:select>方法的操作：
	 <s:select list="deptList" name="deptId" listKey="id" listValue="deptName" headerKey="deptId" emptyOption="true"></s:select>
	//说明：
		//1.list：供选择的列表List变量，List内可以存储一个对象。
		//2.如果list中存储的为一个对象，可以使用listKey指定id为对象中的某个属性，表示返回后的内容；listValue则对象中某个属性，表示在jsp页面显示的内容
		//3.name，表示在Action中的变量名，同时也是返回值的变量名
		//4.emptyOption：表示在下拉列表中，是否添加一个空白行。
	另一种用法：Map
	 <s:select list="#{'true':'删除','false':'正常'}" name="post.remove" headerKey="post.remove" emptyOption="true"></s:select>
	//说明：
		//1.构造一个list变量，需要使用#符号，而且，map类型的变量必须使用“：”分隔键值对；
		//2.其他参数同上雷同。
		
33.Struts中的传值，Action->Action
		<action name="calculate" class="com.desktophrm.action.ResultAction" method="calculate">
			<result name="success" type="redirectAction">  //type="redirectAction"表示Action跳转后，会保留上一Action中的属性值
				emdatalist		//跳转后的Action
				%{deptId}		//向下一Action中传递的参数，注意形式name="deptId"（下一Action中的变量）；>%{deptId}本Action中传递的参数名
			</result>		//这样就可以把上一Action中的某个参数传递至下一Action中。
		</action>
		
34.Struts2获得文件路径的方法：
	private String daoXML=ServletActionContext.getServletContext().getRealPath("/WEB-INF")+File.separator+"dao.xml";
	获得指定文件的绝对路径。
	但是注意一点，j2ee在eclipse中有个tempproject，但是项目配置文件的更新，并不会更新temp下的文件。因此需要手动复制。