Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
礎知識,servlet是什么?
官方解釋:Servlet 是運行在 Web 服務器或應用服務器上的程序,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 服務器上的數據庫或應用程序之間的中間層
簡單來說,servlet是運行在web服務器如tomcat,jetty這樣應用服務器上的一段程序,他可以響應http協(xié)議的請求,并且實現用戶自己的邏輯,最終將結果返回到用戶的客戶端(瀏覽器)
Java Servlet 通常情況下與使用 CGI(Common Gateway Interface,公共網關接口)實現的程序可以達到異曲同工的效果。但是相比于 CGI,Servlet 有以下幾點優(yōu)勢:
1、性能明顯更好。
2、Servlet 在 Web 服務器的地址空間內執(zhí)行。這樣它就沒有必要再創(chuàng)建一個單獨的進程來處理每個客戶端請求。
3、Servlet 是獨立于平臺的,因為它們是用 Java 編寫的。
4、服務器上的 Java 安全管理器執(zhí)行了一系列限制,以保護服務器計算機上的資源。因此,Servlet 是可信的。
5、Java 類庫的全部功能對 Servlet 來說都是可用的。它可以通過 sockets 和 RMI 機制與 applets、數據庫或其他軟件進行交互。
Servlet的生命周期
Servlet 生命周期可被定義為從創(chuàng)建直到毀滅的整個過程。以下是 Servlet 遵循的過程:
1、Servlet 通過調用 init () 方法進行初始化。
2、Servlet 調用 service() 方法來處理客戶端的請求。
3、Servlet 通過調用 destroy() 方法終止(結束)。
4、最后,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的
init() 方法
init 方法被設計成只調用一次。它在第一次創(chuàng)建 Servlet 時被調用,在后續(xù)每次用戶請求時不再調用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一樣。
Servlet 創(chuàng)建于用戶第一次調用對應于該 Servlet 的 URL 時,但是您也可以指定 Servlet 在服務器第一次啟動時被加載。
service() 方法
service() 方法是執(zhí)行實際任務的主要方法。Servlet 容器(即 Web 服務器)調用 service() 方法來處理來自客戶端(瀏覽器)的請求,并把格式化的響應寫回給客戶端。
每次服務器接收到一個 Servlet 請求時,服務器會產生一個新的線程并調用服務。service() 方法檢查 HTTP 請求類型(GET、POST、PUT、DELETE 等),并在適當的時候調用 doGet、doPost、doPut,doDelete 等方法。
destroy() 方法
destroy() 方法只會被調用一次,在 Servlet 生命周期結束時被調用。destroy() 方法可以讓您的 Servlet 關閉數據庫連接、停止后臺線程、把 Cookie 列表或點擊計數器寫入到磁盤,并執(zhí)行其他類似的清理活動。
在調用 destroy() 方法之后,servlet 對象被標記為垃圾回收。
JSP是什么?
JSP全稱Java Server Pages,是一種動態(tài)網頁開發(fā)技術。它使用JSP標簽在HTML網頁中插入Java代碼。標簽通常以<%開頭以%>結束。
JSP是一種Java servlet,主要用于實現Java web應用程序的用戶界面部分。網頁開發(fā)者們通過結合HTML代碼、XHTML代碼、XML元素以及嵌入JSP操作和命令來編寫JSP。
JSP通過網頁表單獲取用戶輸入數據、訪問數據庫及其他數據源,然后動態(tài)地創(chuàng)建網頁。
JSP標簽有多種功能,比如訪問數據庫、記錄用戶選擇信息、訪問JavaBeans組件等,還可以在不同的網頁中傳遞控制信息和共享信息。
servlet和jsp的區(qū)別
1、Servlet在Java代碼中可以通過HttpServletResponse對象動態(tài)輸出HTML內容。
2、JSP是在靜態(tài)HTML內容中嵌入Java代碼,然后Java代碼在被動態(tài)執(zhí)行后生成HTML內容。
servlet和jsp各自的特點
1、Servlet雖然能夠很好地組織業(yè)務邏輯代碼,但是在Java源文件中,因為是通過字符串拼接的方式生成動態(tài)HTML內容,這樣就容易導致代碼維護困難、可讀性差。
2、JSP雖然規(guī)避了Servlet在生成HTML內容方面的劣勢,但是在HTML中混入大量、復雜的業(yè)務邏輯。
MVC的誕生
JSP和Servlet都有自身的適用環(huán)境,那么有沒有什么辦法能夠讓它們發(fā)揮各自的優(yōu)勢呢?答案是肯有的,MVC模式就能夠完美解決這一問題。
MVC模式,是Model-View-Controller的簡稱,是軟件工程中的一種軟件架構模式,分為三個基本部分,分別是:模型(Model)、視圖(View)和控制器(Controller):
Controller——負責轉發(fā)請求,對請求進行處理
View——負責界面顯示
Model——業(yè)務功能編寫(例如算法實現)、數據庫設計以及數據存取操作實現
在JSP/Servlet開發(fā)的軟件系統(tǒng)中,這三個部分的描述如下所示:
MVC模型
1、Web瀏覽器發(fā)送HTTP請求到服務端,然后被Controller(Servlet)獲取并進行處理(例如參數解析、請求轉發(fā))
2、Controller(Servlet)調用核心業(yè)務邏輯——Model部分,獲得結果
3、Controller(Servlet)將邏輯處理結果交給View(JSP),動態(tài)輸出HTML內容
4、動態(tài)生成的HTML內容返回到瀏覽器顯示
MVC模式在Web開發(fā)中有很大的優(yōu)勢,它完美規(guī)避了JSP與Servlet各自的缺點,讓Servlet只負責業(yè)務邏輯部分,而不會生成HTML代碼;同時JSP中也不會充斥著大量的業(yè)務代碼,這樣大大提高了代碼的可讀性和可維護性。
相關面試題
如何讀取Servlet的初始化參數?
ServletConfig中定義了如下的方法用來讀取初始化參數的信息:
public String getInitParameter(String name)
參數:初始化參數的名稱。
返回:初始化參數的值,如果沒有配置,返回null。
init(ServletConfig)方法執(zhí)行次數
在Servlet的生命周期中,該方法執(zhí)行一次。
service()方法的職責
service()方法為Servlet的核心方法,客戶端的業(yè)務邏輯應該在該方法內執(zhí)行,典型的服務方法的開發(fā)流程為:
解析客戶端請求-〉執(zhí)行業(yè)務邏輯-〉輸出響應頁面到客戶端
get方式和post方式有何區(qū)別
數據攜帶上:
GET方式:在URL地址后附帶的參數是有限制的,其數據容量通常不能超過1K。
POST方式:可以在請求的實體內容中向服務器發(fā)送數據,傳送的數據量無限制。
請求參數的位置上:
GET方式:請求參數放在URL地址后面,以?的方式來進行拼接
POST方式:請求參數放在HTTP請求包中
用途上:
GET方式一般用來獲取數據
POST方式一般用來提交數據
原因:
首先是因為GET方式攜帶的數據量比較小,無法帶過去很大的數量
POST方式提交的參數后臺更加容易解析(使用POST方式提交的中文數據,后臺也更加容易解決)
GET方式比POST方式要快
Servlet相關 API
HttpServletRequest:封裝了與請求相關的信息
HttpServletResponse:封裝了與響應相關的信息
獲取頁面的元素的值有幾種方式,分別說一下
request.getParameter() 返回客戶端的請求參數的值
request.getParameterNames() 返回所有可用屬性名的枚舉
request.getParameterValues() 返回包含參數的所有值的數組
request.getAttribute()和request.getParameter()區(qū)別
用途上:
request.getAttribute(), 一般用于獲取request域對象的數據(在跳轉之前把數據使用setAttribute來放到request對象上)
request.getParameter(), 一般用于獲取客戶端提交的參數
存儲數據上:
request.getAttribute()可以獲取Objcet對象
request.getParameter()只能獲取字符串(這也是為什么它一般用于獲取客戶端提交的參數)
forward和redirect的區(qū)別
實際發(fā)生位置不同,地址欄不同
轉發(fā)是發(fā)生在服務器的
轉發(fā)是由服務器進行跳轉的,細心的朋友會發(fā)現,在轉發(fā)的時候,瀏覽器的地址欄是沒有發(fā)生變化的,在我訪問Servlet111的時候,即使跳轉到了Servlet222的頁面,瀏覽器的地址還是Servlet111的。也就是說瀏覽器是不知道該跳轉的動作,轉發(fā)是對瀏覽器透明的。通過上面的轉發(fā)時序圖我們也可以發(fā)現,實現轉發(fā)只是一次的http請求,一次轉發(fā)中request和response對象都是同一個。這也解釋了,為什么可以使用request作為域對象進行Servlet之間的通訊。
重定向是發(fā)生在瀏覽器的
重定向是由瀏覽器進行跳轉的,進行重定向跳轉的時候,瀏覽器的地址會發(fā)生變化的。曾經介紹過:實現重定向的原理是由response的狀態(tài)碼和Location頭組合而實現的。這是由瀏覽器進行的頁面跳轉實現重定向會發(fā)出兩個http請求,**request域對象是無效的,因為它不是同一個request對象
用法不同:
很多人都搞不清楚轉發(fā)和重定向的時候,資源地址究竟怎么寫。有的時候要把應用名寫上,有的時候不用把應用名寫上。很容易把人搞暈。記住一個原則: 給服務器用的直接從資源名開始寫,給瀏覽器用的要把應用名寫上
request.getRequestDispatcher("/資源名 URI").forward(request,response)
轉發(fā)時"/"代表的是本應用程序的根目錄【zhongfucheng】
response.send("/web應用/資源名 URI");
重定向時"/"代表的是webapps目錄
能夠去往的URL的范圍不一樣:
轉發(fā)是服務器跳轉只能去往當前web應用的資源
重定向是服務器跳轉,可以去往任何的資源
傳遞數據的類型不同
轉發(fā)的request對象可以傳遞各種類型的數據,包括對象
重定向只能傳遞字符串
跳轉的時間不同
轉發(fā)時:執(zhí)行到跳轉語句時就會立刻跳轉
重定向:整個頁面執(zhí)行完之后才執(zhí)行跳轉
典型的應用場景:
轉發(fā): 訪問 Servlet 處理業(yè)務邏輯,然后 forward 到 jsp 顯示處理結果,瀏覽器里 URL 不變
重定向: 提交表單,處理成功后 redirect 到另一個 jsp,防止表單重復提交,瀏覽器里 URL 變了
SP
JSP:Java Server Page SUN 公司提供的動態(tài)網頁編程技術,是 Java Web 服務器端的動態(tài)資源。
它相比 html 而言,html 只能為用戶提供靜態(tài)數據,而 Jsp 技術允許在頁面中嵌套 java 代碼,為用戶提供動態(tài)數據。
相比 servlet 而言,servlet 很難對數據進行排版,而 jsp 除了可以用 java 代碼產生動態(tài)數據的同時,也很容易對數據進行排版。
不管是 JSP 還是 Servlet,雖然都可以用于開發(fā)動態(tài) web 資源。但由于這 2 門技術各自的特點,在長期的軟件實踐中,人們逐漸把 servlet 作為 web 應用中的控制器組件來使用, 而把 JSP 技術作為數據顯示模板來使用。
其實 Jsp 就是一個 Servlet,當我們第一次訪問 Jsp 的時候,Jsp 引擎都會將這個 Jsp 翻譯 成一個 Servlet,這個文件存放在tomcat(源碼目錄) 中的 work 目錄中。
這一步不是必須的,當然由于 編輯器中有些默認的配置項我們覺得不是很完美,比如"編碼格式"、頁面模板等。我們可以在新建 JSP 頁面之前就先修改為我們需要的。
1.選擇"File" —> "Settings..."
2.設置編碼格式。搜索"encode",選擇"File Encoding"
[
3.設置頁面模板。搜索"template",選擇"File and Code Templates",選擇右側的"Other",選擇下方的"Jsp File"
在 JSP 中支持兩種注釋的語法操作:
一種是顯示注釋,這種注釋是允許客戶端看見的; 另一種是隱式注釋,此種注釋是客戶端無法看見的
① 顯示注釋語法:從 HTML 風格繼承而來
② 隱式注釋語法:從 JAVA 風格繼承;JSP 自己的注釋
JSP 的三種注釋方式:
1) // 注釋,單行注釋 /* 多行注釋*/
?
2)<!-- HTML風格的注釋 -->
?
3)<%-- JSP注釋 --%>
在 JSP 中最重要的部分就是 Scriptlet(腳本小程序),所有嵌入在 HTML 代碼中的 Java 程序。
在 JSP 中一共有三種 Scriptlet 代碼:都必須使用 Scriptlet 標記出來
第一種:<% %>: java 腳本段,可以定義局部變量、編寫語句
?
第二種:<%! %>:聲明,可以定義全局(成員)變量、方法、類
?
第三種:<%= %>:表達式,數據一個變量或具體內容
通過觀察解析為 java 文件的 jsp 代碼理解三種小腳本
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Scriptlet</title>
</head>
<body>
<%
String str = "Hello JSP";
System.out.println(str);
response.getWriter().write(str);
%>
<%!
String memberStr = "a member String";
%>
<%=memberStr%>
<h1>This is a JSP page!!</h1>
</body>
</html>
使用包含操作,可以將一些重復的代碼包含進來繼續(xù)使用,從正常的頁面組成來看,有時可能分為幾個區(qū)域。而其中的一些區(qū)域可能是一直不需要改變的,改變的就其中的一個具體內容區(qū)域。現在有兩種方法可以實現上述功能。
方法一:在每個 JSP 頁面(HTML)都包含工具欄、頭部信息、尾部信息、具體內容
方法二:將工具欄、頭部信息、尾部信息都分成各個獨立的文件,使用的時候直接導入
很明顯,第二種方法比第一種更好,第一種會存在很多重復的代碼,并且修改很不方便,在 JSP 中如果要想實現包含的操作,有兩種做法:靜態(tài)包含、動態(tài)包含,靜態(tài)包含使用 include 指令即可,動態(tài)包含則需要使用 include 動作標簽。
<%@ include file="要包含的文件路徑" %> <!-- 相對路徑 -->
例如:
<%@include file="include.jsp" %>
或
<%@include file="include.html" %>
靜態(tài)包含就是將內容進行了直接的替換,就好比程序中定義的變量一樣,是在 servlet 引擎轉譯時,就把此文件內容包含了進去(兩個文件的源代碼整合到一起, 全部放到_jspService 方法中),所以只生成了一個 servlet,所以兩個頁面不能有同名的變量。 運行效率高一點點。耦合性較高,不夠靈活。
動態(tài)包含在代碼的編譯階段,包含和被包含部分是兩個獨立的部分,只有當運行時,才會動態(tài)包含進來,好比方法的調用。
<jsp:include page="include.jsp"></jsp:include>
注意:動態(tài)包含,中間不要加任何內容,包括空格,除非確認要使用參數,否則報錯!
<jsp:include page="include.html"></jsp:include>
<%
String a = "hello.jsp";
%>
<jsp:include page="<%=a %>"></jsp:include>
使用動態(tài)包含還可以通過在頁面之間傳參。
接收參數通過 request.getParameter(name);
<jsp:include page="hello.jsp" flush="true">
<jsp:param name="uname" value="zhangsan"/>
</jsp:include>
hello.jsp
<!-- 接收參數 -->
<%=request.getParameter("uname")%>
在JSP中提供了四種屬性的保存范圍,所謂的屬性保存范圍,指的就是一個設置的對象,可以再多少個頁面中保存并可以繼續(xù)使用
方法類型描述public void setAttribute(String name, Object o)普通設置屬性的名稱及內容public Object getAttribute(String name)普通根據屬性名稱取屬性public void removeAttribute(String name)普通刪除指定的屬性
本頁面取得,服務器端跳轉(<jsp :forward>)后無效
問:使用哪個范圍呢?
答:在合理范圍盡可能小
EL(Expression Language) 是為了使 JSP 寫起來更加簡單。表達式語言的靈感來自于 ECMAScript 和 XPath 表達式語言,它提供了在 JSP 中簡化表達式的方法,讓 Jsp 的代碼更加簡化。
語法結構非常簡單: ${expression}
EL 表達式一般操作的都是域對象中的數據,操作不了局部變量。
域對象的概念在 JSP 中一共有四個:pageContext, request, session, application;范圍依次是,本頁面,一次請求, 一次會話,整個應用程序。
當需要指定從某個特定的域對象中查找數據時可以使用四個域對象對應的空間對象,分別是:pageScope, requestScope, sessionScope, applicationScope。
而 EL 默認的查找方式為從小到大查找,找到即可。當域對象全找完了還未找到則返回空字符串""。
設置域對象中的數據
<%
pageContext.setAttribute("uname","zhangsan"); // page作用域
request.setAttribute("uname","lisi"); // request作用域
session.setAttribute("uname","wangwu"); // session作用域
application.setAttribute("uname","zaholiu"); // application
%>
獲取域對象的值
<%-- 獲取域對象中的數據:默認查找方式為從小到大,找到即止。若四個范圍都未找到,則返回空字符串。--%>
${uname} <!-- 輸出結果為:zhangsan -->
獲取指定域對象的值
${pageScope.uname} <!-- page作用域 -->
${requestScope.uname} <!-- request作用域 -->
${sessionScope.uname} <!-- session作用域 -->
${applicationScope.uname} <!-- application作用域 -->
獲取List
<%
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list", list);
%>
<%--
獲取List中指定下標的數據
${list[下標] }
獲取集合的長度
${list.size()}
注:
list代表的是存在域對象中的變量名(限域變量名)
--%>
${list[1] }
獲取Map
<%
Map map = new HashMap();
map.put("aaa", "111");
map.put("bbb", 2222);
map.put("ccc-a", 333);
request.setAttribute("map", map);
%>
<%--
獲取Map中指定值
${map["key"] } 或 ${map.key }
注:
map代表的是存在域對象中的變量名(限域變量名)
--%>
${map.aaa }
${map["bbb"]}
獲取JavaBean對象
User.java
public class User {
?
private Integer userId;
private String uname;
private String upwd;
?
public Integer getUserId() {
return userId;
}
?
public void setUserId(Integer userId) {
this.userId = userId;
}
?
public String getUname() {
return uname;
}
?
public void setUname(String uname) {
this.uname = uname;
}
?
public String getUpwd() {
return upwd;
}
?
public void setUpwd(String upwd) {
this.upwd = upwd;
}
}
<%
User user = new User();
user.setUserId(1);
user.setUname("zhangsan");
user.setUpwd("123456");
request.setAttribute("user",user);
%>
<%-- JavBean中的屬性字段需要提供get方法 --%>
${user} <%-- 獲取對象 --%>
${user.uname} <%--獲取對象中的屬性--%>
<%--
empty
判斷域對象是否為空。為空,返回true;不為空返回false;
${empty 限域變量名 }
判斷對象是否不為空。
${!empty 限域變量名 }
--%>
${empty uname}
${empty list}
${empty map}
${empty user}
<%
request.setAttribute("a", 10);
request.setAttribute("b", 2);
request.setAttribute("c", "aa");
request.setAttribute("d", "bb");
%>
等值判斷
<%--
比較兩個值是否相等,返回true或false
== 或 eq
--%>
${a == b }
${c == d }
${c eq d }
${a == 5 }
${c == 'aa' }
算術運算
<%--
加法: +
減法: -
乘法: *
除法: / 或 div
--%>
${a + b }
${a / b } 或 ${a div b }
大小比較
jsp靜態(tài)包含和動態(tài)包含的區(qū)別
jsp靜態(tài)包含和動態(tài)包含的區(qū)別
<jsp:include page=""/>
jsp有哪些內置對象?作用分別是什么?
jsp有哪些內置對象?作用分別是什么?
九個內置對象:
其中,request、response、session、application、config這五個對象和Servlet的API是一樣的。這5個對象我就不解釋了。
在JSP中,尤其重要的是pageContext對象。
pageContext是內置對象中最重要的一個對象,它代表著JSP頁面編譯后的內容(也就是JSP頁面的運行環(huán)境)!
pageContext對象
pageContext作為域對象
out對象:
page對象
內置對象page是HttpJasPage對象,其實page對象代表的就是當前JSP頁面,是當前JSP編譯后的Servlet類的對象。也就是說:page對象相當于普通java類的this
exception對象
jsp和servlet的區(qū)別、共同點、各自應用的范圍?
jsp和servlet的區(qū)別、共同點、各自應用的范圍?
屬性作用域范圍
屬性作用域范圍
應用場景:
寫出5種JSTL常用標簽
寫出5種JSTL常用標簽
<c:if>,<c:item>,<c:foreach>,<c:out>,<c:set>
寫一個自定義標簽要繼承什么類
寫一個自定義標簽要繼承什么類
我們可以有兩種方式來實現自定義標簽:
SimpleTagSupport類的執(zhí)行順序(原理):
總結
SimpleTagSupport,一般調用doTag方法或者實現SimpleTag接口
JSP是如何被執(zhí)行的?執(zhí)行效率比SERVLET低嗎?
JSP是如何被執(zhí)行的?執(zhí)行效率比SERVLET低嗎?
如何避免jsp頁面自動生成session對象?為什么要這么做?
如何避免jsp頁面自動生成session對象?為什么要這么做?
可以使用頁面指令顯式關掉,代碼如下:
<%@ page session="false" %>
jsp的缺點?
jsp的缺點?
說出Servlet和CGI的區(qū)別?
說出Servlet和CGI的區(qū)別?
簡述JSP的設計模式。
簡述JSP的設計模式。
在Web開發(fā)模式中,有兩個主要的開發(fā)結構,稱為模式一(Mode I)和模式二(Mode II)
首先我們來理清一些概念吧:
模式一指的就是在開發(fā)中將顯示層、控制層、數據層的操作統(tǒng)一交給JSP或者JavaBean來進行處理!
模式一有兩種情況:
完全使用JSP做開發(fā):
使用JSP+JavaBean做開發(fā):
Mode II 中所有的開發(fā)都是以Servlet為主體展開的,由Servlet接收所有的客戶端請求,然后根據請求調用相對應的JavaBean,并所有的顯示結果交給JSP完成!,也就是俗稱的MVC設計模式!
MVC設計模式:
總結
原文地址:https://dwz.cn/NhBjgHRk作者:Java3y
*請認真填寫需求信息,我們會在24小時內與您取得聯(lián)系。