第三章 P74 1-8
1. 什么是MVC模式?
模型(Model)视图(View) 控制器(controller) 210616
2. Struts2的工作原理?
1) 浏览器发送请求
2) 核心控制器FilterDispatcher根据请求决定调用合适的Action。
3) WebWork的拦截器链自动对请求应用通用功能,例如验证 等 功能。
4) 回调Action的execute方法。实际上,因为Action只是一个控制器,它会调用业务逻辑组件(Model)来处理用户的请求。 5) 输出结果到页面
3. Struts2的核心控制器FilterDispaer如何配置?
<filter>
<!--配置struts2核心Filter的名字-->
<filter-name>struts</ filter-name>
<!--配置struts2核心Filter的实现类-->
<filter-class>org.apache. struts2.dispatcher.Filter Dispatcher </filter-class> <init-param>
<!--配置struts2框架默认加载的Action包结构--> <param-name>actionpackages</param-name>
<param-value> org.apache. struts2.showcase.person</param-value> </init-param>
<!--配置struts2框架的配置提供者类-->
<init-param>
< param- name>configProviders< /param- name>
<param-value>com.ascent.MyConfigurationProvider</param-value> </init-param>
</filter>
4. Struts2的Action类如何开发?
对于Struts 2应用而言,Action是应用系统的核心,我们也称Action为业务控制器。开发者需要提供大量的Action类,并在strust.xml文件配置Action。
5. Struts2的配置文件struts.xml如何开发? 主要配置标签有哪几个?
<struts>
<package name="struts2" extends="struts-default">
<action name="login" class="com.ascent.struts2.action.LoginAction"> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result>
</action>
</package>
</struts>
6. struts.xml配置文件中如何配置Action类?
<action name="usrLoginAction" class="com.ascent.action.UsrLoginAction">
<result name="success_1">/product/products.jsp</result> </action>
7. 配置Action的result标签的类型有哪几种?
局部结果:将<result…/>作为<action…./>元素配置
和全局结果:将<result…/>作为<global-result…./>元素子元素配置
8. 配置文件配置Action如何使用通配符?
在配置<action?/>元素时,可以指定name、class和method属性,这3个属性都可支持通配符,这种使用通配符的方式是动态方法调用的一种形式。当我们使用通配符定义Action的name属性时,相当于一个action元素定义多个逻辑Action。
第四章 P114 1-5
1. 如何在JSP页面导入Struts2标签库?
加入taglib标签 <%@ taglib prefix="s" uri="/struts-tags" %>
2. 简述If标签的用法。
执行基本的条件流转, 判断字符串, 判断数值, 判断为空的问题
3. 简述Iterator迭代标签的用法。
用于遍历集合(java.util.Collection)或枚举值(java.util.Iterator)
4. 如何使用Struts2标签编写一个登录的表单?
<s:form action="userLoginAction" method="post">
<s:textfiled name="username" label="用户名"></s:textfiled>
<s:password name="password" label="密码"></s:password>
<s:submit value="登录"></s:submit> </s:form>
5. 使用OGNL如何取request或session范围保存的数据?
<s:property value="#request.name"/>或
<s:property value="#session.name"/>
第五章 P149 1-4,5-8 1. Struts2如何实现国际化的流程?
2. Struts2全局国际化资源文件如何配置?
只需要配置struts.custom.il8n.resources常量即可
3. Struts2类范围国际化资源文件如何配置?
4. Struts2页面使用哪个标签获取资源文件信息? <s:i18n > <s:text …./>
5. Struts2 validate验证流程如何?
1) 通过转换器将请求参数转换成相应的Bean属性;
2) 判断转换过程是否出现异常。如果有,则将其保存到ActionContext中,
conversionError拦截器再封装为fieldError;如果没有,进行下一步;
3) 通过反射(Reflection)来调用validateXxx()方法(可选方法。其中,Xxx表示
Action的方法名);
4) 调用validate()方法;
5) 如果经过上述步骤没有出现fieldError,则调用Action方法;如果有,则会跳
过Action方法,通过国际化将fieldError输出到页面。
6. Struts2验证框架验证流程如何?
1).指定要验证的目标Action——ValidationAction;
2). 根据命名规则,找到目标Action对应的ValidationAction-validation.xml文件,框架为该类创建了一个验证对象,这个验证对象基于XML文件;
3). 验证器对输入的数据产生作用;
4). 如果验证失败,错误信息被添加到内部序列中;
5). 当所有的验证器都已经执行后,如果框架发现有错误信息产生,它寻找“input”结果对应的页面,而不调用Action类; 6). 如果通过验证,调用Action的方法,返回“success”对应的结果。
7. Struts2验证框架的开发流程如何?
第六章 P182 1-3,5,6
1. Struts2拦截器有何作用?
在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
2. Struts2拦截器如何定义?
拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
3. Struts2拦截器栈如何定义?
拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一个链条。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
4. Struts2上传下载的拦截器如何配置?
<action name=”Upload” class=”com.ascent.upload.action.UpLoadAction”>
<interceptor-ref name="fileUpload">
<!-- 设置上传文件类型 -->
<param name="allowedTypes">
image/bmp,image/png,image/jpg,image/gif,image/pjpeg</param>
<!-- 设置上传文件大小 --> <param name="maximumSize">200000</param>
</interceptor-ref>
<!-- 必须显示配置引用struts默认的拦截器栈:defaultStack -->
<interceptor-ref name="defaultStack"></interceptor-ref>
5. Struts2上传拦截器有哪些重要的属性配置?
allowedTypes:指定文件类型,类型间用英文逗号隔开
maximumSize:指定上传文件的最大值,单位为字节
第七章P221 1-4,6,7
1. Hibernate框架的体系结构如何?
会话工厂SessionFactory
对属于单一数据库的编译过的映射文件的一个线程安全的,不可变的缓存快照。它是Session的工厂,是ConnectionProvider的客户。可能持有一个可选的(第二级)数据缓存,可以在进程级别或集群级别保存可以在事物中重用的数据。
会话Session
单线程,生命期短暂的对象,代表应用程序和持久化层之间的一次对话。封装了一个JDBC连接。也是Transaction的工厂。保存有必需的(第一级)持久化对象的缓存,用于遍历对象图,或者通过标识符查找对象。
持久化对象(Persistent Object)及其集合(Collection)
生命周期短暂的单线程的对象,包含了持久化状态和商业功能。它们可能是普通的JavaBeans/POJOs,唯一特别的是他们从属于且仅从属于一个Session。一旦Session被关闭,他们都将从Session中取消联系,可以在任何程序层自由使用(比如,直接作为传送到表现层的DTO,数据传输对象)。
临时对象(Transient Object)及其集合(Collection)
目前没有从属于一个Session的持久化类的实例。他们可能是刚刚被程序实例化,还没有来得及被持久化,或者是被一个已经关闭的Session所实例化的。
事务,Transaction
(可选)单线程,生命期短暂的对象,应用程序用它来表示一批不可分割的操作。是底层的JDBC,JTA或者CORBA事务的抽象。一个Session某些情况下可能跨越多个Transaction 事务。
ConnectionProvider
(可选)JDBC连接的工厂和池。从底层的Datasource或者 DriverManager抽象而来。对应用程序不可见,但可以被开发者扩展/实现。
TransactionFactory
(可选)事务实例的工厂。对应用程序不可见,但可以被开发者扩展/实现。
2. Hibernate框架的加载流程如何?
(1)启动Hibernate
(2)构建Configuration实例,初始化实例中的所有变量:
Configuration cfg = Configuration.configure();
(3)加载hibernate.cfg.xml文件至cfg实例所分配的内存
(4)通过hibernate.cfg.xml文件 中格的mapping节点进行配置,并加载.hbm.xml文件至cfg实例中
(5)由cfg实例构建一个SessionFactory实例:
SessionFactory sf = cfg.buildSessionFactory();
(6)由上面得到的sf实例创建Session连接:
Session s = sf.openSession();
(7)由Session实例创建事务操作接口Transaction的一个实例:
Transaction tx = s.beginTransaction();
(8)通过Session接口提供的各种方法操作对数据库的访问
(9)提交数据库操作结果:
tx.commit();
(10)关闭Session连接:
3. 什么是ORM?
这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去
4. Hibernate配置文件hibernate.cfg.xml核心属性有哪些?如何配置?
<hibernate-configuration>
<session-factory>
<property name="connection.username">root</property>
<property
name="connection.url">jdbc:mysql://localhost:3306/acesys</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="myeclipse.connection.profile">mysql driver</property>
<property name="connection.password">root</property>
<property
name="connection.driver_class">com.mysql.jdbc.Driver</property>
</session-factory> </hibernate-configuration>
5. 对于用户表usr表,写出该表ORM映射的持久化类Usr.java和映射文件Usr.hbm.xml文
件。
Usr.java
package com.ascent.po;
public class Usr implements java.io.Serializable {
private String username;
public Usr() {}
public Usr(String username) {
this.username = username;
}
public String getUsername(){ return this.username;
}
Public void serUsername(Sting Username){
this.username=username;
}
Get and set方法
Usr.hbm.xml
<class name="com.ascent.po.Usr" table="usr" catalog="ascentweb">
<id name="id" type="integer">
<column name="id" />
<generator class="native" />
</id>
<property name="username" type="string">
<column name="username" length="32">
</column>
</property> </class>
6. 写出常用的几种Hibernate提供的主键生成方式。
1:assigned
----表示在新增数据时由应用程序指定主键的值。主要针对主键是采用自然主键的形式。这种方式,适用于主键列不是自动增长列。
其缺点为在执行新增操作时,需查询数据库判断生成的主键是否已经存在。 2:increment
----表示新增数据操作时由hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加上1.适用于采用代理主键形式的主键列。同样不能用于主键列是自动增长的表。但是,该主键生成策略也有些缺点。
(1)新增数据前先查询一遍,影响了性能。
(2)主键的类型只能为数值型的int或者long
(3)并发操作时的冲突问题。
3:identity
----不如说是为sqlerver数据库量身定做的。主要适用于sqlserver数据库的自动增长列的表。
4:native
----表示根据不同的数据库采用不同的主键生成策略。比如,当前数据库为sqlserver,则会采用identity,如为oracle,则采用
oracle中的sequence等。区分数据库的不同是以hibernate主配置文件中sessionFactory中配置的数据库方言。
第八章 P255 4种对应关系 1)
2) 3)
4) <one-to-one> <one-to-many> <many-to-one> <many-to-many>
第九章 P276 1-4,6
1. Hibernate常用查询语句有哪几种?
HQL 和 原生SQL CQ 条件查询
2. Hibernate的HQL查询是否支持多态?
支持
3. Hibernate的HQL语法是否区分大小写?
不区分大小写
4. Hibernate的HQL查询语言操作的是表还是对象?
对象
5. Hibernate的HQL查询如何实现左外连接和右外连接?
内连接 (inner join)
左外连接 (left outer join )
右外连接 (right outer join )
全连接 (full join)(不常使用)
第十章P298 1,2,4,5
1. Spring分层结构中7大模块分别是什么?
1) 核心容器:核心容器提供Spring框架的基本功能。核心容器的主要组件是
BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(IoC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
2) Spring上下文:Spring上下文是一个配置文件,向Spring框架提供上下文信息。
Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。
3) Spring AOP:通过配置管理特性,Spring AOP模块直接将面向方面的编程功能
集成到了Spring框架中。所以,可以很容易地使Spring框架管理的任何对象支持AOP。Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务。通过使用Spring AOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。
4) Spring DAO:JDBC DAO (Data Access Object)抽象层提供了有意义的异常层次结
构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量。Spring DAO的面向JDBC的异常遵从通用的DAO异常层次结构。
5) Spring ORM:Spring框架插入了若干个Object/Relation Mapping框架,从而提
供了ORM的对象关系映射工具,其中包括JDO、Hibernate和iBatis SQL Map。所有这些都遵从Spring的通用事务和DAO异常层次结构。
6) Spring Web模块:Web上下文模块建立在应用程序上下文模块之上,为基于
Web的应用程序提供了上下文。所以,Spring框架支持与Jakarta Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
7) Spring MVC框架:MVC框架是一个全功能的构建Web应用程序的MVC实现。
通过策略接口,MVC框架变成为高度可配置的,MVC容纳了大量视图技术,其中包括JSP、Velocity、Tiles、iText和POI。
2. 如何理解Spring控制反转IoC?举例说明。
程序不应该依赖实现,而是依赖于抽象接口
3. Spring创建Bean的作用域有哪些?
1、singleton:当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。
注意:Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成singleton,可以这样配置:
<bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton">
2、prototype:一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
3、request:在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。
考虑下面bean定义:
<bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>
针对每次HTTP请求,Spring容器会根据loginAction bean定义创建一个全新的LoginAction bean实例, 且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态, 而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。 当处理请求结束,request作用域的bean实例将被销毁。
4、session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
考虑下面bean定义:
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例, 且该userPreferences bean仅在当前HTTP Session内有效。 与request作用域一样,你可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例, 将不会看到这些特定于某个HTTP Session的状态变化。 当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。
5、global session:在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。
考虑下面bean定义:
<bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/> global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。
4. Spring属性注入有哪几种方式?
1) 通过接口注射,这种方式要求我们的类必须实现容器给定的一个接口,然后容
器会利用这个接口给我们这个类来注射他所依赖的类
2) 通过setter方法来注射,这种方式也是Spring推荐的方式
3) 通过构造方法来注射类,这种方式Spring同样给与了实现,它和通过setter
方式一样,都在类里无任何侵入性,但是不是没有侵入性,只是把侵入性转移了,显然第一种方式要求实现特定的接口,侵入性非常强,不方便以后移植。
第十一章 P325 1,2,5
1. Spring AOP包括哪些基本概念?
1) 方面(Aspect): 一个关注点的模块化,这个关注点实现可能 另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的 Advisor或拦截器实现。
2) 连接点(Joinpoint): 程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
3) 通知(Advice): 在特定的连接点,AOP框架执行的动作。各种类 型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架 包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。
4) 切入点(Pointcut): 指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点:例如,使用正则表达式。
5) 引入(Introduction): 添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。
6) 目标对象(Target Object): 包含连接点的对象。也被称作被通知或被代理对象。
7) AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
8) 编织(Weaving): 组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。
9) 各种通知类型包括:
10) Around通知: 包围一个连接点的通知,如方法调用。这是最强大的通知。Aroud通知在方法调用前后完成自定义的行为。它们负责选择继续执行连接点或通过返回它们自己的返回值或抛出异常来短路执行。
11) Before通知: 在一个连接点之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
12) Throws通知: 在方法抛出异常时执行的通知。Spring提供强制类型的Throws通知,因此你可以书写代码捕获感兴趣的异常(和它的子类),不需要从Throwable或Exception强制类型转换。
13) After returning通知: 在连接点正常完成后执行的通知,例如,一个方法正常返回,没有抛出异常。
2. Spring有哪些通知类型?
1) Interception around advice
2) Before通知
3) Throws通知
4) After Returning通知
5) Introduction通知