1、SSH框架介绍:
2、搭建struts2、hibernate和spring编写环境,步骤如下:
(1)下载struts2、spring和hibernate包(到官网下载);
(2)在MyEclipse 10(我用的该版本,其他版本也一样的)创建一个web project项目;
(3)接着按如下方式将下载包中的jar包(按如下方式找到该jar,注意下图只讲述了struts和hibernate环境配过程,spring的配置接在图片后面)添加到项目的lib中,将下载包中默认项目已经存在的xml文档添加到src中:
注:第4步需要将blank中的web.xml中的过滤器配置段拷贝到项目中的web.xml中。
spring环境配置步骤:
首先,若是spring2.5.6以前的版本,则将spring包中的spring.jar添加到项目lib中 jar包位置如:spring-framework-2.5.6\dist
若是spring3.0以后的版本,则将libs中的所有jar包添加到项目的lib中 jar包位置如:spring-framework-3.2.9.RELEASE\libs;
然后,将日志jar包和commons-logging包添加到项目lib中,一般在添加struts和hibernate包后,这两个包就已经有了。
最后,在spring包中找到applicationContext.xml文件并复制到src中。至此三大框架的jar包和配置文档xml都已经被配置到项目中了。
但是,还没有结束,在项目lib中由于添加了三大框架的jar包,这三框架的jar包可能相互之间可能有重复的,需要将重复jar包中版本较低的移除(例如struts和spring都有logging包和common-logging包)。此步很重要,不然可能引发很多未知错误。
/********************************3~8都是关于strust的*****************************/
3、struts2的工作原理流程及相对JSP/servlet的优点:
(1)工作流程粗略概括:
首先,你在url地址栏提起访问请求;
然后,配置在web.xml中的过滤器工作,过滤项目所有对象,并在struts.xml中找到和URL中请求的action同名配置段;
接着,执行找到的该action类;
最后,action类执行完后,将执行上述struts.xml中找到的action配置段下的result对象(一般为JSP等),并返回response响应,(一般情况下,action类执行后会有返回值,该值一般用于区分到底执行action配置段下的哪个result对象)。
具体可见下图:
(2)struts.xml中action配置的作用原理详解:
如上图,action的name对应Url中请求的地址,请求该地址后需要运行class后的action 类,action类会返回一个字符串result,该字符串会自动匹配result的name相同的那个JSP结果页面。
(3)优点:
一:不再需要写servlet类(struts2框架会自动创建一个servlet容器),其逻辑实现都可以在action中实现了。同时,不需要自己写setAttribute\getAttribute、转发跳转forward等,这些都由struts2框架完成,因此开发者可以不了解这些javaWeb知识点,降低了开发难度;
二:struts2的引入使得模块化开发更加清晰,有利于提高开发效率;
4、关于action类中的属性(变量)、get/set、execute方法
(1)属性与get/set方法:
前台form中有一个<input type="text" name="username"/>
如果传到action。在action中应该有一个属性,名字也叫username(就是前台后台变量名要一样),而且这个username有get/set方法。这里的方法名称按java Bean的规定的。
当struts接受这个action请求时,struts自动调用 username的set方法(注意此set方法不是action中那个,而是由struts框架提供)把前台的值传到action中的username,在action处理中如果要使用username则直接用即可(因为action中的get方法会自动获取username)。当action处理完成,要返回到页面时,在生成jsp的过程中,你可以在页面中使用EL,${username},这时struts自动调用username的get方法(此get方法也不是action中那个)。
总结:struts自动将前台的参数赋值给action的前提条件是:action中有名称一样的参数并且该参数有对应的get/set方法;同时,action的参数被struts自动传递给下一页面的前提是action中的该参数有get/set方法。
补充:①、struts中传递的参数是以范围变量request形式传递的,使用${request.username}可以予以验证。
②、如果struts传输的参数在action中没有定义,而是被封装在实体类中并通过对象调用的,那么此时action类应该继承ModelDriven<Object>泛型接口模型驱动。
(2)execute方法
Struts2中Action必须实现execute方法吗?
答:不必须,可以指定处理方法。
你配置里写了method={1}就会调用对应的方法,只有当你没指定method时,struts2才会默认调用execute 方法。
<package name="helloworld" extends="struts-default">
<action name="hello"
class="MyFirstPackage.HelloworldAction"
method="execute">
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
5、action中访问范围变量的方式
第一种ActionContext方式访问方法具体见下:
6、result配置相关知识:
7、自定义拦截器如何使用?
答:首先,拦截器是action运行前起作用的,没有自定义拦截器系统会自动在每个action运行前运行默认的拦截器。
接着,讲一下自定义拦截器类生成方式:new普通类同时添加interceptor继承类,如下:
生成拦截器类后还要在struts.xml中进行配置才会有效,如下图:
8、javaEE中验证器的方式有哪些?
答:两种,一:直接在action类中实现一个验证方法;二:在action类的同一个包下创建一个xml文档用于验证(xml文档的文件名有规定的)。
validation.xml的配置格式如下:
/***********************************9~13都是关于hibernate的*************************************/
9、如何给hibernate添加日志属性文档?
答:到project\etc中找到log4j.properties并复制到项目的src中。
10、hibernate与ORM介绍
答:如下图:
11、hibernate的环境配置好后如何实现hibernate对数据库的操作?
答:一般需要做三件事:
①、创建一个实体类,用于设置或提取需要进行在数据库中操作的数据对象,例如student.java(包括属性及set/get方法);
②、创建**.hbm.xml文档,用于配置对象关系映射(一般直接到hibernate安装包中去找user.hbm.xml,复制过来并修改),如下图:
③、创建数据库的增删改查类及相关方法,基本格式都一致,举个例子(修改操作):
注意:在查询中有get/load两种查询方式,load与get不同之处就是:load在不使用时不会加载sql查询语句,有利于资源利用,故经常使用load进行single查询。举例如下:1执行并不会加载sql语句,只有2执行才会加载,而get则在1处就会加载sql。
12、**。hbm.xml中主键generator的定义与作用
答:主键的generator主要用于定义是否手动还是自动生成主键及自动生成主键时生成何种类型的主键。具体如下图:
注:主要注意uuid是生成一个32位字符串类型的主键,该主键基本保证其是全球唯一的值,也就可以保证其主键的唯一性。
13、hibernate中的sessionFactory创建注意事项?
答:sessionFactory只需要在每个项目创建一次即可,故一般都放在一个单独类中并以静态代码块实现其初始化,如下图:
***************************以下是spring部分********************************
14、spring框架的主要作用有哪些?
答:如下图所示:
注意几个关键词:解耦合、控制反转(IOC)、依赖注入(DI);
举个例子做个对比,如下:
// 实例化JavaBean,主要是为了比较new对象和依赖注入两者的区别
HelloBean hellobean = new HelloBean();
System.out.println(hellobean.getHelloworld());
// 通过Spring访问JavaBean组件
/*************这部分是类对象在Spring中的配置*******************/
< beans >
< bean id = " helloBean " class = " com.HelloBean " >
< property name = " helloworld " >
< value > Hello ! Rick </ value >
</ property >
</ bean >
</ beans >
/************下面是在应用逻辑处理程序中访问类对象************************/
Resource resource = new ClassPathResource( " com/bean.xml " );
BeanFactory factory = new XmlBeanFactory(resource);
hellobean = (HelloBean)factory.getBean( " helloBean " );
System.out.println(hellobean.getHelloworld());
相比直接new对象,通过spring访问的优势是:如果有多个应用逻辑程序都调用了com.HelloBean,那么一旦准备用另一个类代替现在被调用的com.HelloBean时,在第一种new方式中就需要逐个的在应用逻辑程序中改动,工作量大;而使用spring时就只需要在配置中将com.HelloBean改为需要的类名即可。
结论:其实就 Spring的IOC 来说,就是 JavaBean 由 Spring 来管理组装,表面上看就少了几个 new 字,其实就是为了降低耦合度,这也是我们做软件的目标之一。
15、java反射机制是什么?有哪些作用?
答:Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象(根据安全性限制),无需提前编码目标类。这些特性使得反射其特别适用于创建以非常普通的方式与对象协作的库。例如,反射经常在持续存储对象为数据库、XML或其它外部格式的框架中使用。Java reflection 非常有用,它使类和数据结构能按名称动态检索相关信息,并允许在运行着的程序中操作这些信息。Java 的这一特性非常强大,并且是其它一些常用语言,如 C、C++、Fortran 或者 Pascal 等都不具备的。
但反射有两个缺点。第一个是性能问题。用于字段和方法接入时反射要远慢于直接代码;另一个缺点是使用反射会模糊程序内部实际要发生的事情。程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术会带来维护问题。
16、bean的scope属性singleton和prototype有什么作用?
答:如果一个bean是prototype的,并且这个bean要被注入到其它bean或者你通过getBean这样的方式获得这个bean
的时候,spring容器会创建一个新的实例给你; singleton模式指的是对某个对象的完全共享,包括代码空间和数据空
间,也就是说,singleton会让所有线程共享他的成员变量。
此外singleton的生命周期由容器来管理,但是prototype的生命周期得你自己管理。 最后,singleton的bean引用
一个prototype的bean时会出现问题,因为singleton只初始化一次,但prototype每请求一次都会有一个新的对象,但
prototype类型的bean是singleton类型bean的一个属性,所以不可能有新prototpye的bean产生 。
17、bean的生命周期是?
答:bean生命周期如下;
创建:<bean name=”” class=”” 额外属性>
初始化:配置init-method/实现接口InitializingBean
调用:context.getBean(),进行方法的调用
销毁:配置destroy-method/实现DisposableBean接口。