答案:html
(1)在瀏覽器輸入地址,瀏覽器先去查找hosts文件,將主機名翻譯爲ip地址,若是找不到就再去查詢dns服務器將主機名翻譯成ip地址。前端
(2)瀏覽器根據ip地址和端口號訪問服務器,組織http請求信息發送給服務器。java
(3)服務器收到請求後首先根據Host請求頭判斷當前訪問的是哪臺虛擬主機。web
(4)服務器根據http請求頭中的請求URI判斷當前訪問的是哪一個web應用。正則表達式
(5)服務器根據http請求頭中的請求URI判斷當前訪問的是web應用中的哪一個web資源。sql
(6)檢查web應用的web.xml文件,若是根據路徑找到具體的servlet處理類的全路徑名交給該servlet處理,若是找不到就交給缺省servlet處理。數據庫
(7)這個過程當中瀏覽器只知道本身發出來http請求,不久就收到了http響應,瀏覽器不知道也不關心服務器內部是如何處理的。瀏覽器和服務器之間的關係是很是單純的,只有HTTP協議。編程
(8)解析請求、封裝RequestResponse對象、建立Servlet、調用Service方法都是服務器自動進行的,開發人員只須要寫好Servlet配置進容器中便可,無需操心具體的底層實現。設計模式
答案:瀏覽器
(1)Servlet第一次被訪問到時建立對象,建立出來後當即執行init方法執行初始化的操做。
(2)今後之後該對象一直駐留在內存中爲後續的對這個Servlet的請求進行服務。
(3)直到服務器關閉或web應用移除出容器時,隨着web應用的銷燬Servlet對象銷燬掉,在銷燬以前調用destory方法執行善後工做。
(4)在存活期間,每次對Servlet 的調用都會致使Service方法的執行。
答案:
HTTP協議就是一套基於tcp/ip協議的應用層協議 。簡單來講,就是一個基於應用層的通訊規範,雙方要進行通訊,你們都要遵照一個規範,這個規範就是HTTP協議。它規定了客戶端(一般是瀏覽器)和服務器之間的通訊方式。
答案:
HTTP協議基於請求響應模型。
一次請求對應一次響應。
首先客戶端發送一個請求(request)給服務器,服務器在接收到這個請求後將生成一個響應(response)返回給客戶端。
答案:
(1) 它是一個無狀態的協議,服務器端在處理相應請求後不會保留任何客戶端的信息,每次請求都是獨立的
(2) 客戶端與服務器端的每一次數據交互,都要通過一次請求/響應的過程。
(3) 服務器端沒法識別可以出發客戶端請求的方法。
(4) 一個典型的HTTP請求分爲 一個請求行 若干請求頭 一個空行 實體內容。
答案:
(1) get請求用來從服務器上得到資源,而post是用來向服務器提交數據;
(2) get將表單中數據按照name=value的形式,添加到action 所指向的URL 後面,而且二者使用"?"鏈接,而各個變量之間使用"&"鏈接;post是將表單中的數據放在HTTP協議的請求頭或消息體中,傳遞到action所指向URL;
(3) get傳輸的數據要受到URL長度限制(1024字節);而post能夠傳輸大量的數據, POST數據是沒有限制的,上傳文件一般要使用post方式;
(4) 使用get時參數會顯示在地址欄上,若是這些數據不是敏感數據,那麼可使用get;對於敏感數據仍是應用使用post;
(5) get使用MIME類型application/x-www-form-urlencoded的URL編碼(也叫百分號編碼)文本的格式傳遞參數,保證被傳送的參數由遵循規範的文本組成,例如一個空格的編碼是"%20"。
(6) Jsp頁面中的FORM標籤裏的method屬性爲get時調用doGet(),爲post時調用doPost()。
答案:
瀏覽器用什麼碼錶來打開表單頁面就用什麼編碼來發送數據。當前咱們的註冊頁面指定了用utf-8來打開。
這就決定了瀏覽器是用utf-8打開的頁面,瀏覽器在提交表單時是用utf-8編碼的。
而tomcat默認狀況下會使用iso8859-1來進行解碼。
咱們知道全世界的碼錶都兼容iso8859-1,因此英文處理是沒有問題的。
可是iso8859-1中並無中文,iso8859-1對於沒法處理的字節都使用?替代,因此咱們看到的都是?。
答案:
因爲客戶端發送時使用的是utf-8編碼而服務器用iso8859-1解碼形成了亂碼,雖然字符已經亂掉了,但底層的字節仍然是正確的,咱們只要將亂碼字符getBytes(「iso8859-1」)轉換爲字節,就是正確的字節,再將這些字節new String(bytes,「utf-8」)按照正確的碼錶編碼,就能夠轉換回正確的字符了。從而解決了亂碼。
答案:
request對象的生命週期是針對一個客戶端(一個瀏覽器應用程序)的一次請求,當請求完畢以後,request裏邊的內容也將被釋放,一個請求開始時建立,請求結束後銷燬。
答案:
經過response.setHeader("Content-Type", "text/html;charset=utf-8")方法,通知服務器發送數據時的碼錶;經過response.setCharacterEncoding("utf-8")方法,通知瀏覽器解析時使用的碼錶。兩碼相同就不會有亂碼了。
response提供了setContentType("text/html;charset=UTF-8")快捷方法,在它的底層,會同時作上面兩件事,因此能夠一行代碼解決response產生的亂碼問題。
答案:
ServletContext對象表明當前web應用。當服務器啓動時,服務器在啓動時會依次加載web應用,每個web應用加載完成後都會建立一個ServletContext對象惟一表明該web應用,這個對象一直存活,直到web應用移除出容器或服務器關閉時,隨着應用銷燬,ServletContext對象跟着銷燬。
答案:
轉發是服務器內部資源跳轉,重定向是經過302+Location實現瀏覽器跳轉訪問。
轉發一次請求一次響應,重定向兩次請求兩次響應。
轉發地址欄不發生變化,重定向地址欄會發生變化。
轉發以前和轉發以後request是一個,重定向以前和以後不是一個request。
答案:
當程序第一次調用到request.getSession()代碼時,服務器明確的知道了須要用到session了,此時建立session。
若是session超過30分鐘(能夠在web.xml中配置的)沒人使用,服務器認爲這個session超時了,銷燬session。
明確的調用session.invalidate(),session當即銷燬。
服務器被非正常關閉或web應用被移除出容器,此時隨着web應用的銷燬session銷燬.若是是正常關閉,session會被鈍化.當下次服務器正常啓動時,沒有超時的session還會被活化回來。
答案:
session的原理:在服務器第一次調用request.getSession()方法的時候,會在內存中建立一個session對象,此對象具備一個獨一無二的id值,此id值將會以cookie(JSESSIONID)的形式發送給瀏覽器,瀏覽器之後每次訪問都會帶着此cookie,服務器就利用此cookie區分瀏覽器找到對應的session空間。
答案:
cookie數據存放在客戶的瀏覽器上,session數據放在服務器上
cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙,考慮到安全應當使用session
session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能,考慮到減輕服務器性能方面,應當使用COOKIE
答案:
其實這個問題在上面已經闡述過了,Servlet是一個特殊的Java程序,它運行於服務器的JVM中,可以依靠服務器的支持向瀏覽器提供顯示內容。JSP本質上是Servlet的一種簡易形式,JSP會被服務器處理成一個相似於Servlet的Java程序,能夠簡化頁面內容的生成。Servlet和JSP最主要的不一樣點在於,Servlet的應用邏輯是在Java文件中,而且徹底從表示層中的HTML分離開來。而JSP的狀況是Java和HTML能夠組合成一個擴展名爲.jsp的文件。有人說,Servlet就是在Java中寫HTML,而JSP就是在HTML中寫Java代碼,固然這個說法是很片面且不夠準確的。JSP側重於視圖,Servlet更側重於控制邏輯。
答案:
1:request: 請求對象 在javax.servlet.ServletRequest 做用域爲Request來自客服端的請求,如:FORM表單中填寫的信息,經常使用的方法有getParameter,getParamterName 和getParamterValue經過表用獲取請求對象中包含的參數值。
2:response表示客服端的響應。
3:pageContext對象爲頁面的上下文對象,表明當請運行頁面的一些屬性。
4:session:對象代碼服務器與客服端所創建的會話,好比在寫購物,客服軌跡跟蹤,
session」是創建在cookie的基礎之上的。經常使用方法有getId,getValues等。
5:application對象負責提供應用程序在服務端運行時的一些全局信息,方法有getMimeType等。
6:out:與response不一樣,經過out對象發送的內容是瀏覽器須要的顯示內容,還能夠直接想客服端編寫一個有程序動態生成的HTML的文件。
7:page:page裏的變量無法從index.jsp傳遞到test.jsp。只要頁面跳轉了,就不見了。
8: exception:他是一個列外的對象,當頁面發生了列外,就會會建立該對象。
9:config:是在servlet初始化Servlet的時候,JSP引擎向他傳遞信息用的,此消息包括Servlet初始化時所須要的參數。
答案:
SQL注入:就是經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來講,它是利用現有應用程序,將(惡意)的SQL命令注入到後臺數據庫引擎執行的能力,它能夠經過在Web表單中輸入(惡意)SQL語句獲得一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。
防止的方法:
(1) 永遠不要信任用戶的輸入,要對用戶的輸入進行校驗,能夠經過正則表達式,或限制長度,對單引號和雙"-"進行轉換等。
(2) 永遠不要使用動態拼裝SQL,可使用參數化的SQL或者直接使用存儲過程進行數據查詢存取。
(3) 永遠不要使用管理員權限的數據庫鏈接,爲每一個應用使用單獨的權限有限的數據庫鏈接。
(4) 不要把機密信息明文存放,請加密或者hash掉密碼和敏感的信息。
(5) 應用的異常信息應該給出儘量少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝,把異常信息存放在獨立的表中。
答案:
(1)查詢時,能不用* 就不用,儘可能寫全字段名。
(2)索引不是越多越好,每一個表控制在6個索引之內。範圍where條件的狀況下,索引不起做用,好比where value<100
(3)大部分狀況鏈接效率遠大於子查詢,可是有例外。當你對鏈接查詢的效率都感到不能接受的時候能夠試試用子查詢,雖然大部分狀況下你會更失望,但總有碰到驚喜的時候不是麼...
(4)多用explain 和 profile分析查詢語句
(5)有時候能夠1條大的SQL能夠分紅幾個小SQL順序執行,分了吧,速度會快不少。
(6)每隔一段時間用alter table table_name engine=innodb;優化表
(7)鏈接時注意:小表 jion 大表的原則
(8)學會用explain 和 profile判斷是什麼緣由使你的SQL慢
(9)查看慢查詢日誌,找出執行時間長的SQL進行優化
(10)儘可能避免使用order by
(11)由於where子句後面的條件是執行順序是從右到左,因此儘可能把能過濾掉大部分數據的條件放在最後
答案:
init爲初始化方法,在Filter對象被建立出來時,Servlet容器會調用該方法對filter進行初始化。
destory爲銷燬的方法,在過濾器對象被銷燬以前,服務器會調用這個方法執行善後工做。
doFilter爲過濾器中最核心的方法,對訪問的請求和響應進行攔截,當過濾器攔截到對資源的訪問時,服務器會自動調用該方法執行過濾代碼。 咱們只須要在這個方法中設計過濾器的邏輯代碼便可。
答案:
當服務器啓動,web應用加載後,當即建立出這個web應用中的全部過濾器對象,建立出來後當即調用過濾器的init方法執行初始化操做.今後這些過濾器對象駐留在內存中爲後續的攔截進行服務.每當攔截到資源時,都會致使dofilter方法執行.最終直到服務器關閉或web應用移除出容器時,隨着web應用的銷燬,過濾器對象銷燬,銷燬以前調用destory方法執行善後工做。
答案:
對於共享資源,有一個很著名的設計模式:資源池(resource pool)。該模式正是爲了解決資源的頻繁分配﹑釋放所形成的問題。爲解決上述問題,能夠採用數據庫鏈接池技術。數據庫鏈接池的基本思想就是爲數據庫鏈接創建一個「緩衝池」。預先在緩衝池中放入必定數量的鏈接,當須要創建數據庫鏈接時,只需從「緩衝池」中取出一個,使用完畢以後再放回去。咱們能夠經過設定鏈接池最大鏈接數來防止系統無盡的與數據庫鏈接。更爲重要的是咱們能夠經過鏈接池的管理機制監視數據庫的鏈接的數量﹑使用狀況,爲系統開發﹑測試及性能調整提供依據。
答案:
思路以下:
1:利用class實現DataSource接口
2:在class的構造器一次性建立指定的連接將連接保存LinkedList中
3:實現getConnection從LinkedList返回一個連接
4:提供將連接放回方法
Public class MyDataSource inplements DataSource{ Private LinkedList<Connection> dataSource=new LinkedList<>(); Public MyDataSource(){ for(int a=0;a<1000;a++){ Try{ DriverManager.registerDriver(new SQLServerDriver()); Connection con=DriverManager.getConnection(「jdbc:sqlserver://localhost:1443;DatabaseName=liming」,」root」,」liming」 }catch(Exception e){ } } Public Connection getConnetion(){ Final Connection conn=dataSource.removeFirst(); } Public void releasConnection(Connection conn){ dataSource.add(conn); } } }
答案:
HTTP協議傳輸的數據都是未加密的,也就是明文的,所以使用HTTP協議傳輸隱私信息很是不安全,爲了保證這些隱私數據能加密傳輸,因而網景公司設計了SSL(Secure Sockets Layer)協議用於對HTTP協議傳輸的數據進行加密,從而就誕生了HTTPS。簡單來講,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全。
答案:
Servlet是一個供其餘java程序調用的類,它不能獨立運行,針對客戶端的屢次請求,一般情況下,Servlet只會建立一個Servlet實例對象,一旦建立它就會駐留在內存中,爲後續的請求提供服務,直至退出web應用爲止,也就是當咱們關閉了瀏覽器以後咱們的Servlet就終止了。
當Servlet第一次訪問的時候,就被加載到內存中,之後該實例對各個請求服務,沒次狀況會調用一次service方法。
這樣會出現什麼問題:由於Servlet是單例的,因此會出現線程安全問題
答案:
若是說str是null,那麼內存根本沒建立字符串對像,並由str引用。不能調用object的方法。
若是說str是空串,那麼確實存在一個由str引用的字符串對像,只不過這個字符串的值是""。長度爲0;
在獲取請求參數的時候爲何要這樣判斷呢?
if(null==str || "".equals(str)){ return "不合法參數"; }
若是咱們在表單中什麼都不填 接收到的字符串就是null;
若是咱們在表單中填「」,接受到的字符串是「」,可是存入數據庫後,查詢出來的就是null;
答案:
Servlet自己是單實例的,這樣當有多個用戶同時訪問某個Servlet時,會訪問該惟一的Servlet實例中的成員變量,若是對成員變量進行寫入操做,那就會致使Servlet的多線程問題,即數據不一致。
1.解決Servlet多線程同步問題的最好方式:去除實例變量,使用局部變量。
不使用成員變量,而使用局部變量,由於局部變量在每一個線程中都有各自的實例。
因此對Servlet來講,若是要對某個變量作寫入操做,必定不要使用成員變量,而要使用局部變量。
2.使用同步代碼塊
synchronized{}
3.Servlet實現javax.serlvet.SingleThreadModel,Servlet2.4中已經廢棄了該接口,此時Servlet容器將保證Servlet實例以單線程方式運行,也就是說,同一時刻,只會有一個線程執行Servlet的service()方法。
答案:
a、request.getParameter()獲取的類型是String; request.getAttribute()獲取的類型是Object b、request.getPrameter()獲取的是POST/GET傳遞的參數值和URL中的參數; request.getAttribute()獲取的是對象容器中的數據值/對象 c、request.setAttribute()和request.getAttribute()能夠發送、接收對象; request.getParamter()只能接收字符串,官方不開放request.setParamter()(也就是沒有這個方法) setAttribute()和getAttribute()的傳參原理: setAttribute()是應用服務器把這個對象放在該頁面所對應的一塊內存中去,當你的頁面服務器重定向到另一個頁面時, 應用服務器會把這塊內存拷貝到另外一個頁面所對應的那塊內存中。這個就能夠經過getAttribute()獲取到相應的參數值或者對象。
答案:
a、靜態include:語法:<%@ include file="文件名" %>,至關於複製,編輯時將對應的文件包含進來,當內容變化時,不會再一次對其編譯,不易維護。
b、動態include:語法:<jsp:include page="文件名">,可以自動檢查被包含文件,當客戶端對JSP文件進行請求時,會從新將對應的文件包含進來,進行實時的更新。
答案:
基於java的web應用系統採用MVC設計模型,即用Model(模型)、View(視圖)和Controller(控制)分離設計,這是目前web應用服務系統的主流設置方向。
Model:處理業務邏輯的模塊。
View:負責頁面顯示,顯示Model的處理結果給用戶,主要實現數據到頁面的轉換過程。
Controller:負責每一個請求的分發,把Form數據傳遞給Model進行處理,處理完成後,把處理結果返回給相應的View顯示給用戶。
答案:
功能:
a、從四個域對象中取出數據數據顯示。
b、取出請求參數數據顯示。
緣由:
在頁面中用jsp腳本和jsp表達式來獲取數據顯示比較麻煩
a、須要判斷
b、可能須要強轉
答案:
使用session技術:
a、在regist.jsp頁面中生成一個爲一個隨機值,將其保存到session中,同時將其保存爲表單的隱藏域的值。
b、在處理註冊的請求時,獲取session中的值,獲取請求參數的值,比較二者是否相同,若是相同說明不是重複提交,請求經過同時刪除session中保存的的值,若是不相同則是重複提交,不能經過。
答案:
給處於其中的應用程序組件(JSP、Servlet)提供一個環境,是JSP、Servlet直接跟容器中的變量交互,沒必要關注其餘系統問題。
主要有web服務器來實現。例如:tomcat、weblogic、sphere、JBoss等。該容器提供的接口嚴格遵照J2EE規範中的web application標準。
咱們把遵照以上標準的web服務器叫作J2EE的web容器。
答案:
Java中一共有23中設計模式:
Factory(工廠模式)、Builder(建造模式)、Factory Method(工廠方法模式)、ProtoType(原始模型模式)、Singleton(單例模式)、
Facade(門面模式)、Adapter(適配器模式)、Bridge(橋樑模式)、Composite(合成模式)、Decorator(裝飾模式)、
FlyWeight(享元模式)、Proxy(代理模式)、Command(命令模式)、Interpreter(解釋器模式)、Visitor(訪問者模式)、
Iterator(迭代子模式)、Mediator(調停者模式)、Memento(備忘錄模式)、Observer(觀察者模式)、State(狀態模式)、
Strategy(策略模式)、Template Method(模板方法模式)、Chain Of Responsibility(責任鏈模式)、
工廠模式:工廠模式是一種常常被使用到的模式,根據工廠模式實現的類能夠根據提供的數據生成一組類中某個類的實例,一般一組類中有一個公共的抽象父類而且實現了相同的方法,可是這些方法針對不一樣的數據進行了不一樣的操做。首先須要定義一個基類,該類的子類經過不一樣的方法實現了基類中的方法。而後定義一個工廠類,工廠類能夠根據條件生成不一樣的子類實例。當獲得子類的實例後,開發人員能夠調用基類中的方法而沒必要考慮到底返回的是哪個子類的實例。
答案:
事務是做爲一個邏輯單元執行的一系列操做,一個邏輯工做單元必須有四個屬性,稱爲ACID(原子性、一致性、隔離性和持久性)屬性,
只有這樣才能成爲一個事務:
原子性:事務必須是原子工做單元,對於其數據修改,要麼全都執行,要麼全都不執行。
一致性:事務在完成時,必須使全部的數據保持一致的狀態。在相關數據庫中,全部規則都必須應用於事務的修改,以保持全部數據的完整性。事務結束時,全部的內部數據結構(如B樹索引或雙向鏈表)都必須是正確的。
隔離性:由併發事務所作的修改必須與任何其餘併發事務所作的修改隔離。事務查看數據時數據所處的狀態,要麼是另外一併發事務修改它以前
的狀態,要麼是另外一併發事務修改它以後的狀態,事務不會查看中間狀態的數據。這稱爲可串行性,由於它可以從新裝載起始數據,而且重播
一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。
持久性:事務完成後,它對於系統的影響是永久性的。該修改即便出現系統故障也將一直保持。
答案:
一、Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生
二、Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。
三、Read committed (讀已提交):可避免髒讀的發生。
四、Read uncommitted (讀未提交):最低級別,任何狀況都沒法保證
答案:
屬於部署描述符,在整個JAVA中只要是容器都會存在部署描述符,此部署描述符能夠控制整個WEB中各個組件的運行狀態,也能夠配置整個窗口的狀態
答案:
三範式:
第一範式(確保每列保持原子性)最基本範式。數據庫表中全部字段值都是不可分解的原子值,就知足了第一範式。
第二範式(確保表中的每列都和主鍵相關)在第一範式上更近一層。確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關,也就是說一個表中只能保存一種數據,不能夠吧多種數據保存在一張表中。
第三範式:確保每列都和主鍵列直接相關,不是間接相關。
索引:
避免對索引字段進行計算、避免索引在字段上使用not、<>、!=、避免在索引上使用IS NULL和NOT NULL、避免在索引列上出現數據類型轉換、避免索引字段使用函數、避免創建索引的列出現空值
答案:
Ajax的工做原理至關於在用戶和服務器之間加了—箇中間層,使用戶操做與服務器響應異步化。並非全部的用戶請求都提交給服務器,像—些數據驗證和數據處理等都交給Ajax引擎本身來作, 只有肯定須要從服務器讀取新數據時再由Ajax引擎代爲向服務器提交請求。
Ajax其核心只有JavaScript、XMLHTTPRequest和DOM,在舊的交互方式中,由用戶觸發一個HTTP請求到服務器,服務器對其進行處理後再返回一個新的HTHL頁到客戶端, 每當服務器處理客戶端提交的請求時,客戶都只能空閒等待,而且哪怕只是一次很小的交互、只需從服務器端獲得很簡單的一個數據,都要返回一個完整的HTML頁,而用戶每次都要浪費時間和帶寬去從新讀取整個頁面。而使用Ajax後用戶從感受上幾乎全部的操做都會很快響應沒有頁面重載(白屏)的等待。
答案:
答案:
SQL注入是一種將SQL代碼添加到輸入參數中,傳遞到服務器解析並執行的一種攻擊手法。
SQL注入攻擊是輸入參數未通過濾,而後直接拼接到SQL語句當中解析,執行達到預想以外的一種行爲,稱之爲SQL注入攻擊。
答案:
利用新對象PreparedStatement對象完成,先將SQL骨架發送給數據庫服務器,而後再將參數單獨發給服務器,並將參數中的關鍵字當作一個普通字符串來處理,進而起到防止SQL注入的問題
答案:
用來提升程序的效率,建立一個容器,容器中存放已經獲取到了的數據庫鏈接對象,對外提供獲取鏈接和還回鏈接的方法,外界須要時就從容器中獲取,用完就還回容器中。
答案:
XML是可擴展標記語言,而HTML超文本標記語言。不一樣之處:
一、語法有所不一樣。XML語法比較嚴謹而HTML語法比較鬆散。
二、用途不一樣。XML主要用於數據格式化存儲而HTML主要用於網頁的編輯。
答案:
簡單來講: == 表明相同, ===表明嚴格相同, 爲啥這麼說呢,
這麼理解: 當進行雙等號比較時候: 先檢查兩個操做數數據類型,若是相同, 則進行===比較, 若是不一樣, 則願意爲你進行一次類型轉換, 轉換成相同類型後再進行比較, 而===比較時, 若是類型不一樣,直接就是false.
答案:
1. SELECT子句中避免使用‘*’
2. SQL語句用大寫的
3. 用IN來替換OR
4. 查詢語句中不要使用 *
5. 儘可能減小子查詢,使用關聯查詢(left join,right join,inner join)替代
6. 減小使用IN或者NOT IN ,使用exists,not exists或者關聯查詢語句替代
7. or 的查詢儘可能用 union或者union all 代替
8. 合理的增長冗餘的字段(減小表的聯接查詢)
9. 增長中間表進行優化(這個主要是在統計報表的場景,
答案:
1.內存優化:Tomcat依賴於JVM,能夠配置JVM的內存配置
2.最大鏈接數配置(併發能力)
一般搭配Nginx提高Tomcat的併發性能
答案:
自動刷新不只能夠實現一段時間以後自動跳轉到另外一個頁面,還能夠實現一段時間以後自動刷新本頁面。Servlet中經過HttpServletResponse對象設置Header屬性實現自動刷新例如:
Response.setHeader("Refresh","1000;URL=http://localhost:8080/servlet/example.htm");
其中1000爲時間,單位爲毫秒。URL指定就是要跳轉的頁面(若是設置本身的路徑,就會實現沒過一秒自動刷新本頁面一次)
答案:
1. C/S用戶固定,而且處於相同區域,要求擁有相同的操做系統。B/S要有操做系統和瀏覽器就行。與操做系統平臺無關。
2. C/S客戶端的計算機電腦配置要求較高。B/S客戶端的計算機電腦配置要求較低。
3. C/S每個客戶端都必須安裝和配置軟件,客戶端沒必要安裝,使用瀏覽器訪問,易推廣。B/S最大的優勢就是能夠在任何地方進行操做而不用安裝任何專門的軟件。
4. C/S每個客戶端都要升級程序。能夠採用自動升級。BS客戶端沒必要安裝及維護。
5. C/S通常面向相對固定的用戶羣,程序更加註重流程,它能夠對權限進行多層次校驗,提供了更安全的存取模式,對信息安全的控制能力很強。通常高度機密的信息系統採用C/S結構適宜。
事務的特性:ACID
A - 原子性 Atomic
數據操做的最小單元是事務,而不是SQL語句
C - 一致性 Consistency
轉帳前 a+b = 100
轉賬後 a+b = 100
I - 隔離性 Isolation
一個事物進行中時,另外一事物不能操做數據
D - 持久性 Durancy
事務沒有提交以前,數據操做只保存在日誌文件中
提交事務以後,數據持久生效
答案:
HTML(Hypertext Markup Language)文本標記語言,它是靜態頁面,和JavaScript同樣解釋性語言,爲何說是解釋性語言呢?由於,只要你有一個瀏覽器那麼它就能夠正常顯示出來,而不須要指定的編譯工具,只需在TXT文檔中寫上HTML標記就OK。
JSP(Java Server Page)看這個意思就知道是Java服務端的頁面,因此它是動態的,它是須要通過JDK編譯後把內容發給客戶端去顯示,咱們都知道,Java文件編譯後會產生一個class文件,最終執行的就是這個class文件,JSP也同樣,它也要編譯成class文件!JSP不止要編譯,它還得要轉譯,首先把JSP轉譯成一個Servlet文件,而後在編譯成class文件。當用戶訪問JSP時就執行了class文件,最 終......
1.最簡單的區別就是,HTML能直接打開,jsp只能發佈到Tomact等服務器上才能打開
2.定義上HTML頁面是靜態頁面能夠直接運行,JSP頁面是動態頁它運行時須要轉換成servlet
3.他們的表頭不一樣,這個是JSP的頭「 <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>」在表頭中有編碼格式和導入包等
4.也是很好區分的在jsp中用<%%>就能夠寫Java代碼了,而html沒有<%%>
答案:
不一樣: Html是靜態,servlet是動態 html頁面由服務器直接返回, servlet是用來處理客戶請求,並返回html頁面 ,Servlet須要服務器調用servlet方法生成動態html頁面,且須要在web.xml中配置url路徑
答案:
一、Request是客戶端向服務端發送請求
二、Response是服務端對客戶端請求作出響應
三、Session在servlet中不能直接使用,須要經過getSession()建立,若是沒有設定它的生命週期,或者經過invildate()方法銷燬,關閉瀏覽器session就會消失
四、Application不能直接建立,存在於服務器的內存中,由服務器建立和銷燬
答案:
一、Request能夠經過getAttribute()方法直接取值,也可經過getParameter()取值
二、Session須要經過request.getSession().getAttribute()才能取值
三、Request是針對一次請求,Session是針對整個會話
四、在頁面經過contentType,pageEncoding,content設置編碼格式,必需要一致
答案:
動態導入
是行爲元素、是在請求處理階段引入的,引入執行頁面或servlet所生成的應答文本
先編譯,後包含,就是將每一個jsp頁面都單獨轉化成html頁面,最後再將全部的html頁面相加,若是有相同變量不會衝突
<%@ include file="" %> 靜態導入
是指令元素,是編譯時包含,引入靜態文本(html,jsp),在JSP頁面被轉化成servlet以前和它融和到一塊兒。先包含,後編譯
答案:
Spring:輕量級框架
做用:Bean工廠,用來管理Bean的生命週期和框架集成。
兩大核心:
一、IOC/DI(控制反轉/依賴注入) :把dao依賴注入到service層,service層反轉給action層,Spring頂層容器爲BeanFactory。
二、AOP:面向切面編程
答案:
開啓事務註解驅動
事務管理器
開啓註解功能,並配置掃描包
配置數據庫
配置SQL會話工廠,別名,映射文件
不用編寫Dao層的實現類
答案:
工廠模式:每一個Bean的建立經過方法
單例模式:默認的每一個Bean的做用域都是單例
代理模式:關於Aop的實現經過代理模式
答案:
入口不一樣:
Struts2:filter過濾器
SpringMvc:一個Servlet即前端控制器
開發方式不一樣:
Struts2:基於類開發,傳遞參數經過類的屬性,只能設置爲多例
SpringMvc:基於方法開發(一個url對應一個方法),請求參數傳遞到方法形參,能夠爲單例也能夠爲多例(建議單例)
請求方式不一樣:
Struts2:值棧村塾請求和響應的數據,經過OGNL存取數據
SpringMvc:經過參數解析器將request請求內容解析,給方法形參賦值,將數據和視圖封裝成ModelAndView對象,最後又將ModelAndView中的模型數據經過request域傳輸到頁面,jsp視圖解析器默認使用的是jstl。
答案:
把Sql語句從Java中獨立出來。
封裝了底層的JDBC,API的調用,而且可以將結果集自動轉換成JavaBean對象,簡化了Java數據庫編程的重複工做。
本身編寫Sql語句,更加的靈活。
入參無需用對象封裝(或者map封裝),使用@Param註解
ending...