1、JaveEE的三层结构和MVC模式的关系:
SSM架构:(Spring, Spring-mvc, Mybatis)
SSH架构:(Spring, Struts, Hibernate)
2、Struts2框架
(1)Struts2简介:来自Apache基金会的软件,http://struts.apache.org,Struts2与Struts1完全没有关系,Struts2的前身是WebWorks。Spring MVC\Struts2\Struts1都是MVC模式的Web框架,MVC是非常流行的用户界面设计模式。
(2)Maven导包:struts2-core。
(3)配置Struts2:
<1>下载Struts2的jar包:1. 从struts.apache.org下载:解压缩、将*.jar复制到/WEB-INF/lib文件夹;2. 使用Maven下载:使用Eclipse内嵌搜索,搜索到struts2-core的坐标(xml),保存pom.xml;3. 使用maven.tedu.cn/nexus(maven.aliyun.com/nexus)在线搜索,搜索到struts2-core的坐标(xml),保存pom.xml。
<2>配置主控制器:1. 控制器类:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter在struts-core-xxxx.jar包中;2. 编辑文件web.xml(部署描述文件);
<3>添加struts的配置文件:1. 位置:package中(classpath中);2. 文件名:struts.xml,struts的filter会自动按照文件名struts.xml找到这个文件,文件名不能错。
(4)创建HelloWorld项目步骤:
<1>修改配置文件struts.xml,添加web请求的处理路径
- namespace="/test" 表示处理一级路径 /test
- name="hello"处理二级路径 /test/hello.action
- class="com.tedu.HelloAction" 在处理请求时候执行HelloAction的execute()方法,execute方法一定有String返回值,常见的值有“success”"error"
- 与action方法的返回值配合,表示返回“success”时候,转发到msg.jsp页面,msg.jsp 作为用户看的视图。
<2>添加类com.tedu.HelloAction
- 包含String execute()
- 方法中 return "success"
<3>添加 /WEB-INF/msg.jsp
<4>将项目部署到Tomcat上
(5)由控制器向页面传递消息:
<1>在控制器中添加属性,并且为属性添加get方法;
<2>在控制器方法中向属性赋值;
<3>在JSP页面上使用EL表达式读取属性值;EL表达式实际上执行属性的get方法,如果没有get方法就无法获取属性值。
(6)从页面向控制器传递值:
有两种方式:
<1>基本属性传递方式
1. 在控制器中声明与html表单项name属性一致的Bean属性;
2. 添加Bean属性的getxxx setxxx方法;
3. Struts会在接受请求的时候,自动将表单属性值注入到Bean属性中。
<2>域模型属性传递方式
利用域模型打包传递表单数据,优点:
1. 可以便捷的处理表单输入;
2. 特别是在表单被项目重用的时候,显得更加方便。
步骤:
1. 创建域模型对象 User,添加属性id和pwd,添加bean属性访问方法;
2. 在控制器中添加User属性user和get set方法;
3. 在表单中的输入项目name属性值为user.id;
(7)如何获取session对象:
<1>通过工厂方法获取session对象
<2>利用注入获得session对象
<1>通过工厂方法获取session对象
Struts提供了ActionContext对象,这个对象可以获取session,并且访问session。Struts2为了降低耦合性,将HttpSession封装在Map中,调用Map的put方法就可以将数据保存到session中。
<2>利用注入获得session对象
使用ActionContext对象获取Session对象,其缺点是将代码与ActionContext对象耦合在一起,耦合度增加了。为了减少耦合,Struts2提供了Session注入方式。
不仅仅Spring提供了注入功能,Struts2也利用注入方式工作。这里的Session就是注入得到,还可以注入Request对象。注入的好处是彻底实现了松耦合代码。
步骤:
1. 在Action类上实现SessionAware接口
class Login2Action implements SessionAware
2. 在Action类中添加Session属性,和属性访问方法
private Map
public void setSession(Map
this.session = session;
}
3. 在execute方法中就可以利用session属性访问session了
session.put("loginUser", user);
Filter在容器一启动就会创建,Servlet在第一次访问的时候创建,如果在web.xml中加入
3、 UTF-8可以编码10万以上的文字,包括大多数现存的文字,一个中文编码为3个字节;GBK只可以处理中英文,包括2万文字,一个中文编码为2个字节。response.setCharacterEncoding("utf-8");设置服务器端编码方案,response.setContentType("text/html; charset=UTF-8");设置客户端解码方案。
4、Spring整合Struts2
(1)导包:struts2-core 2.3.8、struts2-spring-plugin 2.3.8、struts2-json-plugin
(2)Struts2提供了Spring整合插件struts2-spring-plugin.jar,只要将这个插件添加到/WEB-INF/lib文件夹中,就会自动将spring整合到struts2。整合以后Struts2的Action对象将由Spring容器创建。
(3)手工整合:1. 分别到Spring和Struts2网站下载jar包;2. 将jar包复制到/WEB-INF/lib文件夹中;3. 修改web.xml文件添加Spring容器初始化监听器; 4. 添加Spring配置文件。
利用Maven整合:1. 创建Maven项目,导入Struts2组件,并且配置struts.xml和web.xml; 2.找到struts2-spring组件坐标添加到Struts2项目的pom.xml,插件版本与Struts2的版本必须一致。maven会自动导入插件依赖的Spring包,这是Maven最便捷的特点。
5、(1)dispatcher:转发;
(2)redirectAction:重定向到其他Action;
(3)stream:用于处理图片或者下载;
(4)json:用于处理ajax请求。
转发类型是在Struts的主配置文件中定义struts-default.xml;json:在struts2-json-plugin插件中定义。
dispatcher:是默认的Result,也是最常用的类型。
redirectAction:重定向到其他Action,用于处理重定向结果。org.apache.struts2.dispatcher.ServletActionRedirectResult
stream:用于处理图片或者下载。org.apache.struts2.dispatcher.StreamResult
json:用于处理ajax请求。json不是struts默认的result类型,需要使用一个插件来支持这个类型。org.apache.struts2.json.JSONResult
有两种使用方式:(1)将Action的全部属性发送到客户端;
(2)将Action的一个属性发送到客户端。
json返回结果必须使用struts2-json-plugin插件支持,必须先导入json插件。
6、struts2也提供了拦截器功能,struts2的许多默认功能也是通过其内部的拦截器实现的。
7、值栈ValueStack
(1)从控制器向页面传值的缓冲区;
(2)ValueStack包含当前环境相关的全部对象: request、session、application等;
(3)ValueStack包含两个区域:一个区域是root,是一个List,存储值,一个区域是context,是一个Map,存储环境相关的全部对象;
在Struts2中ValueStack是软件的消息中心,软件的数据和相关环境信息都缓存在这个对象中,其作用与JSP中的pageContext类似,pageContext是JSP中的消息中心。
JSP页面中使用
8、OGNL表达式
OGNL可以在网页struts标签中使用,在struts2中用于读写ValueStack的数据。
(1)读取root区域数据:从栈顶到栈底逐一搜索Bean属性,找到属性就输出;
(2)读写context区域使用#key的方式查找:#session.loginName。
OGNL与ValueStack配合可以从控制器向页面传递数据。
ValueStack与EL
Struts2中拦截了EL表达式,使其从ValueStack中获取数据,也就是说使用EL就可以很好的访问ValueStack。
9、Spring整合Struts2、Mybatis
导包:struts2-core、struts2-spring-plugin、struts2-json-plugin、mybatis、mybatis-spring 1.2.3、dbcp 1.4、mysql 5.1.36、aspectjweaver、spring-aop、aopalliance、codec、junit。
10、Hibernate(冬眠)
导包:hibernate-core 3.6.9、mysql。
由于是开源软件,其包的依赖关系不够完善,有的Hibernate导入以后会出现ClassNotFound异常,可以更换其他版本。
其想法是将java的实体对象映射存储到数据库的表中,只需要将实体与表的映射关系定义好,Hibernate会自动的生成数据库的SQL语句。
Hibernate称为ORM(对象关系映射)框架,是一种不需要写SQL的框架。
使用步骤:
(1)导入Hibernate相关包;
(2)导入数据库的驱动程序;
(3)添加Hibernate主配置文件;
(4)添加Hibernate映射配置文件;
(5)添加实体类,建议实体类实现equals和hashCode方法,使用Eclipse生成即可。
(6)调用Hibernate API就可以自动生成SQL访问数据库了。
11、Hibernate
(1)主键类型:
利用
<1>自增类型identity
语法:
添加用户时,hibernate就是利用自增ID为Student生成ID,并读取到实体对象中。自增列不能插入数据,必须由数据库自动生成ID。
<2>sequence序列
Oracle、DB2等数据库提供了Sequence,用于生成ID,语法:
seq_name
只有Oracle、DB2数据库支持,seq_name是Sequence对象的名称。
<3>UUID
Hibernate会自动调用UUID算法生成ID。语法:
(2)被Hibernate管理的实体对象有三种状态:
<1>临时状态:刚刚创建的对象,或者被删除的对象,数据库中没有对应的记录,这是对象的状态为临时状态。调用了save或者saveOrUpdate方法以后,对象将被保存到数据库中,对象状态将转换为持久状态。
<2>持久状态:保存以后的对象或者从数据库中获取的对象,其状态是持久状态,持久状态下改变对象的数据,将生成相应的sql语句,将对象的状态保存到数据库中。
<3>游离状态:对象被从Session的缓存中清理出来,对象状态变成游离状态,游离状态对象脱离数据库的联系,更改对象的属性,不再影响数据库。如果需要将游离状态的对象数据更新到数据库,可以调用update方法,update方法执行以后,对象又还原回持久状态,并且将已经更改的属性更新到数据库。
(3)HQL查询
(Hibernate Query Language)Hibernate提供一种新的查询语言,与SQL类似,但是与数据库无关。与SQL相近的语法,from类名,where条件,group by...,having...,select...,order by...。
HQL与SQL不同点:
(1)HQL面向对象,按照类名属性进行查询,SQL按照表、列进行查询;
(2)HQL不支持select *,省略就是select *,直接from;
(3)HQL不支持函数,可以有分组函数;
(4)HQL不支持join on。
使用HQL:
(1)打开session;
(2)创建Query对象;
(3)使用Query对象执行HQL,返回集合;
(4)关闭Session。
(4)关联关系
在数据库中表与表有关联关系,反应到实体类上就体现了引用关系。
(5)Hibernate的懒惰(lazy)加载现象:
尽可能晚的情况下加载数据库的数据到内存对象,使用延迟加载可以提高软件性能。
在映射文件上使用lazy="false"可以关闭延迟加载功能,在软件中使用OpenSessionInViewFilter功能,可以在视图层使用延迟加载功能。
12、Spring与Hibernate整合
整合的目的:将Hibernate的对象交给Spring容器,由Spring容器进行管理。
整合步骤:
(1)导入Hibernate(导入数据库驱动,数据库连接池(实现DataSource的类,dbcp,c3p0));分别导入Hibernate、JDBC Driver以及连接池c3p0,连接池可以用dbcp,c3p0或阿里的druid;
(2)导入Spring;
(3)导入Spring-ORM,是Spring整合Hibernate的扩展插件,这个插件是Spring提供的,用于在Spring中整合支持Hibernate;
(4)配置Spring:配置数据源(连接池),配置Hibernate SessionFactory(把Hibernate的参数配置进去),配置事务管理,配置HibernateTemplate(封装了Hibernate提供的CRUD方法);
利用事务管理器,就可以将Hibernate的事务托管到Spring,利用Spring提供的注解就可以管理事务的开启提交和关闭,可以大大简化编码。
(5)编写数据访问层(DAO)接口;
(6)实现DAO:利用Spring注解注入HibernateTemplate对象,就可以非常便捷的实现DAO接口,HibernateTemplate封装了Hibernate提供的CRUD功能。
导包:hibernate-core 3.6.9、mysql 5.1.36、c3p0 0.9.1、druid(com.alibaba)1.0.16、spring-core 3.0.5、spring-orm 3.0.5、struts2-core 2.3.24、struts2-spring-plugin 2.3.24、struts2-json-plugin 2.3.24。
ClassNotFoundException一般是缺少包,MethodNotFoundException一般是导的包版本不对。