SSH简答题.docx
- 文档编号:23693084
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:14
- 大小:24.32KB
SSH简答题.docx
《SSH简答题.docx》由会员分享,可在线阅读,更多相关《SSH简答题.docx(14页珍藏版)》请在冰豆网上搜索。
SSH简答题
1.简述什么是MVC?
MVC的全称为model-view-controller(模型-视图-控制器)。
MVC是一种开发应用程序的模式,这个模式已经具有了很好的框架架构,并且十分容易维护。
使用MVC开发出来的应用程序一般包括以下几块内容:
(1)控制器(Controller):
控制器类处理客户端向Web应用程序发出的请求,获取数据,并指定返回给客户端,用来显示处理结果的视图。
(2)模型(Model):
模型类代表了应用程序的数据,这些数据通常具有一个数据验证逻辑,用来使得这些数据必须符合业务逻辑。
(3)视图(View):
视图类是Web应用程序中用来生成并显示HTML格式的服务器端对客户端请求的响应结果的模板文件。
2.简述一个请求在Struts2框架中的处理流程,请按自己对框架的理解叙述。
1、Login.jsp:
用户提交登录请求,2、web.xml:
1-用户提交自己的请求
2-由web.xml拦截,转发到action进行处理;
3-Struts.xml根据相应的action配置,调用相应的方法来处理,并根据结果转发到不同的页面;
3.以文字过滤拦截器为例,简述拦截器的使用步骤。
-1定义自己的拦截器实例,并继承相应的拦截器类;
-2在struts.xml中配置拦截器。
使用
-3用户发送添加评论的请求,由struts.xml捕获,并交由拦截器处理;
-4拦截器根据定义的方法进行校验,放回相应的执行结果,实现文字屏蔽效果。
4.在同一个系统中配置多个拦截器,试说明它们的执行顺序。
一般来说:
先配置的拦截器,会先获得执行的机会,但是实际情况不是这样。
execute()
方法执行之前,配置在前面的拦截器,会先对用户的请求起作用。
execute()方法执行之后,配置在后面的拦截器,会先对用户的请求起作用。
(两头向中间靠拢的执行)
5.请简述struts2中输入校验的几种方式。
客户端校验:
在客户端用过使用javascript脚本对用户输入的数据进行校验;服务器校验:
在服务器端对数据进行校验。
6.使用配置方式实现输入校验有哪两种方式?
它们的命名规则是?
如果同时配置了两种方式,寻找校验文件的顺序是?
-1重写validate()方法实现和validateXxx()方法实现
-2命名规则:
必须以validate开头
-3顺序:
当被请求的action方法处理逻辑还有相应的validateXxx()方法。
那么该校验方法将在validate()校验之前进行
7.校验器配置风格有哪两种?
举例解释使用标签的含义。
-1一种是字段优先,称为字段校验器风格;
一种是校验器优先,称为非字段校验器风格。
-2字段校验器:
以
-3非字段校验器:
以
Type指定该元素的类型,Param指定传人参数。
8.Struts2哪些内置校验器支持客户端校验?
以及如何通过Struts2标签自动生成客户端校验代码?
必填校验器(required)、必填字符串校验器(requiredstring)
字符串长度校验器(stringlength)、整数校验器(int)
日期校验器(date)、邮件地址格式校验器(email)
网址格式校验器(url)、转换校验器(conversion)
表达式校验器(expression)、字段表达式校验器(fieldexpression)
正则表达式校验器(regex)
9.自定义校验器必须实现哪个接口?
注册校验器的配置文件应如何命名?
实现com.opensymphony.xwork2.validator.Validator;接口;配置文件必须以validate.xml命名;
10.按照自己的理解,谈谈自定义类型转换器的方法。
1继承DefaultTypeConverter类;
2注册局部类型转换器方法
在Action所在的目录下,创建ActionClassName-conversion.properties文件,文件内容格式syntax:
3注册全局类型转换器方法
在classpath的根下创建xwork-conversion.properties文件,文件内容语法:
syntax:
11.什么是国际化?
国际化资源文件的命名格式是?
国际化是(i18n)指的是软件设计阶段,就应该使软件具有支持多种语言和地区的功能、这样,
当需要在应用中添加对一种新语言和国家的支持是不需要对已有的软件返工,不需要修改的代码;
java资源文件的命名可以有3种格式:
basename_language_country.properties
basename_language.properties
basename_properties
12.在页面中使用( text>)输出国际化信息;在Action类中如何输出国际化信息? 表单标签中又当如何? 在action类中,可以继承actionSupport,使用getText()方法得到国际化信息;在表单标签中,通过key属性指定资源文件的key 13.加载国际化资源文件有哪四种方式? 加载全局范围资源文件,加载包范围资源文件,加载action范围资源文件,加载临时指定范围内的资源文件; 14.按照你的理解,谈谈如何实现自由选择语言环境? Struts2提供一个名字为i18n的拦截器,并已把该拦截器添加到默认拦截器中。 i18n拦截器自动查找客户端请求中名字为request_locale的参数,并根据该参数实例化一个Locale对象。 Struts2会把Locale保存在Session中的一个名字为WW_TRANS_I18N_LOCALE的属性中,该属性值将会作为浏览器默认的Locale. 15.请画出OGNL上下文的结构示意图。 解释如何访问OGNL上下文的对象? 常常需要配合哪个Struts标签使用? 添加值栈,将值存放到值栈里面,在页面访问方式#配合 property> 16.Struts2默认响应请求的后缀名是.action,若要配置Struts2只处理以.do为后缀名的请求,有哪些方法? 若要处理多个后缀又当如何? 1可以修改struts.xml和struts.properties来修改默认的配置, 在struts.xml中 或者是修改struts.properties文件添加struts.action.extension=do这都是一样的效果 注意: struts.xml和struts.properties的都放在src下发布的时候会自动拷贝到WEB-INF/classes下 2在web.xml里面的filter中加入 3处理多个后缀,在步骤1里面用逗号隔开添加即可; 17.实现在Action中访问ServletAPI有哪几种方法? 直接访问方式,间接访问方式,ioc和非ioc方式; 18.Struts2文件上传需要用到那两个包? 根据你的理解,谈谈实现文件上传的步骤。 Comons-fileupload-1.2.1.jar和commons-io-1.2.1.jar 第一步: 在web-inf/lib下面添加必须的jar文件 第二步: 把form表单的enctype设置为“multipart/form-data”; 第三步: 在action类中;添加必要属性: privateFileupload;//得到上传文件的类型 19.privateStringuploadFIletype;//文件类型 privateStringuploadFileName;//文件名称 20.简述如何用拦截器解决表单重复提交问题? 第一步: 在表单中加入 token/> 第二步: 在struts.xml中添加如下配置token拦截器 Hibernate 2.试述load()和get()的区别。 P223 1)当数据库中不存在对应的ID数据时,调用load()方法将抛出objectnotfoundexception异常,而get()方法将返回null。 2)Load()方法可以返回实体的代理类实例,而get()方法直接返回实体。 3)Load()方法可以在一级缓存和二级缓存中充分查找现有的数据,而get()方法只在一级缓存中进行查找,如没有发现就直接调用SQL在数据库中查找。 3.简述使用Hibernate完成持久化操作的3个准备和7个步骤。 三个准备如下: 1.需要的jar包;2.Hibernate配置文件;3.实体类和映射文件 七个步骤: 1.创建Congfigure对象。 读取并解析配置文件(相当于使用数据源(DataSource)获取连接前读取DataSource的配置文件): Configurationconf=newConfiguration().configure(); 2.读取并解析映射信息,创建SessionFactory(相当于创建了数据源(DataSource)对象),它是产生Session对象实例的工厂,它是唯一的。 : SessionFactorysf=conf.buildSessionFactory(); 3.创建Session对象,打开session(相当于JDBC获得数据库的连接): Sessionsession=sf.openSession(); 4.开始一个事务(增删改必须,查可选): tx=sessionl.beginTransaction(); 5.持久化操作: session.save(user); 6.结束事务: mit(); 7.关闭session,释放数据库的链接: session.close(); 23.Hibernate继承映射有哪几种方式? 试对几种方式进行比较。 Hiberbate集合类型的映射、关联映射,组件映射 方式一: 整个的继承体系就用一张表、 建立关系模型原则: 描述一个继承关系只用一张表,也就是说子类所使用的表与父类相同 优缺点: 首先表中引入的区分子类的字段,也就是包括了描述其他字段的字段。 其次,如果某个子类的某个属性不能为空,那么在数据库一级不能设置该字段notnull(非空),维护起来方便,只需要修改一个表,灵活性差,表中冗余字段会随着子类的增多而越来越多,在任何情况下,都只需处理一个表,对于单个对象的持久话操作只需要处理一个表 方式二: 每个子类一张表,存放子类所特有的属性 建立关系模型原则: 每个子类使用一张表,但这些子类所对应的表都关联到基类所对应的表中 优缺点: 这种设计方式完全符合关系模型的设计原则,且不存在冗余, 维护起来比较方便,对每个类的修改只需要修改其所对应的表,灵活性很好,完全是参照对象继承的方式进行配置,对于父类的查询需要使用左外链接,对于子类查询需要使用内链接,对于子类的持久话至少要处理两个表 方式三: 每个具体类一张表(union-subclass),保存是子类完整信息 建立关系模型原则: 每个具体类对应一张表,有多少具体类就需要建立多少个独立的表 优缺点: 这种设计方式符合关系模型的设计原则,但有表中存在重复字段的问题。 如果需要对基类进行修改,则需要对基类以及该类的子类所对应的所有表都进行修改,映射的灵活性很大,子类可以包括基类属性在内的每一个属性进行单独配置,对于子类的查询只需要访问单独的表,对父类查询怎需要检索所有的表,对于单个对象持久话操作只需要处理一个表 比较方面 每个具体类一张表 每个分层结构一张表 每个子类一张表 建立关系模型原则 每个具体类对应一张表,有多少具体类就需要建立多少个独立的表 描述一个继承关系只用一张表,也就是说子类所使用的表与父类相同 每个子类使用一张表,但这些子类所对应的表都关联到基类所对应的表中 关系模型的优缺点 这种设计方式符合关系模型的设计原则,但有表中存在重复字段的问题 缺点有二: 首先表中引入的区分子类的字段,也就是包括了描述其他字段的字段。 其次,如果某个子类的某个属性不能为空,那么在数据库一级不能设置该字段notnull(非空) 这种设计方式完全符合关系模型的设计原则,且不存在冗余 可维护性 如果需要对基类进行修改,则需要对基类以及该类的子类所对应的所有表都进行修改 维护起来方便,只需要修改一个表 维护起来比较方便,对每个类的修改只需要修改其所对应的表 灵活性 映射的灵活性很大,子类可以包括基类属性在内的每一个属性进行单独配置 灵活性差,表中冗余字段会随着子类的增多而越来越多 灵活性很好,完全是参照对象继承的方式进行配置 查询性能 对于子类的查询只需要访问单独的表,对父类查询怎需要检索所有的表 在任何情况下,都只需处理一个表 对于父类的查询需要使用左外链接,对于子类查询需要使用内链接 维护性能 对于单个对象持久话操作只需要处理一个表 对于单个对象的持久话操作只需要处理一个表 对于子类的持久话至少要处理两个表 24.什么是Hibernate的并发机制? 怎么去处理并发问题? 并发问题的原因: 基本上都是因为没有设置好事务的隔离性所导致的,即一个事务在更新数据的过程中,另一个事务在不同时刻读取或操作了同样的数据,结果导致了各种问题。 并发带来的问题: 更新丢失、脏读、不可重复读、幻读 并发问题的解决方案——“加锁” 常用的锁类型: 共享锁、排它锁、更新锁(共享锁的一种特例,可提升为排它锁) 、意向锁(意向锁包括意向共享锁、意向排它锁等) 悲观锁在更新数据时把记录锁住,防止其他事务读写这个记录。 25、在持久化层,对象分为哪些状态? 如何转换? 在Hibernate应用中Java对象的状态: 1)临时状态(transient): 刚刚用new语句创建,还没有被持久化,不处于Session缓存中.处于临时状态的Java对象被称为临时对象 2)持久化状态(persistent): 已经被持久化,加入到Session缓存中.处于持久化状态的Java对象被称为持久化对象 3)游离状态(detached): 已经被持久化,但不处于Session缓存中.处于游离状态的Java对象被称为游离对象 26、试述HibernateSession接口中load()与get()、persist()与save()方法的区别。 get()方法与load()方法的区别: 获取失败时,处理方式不同 Hibernate没有查找到数据,get()方法返回null,而load()方法抛出ObjectNotFoundException。 因此,在代码编写上存在差别。 load()使用了延迟检索策略,load()方法可以返回实体的代理类实例,而get()永远只返回实体类 Load()方法可以在一级缓存和二级缓存中充分查找现有的数据,而get()方法只在一级缓存中进行查找,如没有发现就直接调用SQL在数据库中查找 persist()方法无返回值,而save()方法会返回保存对象的标识符。 persist()方法只能保存暂态和持久态的对象,如果试图保存其他状态的对象,Hibernate会抛出异常,而save()方法则可以保存任何状态的对象。 27、试述Query接口list()与iterate()区别。 list()方法与iterate()方法的区别: 1)执行查询不同: list()方法直接运行查询结果所需要的查询语句,它一般只生成较少的执行SQL语句,很多情况就是一条(无关联)。 iterate()方法它会先从数据库中找出所有符合条件的记录的ID,再通过ID去缓存找,对于缓存中没有的记录,再构造语句从数据库中查出,因此很容易知道,如果缓存中没有任何符合条件的记录,使用iterator会产生N+1条SQL语句(N为符合条件的记录数) 2)缓存的使用不同: list()方法只能利用查询缓存(但在交易系统中查询缓存作用不大),无法利用二级缓存中的单个实体,但list查出的对象会写入二级缓存。 iterate()方法则可以充分利用二级缓存,对于一条查询语句,它会先从数据库中找出所有符合条件的记录的ID,再通过ID去缓存找,对于缓存中没有的记录,再构造语句从数据库中查出。 3)对于结果集的处理方法不同: list()方法一次获得所有的结果集对象,而且会初始化所有的结果集对象,如果结果集非常大会占据很多内存空间,甚至造成内存溢出。 iterate()方法不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象,因此在访问中可以控制缓存中对象的数量,以避免占用过多缓存。 13.如何优化Hibernate查询性能? 1.优化SQL语句: HQL语句的书写方法、查询时所使用的查询方法、对象关联时所使用的抓取策略 2.使用正确的查询方法: 执行数据查询功能的基本方法有两种: 一种是得到单个持久化对象的get()方法和load()方法 另一种是Query对象的list()方法和iterate()方法。 在开发中应该依据不同的情况选用正确的方法。 3.抓取优化(fetch): 抓取策略可以在O/R映射的元数据中声明,也可以在特定的HQL或条件查询中声明。 4.使用二级缓存: Hibernate只启用一级缓存,通过正确地使用二级缓存,往往可以获得意想不到的性能 11.试述Hibernate有哪些检索方式? P227 1)导航对象图检索方式、2)OID检索方式 3)HQL检索方式: HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类,对象和属性的概念。 4)QBC检索方式: QBC(QueryByCriteria)是一种纯面向对象查询方式。 5)本地SQL检索方式: Spring: 1.请你谈谈SSH整合。 SSH: Struts(表示层)+Spring(业务层)+Hibernate(持久层) Struts是一个表示层框架,主要作用是界面展示,接收请求,分发请求。 在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。 Hibernate是一个持久层框架,它只负责与关系数据库的操作。 Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。 2.解释一下DI(DependencyInjection,依赖注入)和IoC(InversionofControl,控制反转)。 依赖注入DI是一个程序设计模式和架构模型,一些时候也称作控制反转,尽管在技术上来讲,依赖注入是一个IOC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一个特殊的能力,例如: 把一个数据库连接已参数的形式传到一个对象的结构方法里面而不是在那个对象内部自行创建一个连接。 控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外部以减少依赖 应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。 也可以说,依赖被注入到对象中。 所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。 3.什么是AOP,AOP的作用是什么? AOP意思是面向切面(方面)编程。 AOP是在实现业务处理阶段,降低代码(或模块)之间的耦合度。 AOP技术是通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态添加辅助功能的技术。 它一般只适用于具有横切业务逻辑的应用场合,比如事务管理、日志管理、访问权限管理和性能监测管理等。 4.根据自己的理解谈谈以下几个概念: 切面(Aspect)、通知(Advice)、切入点(Pointcut)、织入(Weaving)。 切面(Aspect): 对象操作过程中的截面,指需要实现的交叉功能。 连接点(JoinPoint): 程序运行过程中的某个阶段点。 如某个方法调用,或者某个异常被抛出。 在这个阶段点插入切面。 通知(Advice): 在某个连接点所采用的处理逻辑,即切面的实际实现。 切点(PointCut): 一系列连接点的集合,指明Advice将在何时触发,即Advice应用在哪些连接点 织入(Weaving): 将切面应用到目标对象从而创建一个新的代理对象的过程。 5.描述一下spring中实现DI(dependencyinjection)的几种方式。 方式一: 接口注入,在实际中得到了普遍应用,即使在IOC的概念尚未确立时,这样的方法也已经频繁出现在我们的代码中。 方式二: Type2IoC: Setterinjection对象创建之后,将被依赖对象通过set方法设置进去 方式三: Type3IoC: Constructorinjection对象创建时,被依赖对象以构造方法参数的方式注入,Spring的方式 6.请介绍下spring中bean的作用域及生命周期。 Bean的作用域 singleton: 在每个SpringIoC容器中一个bean定义只有一个对象实例。 默认情况下会在容器启动时初始化bean,但我们可以指定Bean节点的lazy-init=“true”来延迟初始化bean,这时候,只有第一次获取bean会才初始化bean。 如果想对所有bean都应用延迟初始化,可以在根节点beans设置default-lazy-init=“true”。 prototype: 每次从容器获取bean都是新的对象。 .request、.session、.globalsession BeanFactory中Bean的生命周期: 定义Bean、初始化Bean、调用Bean(也就是使用Bean)、销毁Bean 7.如何使用Spring实现国际化? 1、导入Spring标签文件;2、配置Spring标签库和资源库;3、创建资源库文件;4、标签化JSP页面中的文字;5、创建资源文件。 8.举例说明使用XML方式配置AOP所使用的类、标签和属性。 Spring提供了许多易用的BeanFactory实现,XmlBeanFactory就是最常见的一个。 该实现将以XML方式描述组成应用的对象以及对象间的依赖关系。 XmlBeanFactory类将获取此XML配置元数据,并用它来构建一个完全可配置的系统或应用。 config> aspectid="aspectDemo"ref="aspectBean"> pointcutid="somePointcut" expression="execution(*annoaop.Component.business*(..))"/> beforepointcut-ref="somePointcut" method="validateUser"/> beforepointcut-ref="somePointcu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SSH 答题