- Servlet不支持HTML語法,生成網(wǎng)頁需要通過response輸出流輸出,導致生成頁面的代碼非常復雜.JSP支持HTML語法,生成HTML頁面比較簡單
- JSP和Servlet的區(qū)別和關(guān)系?
- JSP和Servle都是用來動態(tài)生成網(wǎng)頁的
- Servlet不支持HTML語法,生成網(wǎng)頁麻煩
- JSP支持HTML語法,生成網(wǎng)頁比較簡單
- JSP運行時會被翻譯成Servlet再執(zhí)行.所以JSP就是Servlet
jsp腳本元素
- JSP中的腳本元素
- 聲明
- 代碼 : <%! %>
- 作用 : 聲明的內(nèi)容會被翻譯成Servlet的成員變量, 方法和類 !
- 表達式
- 代碼 : <%= %>
- 作用 : 用于向頁面輸出內(nèi)容,等價于out.print(). 不能在內(nèi)容后面添加";"分號
- 代碼塊
- 代碼 : <% %>
- 作用 : 在其中書寫任意Java代碼.代碼塊可以和html嵌套使用
- 聲明
jsp注釋
-
jsp注釋:jsp的注釋只存在于jsp的源文件里面,在翻譯成servlet的時候就消失了
<%-- 這是jsp的注釋 --%>
- jsp中的java注釋:和java一樣不解釋
- html注釋:語法 :
- 不能阻止java代碼和jsp的運行
jsp指令
-
page指令
import:用來導入包的
contentType:相當于response.setContentType();jsp頁面相依的MIME類型
pageEncoding:設(shè)置的是保存時采用指定的字符編碼集
errorPage:指定當前的頁面發(fā)生錯誤的時候跳轉(zhuǎn)到指定的頁面
iserrorPage:設(shè)置某個頁面是錯誤頁面,設(shè)置為true以后,就可以通過exception過去錯誤信息
<%@ page contentType="text/html;charset=UTF-8" language="java" %> -
include指令(靜態(tài)包含)
file指定的是要包裹進來的文件,會生成一個java文件
<%@ include file="index.jsp" %> -
taglib指令
導入標簽庫
uri:命名空間,prefix:命名空間的名字
<%@ taglib url="" prefix="" %>
jsp內(nèi)置對象
-
request
類型:HttpServletRequest 請求對象
-
response
類型:HttpServletResponse 響應(yīng)對象
-
session
HttpSession 回話對象
-
application
ServletContext web應(yīng)用全局唯一對象
-
config
ServletConfig 初始化數(shù)據(jù)
-
page
Object 當前jsp生成的servlet對象
如果一定要使用,需要強制轉(zhuǎn)換成HttpServlet對象
Servlet有三種數(shù)據(jù)范圍:request,session,servletcontext ,JSP在serlvet三種數(shù)據(jù)范圍基礎(chǔ)上,新增了page數(shù)據(jù)范圍
-
pageContext
- PageContext 當前jsp上下文
-
可以向page范圍存取數(shù)據(jù)
- findAttribute方法會依次在page 、request 、session 、 application 四個數(shù)據(jù)范圍進行數(shù)據(jù)查找.如果找到了就不會往下查找
- 如果在EL表達式中直接使用 ${name}會調(diào)用findAttribute方法在四個范圍中依次查找數(shù)據(jù)
-
可以獲得其它八個隱含對象
- pageContext封裝八個隱含對象的作用:框架編寫,得到PageContext對象 相當于得到 JSP九個內(nèi)置對象
-
exception
Throwable 當頁面是一個錯誤頁面,可以獲取的對象
-
out
JspWriter 向輸出流輸出內(nèi)容
jsp動作標簽
-
jsp中6個動作標簽
<jsp:useBean>:用于在page范圍內(nèi)查找指定名稱的javaBean,如果找不到會創(chuàng)建一個User對象, 然后把這個對象賦值為zhangsan;
scope:定義那一個數(shù)據(jù)范圍獲取一個JavaBean;
class:全類名,包名+類名;
id:聲明的變量名;
<jsp:useBean id="zhangsan" class="com.luoluo.User" scope="page" /><jsp:setProperty>:用于在jsp頁面中設(shè)置一個JavaBean屬性 相當于調(diào)用了某屬性的get方法
name:聲明的變量的名字
value:屬性值
property:屬性名
<jsp:setProperty property="age" name="zhangsan" value="10" /><jsp:getproperty>:用于在jsp頁面中獲取一個JavaBean屬性 相當于調(diào)用了某屬性的set方法
<jsp:getproperty property="age" name="zhangsan"><jsp:include>等價于request.getRequestDispatcher().include() 動態(tài)包含
jsp:include和@include的區(qū)別
- @include是JSP指令,屬于靜態(tài)包含.在jsp翻譯為Servlet時完成包含動作,包含的內(nèi)容是目標頁面翻譯為Servlet時的源代碼,最終只會生成一個Servlet
- jsp:include是JSP標簽,屬于動態(tài)包含.在servlet執(zhí)行時完成包含動作,包含的內(nèi)容是目標jsp翻譯為Servlet生成的HTML頁面,每個被包含的JSP都會生成一個單獨的Servlet,所以最終會生成多個Servlet
<jsp:forward>等價于request.getRequestDispatcher.forward()
EL表達式
-
從數(shù)組中獲取數(shù)據(jù)
${arr[0]}
-
從集合中獲取數(shù)據(jù)
${list[0]}
-
從map集合中獲取數(shù)據(jù)
- ${map["key"]} 得的值是value
- ${map.key} 得的值是value
-
empty運算符
可以用來判斷一個對象是否為null,還可以判斷是否為空
${empty list} //當list為null或size為0的時候,得出的結(jié)果都是true
-
三元運算符
${list == null ? " ": " "}
EL內(nèi)置對象的使用
- 獲取四個數(shù)據(jù)范圍中的數(shù)據(jù)
- pageScope
- requestScope
- sessionScope
- applicationScope
- pageContext : 代表當前jsp上下文.通過該對象可以獲取當前應(yīng)用的路徑${pageContext.request.contextPath },等價于<%=request.getContextPath() %>
- ${param.name} 等價于 request.getParameter("name")
- ${paramValues.hobby} 等價于 request.getParameterValues("hobby")
- ${header.referer} 等價于 request.getHeader("referer")
- ${headerValues["Accept-Encoding"]} 等價于 request.getHeaders("Accept-Encoding")
- ${initParam.name} 等價于 getServletContext().getInitParamter("name")
- cookie隱含對象寫法
- ${cookie.address.value } : 等于從所有Cookie中找出name為address的Cookie,并將其中的值取出來JSTL標簽庫
核心標簽庫:
-
c:set
- 保存數(shù)據(jù)到四個數(shù)據(jù)范圍
<% session.setAttribute("address","shenzhen"); %> <!-- scope用于指定數(shù)據(jù)范圍 var:存數(shù)據(jù)的時候?qū)?yīng)的key vlaue:存數(shù)據(jù)的時候?qū)?yīng)的值--> <!-- 實現(xiàn)了和上面的一樣的效果,往session里面存值 --> <c:set scope="session" var="address" value="shenzhen" />- 修改四個數(shù)據(jù)范圍中已存在對象的屬性值
<% User user = new User(); user.setAge(16); pageContext.setAttribute("usr",user); %> <!-- target表示指定的對象 property:要修改的對象的屬性--> <c:set target="${usr}" property="age" value="10" />
-
c:if
- 取代頁面if條件判斷
<% int a= 8; %> <c:if test="${a>10}"> a是大于10的 </c:if> <!-- 如果是else的業(yè)務(wù)邏輯,就用not關(guān)鍵字,里面的條件要用()括起來 --> <!-- var就是把判斷語句的結(jié)果存到一個對象中,對象的名字就是var值,scope就是數(shù)據(jù)存儲的范圍 --> <c:if test="${not (a>10)}" var="result" scope="page"> a是小于10的 </c:if> <!-- 這樣就可以取出if里面存儲的值 --> ${result}
-
c:url
- 完成URL重寫
- 結(jié)合從c:param進行中文的編碼
<!-- context:當前應(yīng)用的路徑 下面的實例的路徑相當于去找 /JSP/jstl/if.jsp 文件 --> <c:url context="/JSP" scope="" value="/jstl/if.jsp" var="encodeURL"> <!-- 在客戶端禁用cookie的時候,可以重寫URL的資源的路徑,可以對中文進行轉(zhuǎn)譯 --> <c:param name="address">深圳</c:param> </c:url> <a href="encodeURL">這里會跳轉(zhuǎn)到上面的URL指定的路徑 </a>
-
c:foreach
- 遍歷數(shù)組和集合
<% pageContext.setAttribute("arr",new int[]{1,2,3}); %> <!-- items:指定要遍歷的對象 --> <!-- var:遍歷的每一個元素 --> <c:foreach items="${arr}" var="a"> ${a} </c:foreach>- 遍歷map
<% Map map = new HashMap(); map.put("a","aaa"); map.put("b","bbb"); map.put("c","ccc"); pageContext.setAttribute("map",map) %> <c:foreach items="${map}" var="m"> ${m.key}==>${m.value} </c:foreach>- foreach特殊的用法
<!-- 求1到100的和 --> <!--定義一個初始變量,初始值為0--> <c:set var="result" value="0" scope="page" /> <!--求和--> <!-- step:遞增的時候每遞增多少,默認值是1 --> <!-- varStatus:獲取當前迭代的狀態(tài) --> <c:foreach begin="1" end="100" var="current" > <c:set var="result" value="${result+current}" scope="page"></c:set> </c:foreach> <!--打印值--> ${result}
-
c:redirect
<!--context是項目名 value是文件路徑名--> <c:redirect context="/JSP" value="/demo1.jsp" ></c:redirect>