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
jsp是一種基于文本的程序,全名java server page,其特點(diǎn)是html和java程序共存。執(zhí)行時(shí)jsp會(huì)被運(yùn)行容器編譯,編譯后的jsp跟servlet一樣,因此jsp是另一種形式的servlet。
jsp 頁面包括以下內(nèi)容:
靜態(tài)內(nèi)容
指令
表達(dá)式
小腳本
聲明
注釋
1.指令:
page指令: 通常位于jsp頁面的頂端,同一個(gè)頁面可以有多個(gè)page指令。
include指令:將一個(gè)外部文件嵌入到j(luò)sp文件中。
taglib指令 :使用標(biāo)簽定義新的自定義標(biāo)簽。
1.1其中page指令語法:
<%@ page 屬性=“屬性值”>
屬性 | 默認(rèn)值 |
---|---|
language | java |
import | “” |
1.2 include 指令
<%@ include file="url" %>
1.3 動(dòng)作
include動(dòng)作
<jsp:include page="url" flush="true"/>
include 動(dòng)作和include指令區(qū)別
描述 | include指令 | include 動(dòng)作
--- | --- | ---
語法 | < % @ include file=""/> | < jsp:include page="url" flush="true"/>
發(fā)生時(shí)間 | 頁面轉(zhuǎn)換期間 | 請(qǐng)求期間
包含內(nèi)容 | 文件實(shí)際內(nèi)容 | 頁面的輸出
轉(zhuǎn)化servlet | 一個(gè)servlet | 2個(gè)servlet
編譯時(shí)間 | 較慢 | 較快
執(zhí)行時(shí)間 | 稍快 |較慢--每次資源必須被編譯
forward動(dòng)作
<jsp:forward page="url"/>
==request.getRequestDispatcher("/url").forward(res,resp);
param動(dòng)作
<jsp:param name="參數(shù)名" value="參數(shù)值"/>常常與<jsp:forward>一起使用
例子:
<jsp:forward page="user.jsp">
<jsp:param name="email" value="1233@154.com"/></jsp:forward>
2.jsp注釋
html注釋
<!-- html注釋 -->//客戶端可見
jsp 注釋
<%-- jsp注釋 --%>//客戶端不可見
jsp 腳本注釋 //客戶端不可見
//單行注射
/** 多行注釋*/
3.jsp腳本
在jsp頁面中執(zhí)行的java代碼,語法:
<% java 代碼 %>
4.jsp聲明
在jsp頁面定義變量或者方法,語法
<%! java 代碼 %>
舉例:
<%!
String s="adele"; int add(int x,int y){ return x+y;
}
%>
5.jsp表達(dá)式
在jsp頁面執(zhí)行的表達(dá)式,語法:
<% =表達(dá)式 %>// 表達(dá)式不以分號(hào)結(jié)尾
舉例:
<%!
String s="adele";%><h2> hello,<%=s %> </h2>
CC36B22A-503E-4C29-98BB-3B58038C140E.png
jspService()是用來處理客戶端請(qǐng)求的,對(duì)于每一個(gè)請(qǐng)求,服務(wù)器會(huì)創(chuàng)建一個(gè)新的線程來處理該請(qǐng)求。以多線程方式執(zhí)行大大降低對(duì)系統(tǒng)的資源需求,提高系統(tǒng)的并發(fā)量和縮短了響應(yīng)時(shí)間,servlet是常駐在服務(wù)器內(nèi)存中。
它同servlet 一樣,jsp 實(shí)例初始化和銷毀也會(huì)調(diào)用sevlet的init() 和destroy();
另外jsp還有自己的初始化方法_jspInit();_jspDestroy();
<%@ page language="java" contentType="text/html";charset="utf-8">
<%!
public void _jspInit(){
}public void _jspDestroy(){
}
%>
動(dòng)作元素:
動(dòng)作元素為請(qǐng)求處理階段提供信息。
Paste_Image.png
在jsp頁面使用javaben
像普通的java類一樣,創(chuàng)建javabean;
在jsp使用動(dòng)作標(biāo)簽來使用 javaben
相關(guān)標(biāo)簽如下:
<jsp:useBwan id="" class="" scope="" />
<jsp:setProperty name="javabean 是例" property="*"/>(跟表單關(guān)聯(lián))
<jsp:setProperty name="javabean 是例" property="javaben 屬性名"/>(跟表單關(guān)聯(lián))
<jsp:setProperty name="javabean 是例" property="javaben 屬性名" value=""/>(手動(dòng)設(shè)置)
<jsp:setProperty name="javabean 是例" property="javaben 屬性名" param="request對(duì)象參數(shù)"/>(跟request參數(shù)關(guān)聯(lián))
<jsp:getProperty name="" property=""/>
舉個(gè)例子:
首先用戶 在login.jsp提交表單,然后用戶在dologin.jsp 根據(jù)動(dòng)作標(biāo)簽獲取參數(shù)。
login.jsp
<form name="loginForm" action="dologin.jsp?mypass=999999" method="post">
<table>
<tr>
<td>用戶名:</td>
<td><input type="text" name="username" value=""/></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="password" name="password" value=""/></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登錄"/></td>
</tr>
</table>
</form>
dologin.jsp
<body>
<jsp:useBean id="myUsers" class="com.po.Users" scope="page"/>
<h1>setProperty動(dòng)作元素</h1>
<hr>
<!--根據(jù)表單自動(dòng)匹配所有的屬性 -->
<%--
<jsp:setProperty name="myUsers" property="*"/>
--%>
<!--根據(jù)表單匹配所有部分的屬性 -->
<%--
<jsp:setProperty name="myUsers" property="username"/>
--%>
<!--根表單無關(guān),通過手工賦值給屬性 -->
<%--
<jsp:setProperty name="myUsers" property="username" value="lisi"/>
<jsp:setProperty name="myUsers" property="password" value="888888"/>
--%>
<!--通過URL傳參數(shù)給屬性賦值 -->
<jsp:setProperty name="myUsers" property="username"/>
<jsp:setProperty name="myUsers" property="password" param="mypass"/>
<!-- 使用傳統(tǒng)的表達(dá)式方式來獲取用戶名和密碼 -->
<%--
用戶名:<%=myUsers.getUsername() %><br>
密碼:<%=myUsers.getPassword() %><br>
--%> <!-- 使用getProperty方式來獲取用戶名和密碼 -->
用戶名:<jsp:getProperty name="myUsers" property="username"/> <br>
密碼:<jsp:getProperty name="myUsers" property="password"/><br>
<br>
<br>
<a href="testScope.jsp">測(cè)試javabean的四個(gè)作用域范圍</a>
<%
request.getRequestDispatcher("testScope.jsp").forward(request, response); %>
</body>
javaben 四大作用域
page ,僅當(dāng)前頁面有效
request ,通過httpRequest.getAttribute()獲取jvabean對(duì)象
session ,通過httpSession.getAttribute() 獲取javabean對(duì)象
application,通過application.getAttribute方法獲取javabean 對(duì)象。
1.概述:
由于http協(xié)議的無狀態(tài),無法保存用戶的狀態(tài),所以需要用session和cookie.
cookie 是web服務(wù)器保存在客戶端的一系列文本信息。它的作用時(shí)記錄一些用戶的行為,簡化登陸,但是容易泄露用戶信息。
2.jsp創(chuàng)建和使用cookie
創(chuàng)建cookie
Cookie cookie=new Cookie(String ,Object);
寫入cookie
response.addCookie(cookie);
讀取 cookie
Cookie[] cookies=request.getCookies();
3.cookie的常用方法
setMaxAge();
setValue();
getName();
getValue();
getMaxAge();
舉個(gè)列子: 使用cookie記住用戶登陸的賬號(hào)密碼;
登陸界面:
<body>
<h1>用戶登錄</h1>
<hr>
<%
request.setCharacterEncoding("utf-8");
String username="";
String password = "";
Cookie[] cookies = request.getCookies(); if(cookies!=null&&cookies.length>0)
{ for(Cookie c:cookies)
{ if(c.getName().equals("username"))
{
username = URLDecoder.decode(c.getValue(),"utf-8");
} if(c.getName().equals("password"))
{
password = URLDecoder.decode(c.getValue(),"utf-8");
}
}
} %>
<form name="loginForm" action="dologin.jsp" method="post">
<table>
<tr>
<td>用戶名:</td>
<td><input type="text" name="username" value="<%=username %>"/></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="password" name="password" value="<%=password %>" /></td>
</tr>
<tr>
<td colspan="2"><input type="checkbox" name="isUseCookie" checked="checked"/>十天內(nèi)記住我的登錄狀態(tài)</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登錄"/><input type="reset" value="取消"/></td>
</tr>
</table>
</form>
</body>
處理登陸邏輯的jsp
<body>
<h1>登錄成功</h1>
<hr>
<br>
<br>
<br>
<%
request.setCharacterEncoding("utf-8"); //首先判斷用戶是否選擇了記住登錄狀態(tài)
String[] isUseCookies = request.getParameterValues("isUseCookie"); if(isUseCookies!=null&&isUseCookies.length>0)
{ //把用戶名和密碼保存在Cookie對(duì)象里面
String username = URLEncoder.encode(request.getParameter("username"),"utf-8"); //使用URLEncoder解決無法在Cookie當(dāng)中保存中文字符串問題
String password = URLEncoder.encode(request.getParameter("password"),"utf-8");
Cookie usernameCookie = new Cookie("username",username);
Cookie passwordCookie = new Cookie("password",password);
usernameCookie.setMaxAge(864000);
passwordCookie.setMaxAge(864000);//設(shè)置最大生存期限為10天
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
} else
{
Cookie[] cookies = request.getCookies(); if(cookies!=null&&cookies.length>0)
{ for(Cookie c:cookies)
{ if(c.getName().equals("username")||c.getName().equals("password"))
{
c.setMaxAge(0); //設(shè)置Cookie失效
response.addCookie(c); //重新保存。
}
}
}
} %>
<a href="users.jsp" target="_blank">查看用戶信息</a>
</body>
使用cookie獲取用戶信息:
<body>
<h1>用戶信息</h1>
<hr>
<%
request.setCharacterEncoding("utf-8");
String username="";
String password = "";
Cookie[] cookies = request.getCookies(); if(cookies!=null&&cookies.length>0)
{ for(Cookie c:cookies)
{ if(c.getName().equals("username"))
{
username = URLDecoder.decode(c.getValue(),"utf-8");
} if(c.getName().equals("password"))
{
password = URLDecoder.decode(c.getValue(),"utf-8");
}
}
} %>
<BR>
<BR>
<BR>
用戶名:<%=username %><br>
密碼:<%=password %><br>
</body>
3.cookie和 session的區(qū)別
session | cookie |
---|---|
在服務(wù)端保存信息 | 在客戶端保存信息 |
保存的 object類型 | 保存的是 string 類型 |
隨會(huì)話結(jié)束,銷毀數(shù)據(jù) | 可以長期保存在客戶端中 |
重要信息 | 不重要信息 |
SP:Java Server Pages。JSP是一種網(wǎng)頁的編碼格式,不同于HTML的是JSP中是由 HTML中的標(biāo)簽指令 和 Java邏輯代碼 拼湊而成, 其中的Java代碼類似于JavaScript中的邏輯代碼, 但相對(duì)比來說JSP中的Java代碼更方便閱讀和書寫.
當(dāng)JSP頁面被運(yùn)行時(shí),WEB容器會(huì)把請(qǐng)求交給JSP引擎處理,會(huì)將JSP翻譯成一個(gè)_jspServlet,然后按照Servlet的調(diào)用方式來進(jìn)行調(diào)用,
瀏覽器向服務(wù)器發(fā)請(qǐng)求,不管訪問的是什么資源,其實(shí)都是在訪問Servlet,所以當(dāng)訪問一個(gè)jsp頁面時(shí),其實(shí)也是在訪問一個(gè)Servlet,服務(wù)器在執(zhí)行jsp的時(shí)候,首先把jsp翻譯成一個(gè)Servlet,所以我們?cè)L問jsp時(shí),其實(shí)不是在訪問jsp,而是在訪問jsp翻譯過后的那個(gè)Servlet,
Tomcat在Web中的作用:
Tomcat是Web中的容器,
當(dāng)客戶在Web服務(wù)器中輸入請(qǐng)求的時(shí)候, 如果請(qǐng)求的動(dòng)態(tài)頁面, 那么Web服務(wù)器會(huì)創(chuàng)建一個(gè)Servlet來處理, Servlet就是Java代碼, 只是在服務(wù)器端的Java代碼, Servlet通過配置文件來攔截客戶所發(fā)出的請(qǐng)求, 并進(jìn)行相應(yīng)的處理, 最后反饋到客戶端.
在這一系列的請(qǐng)求中,Web服務(wù)器是如何創(chuàng)建出Servlet來對(duì)請(qǐng)求進(jìn)行處理? 而Tomcat的作用就是幫助Web服務(wù)器來創(chuàng)建Servlet的
Tomcat是應(yīng)用(java)服務(wù)器,它只是一個(gè)Servlet容器,是Apache的擴(kuò)展,處理動(dòng)態(tài)頁面的部分
Tomcat各個(gè)文件夾的含義
當(dāng)我們通過瀏覽器訪問index.jsp時(shí),服務(wù)器首先將index.jsp翻譯成一個(gè)index_jsp.class,在Tomcat服務(wù)的work\Catalina\localhost\項(xiàng)目名\org\apache\jsp 目錄下可以看到index_jsp.class的源代碼文件index_jsp.java,
index_jsp這個(gè)類是繼承 org.apache.jasper.runtime.HttpJspBase這個(gè)類的,通過查看Tomcat服務(wù)器的源代碼,可以知道在apache-tomcat-6.0.20-src\java\org\apache\jasper\runtime目錄下存HttpJspBase這個(gè)類的源代碼文件
HttpJspBase 類是繼承 HttpServlet 的,所以 HttpJspBase 類是一個(gè) Servlet ,而 index_jsp 又是繼承 HttpJspBase類的,所以index_jsp類也是一個(gè)Servlet,所以當(dāng)瀏覽器訪問服務(wù)器上的index.jsp頁面時(shí),其實(shí)就是在訪問index_jsp這個(gè)Servlet,index_jsp這個(gè)Servlet使用_jspService這個(gè)方法處理請(qǐng)求。
1:jsp中的代碼是由 Java代碼 和 HTML 代碼組成的 但是兩種不同的代碼是如何實(shí)現(xiàn)他們的作用的?
在客戶端發(fā)出請(qǐng)求時(shí)(請(qǐng)求的是動(dòng)態(tài)代碼) 但是客戶端卻只能看到HTML代碼, Java代碼是客戶端看不到的
原因是: 請(qǐng)求的JSP頁面中,所有的代碼是通過了Web服務(wù)器(在Tomcat下)編譯后的Servlet代碼, 在jsp中編寫的java代碼和html代碼都會(huì)被翻譯到_jspService方法中去,在jsp中編寫的java代碼會(huì)原封不動(dòng)地翻譯成java代碼,如<%out.print("HelloJsp");%>直接翻譯成out.print("Hello Jsp");,而HTML代碼則會(huì)翻譯成使用out.write("<html標(biāo)簽>\r\n");的形式輸出到瀏覽器。在jsp頁面中編寫的html排版標(biāo)簽都是以out.write("<html標(biāo)簽>\r\n");的形式輸出到瀏覽器,瀏覽器拿到html代碼后才能夠解析執(zhí)行html代碼。
當(dāng)執(zhí)行_jspService方法處理請(qǐng)求時(shí),就會(huì)執(zhí)行在jsp編寫的java代碼了,所以Jsp頁面中的java代碼服務(wù)器是通過調(diào)用_jspService方法處理請(qǐng)求時(shí)執(zhí)行的。(_jspService中的Java代碼是實(shí)現(xiàn)動(dòng)態(tài)頁面的邏輯基礎(chǔ))
dmin.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>簡歷設(shè)置</title> </head> <body> <form action="index.jsp" method="get" > <table> <tr> <td>姓名</td> <td><input type="text" name="username"></td> </tr> </table> <input type="submit" name="submit" value="提交"> </form> </body> </html>
index.jsp
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。