struts2
1-1:为什么每次请求都要创建一个Action对象?
是出于对线程安全的考虑,每个request都不会相互影响
1-2:ModelDriven拦截器的配置中refreshModelBeforeResult解决了什么问题?
先把旧的model对象从ValueStack中移除,然后再把新的model对象压入ValueStack!
官方解释:
set to true if you want the model to be refreshed on the value stack after action execution and before result execution. The setting is useful if you want to change the model instance during the action execution phase, like when loading it from the data layer. This will result in getModel() being called at least twice.
一般不需要配,顺便骂句谁出的这么坑爹的问题。
1-3:为什么在web.xml中配置的StrutsPrepareAndExecuteFilter要过滤所有的请求?
其实这里可以选择性的过滤,但是一般大家都是<url-pattern>/*</url-pattern>,所有的请求都必须经过StrutsPrepareAndExecuteFilter这个请求转发器。
它会去找struts.xml文件,一般放在src下面的第一层目录,然后找到相应的资源去转发。
1-4:请你给我谈谈ValueStack?
所谓值栈就是在一个栈里面堆了一大坨的数值,在action中可以这样获得ValueStack vs1 = ActionContext.getContext().getValueStack();
其实值栈就类似于一个map的容器,里面存放的是键值对,但是有个区别,这个值栈的键都是String类型的。我们一般可以这样来拿出值栈里面的内容
名字属性获取 :<s:property value="user.username"/> 也可以用el表达式${aa}或者ognl表达式<s:property value="#request.user.username"/>
其中ognl表达式主要就是去访问值栈,它的查找路线为用于按request > session > application顺序访问其属性(attribute),#user.username相当于按顺序在以上三个范围(scope)内读取user.username属性,直到找到为止
1-5:Struts2是如何实现MVC设计模式的?
自己去理解,按自己的request走一遍就知道了。不懂MVC还用STRUTS?
Spring
2-1:你为什么要用Spring?
XXX,为什么要用?好用才用的啊。spring有很多作用比如他的安全机制,事务管理,日志管理等等。。最主要的是把耦合度降到最低。
2-2:请你聊一聊IOC/DI?
把工厂和对象生成这两者独立分隔开来,提高灵活性和可维护性。具体的太多了。
2-3:什么是声明式的事务管理?为什么要使用声明式的事务管理?Spring如何实现声明式的事务管理?
Spring 的声明式事务管理在底层是建立在 AOP 的基础之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
使用声明式的事务管理可重用性高。这里就列举一种最常用的配置吧。
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<!--处理大型数据 Oracle中的lob字段处理-->
<bean id="nativeJdbcExtractor" lazy-init="true"
class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" />
<bean id="lobHandler" lazy-init="true"
class="org.springframework.jdbc.support.lob.OracleLobHandler">
<property name="nativeJdbcExtractor">
<ref bean="nativeJdbcExtractor" />
</property>
</bean>
<!-- Hibernate SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="lobHandler" ref="lobHandler" />
<property name="mappingDirectoryLocations">
<list>
<value>classpath*:XXX</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<!-- <prop key="hibernate.jdbc.batch_size">50</prop>-->
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop>
<prop key="hibernate.default_schema">${hibernate.default_schema}</prop>
</props>
</property>
</bean>
<bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"></ref>
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-exception</prop>
<prop key="update*">PROPAGATION_REQUIRED,-exception</prop>
<prop key="delete*">PROPAGATION_REQUIRED,-exception</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
2-4:把spring和hibernate集成,定义事务管理特性的时候,为何要将除了添加、删除、更新操作之外的方法,即主要执行 查询任务的方法定义为read-only?
应用这项属性时,底层的数据库可以对读取进行最优化,但要配合PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW或PROPAGATION_NESTED使用,即只能在事物中使用。简单的说就是增快查询速度。
Hibernate
3-1:请你谈谈你对OR映射的理解?
对象关系映射,把关系数据库的数据结构与你的对象关联起来,以操作对象操纵关系数据库。
3-2:很多人说Hibernate不适合大项目,性能有问题,你是如何理解的?
好不好是看你怎么用,不一定用了hibernate就不使用sql了,一些复杂的 比如说统计需要的数据一般都是直接用sql去执行的。使用hibernate最重要的一点是
看你如何去使用懒加载,在适当的时候使用懒加载会提高你的性能。
3-3:Hibernate为什么一定要定义一个数据库标识 ?
因为要对应数据库表的主键,唯一性原则。
3-4:为什么Hibernate建议你的实体类实现hashCode和equals方法?
多对多双向关系,如果hashCode和equals正常写之,将出现load不上的问题。
经常使用set集合来保存相关对象,而set集合是不允许重复的。而hibernate正是去"=="比较两个对象是否是同一个,所以它会去比较hashCode和用equals来比较。
3-5:谈谈你对Hibernate实体类中的数据库标识与数据库主键之间关系的认识?
是对象与关系数据库中的表识别的唯一标识。
3-6:谈谈你对Hibernate关联映射与数据库外键之间关系的认识?
关系映射中一个外键就相当于一个对象的实例,这样就形成了1-1 ,1-N,N-1,N-N这种关系。
3-7:调用session.save()方法,hibernate一定会发出insert语句吗?谈谈你的理解
save, 把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符,在save之前hibernate会去根据主键查一次,看能否保存。
3-8:调用session.update()方法,hibernate一定会发出update语句吗?谈谈你的理解
update是把一个脱管状态的对象或自由态对象(一定要和一个记录对应)更新到数据库。在update之前hibernate会去根据主键查一次,看能否可以更新。
3-9:请你聊一下以下名词、概念或用法:lazy、lazy=”extra”、inverse、fetch、fetch=”join”、fetch=”subselect”、batch-size
lazy概念:只有真正使用该对象内普通属性时,才会创建,对于hibernate而言,正真使用的时候才会发出sql,load支持lazy(懒加载),get不支持懒加载。
extra:一种比较聪明的懒加载策略,即调用集合的size/contains等方法的时候,hibernate
lazy=”extra”时并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据。
inverse – 标记由哪一方来维护关联关系(双向关联中会用到,inverse默认值为false。如果inverse设置为true,表示将由对方维护两者之间的关联关系。
fetch是抓取策略:
fetch = "select"是在查询的时候先查询出一端的实体,然后在根据一端的查询出多端的实体,会产生1+n条sql语句;
fetch = "join"是在查询的时候使用外连接进行查询,不会差生1+n的现象
fetch=”subselect”发送一条select语句抓取在前面查询到的所有实体对象的关联集合
batch-size 是来设置批量更新的HQL/SQL数量 如果达到此数量会提交给数据库 但是生成的HQL/SQL语句一个也不会少
3-10:配置了lazy=”true”一定会实现懒加载吗?
get()是不能实现懒加载的。必须使用load()。fetch要使用select
3-11:请你谈谈Hibernate中的“N+1”问题
一对多是查询一次会带出N次查询。就是一些主外键关系的对象。当进行一个表的查询时,当这个表与另外的表是多对一,或者是一对多关联时,就会出现N+1问题,当查询一条语句时,比如主键name=1,而与这个 name相关联的另一张表对应name的有N个记录,这时就出另外发出N条语句去查询,而我又不要那些记录,这时就是N+1问题
分享到:
相关推荐
在给定的内容中提到了Spring与Struts的集成方式,具体包括以下几点: #### 1. 配置Spring上下文 Spring上下文可以通过多种方式进行配置,这里给出了两种配置方法: - **Web 应用配置**:通过`<context-param>`标签...
根据提供的文件内容,我们可以从中提炼出关于SSH、Struts、Spring、Hibernate以及它们之间的相互关系等几个关键领域的知识点。下面将这些知识点进行整理和详细解释。 ### SSH基础知识 #### SSH是什么? SSH...
对于新手来说,独自完成一个完整正确的SSH框架可能是一个相当困难麻烦的事。 最近时间还比较宽裕,为此自己搭建了一个SSH框架...并找了几个很详细的例子的代码,这是应该是新手最希望得到的资料,希望大家互相学习哈。
有一定危险,我这有安全限制不能用telnet连接,需要多开几个ssh连接已被升级失败不能重新连接,我这个升级如果远程ssh连接断网就彻底费了。在VM测试环境和腾讯云或是阿里云可以设置快照,能马上恢复。 我这个升级是...
首先,SSH1的配置主要包括以下几个方面: 1. **服务器端配置**:在服务器上,SSH1的服务通常由`sshd`守护进程提供。配置文件通常是`/etc/ssh/sshd_config`。这里可以设置监听端口、允许的用户、密码认证等选项。 2...
在项目中,你可能接触到以下几个方面的知识: 1. **SSH配置**:学习如何在服务器上安装和配置SSH服务,包括编辑`sshd_config`配置文件,设置端口号、密码策略、公钥认证等。 2. **密钥对生成**:理解和使用`ssh-...
SSH2学习视频的内容可能涵盖以下几个关键知识点: 1. **SSH原理**:了解SSH的工作方式,包括公钥加密、身份验证、数据加密以及如何建立安全连接。SSH通过交换公钥来确保只有授权用户可以访问服务器,而私钥则保存在...
这个过程通常涉及到几个关键步骤,包括配置SSH免密登录和编写能够跨主机执行命令的shell脚本。 首先,让我们详细解释SSH免密登录。默认情况下,每次通过SSH连接到远程主机时,都需要输入密码。为了实现无密码登录,...
学习SSH框架,你需要理解以下几个关键点: 1. **MVC模式**:了解MVC模式的基本原理和各个部分的作用,以及它们如何在SSH框架中体现。 2. **Struts2配置**:掌握Action配置、拦截器和结果页面的设置,以及如何通过...
整合SSH涉及到以下几个步骤: 1. 添加SSH相关jar包到项目的类路径,确保所有依赖都已到位。 2. 配置Spring,包括bean定义、事务管理、数据源等。 3. 配置Struts,定义Action类、ActionForm、结果转发等。 4. 配置...
在Eclipse中整合SSH的步骤通常包括以下几个部分: 1. **环境配置**:安装Eclipse IDE,然后分别安装Spring、Struts2和Hibernate的相应插件,如Maven或Gradle来管理依赖。 2. **创建项目**:创建一个新的Maven或...
在这个练习中,我们可能会涉及到以下几个核心知识点: 1. SSH基础知识:SSH提供了一种加密的网络通信方式,常用于替代传统的telnet等明文传输协议,以保护数据的安全性。它通过公钥基础设施(PKI)进行身份验证,...
在使用SSH工具时,有以下几个核心知识点: 1. **身份验证**:SSH连接通常基于密钥对或密码进行身份验证。密钥对包括公钥和私钥,提供更安全的身份验证方式,而密码认证则相对简单但安全性较低。 2. **加密**:SSH...
SSH(Struts、Spring、Hibernate)是...以上就是SSH框架及其相关组件的主要知识点,这些组件共同构建了一个强大且灵活的Java Web开发环境。在实际开发中,理解并熟练掌握这些技术,将有助于提高开发效率和项目质量。
在SSH注册登录过程中,涉及以下几个关键知识点: 1. **公钥加密**:SSH基于公钥/私钥对的非对称加密技术。用户在目标主机上创建一对密钥,公钥存储在服务器,私钥保留在本地客户端。登录时,客户端使用私钥签名数据...
在"论坛系统(Struts 2+Hibernate+Spring实现)"这个文件中,我们可以预期到以下几个主要的组成部分: 1. **模型(Model)**:论坛系统的业务逻辑和数据对象,如用户、帖子、板块等,会用Java类来表示,这些类通常...
Linux-ssh连接问题,日常工作中在连接ssh时候遇到的几个问题。
这个综合包包含了SSH的两个主要版本:SSH2和SSH,同时也包括了几个流行的Java框架,如Struts2、Struts1、Hibernate3.2和Spring2.5。这些框架在IT行业中扮演着关键角色,尤其是对于企业级Java应用开发。 1. **SSH2**...
登录实例通常包括以下几个部分: - **登录界面**:用户输入用户名和密码的表单。 - **Action处理**:LoginAction接收表单提交的数据,调用Service层进行验证。 - **Service层验证**:基于Hibernate查询数据库,检查...
综上所述,SSH项目编写规范涉及多个层面,包括架构设计、代码组织、异常处理、事务管理等。遵循这些规范,可以提高项目的可读性、可维护性和团队协作效率。在实际开发过程中,应不断学习和优化,适应项目需求的变化...