Hello,今天給各位童鞋們分享JavaWeb,趕緊拿出小本子記下來吧!
Java web
web編程基礎
服務器
請問JAVA應用服務器都有哪些?
從功能上看分為兩種:web應用服務器和java EE服務器
web服務器
Tomcat、Jetty、Orion、Resin、 Bejy Tiger、Geronimo、Jonas、Jrun
java EE 服務器
TongWeb 、BES Application Server 、 Apusic Application Server 、 IBM Websphere 、Sun Application Server 、Oracle 的 Oracle9i/AS 、Sun Java System Application Server 、Bea Weblogic 、JBoss、開源GlassFish。
JAVA 調試
請問在什么情況下會使用assert?
作用:用于檢查一個boolean表達式是否正確
如果一個程序要保證其正確性,就必須使此表達式的返回值為true,返回false,則此程序有誤
應用場景:通過在開發和測試中開啟,在軟件發布后是關閉的
tomcat
限流的幾種方法:計數器,滑動窗口、漏桶法、令牌桶
請問如何在鏈接里不輸入項目名稱的情況下啟動項目?
配置虛擬路徑
此處的WEB-INF可以直接粘貼tomcat中的webapps/root/WEB-INF
配置完以后重啟tomcat即可訪問到
JSP
請說明一下JSP中的靜態包含和動態包含的有哪些區別?
請求方式不同
? ?靜態包含頁面:<%@include file="static.jsp" %>
? ?動態包含頁面 <jsp:include page="dynamic.jsp"/>
編譯過程不同
靜態包含:包含頁面以及被(靜態)包含的頁面只能擁有一個head,body等,且遵循先包含再編譯,即只會生成一個class文件
動態包含:被(動態)包含的頁面遵循先編譯后包含,則會生成不同的.java文件
對于JSP文件首先會通過WEB服務器生成index_jsp.java(servlet文件)再經過編譯生成index.class文件
request
靜態包含:包含頁面不能向被包含的頁面傳參,因為兩個頁面會合成一個頁面進行編譯,就沒有了我們所謂再傳參的頁面,使用的是同一個request對象
動態包含:包含頁面能向被包含的頁面傳參,因為被包含的頁面是是執行到這個語句時才會加載的,且會生成不同的class文件,既然包含頁面可以向被包含的頁面傳參,那么兩個頁面的參數個數是不一樣的的,所以它們有各自的request對象,因此使用的是不同的request對象
注意事項
靜態包含:因為是先包含再編譯,因此頁面的 <%@page contentType=“text/html;charset=utf-8”%> 應該保持一致,否則包含整合以后的頁面會報錯,盡量不用出現一樣的語句否則會進行覆蓋
請談一談JSP有哪些內置對象?以及這些對象的作用分別是什么?
request:用戶對服務器的請求,通過post/get請求并傳遞參數
response:封裝服務器對客戶端的響應
session:會話對象,從第一個請求開始,到頁面的關閉結束,當刷新瀏覽器時,此對象不會發生變化,可以看作是一次全局的,不管哪個頁面都可訪問,多頁面共享
page:當前jsp頁面自身,相當于this,即對應的servlet類的對象
pageContext:當前頁面的上下文,可以獲取此頁面的內容
application:可以存放全局共享的變量,從服務器開啟一直到服務器關閉結束,可以看作是多客戶端共享的
exception:當前頁面發生異常時,會有此對象,<%@page isErrorPage=“true” %>,JSP中的exception對象才有效。
config:web的配置對象,取得再web.xml中的初始化參數
out:向客戶端輸出信息的流對象
請說明一下jsp有哪些動作? 這些動作的作用又分別是什么?
jsp:include:動態包含頁面
jsp:useBean:創建一個Bean對象
jsp:setproperty:給Bean對象中的屬性賦值
jsp:getProperty:獲取Bean對象屬性中的值
jsp:forward:請求轉發
jsp:plugin:根據瀏覽器的類型為Java插件生成OBJECT或EMBED標記
請簡要說明一下四種會話跟蹤技術分別是什么?
為什么要使用會話跟蹤技術?因為服務端和客戶端是通過http傳輸的,http是“無狀態”的,一次響應完之后會斷開,需要再次請求,因此需要判斷是否為同一用戶
重寫URL:其原理是將session的id信息重寫到url中
表單隱藏域:會話會將id添加到表單中,用戶不會看到,存在于源碼中
cookie:客戶請求時可以將信息發送給服務器
? cookie存在于客戶端,不是很安全,會被解析
? 每個cookie限制4kb,且數量為200之內
session:每個用戶都有各自的session
session存在于服務端,當創建一個session時,其id會隨著cookie傳送到用戶端,當每次用戶請求的時候會將sessionId傳送到服務端識別不同的用戶
當訪問量多的時候,使用session服務器的性能會下降
請簡要說明一下JSP和Servlet有哪些相同點和不同點?另外他們之間的聯系又是什么呢?
JSP
本質還是Servlet
可以實現html和Java相結合
JSP會被編譯成Servlet,Servlet再負責用戶的請求
Servlet
由web容器加載和管理
是Java應用程序
用于生成動態web內容
負責處理客戶端請求
其實Jsp本質上還是Servlet(index_jsp.java),只是相比較Servlet更加視圖化,而Servlet更偏向邏輯控制,其實顯示用戶請求以及響應的業務本質還是有Servlet實現的
EL
請說一下表達式語言(EL)的隱式對象以及該對象的作用
用于讀取jsp內置對象的(pageScope、requestScope、sessionScope、applicationScope)分別對應page、request、session、application對象
${requestScope.username}獲取request中的username
與輸入有關的(param、paramValues),可以獲得用戶請求的參數
${param.name}
與cookie有關的
${cookie.username.value}獲取cookie中username的值
讀取請求頭的數據header和headerValues
${header[“User-Agent”]}
讀取web.xml中的參數值initParam
用于獲取與其他用戶有關的頁面或者要求pageContext
${pageContext.request.contextPath} 獲取web application名稱
Request
請詳細說明一下Request對象的主要方法是什么?
getParameter():獲取前端傳來的參數
getAttribute(String name):返回name指定的屬性值
serAttribute(String name,Object o):設置name指定的屬性值
getCookies():獲取cookie
getSession():獲取session
getInputStream():獲取輸入流
JAVA對象
請說明一下JSP的內置對象以及該對象的使用方法。
page
request
getParameter():獲取前端傳來的參數
getAttribute(String name):返回name指定的屬性值
serAttribute(String name,Object o):設置name指定的屬性值
getCookies():獲取cookie
getSession():獲取session
getInputStream():獲取輸入流
foward:請求轉發
? 3.response
sendRedirect():重定向
addCookies():添加cookie
? 4.session
? 5.application
? 6.pageContext
? 7.config
? 8.exception
? 9.out
xml文件
請說明一下web.xml文件中可以配置哪些內容?
配置DispatcherServlet
<servlet>
? ?<servlet-name>dispatcher</servlet-name>
? ?<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
? ? ? ?<init-param>
? ? ? ? ? ?<param-name>contextConfigLocation</param-name>? ? ? ??
? ? ? ? ? ?<param-value>classpath:applicationContext.xml</param-value>? ??
? ? ? ?</init-param>? ??
? ? ? ?<load-on-startup>1</load-on-startup>
? ?</servlet>
? ?<servlet-mapping>
? ? ? ?<servlet-name>dispatcher</servlet-name>
? ? ? ?<url-pattern>/</url-pattern>
? ?</servlet-mapping><!--不過濾靜態資源? 相當于 <mvc:default-servlet-handler/> -->
? ?<servlet-mapping>
? ? ? ?<servlet-name>default</servlet-name>? ??
? ? ? ?<url-pattern>*.png</url-pattern>
? ?</servlet-mapping>
? 2.過濾器
<!--? ? 過濾亂碼-->? ??
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>? ? ? ??
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
? 3.session超時時間
<!--? ? session超時30分鐘-->? ??
<session-config>
? ? ? ? <session-timeout>30</session-timeout>
</session-config>
監聽器
請談談你對Javaweb開發中的監聽器的理解?
Javaweb中的監聽器主要針對于application、session、request三個對象
application
ServletContextListener:對Servlet上下文的創建和銷毀進行監聽
ServletContextAttributeListener:對Servlet上下文中的屬性的添加,刪除和修改進行監聽
session
HttpSessionListener:對Session的創建和銷毀進行監聽
HttpSessionAttributeListener:對Session中的屬性的添加,刪除和修改進行監聽
request
ServletRequestListener:對Request的創建和銷毀進行監聽
ServletRequestAttributeListener:對Request中的屬性的添加,刪除和修改進行監聽
過濾器
請問過濾器有哪些作用?以及過濾器的用法又是什么呢?
對請求和響應進行攔截,并且按照要求進行過濾,在發送給下一個過濾器或者servlet
過濾亂碼
對位登錄的請求進行過濾(控制訪問權限)
敏感字符過濾
補充
過濾器和攔截器的區別
過濾器依賴于servlet,攔截器不依賴于servlet
過濾器是回調函數,攔截器是通過Java的反射機制
過濾器只在容器初始化的時候init一次【幾乎對所有請求起作用】,而攔截器可以在action請求的生命周期中多次初始化【只對action請求起作用】
攔截器可以通過IOC容器獲取各個Bean,而過濾器不行,還可以將service注入,調用業務邏輯
觸發時機
過濾器是請求進入容器之后在請求進入servlet之前進行預處理,請求結束也是在servlet處理完之后在容器處理完之前
所以過濾器過濾的請求參數是doFilter(ServletRequest request, ServletResponse response, FilterChain chain),而不是HttpServletRequest,因為是在HttpServlet之前請求的
chain.doFilter(request, response);此方法是分水嶺在Servlet的doService()中
(prehandler()和afterCompletion()是攔截器中的方法)
prehandler()—>do.chain()—>afterCompletion() prehandler()–[可以操控Controller的ModelAndView內容]–>return ModelAndView
SpringMVC的機制是由同一個Servlet來分發請求給不同的Controller,其實這一步是在Servlet的service()方法中執行的
攔截器是spring容器的,是spring支持的
總結:攔截器功在對請求權限鑒定方面確實很有用處,在我所參與的這個項目之中,第三方的遠程調用每個請求都需要參與鑒定,所以這樣做非常方便,而且他是很獨立的邏輯,這樣做讓業務邏輯代碼很干凈。和框架的其他功能一樣,原理很簡單,使用起來也很簡單,大致看了下SpringMVC這一部分的源碼,其實還是比較容易理解的。
我們項目中僅僅用到了preHandle這個方法,而未用其他的,框架提供了一個已經實現了攔截器接口的適配器類HandlerInterceptorAdapter,繼承這個類然后重寫一下需要用到的方法就行了,可以少幾行代碼,這種方式Java中很多地方都有體現。
web編程進階(一)
初始化
請問使用Servlet如何獲取用戶配置的初始化參數以及服務器上下文參數?
重寫Servlet中的init(),getInitParameter()獲取初始化參數
getServletContext()獲取上下文對象,getInitParameter()獲取上下文參數
servlet
請問使用Servlet如何獲取用戶提交的查詢參數以及表單數據?
getParameter()
getParameterValues()
getParameterMap()
服務器收到用戶提交的表單數據,請問調用了以下方法中的哪一個方法?第一個是Servlet中的doGet()方法,第二個Servlet中的是doPost()方法
根據我們提交表單的method,如果是post,則會調用doPost(),如果是get,則會調用doGet()
請說明一下Servlet 3中的異步處理指的是什么?
因為在沒有異步處理的時候,當用戶端發送請求時,由servlet接受請求,經過對一些信息的預處理,開始調用接口執行業務邏輯,但此時的servlet是處于阻塞狀態的,導致在高并發的情況下,性能低下,如果此時有了異步請求,在servlet阻塞的時候,會有一個子線程去執行其他任務,會將結果信息返回或者發送給其他servlet,此時不會降低性能
說說Servlet接口中有哪些方法?
void init(ServletConfig var1) throws ServletException;
Servlet初始化
ServletConfig getServletConfig();
獲取Servlet的配置
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
service(),會調用doGet()和doPost()
String getServletInfo();
void destroy();
銷毀
補充
什么時候實例化Servlet:
Servlet只初始化一次,即所謂的單例模式
如果設置loan-on-startup為1,則是在web容器加載的時候實例化
如果沒有設置,則是在第一次請求servlet的時候實例化
闡述一下闡述Servlet和CGI的區別?
Servlet創建之后就不會銷毀,每次使用會調用Servlet的一個線程,且不會銷毀;但是CGI(公共網關接口)每次調用的是一個進程,而且調用完畢后會銷毀,導致開銷很大
在Servlet執行的過程中,一般實現哪幾個方法?
首先在容器加載時可能會創建Servlet對象或者第一次請求時,調用init();每次的請求【doPost、doGet】都會調用service(),當容器關閉時會銷毀servlet,調用destroy()。對于getServletConfig()會獲取Servlet的上下文或者返回ServletConfig對象;對于getServletInfo()會獲取一些信息,比如作者、版權…
請說出Servlet的生命周期是什么樣的?并且請分析一下Servlet和CGI的區別。
在第一次請求的時候調用init(),會將初始化的Servlet對象保存在內存中,在以后的每次請求中(doPost()、doGet())都會調用service(),當容器關閉時,會調用destroy(),當Servlet對象實例化時,其有關配置的初始化參數會保存在容器中,可以通過getServletConfig()獲取,對于getServletInfo()可以獲取有關作者,出版社等信息
對于Servlet而言,其只有創建一次,以后都會直接調用,但是對于CGI而言,每次請求都會創建一個,會不停的創建銷毀,開銷比較大
補充
為什么需要Servlet,因為傳統的方式web容器和客戶端之間只能以靜態頁面進行交互,因為兩者是通過Http協議進行信息的傳輸,想要使用動態頁面進行交互就要通過Servlet的支持,什么是Servlet,可以簡單的理解為是一種運行于服務端的程序,狹義的理解為是Servlet接口,廣義的理解為是實現Servlet接口的任何實現類,下面以圖的形式展現Servlet的作用
請回答一下servlet的生命周期是什么。servlet是否為單例以及原因是什么?
在第一次請求的時候調用init(),會將初始化的Servlet對象保存在內存中,在以后的每次請求中(doPost()、doGet())都會調用service(),當容器關閉時,會調用destroy(),當Servlet對象實例化時,其有關配置的初始化參數會保存在容器中,可以通過getServletConfig()獲取,對于getServletInfo()可以獲取有關作者,出版社等信息
是單例模式
因為servlet是在容器加載或者第一次請求的時候初始化,直到容器關閉時才會銷毀
請簡要說明一下forward與redirect區別,并且說一下你知道的狀態碼都有哪些?以及redirect的狀態碼又是多少?
forward:請求轉發,此時的地址欄不會改變,可以共享request里面的數據,效率高
redirect:重定向,此時的地址欄會發生改變,不能共享request里面的數據,效率低
200:正確
302:重定向
404:找不到資源
500:代碼錯誤
文件傳輸
請問如何在基于Java的Web項目中實現文件上傳和下載?
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html>??
<head>? ?
<title>$Title$</title>??
</head>??
<body>??
?<form method="post" action="uploadServlet" enctype="multipart/form-data">? ?
選擇文件: <input type="file" name="fileUp">? ??
<input type="submit" value="上傳">??
</form>? ${hint}?
</body>
</html>
@MultipartConfig@WebServlet("/uploadServlet")public class uploadServlet extends HttpServlet {? ??
@Override? ??
protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {? ? ? ??
Part picture = request.getPart("picture");? ? ? ??
if (picture != null && picture.getSubmittedFileName().length() > 0) {? ? ? ? ? ??
String realPath = request.getServletContext().getRealPath("/upload");? ? ? ? ? ?
picture.write(realPath + "/" + picture.getSubmittedFileName());? ? ? ? ? ?
request.setAttribute("hint", "success");? ? ? ??
}else {? ? ? ? ? ?
request.setAttribute("hint", "failure");? ? ? ? ? ? }? ? ? ?
request.getRequestDispatcher("index.jsp").forward(request, response);? ??
}
}
web編程進階(二)
對象
談一下,什么是DAO模式?
dao模式可以理解為底層模式,是持久層,是與數據庫進行交互的,可以通過sql語句對數據庫中的數據進行增刪查改
MVC
說一說,MVC的各個部分都有那些技術來實現?如何實現?
Model
是模型層,可以用來創建與數據庫有關的實體
View
視圖層,用來作為給客戶端顯示的頁面,同時也可以將從前端獲取的數據傳送到后端,進行處理
Controller
控制層,是用來作為與視圖層交互的,可以獲取前端傳來的數據交給service處理邏輯業務,同時也可以將要顯示在前端的數據傳輸給頁面
JSP標簽
談一談,使用標簽庫有什么好處?如何自定義JSP標簽?
可以在jsp頁面中使用Java語言
可以自定義jsp標簽
具有較好的可移植性,可重用性和可維護性
自定義JSP標簽
繼承TagSupport類,重寫doStartTag(),然后再編寫.tld對自定義標簽進行部署
JSTL
請說說你做過的項目中,使用過哪些JSTL標簽?
jsp <c:foreach> <c:if> <c:choose> <c:when> <c:otherwise>
web編程原理
HTTP請求
說說你對get和post請求,并且說說它們之間的區別?
post和get都可以向服務器提交數據,get是獲取數數據,post是提交數據
約定俗成:
get是將提交的數據通過追加在url中提交數據;post是通過body提交數據【只是約定說get通過url提交,post放在body中提交,并沒有硬性要求】
get的數據是暴露的,不安全;post的數據是安全的
get的提交數據大小有限制;post沒有限制
get提交數據只能是ASCII編碼;post可以是任何編碼類型
get可以緩存;post不會緩存
get速度快;post速度慢
補充
因為get是將自己提交的數據,追加在url中因此不需要使用content-type,但是對于post請求是將提交的數據放在了body中,因此需要通過請求頭content-type來通知服務器以什么語言來解析post中的body
常用的提交方式(content-type的值):
application/x-www-form-urlencoded
multipart/form-data
application/json
text/xml
請談一談,get和post的區別?
約定俗成:
get是將提交的數據通過追加在url中提交數據;post是通過body提交數據【只是約定說get通過url提交,post放在body中提交,并沒有硬性要求】
get的數據是暴露的,不安全;post的數據是安全的
get的提交數據大小有限制;post沒有限制
get提交數據只能是ASCII編碼;post可以是任何編碼類型
get可以緩存;post不會緩存
get速度快;post速度慢
重定向
請談談,轉發和重定向之間的區別?
次數
轉發:請求一次
重定向:請求兩次,通過發送狀態碼
url
轉發:不會發生變化
重定向:會發生變化
request有效
轉發:有效
重定向:無效
效率
轉發:高效
重定向:低效
web service
請你解釋一下,什么是Web Service?
就是一個可以提供一個接口給多個程序之間相互調用,實現其之間的通信,而且web Service并不關注你是使用何種語言的
請求類型
請你說明一下,如何設置請求的編碼以及響應內容的類型?
request.setCharacterEncoding(“utf-8”);
response.setContentType(“application/json”);
response.setHeader(String,String);
客戶端/服務器模式
請說明 BS與CS 的聯系,還有區別。
區別
1.硬件環境不同
C/S 一般建立在專用的網絡上
B/S 建立在廣域網之上的,一般只要有操作系統和瀏覽器就行
2.對安全要求不同
C/S 一般面向相對固定的用戶群, 對信息安全的控制能力很強. 一般高度機密的信息系統采用C/S 結構適宜.
可以通過B/S發布部分可公開信息。B/S 建立在廣域網之上, 對安全的控制能力相對弱, 可能面向不可知的用戶。
3.對程序架構不同
C/S 程序可以更加注重流程, 可以對權限多層次校驗, 對系統運行速度可以較少考慮.
B/S 對安全以及訪問速度的多重的考慮, 建立在需要更加優化的基礎之上. 比C/S有更高的要求 B/S結構的程序架構是發展的趨勢, 從MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持網絡的構件搭建的系統. SUN 和IBM推的JavaBean 構件技術等,使B/S更加成熟.
4.軟件重用不同
C/S 程序可以不可避免的整體性考慮, 構件的重用性不如在B/S要求下的構件的重用性好.
B/S 對的多重結構,要求構件相對獨立的功能. 能夠相對較好的重用.就入買來的餐桌可以再利用,而不是做在墻上的石頭桌子
5.系統維護不同
C/S 程序由于整體性, 必須整體考察, 處理出現的問題以及系統升級. 升級難. 可能是再做一個全新的系統
B/S 構件組成,方面構件個別的更換,實現系統的無縫升級. 系統維護開銷減到最小.用戶從網上自己下載安裝就可以實現升級.
6.處理問題不同
C/S 程序可以處理用戶面固定, 并且在相同區域, 安全要求高需求, 與操作系統相關. 應該都是相同的系統
B/S 建立在廣域網上, 面向不同的用戶群, 分散地域, 這是C/S無法作到的. 與操作系統平臺關系最小.
7.用戶接口不同
C/S 多是建立的Window平臺上,表現方法有限,對程序員普遍要求較高
B/S 建立在瀏覽器上, 有更加豐富和生動的表現方式與用戶交流. 并且大部分難度減低,減低開發成本.
8.信息流不同
C/S 程序一般是典型的中央集權的機械式處理, 交互性相對低
B/S 信息流向可變化, B-B B-C B-G等信息、流向的變化, 更像交易中心。
資源請求方式
請你說明,forward 和redirect的區別?
url
forward :不發生變化
redirect:發生變化
次數
forward :請求一次
redirect:請求兩次
效率
forward :較高
redirect:較低
request
forward :有效
redirect:失效
web訪問
請你說說,cookie 和 session的區別?
cookie是從服務端發出,保存在客戶端的;session是保存在服務端的
cookie是不安全的可以被解析
cookie不能超過4M,并且不能多于200個
session放在服務端,當數量過多會影響服務器的性能
好啦,今天的文章就到這里,希望能幫助到屏幕前迷茫的你們!