81、以下哪句是對索引的錯誤描述(C)
A.選擇性差的索引只會降低 DML 語句的執(zhí)行速度
B.選擇性強的索引只有被 Access Path 使用到才是有用的索引
C.過多的索引只會阻礙性能的提升,而不是加速性能
D.在適當?shù)臅r候將最常用的列放在復合索引的最前面
E.索引和表的數(shù)據(jù)都存儲在同一個 Segment 中
A.當一個事務在表上防止了共享鎖(shared lock),其他事務,能閱讀表里的數(shù)據(jù)
B.當一個事務在表上防止了共享鎖(shared lock),其他事務,能更新表里的數(shù)據(jù)
C.當一個事務在表上防止了排他鎖(exclusive lock),其他事務,能閱讀表里的數(shù)據(jù)
D.當一個事務在表上防止了排他鎖(exclusive lock),其他事務,能更新表里的數(shù)據(jù)
A.缺乏索引,特別是在列上使用了函數(shù),如果要利用索引,則需要使用函數(shù)索引。
B.當訪問的數(shù)據(jù)占整個表中的大部分數(shù)據(jù)時。
C.如果時一個表的 high water mark 數(shù)據(jù)塊數(shù)少于初始化參數(shù) DB_FILE_MULTIBLOCK_READ_COUNT。
D.本次查詢可以用到該張表的一個引用,但是該表具有多個索引包含用于過濾的字段。
1
1.5
1.5
攔截器:是指通過統(tǒng)一攔截從瀏覽器發(fā)往服務器的請求來完成功能的增強。使用場景:解決請求的共性問題(亂碼問題、權限驗證問題)。
過濾器:Servlet中的過濾器Filter是實現(xiàn)了javax.servlet.Filter接口的服務器端程序,主要的用途是過濾字符編碼、做一些業(yè)務邏輯判斷等。其工作原理是只要你在web.xml文件配置好要攔截的客戶端請求,它都會幫你攔截到請求,此時你就可以對請求或響應(Request、Response)統(tǒng)一設置編碼,簡化操作;同時還可進行邏輯判斷,如用戶是否已經登錄、有沒有權限訪問該頁面等等工作。它是隨你的web應用啟動而啟動的,只初始化一次,以后就可以攔截相關請求,只有當你的web應用停止或重新部署的時候才銷毀。
監(jiān)聽器:現(xiàn)在來說說 Servlet 的監(jiān)聽器 Listener,其中有一個監(jiān)聽器是監(jiān)聽上下文的,它實現(xiàn)了javax.servlet.ServletContextListener接口,它也是隨web應用的啟動而啟動,只初始化一次,隨web應用的停止而銷毀。主要作用是:做一些初始化的內容、設置一些基本的內容、比如一些參數(shù)或者是一些固定的對象等等。
每一個ThreadLocal能夠放一個線程級別的變量,可是它本身能夠被多個線程共享使用,并且又能夠達到線程安全的目的,且絕對線程安全。
ThreadLocal的應用場景:最常見的ThreadLocal使用場景為用來解決數(shù)據(jù)庫連接、Session 管理等
在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務,采用三次握手建立一個連接。
● 第一次握手:建立連接時,客戶端發(fā)送 syn 包(syn=j)到服務器,并進入 SYN_SEND 狀態(tài), 等待服務器確認; SYN:同步序列編號(Synchronize Sequence Numbers)。
● 第二次握手:服務器收到 syn 包,必須確認客戶的 SYN(ack=j+1),同時自己也發(fā)送一個 SYN 包(syn=k),即SYN+ACK 包,此時服務器進入 SYN_RECV 狀態(tài)。
● 第三次握手:客戶端收到服務器的 SYN+ACK 包,向服務器發(fā)送確認包 ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務器進入 ESTABLISHED 狀態(tài),完成三次握手。完成三次握手,客戶端與服務器開始傳送數(shù)據(jù)
是線程安全的,request、response 以及 requestContext 在使用時不需要進行同步。而根據(jù) spring的默認規(guī)則,controller對于BeanFactory而言是單例的。即controller只有一個, controller 中的request等實例對象也只有一個。
● compile: 編譯依賴范圍(默認),對其三種都有效。
● test: 測試依賴范圍,只對測試 classpath 有效。
● runtime: 運行依賴范圍,只對測試和運行有效,編譯主代碼無效,例如 JDBC。
● provided: 已提供依賴范圍,只對編譯和測試有效,運行時無效,例如 selvet-api。
● system: 系統(tǒng)依賴范圍.謹慎使用.例如本地的,maven 倉庫之外的類庫文件。
● import(maven2.0.9 以上): 導入依賴范圍,不會對其他三種有影響。
Mybatis使用#{}經過預編譯的,是安全的,防止sql 注入。
Mybatis攔截器只能攔截四種類型的接口:Executor、StatementHandler、ParameterHandler和ResultSetHandler。這是在Mybatis的Configuration中寫死了的,如果要支持攔截其他接口就需要我們重寫Mybatis的Configuration。
Mybatis可以對這四個接口中所有的方法進行攔截。
Mybatis攔截器常常會被用來進行分頁處理。
91、簡單解釋自動裝配的各種模式,或者叫裝配方式
在Spring框架中共有5種自動裝配:
● no:這是 Spring 框架的默認設置,在該設置下自動裝配是關閉的,開發(fā)者需要自行在bean定義中用標簽明確的設置依賴關系。
● byName:該選項可以根據(jù)bean名稱設置依賴關系。當向一個bean中自動裝配一個屬性時,容器將根據(jù)bean的名稱自動在在配置文件中查詢一個匹配的bean。如果找到的話,就裝配這個屬性,如果沒找到的話就報錯。
● byType:該選項可以根據(jù)bean類型設置依賴關系。當向一個bean中自動裝配一個屬性時,容器將根據(jù)bean的類型自動在在配置文件中查詢一個匹配的 bean。如果找到的話,就裝配這個屬性,如果沒找到的話就報錯。
● constructor:造器的自動裝配和 byType 模式類似,但是僅僅適用于與有構造器相同參數(shù) 的bean,如果在容器中沒有找到與構造器參數(shù)類型一致的bean,那么將會拋出異常。
● autodetect:該模式自動探測使用構造器自動裝配或者 byType 自動裝配。首先,首先會嘗試找合適的帶參數(shù)的構造器,如果找到的話就是用構造器自動裝配,如果在bean內部沒有找到相應的構造器或者是無參構造器,容器就會自動選擇byTpe的自動裝配方式。
MVC是Model-View-Controller的簡寫。Model代表的是應用的業(yè)務邏輯(通過 JavaBean,EJB組件實現(xiàn)),View 是應用的表示面(由JSP頁面產生),Controller是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現(xiàn)。這些組件可以進行交互和重用。
● 逆向代碼,例如反編譯
● 與注解相結合的框架,例如Retrofit
● 單純的反射機制應用框架,例如EventBus 2.x
● 動態(tài)生成類框架,例如Gson
class Buy {
public static void main(String[] args) {
int n = 50;
int i = 0;
while (true) {
n -= 3;
n++;
if (n < 3) {
System.out.println("共喝了" + (50 + i) + "瓶");
break;
}
}
}
}
95、根據(jù)某年某月某日,輸出這是一年中第幾天。
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("請輸入3個整數(shù),分別表示年月日:");
int year = in.nextInt();
int month = in.nextInt();
int day = in.nextInt();
int sum = 0;
int[][] a = {
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
for (int i = 0; i < month - 1; i++) {
if (year % 4 == 0 & year % 100 != 0 | year % 400 == 0)
sum = sum + a[1][i];
else
sum = sum + a[0][i];
}
sum = sum + day;
System.out.println(year + "年" + month + "月" + day + "是這一年的第" + sum + "天");
}
96、利潤與獎金,某公司銷售 10 萬元到 20 萬元的獎金 10%,在 20 萬元的獎金 10 萬元以上的獎金 7.5%,到 40 萬元超出 20 萬元的部分獎金為 5%,到 60 萬元的超出 40 萬元的部分獎金 3%,到 100 萬元的超出 60 萬元部分獎金 1%,請輸出說的獎金。
public class Test {
public static void main(String[] args) {
float money = 0;
Scanner scan = new Scanner(System.in);
System.out.print("請輸入利潤:");
float num = scan.nextInt();
if (num <= 100000) {
money = (float) (num * 0.1);
} else if (num <= 200000) {
money = (float) ((num - 100000) * 0.075 + 100000 * 0.1);
} else if (num <= 400000) {
money = (float) ((num - 200000) * 0.5 + 100000 * 0.175);
} else if (num <= 600000) {
money = (float) ((num - 400000) * 0.3 + 100000 * 0.175 + 200000 * 0.5);
} else if (num <= 1000000) {
money = (float) ((num - 600000) * 0.015 + 100000 * 0.175 + 200000 * 0.5 + 200000 * 0.3);
} else {
money = (float) ((num - 1000000) * 0.01 + 100000 * 0.175 + 200000 * 0.5 + 200000 * 0.3 + 400000 * 0.015);
}
System.out.println("獎金:" + money);
}
}
97、除了懶漢式和餓漢式你還了解那些單例模式?
//雙重檢查鎖模式
public class DoubleCheckLock {
private static DoubleCheckLock instance = null;
private DoubleCheckLock() {
}
public static DoubleCheckLock getInstance() {
if (instance == null) {
synchronized (DoubleCheckLock.class) {
if (instance == null) {
instance = new DoubleCheckLock();
}
}
}
return instance;
}
}
//靜態(tài)內部類方式
public class StaticInner {
private static StaticInner instance;
public static StaticInner getInstance() {
return SingletonHolder.STATIC_INNER;
}
private static class SingletonHolder {
private static final StaticInner STATIC_INNER = new StaticInner();
}
}
98、簡述SSH的概念以及主要的設計思想?
SSH是Struts+Spring+Hibernate的一個集成框架,是目前比較流行的一種Web應用程序開源框架。
集成SSH框架的系統(tǒng)從職責上分為四層:表示層、業(yè)務邏輯層、數(shù)據(jù)持久層和域模塊層,以幫助開發(fā)人員在短期內搭建結構清晰、可復用性好、維護方便的 Web 應用程序。
其中使用Struts作為系統(tǒng)的整體基礎架構,負責MVC的分離,在Struts框架的模型部分,控制業(yè)務跳轉,利用Hibernate框架對持久層提供支持,Spring做管理,管理Struts和Hibernate。
具體做法是:用面向對象的分析方法根據(jù)需求提出一些模型,將這些模型實現(xiàn)為基本的 Java對象,然后編寫基本的DAO(Data Access Objects)接口,并給出 Hibernate的DAO實現(xiàn),采用Hibernate架構實現(xiàn)的DAO類來實現(xiàn)Java類與數(shù)據(jù)庫之間的轉換和訪問,最后由Spring 做管理。
要讓程序在后臺執(zhí)行,只需在命令行的最后加上“&”符號。例如:$ find . -name abc -print&
rm –i: 交互模式刪除文件,刪除文件前給出提示。
rm -r:遞歸處理,將指定目錄下的所有文件與子目錄一并處理。
悲觀鎖(Pessimistic Lock),顧名思義,就是很悲觀,每次去拿數(shù)據(jù)的時候都認為別人會修改,所以每次在拿數(shù)據(jù)的時候都會上鎖,這樣別人想拿這個數(shù)據(jù)就會block直到它拿到鎖。傳統(tǒng)的關系型數(shù)據(jù)庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。它指的是對數(shù)據(jù)被外界(包括本系統(tǒng)當前的其他事務,以及來自外部系統(tǒng)的事務處理)修改持保守態(tài)度,因此,在整個數(shù)據(jù)處理過程中,將數(shù)據(jù)處于鎖定狀態(tài)。悲觀鎖的實現(xiàn),往往依靠數(shù)據(jù)庫提供的鎖機制(也只有數(shù)據(jù)庫層提供的鎖機制才能真正保證數(shù)據(jù)訪問的排他性,否則,即使在本系統(tǒng)中實現(xiàn)了加鎖機制,也無法保證外部系統(tǒng)不會修改數(shù)據(jù))。
樂觀鎖(Optimistic Lock),顧名思義,就是很樂觀,每次去拿數(shù)據(jù)的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù),可以使用版本號等機制。樂觀鎖適用于多讀的應用類型,這樣可以提高吞吐量,像數(shù)據(jù)庫如果提供類似于write_condition機制的其實都是提供的樂觀鎖。
兩種鎖各有優(yōu)缺點,不可認為一種好于另一種,像樂觀鎖適用于寫比較少的情況下,即沖突真的很少發(fā)生的時候,這樣可以省去了鎖的開銷,加大了系統(tǒng)的整個吞吐量。但如果經常產生沖突,上層應用會不斷的進行retry,這樣反倒是降低了性能,所以這種情況下用悲觀鎖就比較合適。
答案:%t 輸出產生該日志事件的線程名。
擴展:%M 是輸出方法的名字、%m 是輸出代碼指定的日志信息。指定的打印信息的具體格式 ConversionPattern,具體參數(shù):
● %m輸出代碼中指定的消息
● %p輸出優(yōu)先級,即 DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL
● %r輸出自應用啟動到輸出該 log 信息耗費的毫秒數(shù)
● %c輸出所屬的類目,通常就是所在類的全名
● %t輸出產生該日志事件的線程名
● %n輸出一個回車換行符,Windows 平臺為"rn”,Unix 平臺為"n”
● %d 輸出日志時間點的日期或時間,默認格式為 ISO8601,也可以在其后指定格式,比如:%d{yyyy MM dd HH:mm:ss,SSS}
● %l輸出日志事件的發(fā)生位置,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)
● %x輸出和當前線程相關聯(lián)的 NDC(嵌套診斷環(huán)境),尤其用到像 java servlets 這樣的多客戶多線程的應用中。
● %%輸出一個”%”字符
● %F輸出日志消息產生時所在的文件名稱
● %M輸出執(zhí)行方法
● %L輸出代碼中的行號
出現(xiàn)NotWritablePropertyException異常的原因一般是在ApplicationContext.xml中 property name的錯誤等相關問題。
A. WEB-INF目錄存在于web應用的根目錄下
B. WEB-INF目錄與classes目錄平行
C. web.xml在WEB-INF目錄下
D. Web應用程序可以打包為war文件
A. Servlet 的生命周期由 Servlet 實例控制
B. init()方法在創(chuàng)建完 Servlet 實例后對其進行初始化,傳遞的參數(shù)為實現(xiàn) ServletContext 接口的對象
C. service()方法響應客戶端發(fā)出的請求
D. destroy()方法釋放Servlet實例
A. Cookie是Web服務器發(fā)送給客戶端的一小段信息,客戶端請求時,可以讀取該信息發(fā)送到服務器端
B. 關閉瀏覽器意味著會話 ID 丟失,但所有與原會話關聯(lián)的會話數(shù)據(jù)仍保留在服務器上,直至會話過期
C. 在禁用 Cookie 時可以使用 URL 重寫技術跟蹤會話
D. 隱藏表單域將字段添加到 HTML 表單并在客戶端瀏覽器中顯示
A.
<init-param>
<param-name>MAX</param-name>
<param-value>100</param-value>
</init-param>
B.
<context-param>
<param name="MAX" value="100" />
<context-param>
C.
<context>
<param name="MAX" value="100" />
<context>
D.
<context-param>
<param-name>MAX</param-name>
<param-value>100</param-value>
<context-param>
A. session. getAttribute (“userid”);
B. session. setAttribute (“userid”);
C. request. getParameter (“userid”);
D. request. getAttribute (“userid”);
<html>
<body>
<%
for(int i = 0; i < 10; i++) {
//1
}
%>
</body>
</html>
A. <%= i %>
B. <b>i</b>
C. %><%= i %><%
D. 不寫任何內容
● test1.jsp:
<HTML>
<BODY>
<% pageContext.setAttribute(“ten”,new Integer(10));%>
//1
</BODY>
</HTML>
● test2.jsp:
數(shù)字為:<%= pageContext.getAttribute(”ten”)%>
以下(C)放置在 test1.jsp 中的//1 處,當請求 test1.jsp 時正確輸出 test2.jsp 中的內容。
A. <jsp:include page=”test2.jsp” />
B. <jsp:forword page=”test2.jsp” />
C. <%@ include file=”test2.jsp” %>
D. pageContext對象的scope屬性為page,所以test2.jsp不能訪問 test1.jsp定義的屬性
A. 隱式對象是 WEB 容器加載的一組類的實例,可以直接在 JSP 頁面使用
B. 不能通過config對象獲取 ServletContext 對象
C. response對象通過sendRedirect方法實現(xiàn)重定向
D. 只有在出錯處理頁面才有 exception 對象
解釋:jsp 的九大內置對象分別是:config、request、response、out、page、pageContext、session、exception、application。其中exception 是特殊的內置對象,只有當在 jsp 中添加 isErrorPage="true"屬性時如下配置時才可以使用。該屬性一般出現(xiàn)在設定的錯誤界面。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" isErrorPage="true" %>
112、???????考慮下面 JSP 文件代碼片斷:
<HTML>
<BODY>
<jsp:include page=”test2.jsp”>
<jsp:param name=”username” value=”zhangsan”/>
</jsp:include>
</BODY>
</HTML>
以下(C)代碼片斷放置在 test2.jsp 中不會導致錯誤。
A. <jsp:getParam name=”username”/>
B. <jsp:include param =”username”/>
C. <%=request.getParameter(“username”)%>
D. <%=request.getAttribute(“username”)%>
解釋:<jsp:include page=”test2.jsp”>屬于動態(tài)調用test2.jsp界面,相當于動態(tài)去請求test2.jsp 所生成的Servlet,在請求的同時攜帶了請求參數(shù)“username”,我們知道在Servlet中獲取請求攜帶的參數(shù)就是通過request.getParameter(key)來獲取的,因此C正確。
<%@ page isELIgnored="false"%>
<html>
<body>
<FORM action="login.jsp" method="GET">
<input type="text" name="name" value="${param['name']}">
<input type="submit" value="提交">
</FORM>
<P>
用戶名為: ${param.name}
</body>
</html>