46.Request对象的主要方法?
答:(1)setAttribute(String name,Object):设置名字为name的request的参数值
(2)getAttribute(String name):返回由name指定的属性值
(3)getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例
(4)getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组
(5)getCharacterEncoding():返回请求中的字符编码方式
(6)getContentLength():返回请求的Body的长度
(7)getHeader(String name):获得HTTP协议定义的文件头信息
(8)getHeaders(String name):返回指定名字的request Header的所有值,结果是一个枚举的实例
(9)getHeaderNames():返回所以request Header的名字,结果是一个枚举的实例
(10)getInputStream():返回请求的输入流,用于获得请求中的数据
(11)getMethod():获得客户端向服务器端传送数据的方法
(12)getParameter(String name):获得客户端传送给服务器端的有name指定的参数值
(13)getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
(14)getParametervalues(String name):获得有name指定的参数的所有值
(15)getProtocol():获取客户端向服务器端传送数据所依据的协议名称
(16)getQueryString():获得查询字符串
(17)getRequestURI():获取发出请求字符串的客户端地址
(18)getRemoteAddr():获取客户端的IP地址
(19)getRemoteHost():获取客户端的名字
(20)getSession([Boolean create]):返回和请求相关Session
(21)getServerName():获取服务器的名字
(22)getServletPath():获取客户端所请求的脚本文件的路径
(23)getServerPort():获取服务器的端口号
(24)removeAttribute(String name):删除请求中的一个属性
47.谈一谈你对Struts的理解?
答:①Struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个servlet名为Action
Servlet,或是ActionServlet的子类。我们可以在web,xml文件中将符合某种特征的所有请求交给Servlet处理,这个Servlet再参照文件(通长为/WEB-INF/struts.cfg.xml)将各个请求分别分配给不同的action去处理;(一个扩展知识点:Struts的配置文件可以有多个,可以按照模块配置各自的配置文件,这样可以防止配置文件的过渡膨胀)
②ActionServlet把请求交给action去处理之前,会将参数封装到一个formbean对象(就是一个java类,这个类中每个属性对应一个请求参数),封装成一个什么样的formbean对象呢?看配置文件。
③要说明的是,ActionServlet把formbean对象传递给action的execute方法之前,可能会调用formbean的validate方法进行校验,只有校验通过后,才会将这个formbean对象传递给action的execute方法,否则,它将返回一个错误页面,这个错误页面有input属性指定,(看配置文件)作者为什么将这里命名为input属性,而不是error属性呢?
④action执行完成后,要返回结果视图,这个结果视图是用一个ActionForward对象看来表示的,actionforward对象通过struts-config.xml配置文件中配置关联到某个jsp页面,因为程序中使用的是在struts-config.xml配置文件,为jsp页面设置的逻辑名,这样可以实现action程序代码与返回的jsp页面名称的解耦。
48谈一谈你对Hibernate的理解?
答:①概述:它是一个持久层的ORM(对象关系型映射)框架,使用Hibernate框架,不用写JDBC代码,仅仅是调用一个save方法,就可以将对象保存到关系数据库中;仅仅是调用一个get方法,就可以从数据库中加载出一个对象。
②使用Hibernate的基本流程:配置Configuration对象、产生SessionFactory、创建session对象,开启事务,完成CRUD操作,提交事务,关闭session。
③配置文件:使用Hibernate时,先要配置hibernate.cfg.xml文件。其中配置数据连接信息和方言等,还要为每个实体配置相应的hbm.xml文件,然后在hibernate.cfg.xml文件中引入;
④关联关系映射:
a)一对多:
(Ⅰ)一方:需要加入一个包含多方的set集合,注意必须要new。
(Ⅱ)多方:添加一方的bean对象,注意不用new。
(Ⅲ)注意:只配置一方即可正常维护运行。一般一方会放弃外键维护。
b)多对多:多对多保存中,有一方必须放弃维护中间表"inverse=ture"
⑤级联关系:cascade的6种取值
none —— 不使用级联
save-update —— 保存或修改
delete —— 删除
delete-orphan —— 孤儿删除(只有一对多才有!)
all —— 除了孤儿删除,其他的所有
all-delte-orphan —— 包含孤儿删除所有的。
⑥延迟加载:
底层:动态代理技术
第一次查询时 ====> 至查询ID值,生成代理对象(只含ID)
=====> 继续操作,如打印某属性 ==发送sql语句==> 返回查询值
类级别的延迟加载:查询的是某一个对象
session.get()不延迟加载
session.load()延迟加载
两者区别
关联级别的延迟加载
fetch="select" lazy="true" 延迟加载(默认)
fetch="select" lazy="false" 不延迟加载
fetch="select" lazy="extra" 极其延迟加载
⑦Hibernate三种检索方式:
QBC(Query By Criteria)
HQL(Hibernate Query Language)
SQL(基本不用)
⑧缓存:
缓存概念
缓存是内存中开辟的一块空间,用来保存数据
实质是:一些集合设计
一级缓存:Session
自带的,不能卸载。一定存在的,与Session生命周期一样长
二级缓存:
默认没有开启,只提供了相关的策略,需第三方插件,常用EHCache。
快照机制(SnapShot)
持久态对象,在获取的时候,会保存两份:一份在缓存区,一份在快照区;
在事务提交之前,会自动对比缓存区和快照区的数据,
如果不一致,会自动修改缓存和快照区数据;
49.谈一谈你对Spring的理解?
①Spring是一个开源的业务层框架,分模块,一站式框架,它能够整合各种其他主流框架;
②Spring的实质就是一个实现了工厂模式的工厂类,在其配置文件中,通过添加标签,来创建实例对象;
③Spring的核心——IoC/DI;
a)IoC(Inverse of Control)控制反转,将对象的创建全交给Spring去管理,然后Spring容易通过依赖注入的方式,注入给调用者。这样做的好处是,让bean与bean之间以配置文件的形式组织在一起,而不是以硬编码的方式耦合在一起。
b)依赖注入的方式有三种:接口注入、Setter方法注入(使用)、构造注入;
c)IoC的注解方式:
(Ⅰ)在applicationContext.xml配置文件中开启组件扫描
(Ⅱ)在实现类上添加注解:@Component(value="id值")
@Component的三个衍生注解(功能一样)
* @Controller -- 作用在WEB层
* @Service -- 作用在业务层
* @Repository -- 作用在持久层
(Ⅲ)3.属性注入的注解(说明:使用注解注入的方式,可以不用提供set方法)
* @Value -- 用于注入普通类型
* @Autowired -- 默认按类型进行自动装配
* @Qualifier -- 强制使用名称注入
* @Resource -- 相当于@Autowired和@Qualifier一起使用,强调:Java提供的注解,属性使用name属性
④Spring的核心——AOP;
a)AOP(面向切面编程),可以在不修改源代码的前提下,对程序进行增强,例如,加入日志,加入权限判断,加入异常处理等;
b)AOP底层使用的是代理技术,分为JDK动态代理(面向接口)和CGLIB动态代理(没接口的,产生子类代理);
c)使用步骤:
(Ⅰ)编写切面类==>在IoC中配置切面类的bean标签==>配置aop相关
(Ⅱ)切入点表达式:execution([修饰符] 返回值类型 包名.类名.方法名(参数))
一般简写为:execution(* com.*.*.*DaoImpl.save*(..))
(Ⅲ)通知类型
前置通知:
最终通知:如果程序出现了异常,最终通知也会执行。
后置通知:
异常抛出通知:
环绕通知:
* 要注意:目标的方法默认不执行,需要使用ProceedingJoinPoint对来让目标对象的方法执行。
50.JDBC、ibatis(mybatis)、Hibernate有什么不同?
答:①JDBC编程流程固定,同时将sql语句和java代码混在了一起,经常需要拼凑sql语句,细节很繁琐;
②ibatis(mybatis)它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。但是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
③Hibernate对象/关系映射能力强,数据库无关性好,因为hibernate自动生成sql语句,我们无法控制该语句,我们就无法去写特定的高效率的sql。对于一些不太复杂的sql查询,hibernate可以很好帮我们完成,但是,对于特别复杂的查询,hibernate就很难适应了,这时候用ibatis就是不错的选择,因为ibatis还是由我们自己写sql语句。
需要免费Java架构学习资料视频请加扣扣群:835544715 群内提供免费的学习指导 架构资料 以及免费的解答 不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导
网友评论