關於spring MVC的面試題

MVC設計模式css

M model 模型html

model包括service處理業務邏輯,entity實體類封裝數據,dao操做數據庫,utils工具類前端

service層主要用來處理業務邏輯,service層的一些公共處理可使用spring框架的AOP來完成,好比,日誌信息,事物的處理java

Spring是一個框架,結合了java中多種優秀設計模式造成的一個企業級解決方案程序員

IOC :控制反轉,將對象的建立與屬性的賦值交給Spring框架完成,將控制權由程序員交給Spring框架這就是控制反轉,IOC主要運用的是Java中的工廠設計模式,將要建立對象的類交給Spring工廠,須要時直接去工廠中取web

DI:DI和IOC本質相同說法不一樣,DI依賴注入,經過屬性的set方法或者類的構造方法爲屬性賦值ajax

AOP:面向切面編程,是對OOP面向對象編程的一種補充,主要運用的是Java中代理設計模式,代理設計模式又分爲靜態代理和動態代理redis

靜態代理和動態代理的區別:靜態代理在代碼編譯時代理類就產生了,動態代理是在代碼運行期纔會產生代理類,在運行期JDK底層會動態的生成代理類,並建立代理對象spring

Spring的事務處理:事務處理由Spring框架的聲明式事務處理完成sql

Spring框架建立對象的建立次數

Bean標籤的scope屬性能夠設置對象的建立次數,爲singleton時這個對象時單例的只會建立一次,爲prototype時對象時多實例的每次使用Spring工廠都會從新建立一個新的對象。

Spring框架建立對象的生命週期

生命週期:一個對象從建立到銷燬的過程,當scope屬性爲singleton是當Spring工廠啓動時就會建立對象,若是Scope屬性爲prototype時,當每一次須要使用的時候都會建立一個新的對象,不會再Spring工廠啓動時建立對象。再對象被建立的時候會自動調用Bean標籤中的init-method屬性中指定的方法,對象在被Spring工廠銷燬時就會調用destroy-method屬性中指定的方法,若是是多實例的對象將不禁Spring框架銷燬,會由JDK的垃圾回收機制銷燬不會調用destroy-method中的方法

Dao層:作數據映射,操做數據庫,DataAccessObject數據庫存儲對象

JDBC jdbc是java提供的一套規範,一套接口,具體的實現由數據庫廠商負責

開發JDBC的步驟,1.加載驅動,2.建立連接,3.寫Sql語句,4.建立對象,5.執行,6.釋放資源

setAutoCommit設置事務是否自動提交,commit提交事務,rollback回滾事務

Mybatis框架

MyBatis是一個持久層框架,ORM框架,是一個半自動ORM框架,能夠完成對數據庫的增刪改查操做,封裝了JDBC,MyBatis消除了幾乎全部的JDBC代碼,解決了JDBC操做數據庫時的冗餘問題

ORM框架,ORM object relation mapping,對象數據庫映射,將數據庫的查詢結果儲存給Java的實體類對象,這就是數據映射

SqlSession對象至關於JDBC的Connetcion對象,即獲取一個數據庫連接 ,Sqlsesion對象能夠幫咱們完成整個數據庫操做任務,SqlSession是Java與數據庫之間的會話操做,HttpSession是瀏覽器與服務器之間的會話

當數據庫中的字段名和實體類中的屬性名不一致時,Mybatis映射數據就會產生問題,JDBC技術則會不產生這種問題

能夠同過對數據庫的查詢結果起別名來解決,

可使用resultMap標籤作數據映射

使用association標籤給實體類中對象類型的屬性賦值 多對一

使用collection標籤來對實體類中list集合類型的屬性賦值 一對多

動態Sql

where If 標籤 條件判斷,多條件查詢

foreach標籤循環拼接sql語句,用於批量刪除

item 變量名 隨便寫

collection循環對象的數據類型,List集合 爲list        數組類型爲array 若是使用了@Param註解,則以註解中的名字爲主open 再循環以前拼接的內容,separator 每循環一次中間拼接的內容,close 循環結束以後拼接的內容數據庫 Dao層主要用來操做數據庫

數據庫的分類

網格型,層次性,關係型,主流的數據庫都是關係型數據庫:MySql,Oracle,SqlServer,sybase。Nosql 非關係型數據庫:Mongodb,redis,這些都是數據庫管理系統,每個數據庫管理系統,能夠又不少個數據庫

Oracle 數據庫

Oracle數據庫,MySql數據庫,Java計算機語言都屬於Oracle公司

連接Oracle數據庫

須要安裝數據庫客戶端工具,而且保證Oracle數據庫正常運行

Sql腳本

Sql不是數據庫,Sql是一種結構化語言,他是操做數據庫的一種語言

Oracle中使用|| 拼接字符串

dual啞表

sysdateOracle中獲取當前系統時間

Oracle中的函數

相似於java中的方法,傳入一些實參,運行完該函數返回一些結果

單行函數 每行數據運行完都會返回一個結果

length()返回實參這個字符串的長度

mod() 求餘數

to_date()把一個字符串轉換爲日期類型

to_char()把其餘類型的數據轉換爲字符串

組函數:數據被分到幾個組裏面,查詢結果就會有幾行數據,通常組函數,是和分組查詢一塊使用,當使用組函數時,沒有對錶中的數據進行分組,表示將表中的數據分到一個組裏面

max最大值min最小值avg平均值sum總和count總行數

使用組函數時select後面不能跟其餘字段,使用組函數時,統計時會自動排除值爲null的數據

Oracle中每一個表都有僞列 Rownum 和RowId

連接查詢 當你的查詢結果須要多張表裏的數據,這時候form後面能夠跟多張表,這樣的查詢就時連接查詢

左連接 left join 以左表爲主表右連接 right join 以右表位主表完整連接 【outer】join 兩張表都是主表內連接 inner join 兩張表都是從表自鏈接 本身連接本身 ,兩張表都是同一張表Oracle中字段的類型Varchar2() 可變長的字符串Char()定長字符串number(m,n)m表示數字的總長度,n表示小數點後幾位integer double類型 不建議使用Date存儲日期 日期類型Clob 大文本類型Blob 存儲二進制文件

約束

主鍵約束 primary key   主鍵是一行數據的惟一biao'ji   每一個表都要有主鍵 主鍵的值是不能重複的

一個表中只能有一個主鍵    主鍵是伴隨整個實體的生命週期的,整個生命週期中是不能夠改變的    主鍵的值不能夠爲null

惟一約束 unipue     惟一約束字段的值不能重複     主鍵約束是一種特殊的惟一約束

他的值是能夠改變的    值能夠爲null

非空約束 not null

非空的字段值不能爲null

外鍵約束 references

自頂義約束 check(約束條件)

刪除表和修改表結構

刪除表 drop table 表名

修改表結構 alter table 表名 modify 字段名 字段類型

給表增長一個字段 alter table add 字段名 字段類型 約束

刪除表中的約束 alter table 表名 drop constraints 約束名

Sql 腳本的分類

dql 數據庫查詢語言

ddl 數據庫定義語言

dml 數據庫操做語言

tcl 事務控制語言

序列 sequence

當表中的數據不少時,咱們不清楚主鍵到幾了,爲了更好的控制主鍵的生成方式,咱們可使用序列

create sequence 序列名 start with 開始值

視圖 view

平時咱們會常用一些複雜的sql腳本,這些腳本比較長,寫起來不方便。咱們要基於這些腳本的結果進行再次處理。這是咱們能夠吧這個sql語句建成視圖,方便咱們之後的操做。

create view 視圖名 as sql語句

視圖不能提升運行效率

索引 index

當數據庫裏的數據量很大時,檢索數據的效率會受到影響,這是索引就能夠提升檢索數據的效率

原理:相似於字典的目錄,可以快速的根據目錄定位相應的文字。索引是獨立於表的一個數據庫對象

索引會提升數據檢索效率,而下降了增刪改效率

create index 索引名 on 代表(字段名)

MySql 數據庫

MySql 數據庫是一個關係型數據庫,和Oracle數據庫都屬於Oracle公司

Mysql 和Oracle 的區別

Oracle是一個大型數據庫,產品免費,服務收費,Oracle不支持批量添加,支持序列,sql支持||拼接,Oracle的存儲結構特別複雜

Mysql是一個小型數據庫,是開源免費的,支持批量添加,Mysql支持自增加,能夠經過Mysql提供的函數憑藉sql

Redis 數據庫

RDB 關係型數據庫 Oracle Mysql

NoSql 非關係型數據庫 Redis

Nosql 的特色:

弱化結構

基於內存,在內存中存儲數據,支持自動持久化

弱化事務

基於集羣環境

沒有複雜的連接查詢

支持腳本語言 js

Redis是基於內存,以key-value 的形式存儲數據,支持網絡傳輸,支持自動持久化,是一個非關係型數據庫

Jedis是redis提供的一個Java連接Redis數據庫的一個工具

Entity 實體類

實體類的做用主要用來儲存數據

V view 視圖

主要用來展現數據,接受用戶輸入的數據,將數據提交到後臺 嗎

HTML超文本標記語言,用來展現靜態頁面,不能實現動態頁面

CSS能夠美化HTML頁面,HTML負責內容,CSS負責樣式

JSP

JSP是一個特殊的Servlet,用於實現動態頁面

Jsp的執行流程

當瀏覽器客戶端第一次訪問一個jsp頁面時,服務器會將這個jsp翻譯爲一個javaServlet類,再將這個類編譯爲.class文件,執行的是這個class文件,整個過程jsp再接受第一次請求的時候執行了一次,後續的請求,tomcat會自動去執行class文件,而再也不進行翻譯和編譯

Jsp的九個內置對象

request

response

out

session

application ServletContext是對整個web.xml的封裝

config ServletConfig 該對象是對一個servlet配置項的封裝

Exception 異常信息對象。若是當前頁面是一個錯誤頁面的話,可使用該內置對象。經過該內置對象能夠獲取異常信息

page該對象就是this對象

pageContext 是一個做用域,這個做用域對應一個頁面,用的很是少,能夠經過該對象獲取其餘8個內置對象,能夠操做其餘做用域

Jsp的做用域

pageScope,requestScope,sessionScope,applicationScope

EL表達式

表達式語言,能夠獲取做用域裏面的數據,el表達式獲得的變量能夠作一些運算

${做用域.key}

EL表達式能夠直接獲取Cookie裏面儲存的數據

EL表達式能夠經過param獲取到請求傳遞過來的參數

JSTL El表達式雖然強大,可是不能作到流程的控制。JSTL能夠和El表達式結合使用,來彌補這個缺陷

JSTL jsp標準標籤庫,能夠作到流程的控制,和EL表達式結合使用

JavaScript 一種腳本語言、

前端編程語言,和HTML,CSS相似都是由瀏覽器解釋執行,JavaScript主要用來實現動態頁面

JavaScript是一種弱類型語言 ,變量沒有類型,值有類型

事件

瀏覽器中的交互效果都是由事件驅動的. 事件都是由瀏覽器內置的,當用戶操做瀏覽器的時候就可能觸發已經內置的事件. 當瀏覽器監聽到用戶觸發了某一個事件的時候,就會調用開發者(程序員)提早編寫好的函數.

點擊事件 onClick

鼠標移入事件 onmouseover

鼠標移出事件 onmouseout

輸入框獲取焦點事件 onfocus

輸入框失去焦點事件 onblur

表單提交事件 onsubmit

內容被改變事件       onchange

頁面加載完成事件     onload

DOM 操做

當網頁被加載的時候,瀏覽器會建立頁面的文檔對象模型document object model

BOM操做

JQuery

jQuery是一個JavaScript庫、jQuery極大地簡化了JavaScript編程。jQuery設計的宗旨是「writeLess,Do More」,即倡導寫更少的代碼,作更多的事情。它封裝JavaScript經常使用的功能代碼,提供一種簡便的JavaScript設計模式,優化HTML文檔操做、事件處理、動畫設計和Ajax交互。jQuery兼容各類主流瀏覽器。

AJAX

無刷新請求,不刷新頁面,接收請求,並接收後臺響應的內容

AJAX的核心編程語言是JavaScript,AJAX會用到DOM技術和CSS,AJAX經過字符串,JSON,xml作數據傳輸

AJAX的執行流程

建立XMLHttpRequest對象,根據不一樣的瀏覽器建立的方式也不一樣

創建連接,經過open方法創建連接

發送請求,經過send方法發送請求

監控XMLhttpRequest對象的狀態,當就緒狀態時是4,響應狀態碼200時,獲取後臺響應的內容

EasyUI

EasyUI 能夠作頁面效果,能夠經過ajax和後臺作交互,自動解析後臺響應回來的內容,是再JQuery的基礎上封裝造成的一個前端框架

EasyUI控件三要素

屬性 特徵用來控制控件的效果

方法 行爲,功能體,再須要某一個功能時,調用對應的放法

事件 須要綁定一個函數,當達到事件的觸發時機時調用函數

C controller 控制器

Servlet

咱們把html放入到tomcat後,能夠經過瀏覽器訪問這些頁面。可是這些頁面都是靜態不會變化的內容。任何人,任什麼時候間看到的內容都是同樣的。

Servlet可以使html源碼動態的產生。Servlet是一個特殊java類,他運行在服務器。

Servlet類應該繼承HttpServlet這個類

每個Servlet類都須要在web.xml文件中經過servlet標籤進行配置

HttpServletRequest 對請求信息的封裝

HttpServletResponse 對響應信息的封裝

Servlet的生命週期 一個對象建立到銷燬的過程,當客戶端第一次發送請求訪問一個servlet時,服務器會建立一個servlet對象,而且調用init方法,servlet是單例的只會建立一次,每一次請求這個servlet都會執型service方法,當服務器中止時,servlet對象會被銷燬掉,銷燬前會執行destroy方法

servlet的請求方法1.url地址訪問2.超連接方法3.form表單提交

Servlet和HTML頁面的區別

Servlet是要實現動態的頁面效果,html是要實現靜態的頁面效果。

動態的頁面效果就是:不一樣的人在不一樣的時間訪問的頁面是不同。

靜態的頁面效果是:全部的人在全部的時間訪問的頁面效果是同樣的。

轉發

當運行完一個servlet後須要去請求其餘資源文件,這時候可使用轉發

轉發:兩個資源文件對應一個請求一個響應。轉發是服務器端起的效果。瀏覽器端是感受不到的,瀏覽器的地址攔不會改變

Request做用域

當請求從一個action轉發到一個jsp的時候,若是jsp中要使用action類中的變量,那麼咱們須要將action中的變量放入到request做用域中傳給jsp。那麼jsp中就能夠經過request做用域獲取到該變量

Request做用域的特色

放數據的servlet和取數據的servlet必須保證使用的是同一個request對象。一旦request對象改變了,那麼,request做用域裏面的值就會失效。

Form表單的Method屬性

get方式的提交,表單元素對應的值會以?key=value&key=value的方式顯示在地址欄裏面。Post方式不會。Post要相對安全一些。由於get方式要把數據顯示在地址欄裏面,因此他能夠傳遞的數據量是有限制的。Post的大小是沒有限制的。

重定向

重定向和轉發實現的效果都是同樣的。

重定向的過程當中會有兩次的請求和響應。RegistAction運行結束後,會給瀏覽器響應一個重定向的指令。瀏覽器接收到這個重定向指令後,會自動發出請求。不用用戶作任何操做。

轉發和重定向的區別

轉發的代碼request和重定向的代碼response。轉發的參數是url-pattern。重定向的參數是/appName/url-pattern

轉發的過程當中只有一次請求和響應。重定向的過程當中會產生兩次請求和響應。

轉發的地址欄顯示的是轉發前資源的路徑。重定向的地址欄顯示的是重定向後的資源的路徑。

由於重定向會產生兩個request對象,因此重定向的時候使用request做用域會沒有效果。

重定向刷新後,不會形成數據庫數據的異常。

會話跟蹤技術

在服務器端有一些資源文件,須要判斷請求的狀態,看該請求是否有權利訪問資源文件,若是有就讓該請求訪問,不然就不讓該請求訪問。要實現該功能須要使用到會話跟蹤技術。

Cookie

cookie是服務端建立出來的,保存再客戶端

瀏覽器一旦有了cookie信息,那麼瀏覽器請求項目的全部資源時,都會自動攜帶該項目的cookie信息

cookie的特色

cookie是保持再瀏覽器的字符串,一個cookie是由標記和值組成,標記和值都是由字符串組成,不能是中文

瀏覽器請求項目資源時,會自動攜帶跟項目相關的cookie

cookie會再瀏覽器關閉時自動清除掉,若是想控制cookie的有效期,建立出cookie對象後會掉用setMaxAge()來設置cookie的生命時長,單位秒

cookie的數據不安全,重要的數據不存在cookie中

Session

session是服務端爲每一個瀏覽器建立出來的私人存儲空間

HttpSessionsession=request.getSession();//獲取session對象,當瀏覽器第一次訪問服務器,調用了該方法後,該方法的含義是建立出session對象。當瀏覽器不是第一次訪問服務器,調用該代碼後,該代碼的含義是獲取到該瀏覽器對應的session

Session的生命週期

默認狀況下session會存活30分鐘 ,能夠經過web.xml配置來決定session的存活時間

當瀏覽器請求服務器後,關閉了瀏覽器。這時候再打開瀏覽器後,訪問服務器,獲得的session跟關閉前獲得的session不是同一個了。服務器端到30分鐘後就把以前的session銷燬掉。

session 的特色

session跟瀏覽器一一對應。

Session是保存在服務器端。

Session存儲的是任意數據類型。

Session做用域裏面是不能隨意放數據

Cookie和session的區別

都是會話跟蹤技術,都和瀏覽器相關

保存的位置不同,cookie保存再瀏覽器端,session保存再服務器端,重要的數據保存再session中

保存的數據不同,cookie保存的是字符串,session保存任意類型

Session 的實現原理

當瀏覽器第一次訪問服務器時,服務器會建立一個session對象,並建立一個cookie對象,將JSESSIONID和session的id放入cookie中,響應給客戶端,瀏覽器下次訪問,會攜帶這與項目相關的cookie,服務器會經過JSESSIONID去找對應的session對象,若是瀏覽器禁用了cookie,則會對url地址進行URL重寫,將JSESSIONID以參數的方法提交給服務器

ServletContext

ServletContext能夠獲取配置文件中的內容,是對web.xml對象的封裝,一個項目中只有一個web.xml因此ServletContext對象只有一個

Request做用域的範圍最小,對應一次請求。

Session做用域的範圍要大一些。對應一次會話。只要瀏覽器不關就是一個session。

Application(ServletContext)做用域的範圍最大。對應一個應用程序。無論有多少個瀏覽器,只要訪問的是同一個項目,那麼他們對應的就是一個application對象。

Application對象跟一個項目相關,他會在tomcat啓動的時候被建立,tomcat關閉的時候被銷燬。

監聽器

能夠監聽一些事件的發生。ServletContext監聽器能夠監聽tomcat的啓動和關閉。

過濾器

Filter是運行web項目中的一個組件,當請求過來時,過濾器會先運行裏面的代碼,而後再把請求分發給真正要請求的資源。

Struts2框架

struts2框架封裝了Servlet技術,用於接收頁面傳遞過來的參數,經過內部處理,將結果返回

struts2框架的執行過程

瀏覽器向服務器發送請求,通過核心過濾器處理,獲取到,namespace和method,再struts.xml配置文件中匹配對應的方法,執行方法中的內容,獲取一個返回值,再去struts.xml文件中找對應的result標籤,按照指定的方式請求資源文件

跳轉方式

dispatcher 默認值。轉發到jsp頁面。

redirect 重定向到一個jsp頁面。

redirectAction重定向到一個action。

chain 轉發到一個action。

Auction類中獲取session

HttpServletRequest request=ServletActionContext.getRequest();

HttpSession session=request.getSession();

struts2的數據處理機制

action把處理的數據放入到值棧裏面。值棧是存放數據的空間。到視圖裏面能夠到值棧裏面獲取數據。

視圖能夠經過ognl表達式到值棧裏面獲取數據。須要流程控制時,能夠經過struts2的標籤。

OGNL表達式

對象圖導航語言。他是一個表達式語言相似於以前的el表達式。這個ognl是獨立於struts2框架的。

Ognl的數據源有兩個。1.Root區域。2.contextMap區域。

攔截器

Struts2的攔截器是struts2框架中最爲重要的核心組件。Struts2的不少核心功能都是經過攔截器實現的。

當客戶端請求struts的攔截器時,請求會先進入到struts的攔截器裏面。攔截器先運行,攔截器能夠對請求放行,放行後請求運行action方法。Action方法運行完後,會去運行攔截器爲執行完的代碼。

過濾器和攔截器的區別

過濾器屬於servlet相關技術,攔截器是struts2的組件技術。

過濾器能夠過濾全部的資源,包括jsp,servlet,圖片,css,js。攔截器只攔截struts2中的action。

在struts2項目中若是使用了自定義的攔截器,struts2框架自帶的攔截器就會失效,須要在action引用攔截器的配置上面增長系統攔截器defaultStack。

攔截器棧

一個攔截器棧裏面能夠存儲多個攔截器。Action引用的時候能夠直接引用攔截器棧

使用默認攔截器

<default-interceptor-ref name=」攔截器名」/>

Default-action-ref

當用戶請求了一個不存在的actionName時,這時候請求會進進入到default-action-ref指定的action類中。

Global-results

配置爲全局的result

相關文章
相關標籤/搜索