servlet+jsp基礎知識三
1、問題
通過servlet01-02的相應案例可以看出,servlet里面
1、有大量的out.println("<html>")等語句
2、每個 servlet里面有大量的連接訪問數據庫的代碼,代碼冗余不利于后期維護
采用jsp可以解決以上問題
通過servlet01-02的相應案例可以看出,servlet里面
1、有大量的out.println("<html>")等語句
2、每個 servlet里面有大量的連接訪問數據庫的代碼,代碼冗余不利于后期維護
采用jsp可以解決以上問題
2、hey.jsp例子
<%
for (int i=1;i<=10000;i++){
out.print("JSP");
}
%>
<%
for (int i=1;i<=10000;i++){
out.print("JSP");
}
%>
3、通過例子來理解JSP、內建對象、JSP引擎
理解:
實際上 JSP也是servlet,是一路貨,是同樣的東西
訪問這個JSP實際上也是訪問servlet
當我們用瀏覽器訪問JSP的時候,tomcat服務器要首先要把這個jsp文件讀取了,并把它轉換成servlet
實際上我們訪問的就是這個轉換后的servlet
servlet與Jsp原理是一樣的,只是jsp的效率稍微高些
Tomcat服務器是怎么把它轉換成servlet的呢?通過jsp引擎來進行轉換
其中 JSP引擎是Tomcat里面的一個小程序,用來將用戶寫的JSP轉換成指定的servlet,然后再輸出到瀏覽器
訪問一個 html頁面和訪問一個jsp是不一樣的
訪問一個html頁面,服務器只是簡單做個響應
訪問一個jsp時,首先要將jsp轉換成servlet然后在將其輸出到瀏覽器上
Tomcat服務器是怎么把它轉換成servlet的呢?通過jsp引擎來進行轉換
其中 JSP引擎是Tomcat里面的一個小程序,用來將用戶寫的JSP轉換成指定的servlet,然后再輸出到瀏覽器
訪問一個 html頁面和訪問一個jsp是不一樣的
訪問一個html頁面,服務器只是簡單做個響應
訪問一個jsp時,首先要將jsp轉換成servlet然后在將其輸出到瀏覽器上
第一次運行比較慢,首先要將jsp轉換成servlet。
下一次運行時不需要轉化,直接運行調用即可。
下一次運行時不需要轉化,直接運行調用即可。
比如看
D:\tomcat6\work\Catalina\localhost\org.e2learning.servlet.03\org\apache\jsp
2個文件,其中hey_jsp.java就是tomcat將hey.jsp文件轉換成hey_jsp.java
D:\tomcat6\work\Catalina\localhost\org.e2learning.servlet.03\org\apache\jsp
2個文件,其中hey_jsp.java就是tomcat將hey.jsp文件轉換成hey_jsp.java
out內建對象,隱含對象
什么叫內建對象,引擎形成的servlet代碼的形成的內容方面已經聲明了
什么叫內建對象,引擎形成的servlet代碼的形成的內容方面已經聲明了
SUN相關標準規定:不同服務器的jsp引擎是不一樣的,但其生成的的內建對象必須是一樣的。
out,response,request
4、如何寫一個jsp文件?
先寫不變的部分
再寫jsp部分
先寫不變的部分
再寫jsp部分
---------- -----------
| | | 頭 |
| jsp | | |
| | | jsp |
| | | 尾 |
---------- ------------
| | | 頭 |
| jsp | | |
| | | jsp |
| | | 尾 |
---------- ------------
jsp指令是指揮jsp引擎的,要求其在jsp引擎在生成的servlet代碼內加些東西。并不在瀏覽器中顯示。
重要技巧:
<%out.writer(rs.getString(1));%> ====>相當于<%=rs.getString(1)%>
<%=表達式%>======〉<%out.writer(表達式);%>
即便寫一個jsp沒有<%%>,也要寫成jsp
header.jsp文件-----應用最多的是頁面的頭部分
foot.jsp文件-----頁面的尾部分
foot.jsp文件-----頁面的尾部分
<%@include file="header.jsp" %>
jsp引擎將jsp文件轉換成servlet的時候,一旦讀取到上面這一行,則將讀取所指定的文件到此,完畢后繼續轉換。
<input type="button" class="button" value="Add Emp »" onclick="location='emp_form.jsp'"/>
=================
地址欄地址變更為emp_form.jsp
6、要注意的問題:
a、include引入的文件里面定義的變量不能和當前文件定義的變量名相同
否則會出現 550錯誤,JSP引擎錯誤
否則會出現 550錯誤,JSP引擎錯誤
b、<%page import="java.sql.*"%> 以下錯誤信息是由于import后面的java.sql.*沒引起來
org.apache.jasper.JasperException: /emp_list.jsp(1,17) quote symbol expected
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:88)
at org.apache.jasper.compiler.Parser.parseAttribute(Parser.java:198)
at org.apache.jasper.compiler.Parser.parseAttributes(Parser.java:148)
at org.apache.jasper.compiler.Parser.parseAttributes(Parser.java:160)
at org.apache.jasper.compiler.ParserController.getPageEncodingForJspSyntax(ParserController.java:490)
at org.apache.jasper.compiler.ParserController.determineSyntaxAndEncoding(ParserController.java:431)
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:207)
at org.apache.jasper.compiler.ParserController.parseDirectives(ParserController.java:120)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:180)
org.apache.jasper.JasperException: /emp_list.jsp(1,17) quote symbol expected
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:88)
at org.apache.jasper.compiler.Parser.parseAttribute(Parser.java:198)
at org.apache.jasper.compiler.Parser.parseAttributes(Parser.java:148)
at org.apache.jasper.compiler.Parser.parseAttributes(Parser.java:160)
at org.apache.jasper.compiler.ParserController.getPageEncodingForJspSyntax(ParserController.java:490)
at org.apache.jasper.compiler.ParserController.determineSyntaxAndEncoding(ParserController.java:431)
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:207)
at org.apache.jasper.compiler.ParserController.parseDirectives(ParserController.java:120)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:180)
c、以下代表單元格內容為空格<td> </td>
7、
<%out.write("<a href='emp_formb.jsp'>addEmp</a>"); %>
<input type="button" class="button" value="add EMP" onclick="location='emp_listb.jsp'"/>
8、cookies理解
cookies
瀏覽器第一次訪問服務器的時候,服務器在響應的時候,讓瀏覽器把一部分小的數據帶回去,這部分小的數據就是cookies
比如坐車,坐10次送1次;這個老板應該做什么呢?
方式:
1\服務器卡
2\每人發個卡 cookies
給每人發一個卡,來一次填寫一個卡
用servlet和jsp寫cookies是一樣的。
9、servlet中cookies,通過sniffer抓包分析
servlet中加上有以下代碼:
Cookie cookie=new Cookie("some_cookie","1000");//用來封裝cookies信息
response.addCookie(cookie);//通過響應來添加cookies;response.addCookie()
通過客戶端訪問servlet時:
http第一次請求
http第一次請求
http響應
Set-Cookies:some_cookie=1000
Set-Cookies:some_cookie=1000
http第二次請求 會通過請求協議頭的方式把這個信息帶給服務器
cookie:some_cookie=1000;
cookie:some_cookie=1000;
一次請求可以帶n個cookie
響應的時候多個set-cookie
// 用來封裝Cookie的信息
//名字和值都是字符串
10、寫 cookie:response
String value1 = URLEncoder.encode("1+1=2", "utf-8");
String value2 = URLEncoder.encode("兩千", "utf-8");
Cookie cookie1 = new Cookie("some_cookie", value1);
Cookie cookie2 = new Cookie("other_cookie", value2);
// 生成響應頭中的set-cookie項
// 0 馬上刪除
// <0 瀏覽器關閉即刪除
// >0 秒數
cookie1.setMaxAge(60);
response.addCookie(cookie1);
response.addCookie(cookie2);
響應的時候多個set-cookie
// 用來封裝Cookie的信息
//名字和值都是字符串
10、寫 cookie:response
String value1 = URLEncoder.encode("1+1=2", "utf-8");
String value2 = URLEncoder.encode("兩千", "utf-8");
Cookie cookie1 = new Cookie("some_cookie", value1);
Cookie cookie2 = new Cookie("other_cookie", value2);
// 生成響應頭中的set-cookie項
// 0 馬上刪除
// <0 瀏覽器關閉即刪除
// >0 秒數
cookie1.setMaxAge(60);
response.addCookie(cookie1);
response.addCookie(cookie2);
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println("<BODY>");
out.println("<h1>Add Cookie</h1>");
out.println("</BODY>");
out.println("</HTML>");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println("<BODY>");
out.println("<h1>Add Cookie</h1>");
out.println("</BODY>");
out.println("</HTML>");
11、得到cookie :request
getcookies
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 如果請求協議頭中沒有cookie,則返回null
//由于cookies返回的可能不是一個,所以是以數組
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//顯示在控制臺上看下
System.out.println();
out.println("<h1>" + cookie.getName() + ": "
+ URLDecoder.decode(cookie.getValue(),"utf-8") + "</h1>");
}
}
PrintWriter out = response.getWriter();
// 如果請求協議頭中沒有cookie,則返回null
//由于cookies返回的可能不是一個,所以是以數組
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//顯示在控制臺上看下
System.out.println();
out.println("<h1>" + cookie.getName() + ": "
+ URLDecoder.decode(cookie.getValue(),"utf-8") + "</h1>");
}
}
12、cookies的編碼問題
存儲cookies的時候,其字符串不能包含 "= ;",盡量不要寫太復雜。(主要是協議頭里面包含=號和;號)
如果非要在里面加上=;號時,需要進行URLEncode的編碼
比如說
String value1 = URLEncoder.encode("1+1=2", "utf-8");
String value2 = URLEncoder.encode("兩千", "utf-8");
Cookie cookie1 = new Cookie("some_cookie", value1);
Cookie cookie2 = new Cookie("other_cookie", value2);
通過編碼之后再保存 就可以解決以上問題。
如果非要在里面加上=;號時,需要進行URLEncode的編碼
比如說
String value1 = URLEncoder.encode("1+1=2", "utf-8");
String value2 = URLEncoder.encode("兩千", "utf-8");
Cookie cookie1 = new Cookie("some_cookie", value1);
Cookie cookie2 = new Cookie("other_cookie", value2);
通過編碼之后再保存 就可以解決以上問題。
out.println("<h1>" + cookie.getName() + ": "
+ URLDecoder.decode(cookie.getValue(),"utf-8") + "</h1>");
13、假設一個論壇需要登錄注冊模塊
要求:必須是我們數據庫里面的用戶才能登陸,否則不能登陸
我們用什么辦法檢測過,這個用戶登錄過
避免:只是設置了個門口,而沒用設置墻
if(num==1) {
-------
最好加上下面cookies代碼
-------
response.sendRedirect("emp_list.jsp");
} else {
response.sendRedirect("login_form.jsp");
}
可以采用這種方式,如果成功登陸了,則會返回一個cookies,當再次訪問的時候可以帶一個cookies上來。
cookies代碼
Cookie cookie = new Cookie("user_key",name);
//cookie.addMaxAge(60);
response.addCookie(cookie);
這里嚴格一下都要進行編碼
if(num==1) {
-------
最好加上下面cookies代碼
-------
response.sendRedirect("emp_list.jsp");
} else {
response.sendRedirect("login_form.jsp");
}
可以采用這種方式,如果成功登陸了,則會返回一個cookies,當再次訪問的時候可以帶一個cookies上來。
cookies代碼
Cookie cookie = new Cookie("user_key",name);
//cookie.addMaxAge(60);
response.addCookie(cookie);
這里嚴格一下都要進行編碼
新建一個validate.jsp頁面,通過include導入到其他頁面,來進行信息的驗證
validate.jsp
<%
<%
Cookie[] cookies = request.getCookies();
boolean b = false;
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if ("user_key".equals(cookies[i].getName())
&& cookies[i].getValue() != null
&& cookies[i].getValue().length() > 0) {
b = true;
break;
}
}
}
if (!b) {
response.sendRedirect("login_form.jsp");
}
%>
boolean b = false;
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if ("user_key".equals(cookies[i].getName())
&& cookies[i].getValue() != null
&& cookies[i].getValue().length() > 0) {
b = true;
break;
}
}
}
if (!b) {
response.sendRedirect("login_form.jsp");
}
%>
需要在登陸之后才能看到的jsp文件前面加上
<%@include file="validate.jsp" %>
<%@include file="validate.jsp" %>
14、碰到的問題:
web.xml文件中<servlet-name>saveCookie</servlet-name>
web.xml文件中<servlet-name>savecookie</servlet-name>區別??
15、cookie的年齡
web.xml文件中<servlet-name>saveCookie</servlet-name>
web.xml文件中<servlet-name>savecookie</servlet-name>區別??
15、cookie的年齡
cookie默認是有年齡的,一關瀏覽器就自動刪除了。
cookie.setMaxAge(60);//設置cookie年齡為多少秒?
// 0 馬上刪除
// <0 瀏覽器關閉即刪除(默認)
// >0 秒數
validate.jsp
<%
cookie.setMaxAge(60);//設置cookie年齡為多少秒?
// 0 馬上刪除
// <0 瀏覽器關閉即刪除(默認)
// >0 秒數
validate.jsp
<%
Cookie[] cookies = request.getCookies();
boolean b = false;
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if ("user_key".equals(cookies[i].getName())
&& cookies[i].getValue() != null
&& cookies[i].getValue().length() > 0) {
b = true;
break;
}
}
}
if (!b) {
response.sendRedirect("login_form.jsp");
}
%>
這個代碼是有bug的。
boolean b = false;
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if ("user_key".equals(cookies[i].getName())
&& cookies[i].getValue() != null
&& cookies[i].getValue().length() > 0) {
b = true;
break;
}
}
}
if (!b) {
response.sendRedirect("login_form.jsp");
}
%>
這個代碼是有bug的。
只要Cookie:user_key=1000;即可
=====
=====
原因就是cookie是讓人拿回家的,用戶如果了解原理就可以修改這個cookie。
登陸安全級別相對來說比較高的話,session比cookie要安全點,但是并不是完美安全
一個cookie不能超過4k
輸入法是一個強大的搜索引擎
本文由用戶 honghu79 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!