servlet_jsp 專題專題Servlet_JSPhtml
::::::::::::::::::::::::::::::::::tomcat:::::::::::::::::::::::::::::::::::java
Server version: Apache Tomcat/6.0.18mysql
Server built: Jul 22 2008 02:00:36web
Server number: 6.0.18.0面試
OS Name: Linuxajax
OS Version: 2.6.27-11-genericsql
Architecture: i386數據庫
JVM Version: 1.6.0_10-b33編程
JVM Vendor: Sun Microsystems Inc.ubuntu
javac -version :javac 1.6.0_10
jre 1.5
::::::::::::::::::::::::::::::::::servlet::::::::::::::::::::::::::::::::::::
server lettle (字母)一小段應用程序
TestHTTP.class :http 是什麼東西 :我寫一點東西過去,他返回一點東西給我
Socket s = newSocket("127.0.0.1", 8888);
PrintWriter pw = new PrintWriter(newOutputStreamWriter(s.getOutputStream()));
pw.println("GET / HTTP/1.1");
pw.println("Host:localhost");
pw.println("Content-Type:text/html");
pw.println();
pw.flush();
BufferedReader br = new BufferedReader(newInputStreamReader(s.getInputStream()));
String str = "";
while ((str = br.readLine()) != null) {
System.out.println(str);
}
br.close();
pw.close();
s.close();
::::::::::::::::::::::::::::::::::::::::::::::第一個servlet 程序::::::::::::::::::::::::::
符合j2ee WebApplication 就是一個個目錄:結構比較固定
webapps/ 下創建webapplication
1.must hava :WEB-INF folder ; in it youmust have file web.xml
2.don't make static pages ...in WEN-INFfolder it's used by TomCat
3.make a 01.html under test application orfolder in it have 02.html
4. http://localhost:8888/test/01.html
http://localhost:8888/test/ao.02.html is visit your web application
經過一層server 跟本地打開不同相對url
in java ee sun don't give you jar package only interface for
API javax.servlet and javax.servlet.http you use
TomCat 實現了 sun 的標準(interface)
where is it: tomcat/lib/servlet-api.jar
打開servlet-api.jar 跟sun 定義的接口是一一對應的;
servlet-api.jar 是對API 文檔的實現
實現接口的class 文件就在 jar 包裏
we must buildpath add jar to our project
寫一個servlet newHelloWorldSerlet.class (not so easy)
all servlet must implement servletinterface
servlet 是能夠在任何服務器端運行的程序(service() 方法被全部服務器自動調用)
咱們寫的是專門在http 服務器端運行的程序
adpter GenericServlet abstract classimplemented interface (通用的)
abstract class HttpServlet extendsGenericServlet (專門給web server 使用的 servlet)
一個servlet 被調用,其實是調用 service() 方法;
通常咱們不重寫service()方法; service() 默認幫咱們調用 doGet() ,doPost()
咱們只須重寫doGet(), doPost();
shift + alt + s (重寫方法)
doGet(HttpServletRequest request,HttpServletResponse response)
客戶端訪問服務器發送本身的請求:request 傳遞給服務器,服務器調用 servlet;
服務器往response 裏寫的東西,就是要發送給客戶端的。
request 封裝了客戶端的一系列的請求;response 服務器端返回給客戶端的那個對象
客戶端用get 方式來訪問咱們servlet 的時候; doGet() 被調用
what is get: 直接敲咱們的url 地址;就是get 方式
what is post: form 裏點提交 and form method is post 就是post 方式
讀一下新的類,新的接口;
servlet 不能夠在eclipse 裏運行 servlet 被tomcat 容器調用的,把它放在tomcat application 下
WEB-INF 裏有一個文件夾classes 放編譯好的 servlet class 文件
Navigator 視圖:顯示真正目錄下面咱們的項目是什麼形式(ubuntu 下不能複製!!!)
what url is use the servlet : 去 web.xml 配置文件裏配置
<servlet> //表示在容器裏有一個servlet
<servlet-name>HelloWorldServlet</servlet-name> //名字隨便取
<servlet-class>HelloWorldServlet</servlet-class> //classes 目錄下class 的名字
</servlet> //copy class name
//servlet 定義好了算
<servlet-mapping> //servlet 映射
<servlet-name>HelloWorldServlet</servlet-name> //名字和上面定義的同樣
<url-pattern>/first</url-pattern> //url 裏敲什麼調用this servle
</servlet-mapping> //‘/’開頭 is web application根路徑
分析運行過程:
we type url www.localhost:8888/test/first
to find if have <url-patten> is "/first"
have it ,next visit servlet named HelloWorldServlet
HelloWorldServlet'class is HelloWorldServlet
calling method of HelloWorldServlet object's doGet() .
so tomcat'backstage "System.out.println("doGet")";ok~
tomcat 後臺Reloading context 說明咱們的配置起做用了
:::::::::::::::::::::::::::::::::晚上搞了好久的錯誤::::::::::::::::::::::::::::::::::::::
HelloWordServlet.java 不用運行的在myeclipse 裏也運行不了 //就這個想他運行搞了好久
把 class 放到 test web application 下,class 改動一次要從新放一次 //tomcat 也要重啓
改動 web.xmltomcat 不須要重啓 //tomcat 自動 reloading context
ubuntu tomcat 啓動看不到後臺
沒辦法在myeclipse 裏啓動 tomcat
建web project 項目文件點右鍵->「myeclipse」->「Add and remove project deployment
默認的 myeclipse tomcat 不要 add 一個
windows--show view-- Myeclipse java enterprise --servers //能夠看到後臺了;這把我搞亂了
差點想重裝 myeclipse 氣死了;;;;;
::::::::::::::::::::::::::::::::::回來繼續:::::::::::::::::::::::::::::::::::::::::::::::
response.getWriter().write("<ahref='http://www.bjsxt.com'>go</a>"); //往客戶端寫點東西
//有雙引號了,用單引號
服務器調用servlet 寫給你 html頁面,數據庫內容... 你請求什麼我給你發什麼; 改變/test/後面的東西就ok
只要你有寫那個servlet 請求就能夠獲得響應
:::::::::::::一個servlet 要想正常運行
1.寫 class 放到 WEB-INF 目錄下的 classes 目錄裏
2.正確部署servlet 到 web server or container
::::::::::::::::::::::::::::::::::Servlet 生命週期::::::::::::::::::::::::::::::::::::::::::::
public TestLiftCycleServlet() {
System.out.println("constructor");
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("deGet");
}
public void destroy() {
System.out.println("destroy");
}
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
}
TestLiftCycleServlet.class 初始就讓他繼承 httpservlet
override :init(arg);doGet(); destroy(); +constructor () (inition 開始)
web.xml add new servlet
1.先 constructor :沒有構建怎麼調用其餘的方法阿
2.constructor --- init----doGet
3.calling again (刷新)
4.constructor -- init -- doGet --doGet //只執行一次,第一次初始化的時候
5.同個 container 裏:servlet 只new 一個對象;全部人都訪問的是這個對象(省內存) //有些容器 can new more 構成池
Interface SingleThreadModel Deprcated (廢棄了) 每當別人發一個請求,就new一個新對象
6.init(ServletConfig config) ServletConfig 對象保持着 servlet 配置信息 in web.xml
:::::::::::::::::::::::::::::::::使用doGet和doPost方法處理請求(request):::::::::::::::::::::::::::::::
ThreeParams.html/ThreeParams.java
把源文件都copy 到 navigator src 下粘貼
有時間把方法都打印出來看看沒有getParameter() 方法,就是父類裏有!!!
get 參數名,參數值跟後面,post 不跟後面
::::::::::::::::::::::::::::ShowParameters.java/ShowParametersForm.html::::::::::::::::::::::::
java.util Interface Enumeration isduplicated by the Iterator interface 被 Interator 替代
用Enumeration 是歷史遺留問題 servlet 有的時候尚未 Iterator (網頁是下下來的)
getParameterMap() 代替 Enumeration (做業)
:::::::::::.htm::::::::::::::: ::::::::::::::::::::web.xml:::::::::::::::::::::::
ACTION="/ao/ShowParametersMap" <url-pattern>/test/ao/ShowParametersMap</url-pattern>
不然異常:
HTTP Status 404 - /ao/ShowParametersMap
type Status report
message /ao/ShowParametersMap
description The requested resource(/ao/ShowParametersMap) is not available.
:::::::::::::::::::::::::::::::::::::::cookie (kuki)::::::::::::::::::::::::
http 無鏈接性,請求,響應完就斷開鏈接了;(去第二個頁面結帳已經不認識你了)
(解決:買完東西:*給你在客戶端作記錄*)this is cookie
//每一個瀏覽器有獨一無二的編號
應用:(1)沒有cookie 就買不了書(2)有些網站不能打開(3)兩週內不用從新登陸
兩週內不用從新登陸
0:cookie 是名-值對
1:服務器能夠向客戶端寫內容
2:只能是文本內容
3:客戶端能夠阻止服務器寫入
4:只能拿本身webapp寫入的東西 //新浪不能拿搜狐的cookie
5:Cookie分爲兩種
屬於窗口/子窗口 ---沒有設置setAge();(放在內存中的) //沒有生命週期,窗口關了就沒有了
屬於文本(有生命週期的) //誰均可以訪問
//打開新窗口,showcookies只能看到有生命週期的cookie
//ctrl + n windows.open 從瀏覽器裏打開新窗口(父子關係)擁有原窗口cookie (ie ok)
6:一個servlet/jsp設置的cookies可以被
同一個路徑下面或者子路徑下面的
servlet/jsp讀到 (路徑 = URL)
(路徑 != 真實文件路徑)
實驗:(先刪了全部的cookies)
(1) /servlet/setcookies /showcookies 看不到:老子想看兒子的不可能
(2)/setcookies /servlet/showcookies 兒子看老子的ok!
:::::::::::::::::::::::::::Session (會話跟蹤):::::::::::::::::::::::::::::::
asp asp.net 都同樣:1.cookie ;2.session; 3.application (17 總結)
配置:SessionInfoServlet ShowSession
cookie 不可靠,能夠阻止,能夠手動刪
session :把信息記錄在服務器端
客戶端來訪問時候;服務器端給你開闢一塊內存就是session 跟客戶端瀏覽器窗口或子窗口關聯在一塊兒的
新窗口:新 session
原理:
服務器:給每一個瀏覽器一個獨一無二的號碼;同時給相應的session 賦予一樣的號碼
服務器端記錄了一系列的session 當你訪問第二個頁面的時候,
把號碼發給第二個頁面,第二個頁面去找與這個號碼對應的 session
這個號碼就是sessionID
session 兩種實現:(面試老問)
1.經過cookie 實現(若是瀏覽器支持cookie)
建立session時,把sessionID 存儲在臨時的cookie 裏
瀏覽器窗口關了 sessionID 就沒有了服務器中清除內存
showcookies 能夠顯示出 sessionID
2.經過本身編程,使用url重寫來實現 (response.encodeURL(); 1.轉碼(中文) 2.URL 後面加入SessionID)
禁了cookie 每次刷新 sessionID 都改變(有的IE 禁不了 cookie ;同時url後面不跟 sessionID)
不由cookie 每次刷新 sessionID 不改變 (firefox 不由 cookie URL後面不加ID)
out.println("<br><a href=" +response.encodeURL("SessionInfoServlet") +">refresh</a>");
servlet 寫錯了我暈
給每一個要支持session的連接加上 response.encodeURL() 你的session 就永遠有效
(完美可是麻煩,因此大公司就認爲你就應該支持 cookie 不寫session: main.sina.com.cn)
登陸郵箱後給你個sessionID 再訪問別的頁面的時候就知道是你了 cookie 禁了就登陸不了了
他沒有寫encodeURL() 就沒有 sessionID 了進不去 sun 都有寫的
比較重要的應用寫encodeURL() 趕時間就不用寫了
改事後就要從新部署;class copy to classes 重啓 tomcat
禁了cookie 寫了encodeURL() 後點刷新ID變;點 refesh sessionID 不變而且加在URL 後面
因此每一個URL加這個方法就有固定的sessionID 了
服務器給你建session 後,開始記時間,多久沒有訪問就刪除這個session 從新訪問從新記時間
session 又過時時間
登陸郵箱,在那裏狂敲郵件,發送,session 已過時,沒有跟服務器端及時聯繫
新浪看網頁,又去搜狐,能back回來,新浪session 沒有過時
tomcat conf/web.xml 全部web application 都用, 能夠拷過來,本身該時間
<session-config>
<session-timeout>30</session-timeout> 分鐘
</session-config>
session 是服務器中的一塊內存,能夠往裏面寫任何的東西
void setAttribute(String name Objectvalue) 名字永遠是String 類型相似cookie 名-值對
往服務器裏寫東西:::
(4)訪問次數加一
showsession.class 訪問次數,刷新一次,加一;新建窗口,訪問次數歸0;(一個窗口對應一個session)
session 不存在cookie 路徑不能訪問的問題
只要是同一個窗口/test/Servlet/SessionInfoServlet 創建的ID 能夠被ShowSession 拿到
MIME
Multipurpos Internet Mail Extension
指明白傳送內容的格式
最先用於郵件附件
::::::::::::::::::::::::::::::application ::::::::::::::::::::::::::::::
session 之給一個客戶端訪問
application 讓因此的客戶端均可以訪問
對應的類:
ServletContext(每個 web application 的運行環境叫一個context servletcontext servlet 運行的上下文環境)
servlet run in web application webapplication is servlet' context
what is one servlet'servletcontext ? It'shole web application .
put sth in web application , so everyonecan share it;
計算整個webapplication 生存期間訪問某個頁面一共有多少個客戶端(記錄在application 裏)
全部類的對象都共享application 就像靜態方法forward.jsp / forforward.jsp
TestServletContext 每次刷新都自動加1 ,新起窗口,刷新繼續加1
:::::::::::::::::::::::::::::::部署帶包的class:::::::::::::::::::::::::::::
部署帶包的 class 連包名一塊兒拷到 classes 裏
com.bjsxt.servlet.HelloWorldServlet
web.xml 中配置 name, url-pattern 隨便起; servlet-class:com.bjsxt.servlet.HelloWorldServlet
:::::::::::::::::::::::::::::::::::::::JavaBean(咖啡豆) 支持組件::::::::::::::::::::::::::::::::::::
sun 發明了在java 怎麼使用組件一系列的類中和在一塊兒共同對外提供服務
VB 的一個按鈕就是一個組件
JavaBean 狹義的:sun 規定的關於 JavaBean的標準 ;有界面形式的體現
JavaBean 廣義的:就是一個普通的Java 類
Servlet中使用Bean和在一般程序中使用Bean相似
1.屬性名稱第一個字母必須小寫,通常private,好比:private productId
屬性不讓別人訪問,只有本身能訪問;類的封裝;掩藏細節
2.通常具備gettersand setters;要具備一個參數爲空的構造方法
別人經過方法訪問屬性的值
3.但Bean不該具備GUI表現;通常是用來實現某一業務邏輯或取得特定結果
:::::::::::::::::::::::::::::::::servlet 中訪問數據庫::::::::::::::::::::::::::::::::::::::::
mysql select * from article; 亂碼; set names 'gbk';
找到錯誤的開頭再看,否則就是斷章取義了 ClassNotFoundException
引人包也找不着阿;class 在 web application 裏運行;你把包加到項目裏有什麼用
WEB-INF/lib 中加入相應的jar包 (用於運行,項目中用於編譯和運行) // 重啓 tomcat
::::::::::::::::::出錯越多,能力越強;;;關看程序,不寫程序,永遠出不了錯:::::::::::::::::
::::::::::::::::::不怕你出錯,就怕你出了錯後,手足無措::::::::::::::::::::::::::::::::
每次鏈接數據庫都要寫重複的代碼;咱們把這個鏈接過程代碼封裝到一個類裏;DB.java (封裝)(本身學會常見東西封裝類)
servlet 裏使用 JavaBean 就是在 servlet 裏使用別的類(類要有上面說的特色)
1.直接連數據庫:ShowRs.java
2.JavaBean 封裝連數據庫:DB.java + ShowRsUseBean.java (有異常去DB 裏處理)
:::::::::::::::::::::::::::::::::JSP JSP JSP :::::::::::::::::::::::::::::::::::::::::
JSP---Java Server Pages
擁有servlet的特性與優勢(自己就是一個servlet)
servlet 裏out.println() 太麻煩了
HTML中內嵌JSP代碼 JSP 就像 HTML 同樣使用它
HTML 放哪裏 JSP 就放在哪裏,不用配置直接訪問(跟HTML 同樣,別放在 WEB—INF 目錄下)
out.println("HelloWorld!"); out 輸出流,打印到客戶端
out.println(new java.util.Date());
JSP 運行原理:
1:work 目錄存放編譯 JSP 轉換完成後的 class文件,java文件(JSP 轉成Servlet 再運行)
第一次訪問要轉換和編譯,慢一些;
out.write("<html>\r\n");
out.println("HelloWorld!");
JSP 4套語法:1:傳統語法;2:JSTL(替代傳統語法);3:JSF(替代 JSTL)(好東西推廣很差,都會最好)4:其餘taglib (如struts) (哪一個招的人最多就學那個;JSTL 項目中直接用,JSF 簡單介紹)
ASP 跟 ASP.NET 徹底兩碼事
:::::::::::::::::::::::::::::::::JSP 傳統語法:::::::::::::::::::::::::::::::::
JSP傳統語法
*Declaration (聲明)
*Scriptlet (小程序段)
*Expression (表達式)
*Comment (註釋)
*Directives (編譯指令)
*Action動做指令(動做)
*內置對象
:::::::::::::::::::::::::::::::::Declaration(聲明):::::::::::::::::::::::::::::::::::::
基本語法: <%! %> (成員變量) AccessCounts.jsp
說明:在此聲明的變量、方法都會被保留成惟一的一份,直到JSP程序中止執行
回一
刷新的時候,後臺尚未來的及從新編譯過來 reload 一遍;刷新過程當中他給reload 了
錯誤: <%voidm()%> //把方法聲明在方法裏面了
出現錯誤瀏覽器會報錯;;(resolved 下定義)
1.打印調試; 2.刪一段再運行; JSP支持DEBUG (logbox)
:::::::::::::::::::::::::::::::Scriptlet (小程序段):::::::::::::::::::::::::::::::::::
基本語法:<%程序代碼區%> BGColor.jsp?bgColor=red(動態改變服務器端)
<%= 賦值%>
* 能夠放入任何的Java程序代碼
註釋格式:
<%--……--%> 客戶端源碼能夠看見
<%//… …%>
<%/*… …*/%>
:::::::::::::::::::::::::::::::Expression(表達式)::::::::::::::::::::::::::::::::
基本語法: <%=……%> Expressions.jsp ?testParam=abcde (加空格轉化爲%20)
(firefox 不轉)
*=後面必須是字符串變量或者能夠被轉換成字符串的表達式
*不須要以;結束
*只有一行
:::::::::::::::::::::::::::::::Directives(編譯指令):::::::::::::::::::::::::::::::::::::
Directive(編譯指令)至關於在編譯期間的命令
格式:<%@Directive屬性=「屬性值」%>
常見的Directive:
1.page
2.include
3.taglib (之後再講)
::::::::::::::::::::::::::Directive-page :指明與JSP Container 的溝通方式::::::::::::::::::::::::::::
//編譯期間,指明白頁面特色
基本格式:
<%@page language=「script language」| //不能有空格
extends=「className」|
import=「importList」| --*引入的包名
buffer=「none|kb size」| --none:不緩衝,默認8k緩衝區
session=「true|false」| --是否可使用session 對象,第一次使用對象給你建立一個session,默認true
autoFlush=「true|false」 --緩衝器是否自動清除,默認true
isThreadSafe=「true|false」| --默認false(永遠不要設成true) 實現SingleThreadModel Deprcated
info=「infoText」| --任何字符
errorPage=「errorPageUrl」| --*頁面出錯後顯示什麼頁面的內容
isErrorPage=「true|false」| --*當前頁面是否是顯示錯誤的頁面
contentType=「contentTyepInfo」| --*"text/html" charset 2312
pageEncoding=「gb2312」
%>
TestDirective.jsp
TestErr.jsp
ErrPage.jsp
:::::::::::::::::::::::::::::Directive-include將指定的JSP程序或者HTML文件包含進來::::::::::::::::::::::::::
TestBar.jsp
TitleBar.jsp
<%@include file=「fileURL%> //先原封不動的包含進來,再編譯,編譯指令(Directive)
<%@ includefile="TitleBar.jsp?user=aa" %> //"/TitleBar.jsp?user=aa" not found 編譯指令不能往裏面傳參數
//尚未運行呢
包含非動態的代碼(不接受參數的代碼)編譯時候包含,執行效率比較高
不能向fileURL中傳遞參數
不能abc.jsp?user=aaa
:::::::::::::::::::::::::::::::Action (運行期間指令)::::::::::::::::::::::::::::::::::::::::::::::::
常見的 (4種):
1.jsp:useBean
jsp:setProperty
jsp:getProperty
2.jsp:include
3.jsp:forward
jsp:param
3.jsp:plugin
嵌入applet (不多用了 ajax 出現後)
::::::::::::::::::::::::::::::::Actionjsp:include ::::::::::::::::::::::::::::::::::::::::::::::::
用於動態包含JSP程序或HTML文件等
除非這個指令會被執行到,不然它是不會被Tomcat等JSP Engine編譯。
格式:
<jsp:include page=「URLSpec」 flush=「true」/> //沒有@ 了flush="true" 趕快輸出
<jsp:include page=「URLSpec」 flush=「true」>
<jsp:param name=「ParamName」 value=「paramValue」/> //子標籤
</jsp:include>
jsp:param :用來設定include文件時的參數和對應的值
include.jsp
date.jsp
兩種包含的區別:compute.html;compute.jsp;divide.jsp;;multiply.jsp
String value1 =request.getParameter("value1"); //返回值是String 類型檢驗是否是空
request.getParameter("compute") //檢驗是否是空值 NoPointException
運行指令和編譯指令include的區別 (Directive-include)
1.include 屬性名不一樣 <%@include file ;<jsp:include page
2.include編譯指令是在JSP程序的轉換時期就將file屬性所指定的程序內容嵌入,而後再編譯執行;而include指令在轉換時期是不會被編譯的,只有在客戶端請求時期若是被執行到纔會被動態的編譯載入
3.Include不能帶參數, 而<jsp:include>能夠
4.動態包含的文件和被包含文件用的是同一個request對象
::::::::::::::::::::::::::::::::::::::::Action jsp:forward::::::::::::::::::::::::::::::::::::
用於將一個jsp的內容傳送到page所指定的JSP程序或者Servlet中處理(URL)
格式:
<jsp:forward page=「urlSpec」 flush=「true」/> //沒有參數
<jsp:forward page=「urlSpec」> //有參數
<jsp:param name=「paramName」 value=「paramValue」/>
</jsp:forward>
<jsp:param>用於指定參數和其對應的值
forward.jsp //url 輸入forward.jsp 顯示的是 forforward.jsp url 中顯示的是forward.jsp
forforward.jsp
test.jsp //response.sendRedirect("forforward1.jsp");
//轉到forforward1.jsp 不能傳參數 url 中顯示的是 forforward.jsp
(用處)跳轉:
根據不一樣的(登陸信息)用戶名跳轉到不一樣的頁面
看你用戶名不對讓你從新登陸
forward1.jsp
forforward1.jsp
分析:
forward1.jsp
<jsp:forward page="forforward1.jsp">
<jsp:param name="name" value="m" /> //參數名;值固定了沒有用request.getParameter()方法
<jsp:param name="oldName"value='<%=request.getParameter("name")%>' />
<jsp:param name="roles" value="manager" />
</jsp:forward>
forforward1.jsp
<%=request.getParameter("name")%> //forward1.jsp 中name 的值 "m"
<%=request.getParameter("oldName")%> //url 中輸入的 name=aoople
<%=request.getParameter("roles")%> //顯示 manager
<%=request.getParameter("ccc")%> //forward1.jsp?ccc=aoople 能夠拿到
//這個request =forward1.jsp 中的request //同一個request forward1.jsp傳過去了
test.jsp //也是跳轉到forforward1.jsp
<%
response.sendRedirect("forforward1.jsp");
//這裏的request !=forward1.jsp 中的request 對象
System.out.println("ddd");
%>
<jsp:forward>與response.sendRedirect的區別:
<jsp:forward>
使用同一個request 只發起一次請求 (request)
forward後的語句不會繼續發送給客戶端
速度快
服務器內部轉換,無聲無息轉到另外一個界面,客戶端不知道
能夠傳參數
response.sendRedirect //請你從新訪問另外一個頁面
是不一樣的request 發起兩個請求
send後的語句會繼續執行,除非return
速度慢
須要到客戶端的往返,能夠轉到任何頁面
能夠傳參數,直接寫在url後面
:::::::::::::::::::::::::::::::::::::Action jsp:useBean (使用JavaBean):::::::::::::::::::::::::::::
StringBean.jsp
StringBean.java
jsp:useBean : 在JSP中使用定義好的Bean
Bean的基本要素:
必需要有一個不帶參數的構造函數。在JSP元素建立Bean時會調用空構造器
Bean類應該沒有任何公共實例變量,也就是說,不容許直接訪問實例變量,變量名稱首字母必需小寫
經過getter/setter方法來讀/寫變量的值,而且將對應的變量首字母改爲大寫
基本用法:
test.jsp/CounterBean.java 不要使用裸體類(規範要求) package bean;
javabean 連包名一塊兒放到 web-inf/classes 目錄下
jsp:useBean各項參數含義:
id:對象實例名稱
scope:Bean做用的範圍,默認爲page,對整個jsp頁面有效
class:Bean類名稱(全名)
type:Bean實例類型,能夠是本類,或其父類,或實現的接口,默認爲本類
Scope各項參數的意義:
page:僅涵蓋使用JavaBean的頁面
(PageBean.jsp/CounterBean.java) //兩次getCount()
request:有效範圍僅限於使用JavaBean的請求
(RequestBean.jsp/RequestBean2.jsp/CounterBean.java) //沒有CountBean 給new 一個(名:值對)
//同一個request 拿到的bean 就是同一個
//forward 的是(101),方法的不是(1)
session:有效範圍在用戶整個鏈接過程當中(整個會話階段均有效)
(SessionBean.jsp/Session2.jsp/CounterBean.java) //當前窗口或子窗口刷新會 ++
//輸入sessionbean2.jsp 也會++
//firefox 新起一個也++ ??怪了
application:有效範圍涵蓋整個應用程序。也就是對整個網站均有效
(Application.jsp/Application2.jsp/CounterBean.java) //重啓tomcat 打開新窗口爲1
有兩種語法:練習的時候用不熟悉的語法,寫程序的時候用熟悉的
<%@ page import="bean.*" %>
<%--
<%response.sendRedirect("../servlet/ShowRs"); %>
<% CounterBean cb = new CounterBean();%>
<font color="red"size="5">
<%=cb.getCount()%>
</font>
--%>
oooooo 兩個註釋了仍是不能執行,不能一塊兒放,分開來執行
<jsp:useBean id="cb"class="bean.CounterBean" typ="java.lang.Object> Object cb = new CounterBean() 引用指向子類對象
<jsp:useBeanid="cb"class="bean.CounterBean" >
等於<% CounterBean cb = newCounterBean(); %>
</jsp:useBean>
像HTML 可是那個公司讓美工寫JSP代碼的阿 scope=page 局部變量,頁面沒有方法消失
雖然有方法publicint getCount() { count++; return count; } 每次刷新,都所新的值,不會++
<jsp:setProperty name="cb"property="count" value="23"/> <%--cb.setCount(Integer.parseInt("23")) --%>
<jsp:getProperty name="cb"property="count"/> <%--out.print(cb.getCount()) --%>
:::::::::::::::::::::::::::::::::::jsp:useBean配套用的兩個子標籤:::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::jsp:setProperty::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::jsp:getProperty::::::::::::::::::::::::::::::::::
創建表單參數和Bean屬性之間的關聯
1.經過param指定表單元素的名稱,經過perperty指定對應的Bean屬性名稱,由此創建這兩個變量的關聯
(SaleEntry.jsp/SaleEntry.java,用url傳遞參數)
2.經過*來設置全部屬性和輸入參數之間的關聯
(SayHelloBean.html/SayHelloBean.jsp/HelloBean.java)
3.在創建Bean屬性和表單參數之間的對應關係時,服務器會將對應的參數自動轉換成和屬性類型匹配的數據
1.)
報錯:(上網一查)
value="<%=request.getParameter("itemID")%>"/>
/SaleEntry.jsp(26,14) Attribute value request.getParameter("itemID")is quoted with " which must be escaped when used within the value
改錯: value="<%=request.getParameter('itemID')%>" />
<jsp:useBean id="entry" class="bean.SaleEntry"/> //new 出一個bean的實例 entry
param="numItems" /> ====等同於==== value="<%=request.getParameter("numItems")%>"
request.getParameter("numItems") 拿到的是String 類型; numItems 是Int 類型服務器自動轉換
<TD>$<jsp:getProperty name="entry"property="totalCost" />
//沒有totalCost 屬性,但會調用getTotalCost()方法
//怎麼調的阿
Cc = new C; c.get*(); 要在知道有C 的前提下才能new,JSP知道有SaleEntry 這個類嗎:反射機制
2.)
<jsp:useBean id="hello" class="bean.HelloBean"scope="request" >
<jsp:setProperty name="hello" property="*" />
</jsp:useBean>
form 裏的內容傳到jsp 裏去*的setProperty 都寫了,傳那個調那個
html form 裏的name ; jsp 裏有對應的 property 沒有就找不到了
手寫用的不多, strus裏用的巨多
:::::::::::::::::::::::::::::::::;;request.setCharterEncoding("gb2312"):::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::中文亂碼問題::::::::::::::::::::::::::::::::::::::::::
亂碼中間經歷了那些環節,肯定在那個環節上出了問題
1.提交過去
2.set方法
3.get方法
set方法後面打印 <%=request.getParameter("name")%> 是亂碼
提交過來後就是亂碼了
最原始的解決辦法;放到四海而皆準的辦法:轉碼
<%
String name =request.getParameter("name");
out.println(new String (name.getBytes("ISO8859_1"),"GBK"));
%>
name.getBytes() 分解成一個一個字節,構建成一個字節數組
重載,按ISO8859_1 編碼把name 分解成最原始的字節數組傳輸過程當中是安這個編碼進行編寫的
new String (原來編碼,指定編碼的集合);
能解決任何關於編碼問題,可是要認清他原來的編碼是什麼,你要轉成的編碼是什麼
使用一個簡單的方法:request.setCharacterEncoding("GBK");
你是經過request 傳過來的,你先把request 裏的內容轉化爲GBK 編碼
就不用下面的手動編碼了
::::::::::::::::::::::::::::::::::::::JSP 內置對象::::::::::::::::::::::::::::::::::::::::
JSP的內置對象 (9個) (讀API 文檔)
out
request
response
pageContext *用的不多(這個page運行的環境,相似於servletContext,馬士兵沒有用過,寫JSP 容器有用)
session
application
config *用的不多(servlet 要配置,JSP不用配置,相似web.xml)
exception
Page *用的不多(不多用,由於當前頁面的全部內容咱們直接就能夠訪問,成員變量,局部變量)
緊緊記住其餘的6個對象,
面試題:請你寫出JSP 經常使用的內置對象,以及他們經常使用的方法(遇到N次了)
::::::::::::::::::::::::::::::::::::JSP 內置對象(OUT)::::::::::::::::::::::::::::::::::
Out內置對象是一個緩衝的輸出流,用來給客戶端返回信息。
它是javax.servlet.jsp.JspWriter的一個實例
典型應用:向客戶端輸出內容
例:向客戶端輸出一個字符串「Hello World」
(HelloWorld.jsp)
經常使用方法:
println():向客戶端輸出各類類型數據 (經常使用的) write()
newLine():輸出一個換行符(經常使用的)
close():關閉輸出流
flush():輸出緩衝區裏的數據
clearBuffer():清除緩衝區裏的數據,同時把數據輸出到客戶端
clear():清除緩衝區裏的數據,但不把數據輸出到客戶端
getBufferSize():返回緩衝區的大小
::::::::::::::::::::::::::::::::::::JSP 內置對象(request)::::::::::::::::::::::::::::::::::
request內置對象表示的是調用JSP頁面的請求。
一般,request對象是javax.servlet.http.HttpServletRequest接口的一個實例
典型應用:
經過request.getParameter(「paramName」)能夠得到Form提交過來的參數值
能夠用此對象取得請求的Header、信息(如瀏覽器版本、語言和編碼等)、請求的方式(get/post)、請求的參數名稱、參數值、客戶端的主機名稱等
經常使用方法:
getMethod():返回客戶端向服務器端傳送數據的方法
getParameter(String paramName):返回客戶端向服務器端傳送的參數值,該參數由paramName指定
getParameterNames():得到客戶端傳送給服務器端的全部參數的名字,結果是一個枚舉類型數據(Enumeration)
getParameterValues(String name):得到指定參數的全部值,由name指定
getRequestURI():得到發出請求字符串的客戶端地址
getRemoteAddr():獲取客戶端的IP地址
getRemoteHost():獲取客戶端機器名稱
getServerName():獲取服務器的名字
getServletName():客戶端所請求的腳本文件路徑
getServerPort():獲取服務器端的端口(8888)
對應類:javax.servlet.http.HttpServletRequest
::::::::::::::::::::::::::::::::::::JSP 內置對象(request)::::::::::::::::::::::::::::::::::
表示的是返回給客戶端的響應
是javax.servlethttp.HttpServletResponse接口的一個實例
常常用於設置HTTP標題,添加cookie、設置響應內容的類型和狀態、發送HTTP重定向和編碼URL
經常使用方法:
addCookie(Cookie cookie):添加一個Cookie對象,用於在客戶端保存特定的信息
addHeader(String name,String value):添加HTTP頭信息,該Header信息將發送到客戶端
containsHeader(String name):判斷指定名字的HTTP文件頭是否存在
sendError(int):向客戶端發送錯誤的信息 //(int) http 錯誤碼 404(找不着) 500(服務器內部錯誤)
sendRedirect(String url):重定向JSP文件
和<jsp:forward>的區別
sendRedirect經過客戶端發起二次申請,不一樣的request對象
Jsp:forward是同一個request,在服務器內部轉發
setContentType(String contentType):設置MIME類型與編碼方式 (contentType="text/html;charset=gb2312" )
::::::::::::::::::::::::::::::::::::JSP 內置對象(cookie)::::::::::::::::::::::::::::::::::
Http協議的無鏈接性要求出現一種保存C/S間狀態的機制
Cookie:保存到客戶端的一個文本文件,與特定客戶相關
Cookie以「名-值」對的形式保存數據
經過getName和getValue的方式獲得相應的名字和值
addCookie
::::::::::::::::::::::::::::::::::::JSP 內置對象(session & application):::::::::::::::::::::::::::
<% @page session=「true」%>(默認)--表示session功能已經在jsp頁面中啓動
session經常使用方法:
void setAttribute(String name,Object value)
Object getAttribute(String name)
boolean isNew()
application
ServletContext (對應的類,去API 裏查就是了setAttribute,getAttribute)
::::::::::::::::::::::::::::::::::::Servlet和JSP的通訊 :::::::::::::::::::::::::::::::::::::::
Servlet 跳轉到一個 JSP ,JSP 怎麼跳轉到一個 Servlet ;
JSP 能夠經過,forward, sendRedirect(Stringurl) 跳轉到任何url 地址
部署: servlet
編譯 ServletToJSP.java //大小寫不要寫錯了
把class copy 到 classes 目錄下
配置 web.xml
ServletUseJsp.jsp copy 到 test 根目錄下
分析:
1.FromJspToServlet.jsp :跳轉到ServletToJSP (你也能夠用 sendRedirect)redirect :從新寄送
2.ServletToJSP servlet 又跳轉到 ServletUseJsp.jsp
3.
從JSP調用Servlet可用<jsp:forward>
請求信息自動傳遞到Servlet
或者經過sendRedirect
從Servlet調用JSP使用
RequestDispatcher接口的forward(req, res)方法
請求信息須要顯式傳遞(在req、res參數中)
或者經過sendRedirect
例如:
FromJspToServlet.jsp / ServletToJsp.java /ServletUseJsp.jsp
forward能夠用」/」路徑, 是指web app的根路徑, servlet forward jsp的時候必定要用「/」開頭
jsp sendRedirect到servlet應該用相對路徑,由於這裏」/」指網站的根路徑
servlet sendRedirect jsp也是
request.getContextPath起做用了