《JAVA三大框架知识.doc》由会员分享,可在线阅读,更多相关《JAVA三大框架知识.doc(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、* Sturts2*配置struts2的步骤:1.找到struts-2.1.8.1夹2.在struts-2.1.8.1appsstruts2-blank-2.1.8.1WEB-INFlib下所有的jar文件导入到你自己的项目中 (1)拷贝所有的jar文件,放到项目中的一个文件夹中 (2)把拷贝过来的所有jar文件构建路径导入项目中。 也可以把所有的jar文件拷贝到web-inf/lib目录下3.修改你自己项目中的web.xml文件添加以下代码 struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilte
2、r struts2 /* 以上的这些代码是从struts2-blank-2.1.8.1例子中的web.xml文件中拷贝过来的。4.从struts2-blank-2.1.8.1例子中把struts.xml文件拷贝到自己项目类路径下并进行修改。5.部署启动,访问。*通常每个包都应该继承struts-default包, struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型。*struts2的处理流程FilterDispatcher-Interceptor-Action-Result-Jsp/html Struts2内置的一些拦截器或用户自定义
3、拦截器 用户编写的action类,类似struts1中的Action*struts中action后如果没有class则默认访问ActionSupport类的excute()方法,该方法的返回值与其下方的result中的name值进行比较,如果result后没有写name则默认为name=“success”,如果excute()方法的返回值与name的值相等则跳转到result后对象的相应JSP页面。*如果struts中action后写相应的类那么此类需要继承ActionSupport这个类,并覆写其中excute()方法,excute()方法的返回值为字符串类型,返回值与result中的值进行
4、比较,然后跳转到后边相应的JSP页面。*jar包拷贝到项目中构建路径之后,部署程序,点击浏览,如果struts21WEB-INFlib路径下没有相关的jar包那么解决办法为:将jar包直接拷贝到本项目中的web-inf/lib下。*访问项目的时候访问路径要根据struts的配置中命名空间进行访问,访问是逐层往回访问的,只要访问路径最前面的路径是命名空间的路径就可以访问成功。例如:明明空间是/aaa,则访问的时候输入/aaa/bbb/ccc也可以访问成功。*action接口定义了5个字符串常量:public static String SUCCESS = success;public stati
5、c String NONE = none;public static String ERROR = error;public static String INPUT = input;public static String LOGIN = login;在excute()方法中return值可以直接写常量例如:return SUCCESS;*result配置:struts2中提供了多种结果类型,如: dispatcher(默认值):表示转发。redirect :表示重定向。redirectAction :重定向到其他的action。plainText:页面以源码的形式展现。*struts配置中a
6、ction有method属性,method属性值是所访问的类的一个方法名,method属性值是什么,访问类的时候就调用哪个方法。*struts中要修改访问时的后缀名,语句为:*如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。如:*如果Action中存在多个方法时,我们可以使用!+方法名调用指定方法。*全局变量,访问的时候如果在action中没用找到result值那么会到全局变量中去寻找/message.jsp*通过这种方式,我们就可以将Struts 2的Action按模块配置在多个配置文件中。*struts2中表单提交的属性名可以直接在类中定义成变量,并必须为变量设置get和
7、set方法。表单的action就可以直接提交到struts的配置文件的action访问路径。*struts2标签 :* Hibernate*hibernate项目的创建流程:1.将hibernate的jar包以及mysql的jar包拷贝的项目中2.将user.hbm.xml拷贝到实体类中并将名字改为对应的类名3.配置user.hbm.xml中的内容 配置要生成表的相应的字段以及主键: 4.将hibernate的配置文件hibernate.cfg.xml导入到src路径下,并配置: com.mysql.jdbc.Driver jdbc:mysql:/localhost:3306/hibernat
8、e root root org.hibernate.dialect.MySQLDialect *regedit 搜索注册表*hibernate中创建一个学生对象,把学生对象保存到数据库中的步骤:1.读取hibernate.cfg.xml配置文件Configuration cfg=new Configuration().configure();2.创建一个会话工厂SessionFactory sf=cfg.buildSessionFactory();3.从会话工厂取得会话Session session=sf.openSession();4.开启事务session.beginTransaction
9、();5.持久化学生对象6.提交事务session.getTransaction().commit();7.释放资源session.close();*在查询数据的时候用session.load()方法会形成懒加载,在输出的时候才会发出SQL语句,而session.get()方法则不会形成,使用session.get()方法会直接发出sql语句 解决懒加载的办法是在session资源关闭之前输出所要查询的对象 ,那么session资源关闭之后仍然可以输出所要查询的对象。*表示的是多对一的关系 在多的那个类的配置文件中加入 *一对一的关系中在只有主键的那个类中加入 一对一的关系在有外键和主键的类中
10、加入 person *在一对一的外键唯一在只有主键的类中加入 在有主键和外键的类中加入*在一对多的关系中在一端配置文件中加入: 如果要双向关联需要在多端加入: 特别注意的是:两端指定的外键列名要相同 要不然会出现两列都是外键*在多对多的关系中两端的配置文件: 两端的配置是相反的*组件映射:映射文件: 其中contact不会被创建成表,它里面的这些属性会自动创建成相应的字段,因为它不是实体类,它只是实体类的一个组成部分。*复合主键也称之为联合主键,就是多个字段构成唯一性。 复合(联合)主键映射 通常将复合主键相关的属性,单独放到一个类中: 此类必须实现序列化接口 覆写hashcode和equal
11、s方法*hibernate中hql查询语句:1.单一属性查询/返回结果集属性列表,元素类型和实体类中相应的属性类型一致List courses = session.createQuery(select name from Course).list();for (Iterator iter=courses.iterator(); iter.hasNext();) String name = (String)iter.next();System.out.println(name);2.多个属性查询/查询多个属性,其集合元素是对象数组/数组元素的类型和对应的属性在实体类中的类型一致/数组的长度取决与
12、select中属性的个数List courses = session.createQuery(select id, name from Course).list();for (Iterator iter=courses.iterator(); iter.hasNext();) Object obj = (Object)iter.next();System.out.println(obj0 + , + obj1);3.返回实体对象/如果认为返回数组不够对象化,可以采用hql动态实例化Course对象/此时list中为Course对象List courses = session.createQue
13、ry(select new Course(id, name) from Course).list();for (Iterator iter=courses.iterator(); iter.hasNext();) Course course = (Course)iter.next();System.out.println(course.getId() + , + course.getName();但是此时在类中必须有相应的构造函数4.使用别名/可以使用别名List courses = session.createQuery(select c.id, c.name from Course c).
14、list();for (Iterator iter=courses.iterator(); iter.hasNext();) Object obj = (Object)iter.next();System.out.println(obj0 + , + obj1);5.使用as命名别名/可以使用as命名别名List courses = session.createQuery(select c.id, c.name from Course as c).list();for (Iterator iter=courses.iterator(); iter.hasNext();) Object obj
15、= (Object)iter.next();System.out.println(obj0 + , + obj1);6.实体对象查询/返回Course对象的集合/可以忽略selectList courses = session.createQuery(from Course).list();for (Iterator iter=courses.iterator(); iter.hasNext();) Course course = (Course)iter.next();System.out.println(course.getName();7.实体对象查询用别名/返回Course对象的集合/
16、可以忽略select,表可以使用别名List courses = session.createQuery(from Course c).list();for (Iterator iter=courses.iterator(); iter.hasNext();) Course course = (Course)iter.next();System.out.println(course.getName();8.实体对象查询用as命名别名/返回Course对象的集合/可以忽略select,表可以使用as命名别名List courses = session.createQuery(from Cours
17、e as c).list();for (Iterator iter=courses.iterator(); iter.hasNext();) Course course = (Course)iter.next();System.out.println(course.getName();9./返回Course对象的集合/使用select查询实体对象,必须采用别名List courses = session.createQuery(select c from Course as c).list();for (Iterator iter=courses.iterator(); iter.hasNex
18、t();) Course course = (Course)iter.next();System.out.println(course.getName();10./不支持select * from .这样的查询语句List courses = session.createQuery(select * from Course).list();for (Iterator iter=courses.iterator(); iter.hasNext();) Course course = (Course)iter.next();System.out.println(course.getName();1
19、1.采用list查询发出一条查询语句,取得Course对象数据、List courses = session.createQuery(from Course).list();for (Iterator iter=courses.iterator(); iter.hasNext();) Course course = (Course)iter.next();System.out.println(course.getName();12. 出现N+1问题 1:发出查询id列表的sql N:在依次发出根据id查询Course对象的sqlIterator iter = session.createQue
20、ry(from Course).iterate();while(iter.hasNext() Course course = (Course)iter.next();System.out.println(course.getName();13.不会出现N+1问题 因为list操作已经将Course对象放到了一级缓存中,所以再次使用iterate操作的时候 它首先发出一条查询id列表的sql,在根据id到缓存中去数据,只有在缓存中找不到相应的 数据时,才会发出sql到数据库中查询Iterator iter = session.createQuery(from Course).iterate();
21、while(iter.hasNext() Course course = (Course)iter.next();System.out.println(course.getName();14.List courses = session.createQuery(from Course).list();for (Iterator iter=courses.iterator(); iter.hasNext();) Course course = (Course)iter.next();System.out.println(course.getName();System.out.println(-)
22、;再次发出查询sql在默认情况下list每次都会向数据库发出查询对象的sql,除非配置查询缓存,所以下面的list操作 虽然在一级缓存中已经有了对象数据,但list默认情况下不会利用缓存,而再次发出sql 默认情况下,list会向缓存中放入数据,但不会利用数据courses = session.createQuery(from Course).list();for (Iterator iter=courses.iterator(); iter.hasNext();) Course course = (Course)iter.next();System.out.println(course.ge
23、tName();15.条件查询/可以拼字符串List courses = session.createQuery(select c.id, c.name from Course c where c.name like %1%).list();for (Iterator iter=courses.iterator(); iter.hasNext();) Object obj = (Object)iter.next();System.out.println(obj0 + , + obj1);16./可以使用?方式传递参数/参数的索引从0开始/传递的参数值,不用单引号引起来/注意方法链编程List
24、courses = session.createQuery(select c.id, c.name from Course c where c.name like ?) .setParameter(0, %1%) .list();for (Iterator iter=courses.iterator(); iter.hasNext();) Object obj = (Object)iter.next();System.out.println(obj0 + , + obj1);17./使用 :参数名称 的方式传递参数值List courses = session.createQuery(sele
25、ct c.id, c.name from Course c where c.name like :myname) .setParameter(myname, %1%) .list();for (Iterator iter=courses.iterator(); iter.hasNext();) Object obj = (Object)iter.next();System.out.println(obj0 + , + obj1);18./使用 :参数名称 的方式传递参数值List courses = session.createQuery(select c.id, c.name from Co
26、urse c where c.name like :myname and c.id=:myid) .setParameter(myname, %1%) .setParameter(myid, 12) .list();for (Iterator iter=courses.iterator(); iter.hasNext();) Object obj = (Object)iter.next();System.out.println(obj0 + , + obj1);19./支持in,需要使用setParameterList进行参数传递List courses = session.createQuery(select c.id, c.name from Course c where c.id in(:myids).setParameterList(myids, new Object1, 2, 3, 4, 5) .list();for (Iterator iter=courses.iterator(); iter.hasNext();)