1.很新的面試題
2.很全的面試題
3.很重點的面試題 框架
Struts2與Struts1的面試題
###1.Struts2與Struts1的聯系與區別?為什么要用Struts2?
struts1與struts2都是mvc框架的經典實現模式。
Struts2不是從Struts1升級而來,而是由WebWork改名而來,而WebWork只是Xwork加了很多WEB攔截器而已
區別:
1.核心控制器改成了過濾器(過濾器比Servlet的級別要高,因為程序運行時是先進入過濾器再進入Servlet)
2.struts1嚴重依賴于Servlet(因為太過于依賴于api的HttpServletRequest與HttpServletResponse的兩個參數),
struts2就則脫離了Servlet的API。
3.管理Action時struts1是單例模式,struts2是每個請求產生一個實例。
4.在表達式的支持上struts2不僅有jstl,還有功能更加強大的ognl表達式。
5.struts1的類型轉換是單向的(頁面到ActionForm),struts2是雙向的(頁面到Action再到頁面回顯)
6.校驗,struts1沒有針對具體方法的校驗,struts2提供了指定某個方法進行效驗,還有框架校驗。
7.struts2提供了攔截器,利用攔截器可以在訪問Action之前或之后增加如權限攔截等功能。
8.struts2提供了全局范圍,包范圍,Action范圍的國際化資源文件管理實現。
9.struts2支持多種視圖類型
###2.Struts2的核心是什么,體現了什么思想?
Struts2的核心是攔截器,基本上核心功能都是由攔截器完成,攔截器的實現體現了AOP(面向切面編程)思想
###3.為何繼承ActionSupport
因為ActionSupport實現了Action接口,提供了國際化,校驗的功能。
ActionSupport實現了國際化功能:因為它提供了一個getText(String key)方法實現國際化,該方法從資源文件上獲取國際化信息。
Action接口提供了五個常量(success,error,login,input,none)。
(s?k'ses,er?(r) n?n
###4.模型驅動與屬性驅動是什么 模型驅動使用時注意什么問題
答:模型驅動與屬性驅動都是用來封裝數據的。
1.模型驅動:在實現類中實現ModelDriven<T>接口使用泛型把屬性類封裝起來,重寫getModel()方法,然后在實現類里創建一個屬性類的實例,
2.屬性驅動:在實現類里定義屬性,生成get與set方法,通過屬性來拿值。
###5.Struts2是怎樣進行值封裝的?
struts2的值封裝實際上是采用了ognl表達式.
###6.Struts2如何進行校驗
1.每個Action類有一個校驗文件,命名 Action類名-validation.xml,且與Action類同目錄,這是對action里面所有的方法進行校驗。
2.對Action里面的指定方法做校驗使用Action的類名-訪問路徑_方法名-validation.xml。
在效驗文件里又分為兩種:
字段校驗:字段用什么校驗器來校驗。
非字段校驗:是用校驗器校驗什么字段。
###7.談談Struts2 的國際化
在struts2中是使用了攔截器來實現國際化。
具體是先配置屬性文件,格式是文件名_語言_國家名.PRoperties,然后放的位置有Action同包位置,
package位置,全局位置(要在常量里面配置), 然后頁面通過s:text或者key屬性去訪問
###8.OGNL是什么你在項目中如何使用它
OGNL是:對象圖形導航語言。
在struts2中的作用:
ognl的實現關系:ActionConetxt。
ognl 3個常用的符號 # $ %
#
1 構造map,list集合。 2 取ognl上下文的值。 3 用來過濾集合。 $
1 在校驗框架中取資源文件中的值。
2 可以在配置文件中傳遞參數。
%
使用百分號可以進行轉義。
###9.Strust2如何訪問Servlet API
1:通過ActionContext可以獲得request,application,session三個作用域(struts2實際上是通過適配器
來把servlet的api轉換為一個map,并把這些map放在ActionContext里面)。 2:通過ActionContext的子類ServletActionContext去獲取原滋原味的API。
3:可以通過實現ServletRequestAware接口,重寫里面的setServletRequest方法可以獲
得request,實際上是通過set的依賴注入。
###10.什么是攔截器 說說Struts2用攔截器來干什么 說出6個攔截器來
解釋:在訪問類的某個方法或者屬性之前執行,攔截的是Action的請求,進行攔截然后在方法的執行前或者之后加入某些操作。
作用:國際化,權限,效驗等與源代碼無關的操作。
攔截器:
國際化,表單重復提交,類型轉換,自動裝配,數據封裝,異常處理,模型驅動,請求參數,處理類型轉換錯誤,日志攔截器。
###11.如何實現自定義攔截器? 需要注意什么?
實現:
1.可以實現Interceptor接口,重寫doIntercept方法指定某個方法進行攔截,或者繼承AbstractInterceptor類,重寫intercept方法。
2.在xml配置文件中定義自定義攔截器,然后注入到攔截器棧中,再把攔截器引用到action中。
3.可以配置到某個action單獨使用,也可以配置到包下面的所有action使用。 注意:
要把默認的攔截器棧重新引用,否則會被覆蓋。
###12. ActionContext是用來干什么的
ActionContext是Action的上下文。
###13.為什么要繼承默認的包?
因為在Strtus2里面默認有很多的常量,攔截器,還有一些bean,如果繼承默認的包,這些默認值和常量就會繼承過來,
###14.常見的有哪幾種結果集類型?
dispatcher:指得是轉發,默認的結果集類型
redirect:重定向,
redirectAction:重定向到一個Action
stream:是返回一個流,一般用在文件下載上面
###15.開發項目時struts2在頁面怎樣拿值?
從值棧中或者是ognl的上下文
###16.怎么樣用Struts2進行文件的上傳或者下載
上傳:
1.在jsp用了s:file標簽,把s:from的enctype 屬性設置為 multipart/form-data
2.在action里面定義三個字段 File file ,String [file]ContentType,String [file] FileName
3.用輸出流轉化成硬盤上面的文件
下載:
1.在struts.xml中配置result為stream的類型
2.在action定義四個屬性,默認的有個是InputStream 的類型叫inputStream的,從硬盤上面讀取文件到這個流賦值即可.
contentType; contentLength; contentDisposition; inputStream;
###17.簡單講下struts里面的標簽,說不少于5個
s:if
s:form
s:url
s:property
s:iterater
###18.默認struts2里面的標簽取值都是從那里取值的
默認都是從OGNL值棧里面取值的
###19.ValueStack分為那兩部分,組成部分是什么,分別怎么訪問
分為:
對象棧和ContextMap
訪問:
1.對象棧前臺可以直接訪問
2.ContextMap訪問的時候前面加#
###20.標簽<s:property>和el表達式有什么區別,
相同:
都可以從值棧里面取值
區別:
el表達式只能取屬性有get set方法的簡單數據類型
s:property標簽:取得數組的一些方法等復雜數據對象類型
###21.說下重復提交的解決思路,Struts2是怎么樣解決重復提交的
1.在頁面表單域加入一個隱藏的s:token字段,然后在session里面也加入同樣的值
2.當用戶第一次請求的時候,把request的值和session對比,相同就通過請求,執行下面攔截器,并且移除Session里面的值
3.如果第二次請求時候,Session已經沒有這個值,那么就阻斷當前請求,定位重復提交 Struts2是通過s:token標簽來完成重復提交思路的
spring的面試題部分
###1.Spring的aop你怎樣實現?
用動態代理和cglib實現,有接口的用動態代理,無接口的用cglib
###2.Spring在SSH起什么作用
為大部分框架提供模版,常見的核心類提供初始化,并且整合三層框架
###3.Spring容器內部怎么實現的
內部用Map實現,或者說HashMap
###4.怎么樣理解IOC與AOP
IOC是一種控制反轉的思想,降低了對象的耦合度,AOP是面向切面編程,非侵入式編程,實現了非業務性編程(公共功能),譬如日志,權限,事務等等
###5.Spring的事務,事務的作用。
Spring里面的事務分為編程式事務和聲明式事務,一般用聲明式事務,用來控制數據操作的完整性,一致性
###6.Spring的IOC和AOP你在項目中是怎么使用的?
IOC主要來解決對象之間的依賴問題,把所有的bean的依賴關系通過配置文件或者注解關聯起來,降低了耦合度,AOP一般用來整合框架時候都可以用得到,
事務用的最多,還有個別日志,權限功能也可以用到
###7Spring主要使用了什么模式?
工廠模式-->每個Bean的創建通過方法
單例模式-->默認的每個Bean的作用域都是單例
代理模式-->關于AOP的實現是通過代理,體現代理模式
###8.Spring bean的作用域.
Scope作用域有4種,常見的有單例或者多例,默認是單例
###9.Spring的事務是如何配置的?
1.先配置事務管理器TransactionManager,不同的框架有不同屬性
2.再配置事務通知和屬性,通過tx:advice
3.配置<aop:config>,設置那些方法或者類需要加入事務
###10.Spring的配置文件最好使用什么文件?
xml,因為它是最簡單,最流行的數據格式
###11.你使用過Spring中的哪些技術?
bean的管理,AOP技術,IOC技術 ,事務等
###12.為什么要用Spring
降低對象耦合度,讓代碼更加清晰,提供一些常見的模版
###13.說下Spring的注解
1.bean的標記注解
@Component 通用注解 @Repository 持久層注解 @Service 業務層注解 @Controller:表現層注解
2.bean的自動裝配注解
稱
@AutoWired 默認是按照類型裝配,如果有多個類型實現可以用Qualifier來指定名
@Resource 默認是按照名稱來裝配,是JDK里面自帶的注解,默認情況下用@AutoWired注解
###15.寫過類似Spring AOP的操作嗎?
簡單的寫過,譬如前置通知,后置通知的方法,環繞通知,事務就是典型的AOP的實現
###16.Spring中的AOP在你項目中是怎么使用的,用在哪里?
Struts2和Hibernate整合時候都可以用得到, 事務用的最多,還有個別日志,權限功能也可以用到
###17.Spring的事務(傳播屬性,隔離級別)。
七大傳播屬性,四大隔離級別
###19.Spring DI的幾種方式
setter注入和構造器注入,一般用setter注入
###20.依賴注入的原理
就是通過反射機制生成想要的對象注入
###21.說一下整合Spring的核心監聽器。
這個是在SSH整合的時候使用,是整個WEB項目啟動的時候初始化Spring的容器. 具體是在web.xml里面配置的ContextLoaderListener
Spring配置文件中的核心是個監聽器,是用來初始化Spring的容器
###22.Spring你們為什么用配置文件而不使用注解?
配置文件耦合度低,容易維護,尤其是在切面或者事務的時候,只配置一次就可以讓很多代碼擁有事務,
###23.Spring和Hibernate的事務有什么區別?
Spring的事務提供了統一的事務處理機制,包含了JDBC,Hibernate,IBatis等事務實現,而Hibernate只處理自己事務
###24.Struts2與Spring整合先啟動那個容器。
先啟動監聽器,因為先要初始化容器,初始化容器了以后Action才能從容器里面獲得
###26.讓你寫Spring的容器,你是怎樣實現的?
我們可以寫一個HashMap,如果并發考慮的話要寫并發的Map,把bean的名字放在map的key,bean的實現map的value
###27.談談Spring的IOC和AOP,如果不用Spring,怎么去實現這兩個技術。
ioc用反射實現 ,AOP用動態代理實現
###28.Spring事務和Hibernate事務的操作上面的區別?
hibernate的事務只能手動顯示代碼的方式控制創建事務與提交事務以及回滾。
Spring可以通過配置文件設定一類class事務的創建與提交以及回滾,也可以顯示代碼方式控制。
###29.講下Spring的七大事務傳播
有七個,常用有兩個REQUIERD, REQUIRED_NEW,REQUIERD表示兩個事務的方法調用的時候,前面的時候和后面的合并成一個事務,REQUIRED_NEW是重啟一個事務,各干各的
###30.在同一進程里,有A,B兩個方法都對不同的表進行更新數據,假如A方法出異常了,若要B方法執行,怎樣配置事務級別,若不要B方法執行,又該怎樣配置?
前者用REQUIRED_NEW,后者用REQUIRED
###31.事務并發會引起什么問題,怎么解決
事務并發會引起臟讀,幻讀,不可重復讀等問題,設定事務的隔離級別就可以解決
###32.事務的隔離級別
Spring定義有四種,但是常見的是READ_COMMIT,Oralce有兩種實現,MySQL有四種
###33.Spring的IOC容器與工廠類有什么區別?
IOC(Inversion of Control)對Bean的控制能力更強,能控制對象自動注入,還可以控制生命周期,而工廠類只是簡單的創建一個對象,沒有什么控制能力
###34.事務的安全問題:鎖機制的實現原理及在項目中的使用
鎖有悲觀鎖和樂觀鎖,悲觀鎖一般假設每個人都會修改數據,默認情況下把數據都鎖住,影響性能,但安全性高.
樂觀鎖是假設每個人都只讀下數據,不會修改數據,性能比較高,但是安全性較低,一般通過增加類似于版本控制里面版本號來解決問題
###35.講下BeanFactory和ApplicationContext的區別
BeanFactory是Spring容器頂級核心接口,比較早,但功能比較少,getBean就是BeanFactory定義的,
ApplicationContext是Spring里面的另外一個容器頂級接口,它繼承于BeanFactory,但是提供的功能譬如校驗,國際化,監聽,
對Bean的管理功能比較多,一般使用ApplicationContext
###f-sm-1. 講下SpringMvc和Struts1,Struts2的比較的優勢
性能上Struts1>SpringMvc>Struts2 開發速度上SpringMvc和Struts2差不多,比Struts1要高
###f-sm-2. 講下SpringMvc的核心入口類是什么,Struts1,Struts2的分別是什么
SpringMvc的是DispatchServlet,Struts1的是ActionServlet,Struts2的是StrutsPrepareAndExecuteFilter
###f-sm-3. SpringMvc的控制器是不是單例模式,如果是,有什么問題,怎么解決
是單例模式,所以在多線程訪問的時候有線程安全問題,不要用同步,會影響性能的,解決方案是在控制器里面不能寫字段
###f-sm-4. SpingMvc中的控制器的注解一般用那個,有沒有別的注解可以替代
一般用@Controller注解,表示是表現層,不能用用別的注解代替.
###f-sm-5. @RequestMapping注解用在類上面有什么作用
用于類上,表示類中的所有響應請求的方法都是以該地址作為父路徑。
###f-sm-6. 怎么樣把某個請求映射到特定的方法上面
直接在方法上面加上注解@RequestMapping,并且在這個注解里面寫上要攔截的路徑 ###f-sm-7. 如果在攔截請求中,我想攔截get方式提交的方法,怎么配置
springMVC模式的面試題部分
可以在@RequestMapping注解里面加上method=RequestMethod.GET
###f-sm-8. 如果在攔截請求中,我想攔截提交參數中包含"type=test"字符串,怎么配置
可以在@RequestMapping注解里面加上params="type=test"
###f-sm-9. 我想在攔截的方法里面得到從前臺傳入的參數,怎么得到
直接在形參里面聲明這個參數就可以,但必須名字和傳過來的參數一樣
###f-sm-10. 如果前臺有很多個參數傳入,并且這些參數都是一個對象的,那么怎么樣快速得到這個對象
直接在方法中聲明這個對象,SpringMvc就自動會把屬性賦值到這個對象里面 ###f-sm-11. 怎么樣在方法里面得到Request,或者Session
直接在方法的形參中聲明request,SpringMvc就自動把request對象傳入
###f-sm-12. SpringMvc中函數的返回值是什么.
返回值可以有很多類型,有String, ModelAndView,List,Set等,一般用String比較好,如果是Ajax請求,返回的可以是一個集合
###f-sm-13. SpringMvc怎么處理返回值的
SpringMvc根據配置文件中InternalResourceViewResolver(內部資源視圖解析器)的前綴和后綴,用前綴+返回值+后綴組成完整的返回值
###f-sm-14. SpringMVC怎么樣設定重定向和轉發的
在返回值前面加"forward:"就可以讓結果轉發,譬如"forward:user.do?name=method4" 在返回值前面加"redirect:"就可以讓返回值重定向,譬如"redirect:http://www.uu456.com" ###f-sm-15. SpringMvc用什么對象從后臺向前臺傳遞數據的
通過ModelMap對象,可以在這個對象里面用addAttribute()方法,把對象加到里面,前臺就可以通過el表達式拿到
###f-sm-16. SpringMvc中有個類把視圖和數據都合并的一起的,叫什么
ModelAndView
###f-sm-17. 怎么樣把數據放入Session里面
可以聲明一個request,或者session先拿到session,然后就可以放入數據,或者可以在類上面加上@SessionAttributes注解,
里面包含的字符串就是要放入session里面的key
###f-sm-18. SpringMvc怎么和AJAX相互調用的
通過Jackson框架就可以把java里面的對象直接轉化成Js可以識別的Json對象 具體步驟如下 :
1.加入Jackson.jar
2.在配置文件中配置json的映射
3.在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解
###f-sm-19. 當一個方法向AJAX返回特殊對象,譬如Object,List等,需要做什么處理
要加上@ResponseBody注解
###f-sm-20. SpringMvc里面攔截器是怎么寫的
有兩種寫法,一種是實現接口,另外一種是繼承適配器類,然后在SpringMvc的配置文件中配置攔截器即可:
<!-- 配置SpringMvc的攔截器 --> <mvc:interceptors> <!-- 配置一個攔截器的Bean就可以了 默認是對所有請求都攔截 -->
<bean id="myInterceptor" class="com.et.action.MyHandlerInterceptor"></bean>
<!-- 只針對部分請求攔截 --> <mvc:interceptor> <mvc:mapping path="/modelMap.do" /> <bean class="com.et.action.MyHandlerInterceptorAdapter" /> </mvc:interceptor> </mvc:interceptors>
###f-sm-21. 講下SpringMvc的執行流程
系統啟動的時候根據配置文件創建spring的容器, 首先是發送http請求到核心控制器DispatcherServlet,spring容器通過映射器去尋找業務控制器,
使用適配器找到相應的業務類,在進業務類時進行數據封裝,在封裝前可能會涉及到類型轉換,執行完業務類后使用ModelAndView進行視圖轉發,
數據放在model中,用map傳遞數據進行頁面顯示。
### 1.講下MyBatis和Hibernate的區別?
MyBatis是JDBC的輕量級封裝,把Sql和java代碼獨立出來,性能相對比較高,寫SQL語句相對于比較靈活,并且容易調試,一般用在大型項目中.
Hibernate是JDBC的重量級封裝,開發速度比較快,但是性能比較低,調試不方便,一般適合對進度要求的比較高的中小型項目
###2.什么是MyBatis的接口綁定,有什么好處
接口映射就是在IBatis中任意定義接口,然后把接口里面的方法和SQL語句綁定,我們直接調用接口方法就可以,
這樣比起原來了SqlSession提供的方法我們可以有更加靈活的選擇和設置.
###3.接口綁定有幾種實現方式,分別是怎么實現的?
接口綁定有兩種實現方式,一種是通過注解綁定,就是在接口的方法上面加上@Select MyBatis的面試題部分
@Update等注解里面包含Sql語句來綁定,另外一種就是通過xml里面寫SQL來綁定,在這種情況下,
要指定xml映射文件里面的namespace必須為接口的全路徑名.
###4.什么情況下用注解綁定,什么情況下用xml綁定
當Sql語句比較簡單時候,用注解綁定,當SQL語句比較復雜時候,用xml綁定,一般用xml綁定的比較多
###5.MyBatis實現一對一有幾種方式?具體怎么操作的
有聯合查詢和嵌套查詢,聯合查詢是幾個表聯合查詢,只查詢一次,通過在resultMap里面配置association節點配置一對一的類就可以完成;
嵌套查詢是先查一個表,根據這個表里面的結果的外鍵id,去再另外一個表里面查詢數據,也是通過association配置,但另外一個表的查詢通過select屬性配置
###6.如果要查詢的表名和返回的實體Bean對象不一致,那你是怎么處理的?
在MyBatis里面最主要最靈活的的一個映射對象的ResultMap,在它里面可以映射鍵值對, 默認里面有id節點,result節點,它可以映射表里面的列名和對象里面的字段名. 并且在一對一,一對多的情況下結果集也一定要用ResultMap
###7.MyBatis里面的動態Sql是怎么設定的?用什么語法?
MyBatis里面的動態Sql一般是通過if節點來實現,通過OGNL語法來實現,但是如果要寫的完整,必須配合where,trim節點,
where節點是判斷包含節點有內容就插入where,否則不插入,trim節點是用來判斷如果動態語句是以and 或or開始,那么會自動把這個and或者or取掉
###8.MyBatis在核心處理類叫什么
MyBatis里面的核心處理類叫做SqlSession
###9.IBatis和MyBatis在細節上的不同有哪些
在sql里面變量命名有原來的#變量# 變成了#{變量} 原來的$變量$變成了${變量}, 原來在sql節點里面的class都換名字交type
原來的queryForObject queryForList 變成了selectOne selectList
原來的別名設置在映射文件里面放在了核心配置文件里
###10.講下MyBatis的緩存
MyBatis的緩存分為一級緩存和二級緩存,一級緩存放在session里面,默認就有,二級緩存放在它的命名空間里,
默認是打開的,使用二級緩存屬性類需要實現Serializable序列化接口(可用來保存對象的狀態),可在它的映射文件中配置<cache/>
###11.MyBatis(IBatis)的好處是什么
ibatis把sql語句從Java源程序中獨立出來,放在單獨的XML文件中編寫,給程序的
維護帶來了很大便利。
ibatis封裝了底層JDBC API的調用細節,并能自動將結果集轉換成Java Bean對象,大大簡化了Java數據庫編程的重復工作。
因為Ibatis需要程序員自己去編寫sql語句,程序員可以結合數據庫自身的特點靈活控制sql語句,
因此能夠實現比hibernate等全自動orm框架更高的查詢效率,能夠完成復雜查詢。 ###12.MyBatis里面怎么處理分頁
用插件分頁
###13.MyBatis里面怎么樣獲得剛插入的主鍵
把insert節點的useGeneratedKeys=true設置先生成主鍵,然后keyProperty="id",把生成的主鍵指向屬性.
###1. 為什么要用自定義標簽?
①Jsp中寫代碼比較混亂,難以維護
②把一些重復的功能都抽取出來,方便復用。
###2. 自定義標簽分為幾個步驟.
1.編寫標簽處理器類(SimpleTagSupport的實現類)
重寫doTag()
2.編寫標簽庫文件(WEB-INF/xxx.tld)
整個文件的定義: <short-name> <uri>
標簽的定義: <tag>
3.在jsp頁面使用標簽:
導入標簽庫(xxx.tld/)
使用標簽
###3. 自定義標簽類要繼承哪個類?
SimpleTagSupport類
sim·ple tag s?'p?rt
###4. 怎么配置自定義標簽的屬性
在.tld文件<tag>標簽中添加<attribute>,
通過<name>標簽設定自定義標簽的標簽名。 JSTL &EL的面試題部分
###5. 為什么要用EL表達式,有什么好處
1.在頁面中用js腳本和jsp表達式來獲取數據顯示比較麻煩
a:需要條件判斷
b:可能需要強轉
2.好處是EL表達式簡單易用,默認可訪問所有的JSP隱藏對象。
###6. EL表達式的語法是什么?
美元符號加大括號 ---> ${ EL表達式 }
###7. EL有哪兩種訪問格式,有什么區別?
EL 提供“.“和“[ ]“兩種運算符來存取數據。
當要存取的屬性名稱中包含一些特殊字符,如 . 或 - 等并非字母或數字的符號,就一定要使用“[ ]“。例如:
${ user. My-Name}應當改為${user["My-Name"]}
如果要動態取值時,就可以用“[ ]“來做,而“.“無法做到動態取值。例如: ${sessionScope.user[data]}中data 是一個變量。
###8. EL表達式中有哪些隱藏對象,舉幾個例子?
pageContext : JSP頁面的上下文
param : 參數
paramValues : 參數值
header : 頭信息
headerValues : 頭的值
cookie : 緩存
initParam : 初始化參數
###9. EL表達式中怎么樣拿到request,session里面的值?
例 :
可以通過它的隱藏對象RequestScope來獲取到Request范圍的屬性名稱所對應的值。 可以通過它的隱藏對象sessionScope來獲取到session范圍的屬性名稱所對應的值。
###10. EL表達式怎么樣拿到用戶請求的參數?
可以用${param.name} 來獲取用戶請求的參數
###11. EL表達式怎么樣得到上下文路徑?
${pageContext.request.contextPath}
###12. EL表達式怎么樣拿到request?
RequestScope
###13. JSTL全稱是什么?
java服務器頁面標準標簽庫
(JavaServer Pages Standard Tag Library)
###14. JSTL是怎么使用的?
將jstl.jar、standard.jar 復制到 Tomcat 的 WEB-INF/lib 中. 若要在 JSP 網頁中使用 JSTL 時,一定要先做下面這行聲明: < %@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
主要提供給 Java Web 開發人員一個標準通用的標簽函數庫。Web 程序開發人員能夠利用 JSTL 和 EL 來開發 Web 程序,
取代傳統直接在頁面上嵌入 Java 程序(Scripting)的做法,以提高程序可讀性、維護性和方便性。
###15. JSTL分為幾個標簽庫?
①核心標簽庫
②國際化標簽庫
③數據庫標簽庫
④XML標簽庫
⑤函數標簽庫
###16. JSTL里面判斷標簽是什么?
1. <c:if>
2. <c:choose>
<c:when></c:when>
<c:otherwise></c:otherwise>
</c:choose>
###17. JSTL里面的屬性是否可以從EL表達式獲取?
可以${xxxScope.attribute}
###18. JSTL里面的循環標簽有幾種,各是怎么用的?
1. <c:forEach> 用于迭代數字或集合;
2. <c:forTokens> 用于迭代字符串標記。
###19.怎么樣得到循環標簽里面的狀態值,譬如index,count等?
在forEach循環標簽中加入varStatus="s",然后直接用EL表達式: <c:forEach items="${atts}" var="item" varStatus="s">
<c:if test="${s.last}">
------
</c:if>
index:${s.index}<br/> count:${s.count}<br/> first:${s.first}<br/> last:${s.last}<br/> ${item}<br/><br/> </c:forEach>
###1.為什么要用自定義標簽
自定義標簽其實是一個Java類,他封裝了一些標簽代碼,形成一個
具有某個功能的新標簽。
1.增加了可擴展性。
2.增加了可復用性。
###2.自定義標簽分為幾個步驟.
1.創建標簽的處理類(Tag Handler Class)
2.創建標簽庫描述文件(Tag Library Descrptor File)
3.在JSP文件中引入標簽庫
###3.自定義標簽類要繼承那個類
TagSupport
###4.怎么配置自定義標簽的屬性
在.tld 文件里配置
集合類面試題
###1.請講下Java里面的容器
分兩大類,Map和Collection。而Collection又有子接口List
(數據存儲順序和插入順序是一樣的)、Set(里面的元素具有唯一性)
Map是存儲鍵值對的,里面的健不可以重復,但值可以重復 List主要有ArrayList和LinkedList兩種實現。實現的數據結構不同, 所以主要的區別也都是和數據結構相關的。 ArrayList基于數組,隨機訪問快, 而對于中間元素的插入刪除效率比較低,而且需要考慮擴容問題。 LinkedList,則 基于鏈表,和ArrayList提到的正相反,隨機訪問慢, 但對于中間元素的插入和刪除更有效率。 Set也是一種Collection,和List比起來主要體現在元素唯一性。
###2.請說下Iterator的作用
迭代器可以實現Collection接口的方法,可以一個一個地獲取集合中的元素 特性:在遍歷集合時 可判斷是否有下一個元素
###3.說下ArrayList和LinkedList的區別和聯系,并說明什么情況下用它們
區別:ArrayList用于對象的隨機訪問速度快,沒有順序
LinkedList實現機制是鏈表式的,和順序有關,速度比ArrayList慢
--->聯系:ArrayList和LinkedList都是List接口的實現類
當要快速獲取一個值時,用ArrayList,用于順序插入操作時,用LinkedList.
###4.說下List,Set,Map三種集合各有什么特征
List集合中的元素可以重復,
Set集合中的元素不可以重復
Map集合用鍵-值映射存放對象,Map容器中的鍵對象不能重復,值對象可以重復
###5.HashSet和TreeSet有什么區別,什么時候用它們
區別:HashSet中的元素不能重復,沒有順序
TreeSet中的元素不能重復,但有順序
當集合中的元素需要排序時,用TreeSet
一般情況下用HashSet,因為不需要排序,速度比TreeSet快
###6.什么是泛型,怎么使用的,有什么好處?
答案
泛型又分為:方法泛型和類泛型。
定義一個集合時,可以知道里面定義的是什么類型
使用:在集合類型后面加< 數據類型 >
使用泛型后,從集合中取得元素后就不用再用強轉
###7.什么是for each循環,它可以循環那些數據類型
答案
通過對象拿到集合里的值 可以用來循環集合和數組
###8.寫一個for each循環看看
for(Object object : list){
System.out.println(object);
}
###9. 什么是強轉怎么寫的,有什么優缺點,一般要多用還是少用,為什么?
一般在繼承的基礎上用. Person person=new Student(); Student student=(Student)person; 把運行期的強轉為編譯期的. 編譯期不會出錯.運行期容易出錯.所以一般少用
###10.HashMap和Hashtable有什么區別,一 般情況下常用那個?
HashMap的鍵-值都可以為空(null)
Hashtable的鍵-值都不可以為空(null),線程安全 ,
一般情況下用HashMap
###11.Hashtable名字為什么沒有駝峰命名
Hashtable的由來比較古老,當時還沒有命名規范
###12.Collections和Collection有什么區別
Collections是一個工具類,可以直接調用List和Set的方法
Collection是一個接口,是List和Set集合的父接口
###13.寫出Collections的6個方法,并詳細解釋
sort():對集合進行排序
shuffle():打亂集合中的元素順序
addAll():將一個集合添加到另一個集合中
max():判斷集合中的最大值
min():判斷集合中的最小值
copy():將一個集合中的元素復制到另一個集合中去
fill():將一個集合中的元素全部替換成指定的元素
###14.Arrays類是做什么的,寫出它的常用6個方法
Arrays是數組的一個工具類
sort():對數組進行排序
binarySearch():搜索數組指定元素的下標
copyOf():復制數組中指定長度的元素
deepEquals():比較兩個數組的深度
fill():把數組中的所有元素替換成指定元素
equals():比較指定兩個數組的元素是否相等
hashcode():將指定數組的指定范圍復制到一個新數組。
###15.比較下集合和數組的優缺點
集合是多個對象的容器,可以將不同數據類型的多個對象組織在一起
數組類型是有相同數據類型的數據集合,數組是很多語言都支持的底層數據結構,性能上是最高的
###16.如何對一個對象排序,有幾種方法
把對象放入List集合中,用Collections工具類調用sort()方法進行排序,
但是這個類必須實現Compareble接口才行
把對象放在Set集合中,用TreeSet()實現類對集合直接排序
###17.在集合里面怎么判斷兩個對象相等,要實現什么方法
重寫equals方法
###18.怎么樣把集合轉化成數組,或把數組轉化為集合
把集合轉為數組,可以用toArray()方法
把數組轉為集合時, for each循壞,先把數組中的元素轉為String型,再放到集合里
###19.分別寫出List,Set,Map里面的5個常用方法
List:
add()新增 clear()清除 contains()判斷是否包含某個元素
indexOf()一個元素在集合中首次出現的位置
set()把指定下標的元素替換成自定義元素
Set:
add()新增 clear()清除 contains()判斷是否包含某個元素
remove():把集合中指定下標的元素刪掉 size():返回集合長度 Map: containsKey()是否包含指定key containsValue()是否包含指定value keySet()返回所有key put()添加元素 Remove()移除
###20.HashMap與LinkedHashMap,和TreeMap的區別。
共同點:HashMap,LinkedHashMap,TreeMap都屬于Map的實現類.
不同點: 1.HashMap里面存入的鍵值對在取出的時候是隨機的,
TreeMap取出來的是排序后的鍵值對。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會更好。
LinkedHashMap 是HashMap的一個子類,如果需要輸出的順序和輸入的相同,那么用LinkedHashMap可以實現.
###21.HashMap怎么實現有序
可以轉化放入TreeMap里面,或者把key放入LinkedList里面。
###22.在List里面怎么去掉重復的數?
通過把List里面的數據放入HashSet可以去除重復
###23.在List里面有幾種排序?
答:兩種:實現Comparable<Article>接口,實現里面的CompareTo方法進行排序。 還有調用Collections.sort()方法排序!
###24.說一下鏈表跟數組的區別
鏈表:用一組任意儲存單元存放線性表的數據元素,并且通過指針鏈相接結點的序列稱為鏈表。
是一種常見的數據組織形式,它采用了動態分配內存的形式實現。
需要時可以用new分配內存空間,不需要時用delete將已分配的空間釋放, 不會造成內存空間的浪費。不靠數組實現,沒有下標。
數組必須事先定義固定的長度,不能適應數據動態增減的情況。當數據增加時,
可能超出原先定義的元素個數;當數據減少時,造成數據浪費。在使用的時候還要數組初始化,
注意數組的下標越界。
###25.HashSet的理解
HashSet實現了Set接口,HashSet不保證集合的迭代順序,允許使用Null元素。
HashSet的底層使用了HashMap,使用HashMap實列進行對集合的元素進行操作,然后再封裝成HashSet的操作。
###26.什么類可以實現有序存儲(除ArrayList以外)?
一種按照插入的順序排序,譬如LinkedList,LiskedHashMap,
另外一種是插入后重新排序TreeSet,TreeMap
###27.HashMap和ArrayList是不是都是線程不安全的?
ArrayList是線程不安全的;HashMap是線程不安全的; 還有我們常見的一些JAVA集合都是線程不安全,這樣做是為了提高性能
在JDK5以后提供了線程安全的并發包java.util.concurrent并發包,譬如里面的類CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentHashMap等
###28.HashMap和TreeMap的區別?
TreeMap實現Map接口,能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序, 也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的。 hashMap最多只允許一條記錄的鍵為Null,允許多條記錄的值為Null,hashMap不支持線程的同步,
即同一時刻可以有多個線程同時寫hashMap.可能會導致數據的不一致。 TreeMap不僅可以保持順序,而且可以用與排序。
HashMap通過hashcode對其內容進行快速查找,而TreeMap中所有的元素都保持著某種固定的順序,
如果你需要得到一個有序的結果你就使用TreeMap.
###29.ArrayList集合加入1萬條數據,應該怎么提高效率
因為ArrayList的底層是數組實現,并且數組的默認值是10,如果插入10000條要不斷的擴容,耗費時間,
所以我們調用ArrayList的指定容量的構造器方法ArrayList(int size) 就可以實現不擴容,就提高了性能
###30.你知道HashMap底層是怎么實現的嗎?
簡單的說是一個數組,因為數組的性能比較好,數組里面放的是Entry類,HashMap類有一個叫做Entry的
內部類。這個Entry類包含了key-value作為實例變量。當存儲或者獲取對象的時候, 就根據哈希算法,對象的hashCode調用得到這個下標,以便實現快速訪問.
###31.怎樣遍歷List Set,Map
List 和Set可以通過一般for循環,迭代器循環,或者增強型循環來遍歷, 其中一般for循環性能最快,
迭代器循環可以判斷和得到下一個值,for each增強型循環擴展性強,但性能稍低.
Map循環可以通過keySet得到Key的Set集合,然后遍歷這個集合就可以得到所有的Value
###32.Set為什么是不允許重復的。
set的實現機制不允許重復的
###33.ArrayList為什么要用for循環,為什么要用迭代器,又有什么好處。
for循環通過對象拿到集合里的值
迭代器可以實現Collection接口的方法,可以一個一個地獲取集合中的元素 在遍歷集合時 可判斷是否有下一個元素
###34.你對與隊 列了解多少你是怎么用的。
答:隊列是一種數據結構,FIFO 先進先出有點類似與棧,只是在隊列中第一個插入的數據項也會被最先刪除,
隊列的兩個基本操作:
一個是插入一個數據項,即把一個數據項放入隊尾
另一個是移除一個數據項,即移除隊頭的數據項.
###35.如果我要存取很多的數據,但是又不需要重復的,要選擇什么容器,說一下為什么使用它,它是哪個的子類?
答:Set容器,它是不允許重復的,它是collection的子類
###36.哪種方法可以得到Map的Key?
keySet()方法 面向對象的面試題部分
###1) 面向對象的優點?
答案
易擴展 易維護 面向對象是相對面向過程的
###2) 如何聲名一個靜態塊?
答案
在類中方法外聲明 static關鍵字+代碼塊
###3) 接口與抽象類的區別?
答案
類是單繼承的,但是可以實現多個接口
抽象類里的方法可以有實例方法也可以有抽象方法
接口里面只能有抽象方法。
!!!注意:關注一個事物的本質的時候,用抽象類;當你關注一個行為的時候,用接口。
###4) 用于類和接口的關鍵字
答案 定義類的是class,如類文件的開頭都是:public class 類名{ } 定義接口的是interface,如public interface 接口名{ } 用于實現接口的是implements。
###5) 如何創建數組?
答案 數組是new出來的 或者直接可以聲明, 舉個例子 String[] array={"1","2"}; 或者String[] array=new String[10];
###6) 如何創建一個構造方法對象的格式?要注意哪些?
答案
構造器是為了創建一個類的實例Platypus p1 = new Platypus();
注意:方法名與類名一致
###7) 類的組成 和執行順序
答案
屬性
方法
靜態塊
非靜態塊
執行順序: 先父類,后子類,靜態塊 靜態字段 非靜態塊 非靜態字段 構造器 方法
###8) main方法必須被什么修飾?
答案 方法名必須是main 是被public static void 修飾 傳入String數組
###9) 如何理解面向對象
答案
世間萬物皆對象,對象有具體的的實例化,任何方法或者屬性都要寫在對象(類)里面
###10) 構造方法可否能被重寫:
答案 構造方法不能被繼承,因此不能重寫,但能被重載。
###11) 靜態方法中能有靜態的變量嗎?
答案
不能 靜態變量是類變量 不可以定義在方法里
###12) String與StringBuffer的區別:
答案
String 是不可變的 可以直接使用它的方法 用來創建字符串
而 Stringbuffer無論怎么修改都是一個對象
如果在字符串改變,或者迭代改變的情況下Stringbuffer比String運行快
###13) 重載(overloading)與重寫(override)的區別:
答案
1.重載發生在同一個類。 重寫發生在父子類中。
2.重載參數簽名不同,而重寫相同且返回類型相同。
3.方法名相同,重寫override是父類與子類之間多態性的一種表現,重載overload是一個類中多態性的一種表現。
###14) (= =)與equals()的區別:
答案
如果是基本類型比較,那么只能用==來比較,不能用 equals 對象間的比較使用equals ==比較的是對象中的地址 而equals比較的對象 的內容
###15) Abstract與interface的區別:
答案
Abstract是用來聲明抽象類抽象方法,而interface是接口 抽象類可以有
變量,有方法的實現,接口內只能有常量和抽象方法
###16) StringBuilder和StringBuffer的區別:
答案 StringBuilder比StringBuffer更加快捷,但是StringBuilder線程不安全
###17) JRE,JDK,JVM分別是什么,它們有什么聯系:
答案
jre 運行時環境,jvm虛擬機 jdk java開發工具包 jvm是jre的一部分
###18) 普通類繼承抽象類為什么一定要重寫其中的抽象方法?
答案
必須要實現的,也就是要重寫,如果不實現,子類無法對象實例化。
###19) 什么是拆箱和裝箱?
答案
裝箱就是將基本類型轉換為對象類型
拆箱就是將對象類型轉換為基本類型。
###20) 繼承與實現的區別?
答案
繼承針對類,實現針對接口。
單繼承、多實現的。
實現要重寫接口里面的方法,而繼承不需要。
###21) Abstract為什么不能與,private,final,同時使用?
答案
抽象方法需要被子類重寫 所以不能夠用private final修飾
###24) 繼承最大好處?
答案 可以對父類的方法進行重用,節省時間
###25) 寫出String類常見的5個方法,并詳細解釋?
答案 indexOf()返回指定字符串在該字符串出現的序列 startsWith()判斷該字符串是否以指定字符開始 concat() 將指定字符串連接在該字符串的結尾 length()返回字符串的長度 substring返回該字符串從索引開始 結束于字符串末尾 或者指定索引的一個子字符串
###27) 普通方法的方法名可以與類名一致嗎?
答案
可以,構造器就是
###28) 在什么情況下局部變量會覆蓋全局變量?
答案
當局部變量名與全局變量名相同 類型相同
###29) static 修飾的方法可否支持多態?
答案
不支持多態,如果父類聲明一個對象,子類實現這邊變量,那么調用static修飾的時候會調用父類的,而不是子類的.
除了工具類。用static修飾的變量會發生一處改變則全部改變。
###30) 使用數組前應該注意的什么?
答案 數組下標是否越界 對數組進行初始化
###31) 如果一個類繼承了父類,父類里有一個靜態塊,子類里也有個靜態塊 ,對子類進行實例,父類的靜態塊先執行還是子類的先執行?
答案
父類的靜態塊先于子類的靜態塊的執行
###32) Java語言最大的特點?
答案 跨平臺性(一次編譯,多次執行)
###33) 請你說說byte short char之間可以互相轉換嗎?為什么?
答案
可以通過強轉
###34) 請說說引用和對象?
答案
對象和引用是分不開的,對象生成一個地址,引用則指向了這個地址
A a=new A();
a為引用 等號右邊的是對象
###35) 怎樣將一個String添加到另一個String的后面?
答案
(StringBuffer ,StringBuilder)的append方法
concat
###36) 有幾種數據類型?
答案
JAVA數據類型分基本數據類型和引用對象類型。
###37) 傳參有幾種類型?有幾種特殊類型?
答案
基本數據類型 引用對象類型
###38) 什么是匿名類,有什么好處
答案 匿名類沒有名字的類 ,封裝性好,比較安全用了一次便可以丟棄 接口不能new,但語法中的匿名類卻和new一個接口的的語法結構很相似。
###39) jar是什么格式的文件,有什么好處
答案
它允許將許多class文件組合成一個壓縮文件,方便管理class文件
###40) java和javac,javaw各有什么作用
答案 java:運行程序 javac:編譯java文件至class文件 javaw: 不需要打開dos窗口就可以運行
有興趣的可以看下 ssh的面試題
http://blog.csdn.net/my_name_nb/article/details/54866319
|
新聞熱點
疑難解答