javascript
JSP快速入门教程——全十讲
第一講(參考《Java?Web程序設計基礎教程》第1章)
1 JSP 和?Java的關系
?? 一般Java指的標注版?Java SE
?? 另外兩個版本:Java EE?和 Java ME
?? JSP屬于Java EE的一部分。
?? Java EE:
???? 組件:Web層組件(JSP+Servlet)+業務層組件(EJB)
???? 服務:JNDI JDBC RMI JAAS JavaMail等等
?? Java EE包括2個體系:標準(上面介紹的)+流行(Struts+hibernate+spring)
?? 兩套體系都是JSP+Servlet為基礎。
2 JSP會涉及哪些內容
??
?? JSP語法基礎(Java+HTML):
?????? 對于Java,需要掌握Java的基本語法(類定義 對象定義和使用 常用類庫java.lang.*,java.util.*)
?????? 對于HTML,主要表單元素(輸入)+表格(顯示信息)+基本HTML
?? JSTL,標準標簽庫,用于輸出和控制
?? EL,通常與JSTL一起使用,主要用于輸出
?? Servlet,幾乎所有介紹JSP的書和課程都包含Servlet,因為JSP實際上指的是Java Web開發。用Servlet主要是控制器。
?? JDBC,對數據庫的訪問。
?? JavaBean(Java類)
3 JSP的運行環境
?? JDK
?? 服務器:我們用Tomcat。其它的服務器:IBM Websphere + BEA WebLogic? + JBoss(免費的) + GlassFish(新出的Java EE 5服務器)
4 JSP的開發環境
?
?? 頁面:DreamWeaver開發頁面
?? 代碼:本文編輯器 Eclipse NetBeans JBuilder
?? 注:我們采用記事本。
5 Tomcat文件夾
?
?? webapps? 主要各個應用,編寫的每個應用(網站)都可以放在這個位置
?? bin? 這個是啟動服務器的相關文件,tomcat6用于命令行方式的啟動,tomcat6w用于windows方式的啟動
?? conf? 用于配置,常用的是server.xml 另外一個是web.xml
?? work 存放臨時文件
?? logs? 系統運行時候的日志信息
6 實例:hello.jsp
?? 創建一個應用,實際上需要在webapps中創建文件夾,bookstore,相當于應用的名字
?? 文件夾中要創建一個子文件夾WEB-INF,這個每個應用web應用都需要的。
?? 在WEB-INF中需要web.xml,是web應用的配置文件,還應該有classes和lib子文件夾(存放類文件)
?? JSP文件和HTML文件直接放在bookstore下面。
?? hello.jsp文件內容如下:
<%@ page contentType="text/html;charset=gb2312"%>
<!-- 上面的代碼聲明文檔類型和編碼方式,每個JSP文件基本上都會有 -->
<html>
?? <head>
????? <title>第一個JSP程序</title>
?? </head>
?? <body>
????? Hello,晚上好!
?? </body>???
</html>
?? 先啟動服務器:
?? 訪問程序:http://127.0.0.1:8080/bookstore/hello.jsp
?? http表示協議
?? 127.0.0.1表示主機IP地址,也可以寫主機名字
?? 8080表示服務的端口,上網的時候不用輸入端口,因為采用了默認的端口,默認端口80。
?? bookstore表示應用,是應用的名字
?? hello.jsp就是資源
7 JSP的運行原理
?? 過程:
????? 首先啟動服務器,并且要保證應用在服務器上(把應用放在webapps下面,會自動加載)
????? 在客戶端通過瀏覽器發送請求(在地址欄中輸入地址)
????? 服務器接收到請求之后,查找有沒有這個文件對應的Java文件的對象。如果沒有這個對象,需要創建(先把JSP文件轉換成Java文件,
????? 編譯成.class文件,加載類并創建對象),然后調用對象的相應方法,方法完成對用戶的響應,通常是輸出的html代碼)
????? 客戶端接收到的是html代碼,瀏覽器解析這個代碼生成頁面。
???
8 表格的語法
?? 開始標志:<table>??
?? 結束標志:</table>
?? 中間是行,每行是一個<tr>? </tr>
?? 每行之間是列,每一列對應<td> </td>
?? <td></td>之間的內容就是每個表格中的信息
******http://blog.csdn.NET/javaeeteacher*******************************************************************
*************************************************第一講結束************************************************
***********************************************************************李老師的一畝三分地******************
第二講(參考《Java Web程序設計基礎教程》第2章)
1、form
?? 只要是涉及向服務器提交信息,都應該使用form。
?? 基本語法結構:
?? <form action="目標文件" method="get|post">
????? 各種表單元素
?? </form>
?? action屬性決定的目標文件來對用戶提交的信息進行處理。
2、常用的表單元素
?? 單行文本框:用于輸入少量的信息。
?? 基本語法格式:
?? <input type="text" name="名字" value="值">
?? type="text"就說明這是單行文本框;
?? name指出文本框的名字,最好不要用漢字,最好使用有意義的名字;
?? value指出默認值,如果沒有默認值,可以不要value屬性,value屬性經常在修改的時候使用。
?? 注意:如果有格式要求,要明確的告訴用戶。
?? 密碼框:用于輸入密碼。
?? 基本的語法格式:
?? <input type="password" name="名字" value="值">
?? 注意:設置密碼的時候,應該使用確認密碼,應該有兩個密碼框。
?? 提交按鈕:當點擊它的時候,會把輸入的信息提交給服務器。
?? 基本語法格式:
?? <input type="submit" value="值">
?? type應該為submit,value是顯示在按鈕上面的信息。
??
?? 復位按鈕:當點擊它的時候,會把各個表單元素的值恢復到默認值。
?? 基本語法格式:
?? <input type="reset" value="值">
??
?? 普通按鈕:也可以完成提交,還可以完成方法的調用。
?? 基本語法格式:
?? <input type="button" value="值">
?? 單選按鈕:通用用于在多個選項中選擇一個。
?? 基本語法格式:
?? <input type="radio" name="名字" value="值">
?? 這個表示一個單選按鈕,并且僅僅是一個按鈕。
?? 例,選擇性別:
?? <input type="radio" name="sex" value="1" checked>男
?? <input type="radio" name="sex" value="0">女
?? 如果希望在多個選項中選擇一個(有互斥性),必須讓他們的名字一致。
?? 復選框:用于多選。
?? 基本的語法格式:
?? <input type="checkbox" name="名字" value="值">
?? 顯示給用戶的信息與提交給服務器的信息沒有關系。
?? 如果希望多個選項是一組,應該使用相同的名字。
?? 下拉列表:用于選擇,可以單選,也可以多選。
?? 基本語法格式:
?? <select name="名字">
????? <option value="1" selected>1</option>
????? <option value="2">2</option>
????? ...
?? </select>
?? 每個選項使用一個option,使用value屬性指出該選項的值,在<option>和</option>之間是顯示給用戶的值。
?? 文本域:用于輸入大量的信息。
?? 基本語法格式:
?? <textarea name="名字" cols="列數" rows="行數">
???? 默認值
?? </textarea>
?? 要為這個文本域賦默認值,需要把值放在開始標志和結束標志之間,而不是使用value屬性。
3、完成輸入的時候應該注意的問題
?? 對格式的要求必須明確,包括長度、數字、日期、email、電話、必添。
?? 能夠從系統中獲取的信息不要讓用戶提供,例如當前時間。
?? 能夠選擇的信息不要讓用戶輸入。
?? 按照信息的重要程度安排表單元素在界面中的位置。
4、對用戶輸入信息進行驗證
?? 要用JavaScript,使用下面的標記:
?? <script language="javascript">
????? //JavaScript代碼
?? </script>
?? 要寫方法
?? function check(){
?? }
?? 方法可以不用定義返回值,但是可以有返回值
?? 獲取用戶輸入的值:
?? document.form1.username.value
?? document表示當前文檔,form1表示表單的名字,username表示該表單中表單元素的名字,value表示得到值
?? 把表單提交與方法關聯:可以使用表單的onSubmit事件。
?? onSubmit="return check();"
?? 例:
<script language="javascript">
?? function check(){
????? username = document.form1.username.value;
????? if(username.length<6 || username.length>8){
???????? alert("用戶名長度不合適!");
???????? return false;
????? }else{
???????? return true;
????? }
?? }
</script>
?? 使用button的onClick事件進行驗證:
?? 首先要把提交按鈕修改成普通按鈕;
?? 在普通按鈕上增加事件:onClick="javascript:check()"?
?? 在驗證成功的時候,提交表單:document.form1.submit();
******http://blog.csdn.Net/javaeeteacher*******************************************************************
*************************************************第二講結束************************************************
***********************************************************************李老師的一畝三分地******************
第三講(參考《Java Web程序設計基礎教程》第3.4章)
1、include指令
??? 作用:把多個文件中需要共享的代碼放在單獨的文件中,然后在需要的時候使用該指令引入這個文件。典型的應用,把網站的頭部和版權信息放在單獨的文件中,在其他文件中包含這兩部分。
??? 基本的語法格式:
??????? <%@ include file="目標文件"%>
??? file屬性指出目標文件。
??? 例:把index.jsp和register.jsp中的共同部分做成單獨的文件header.jsp(后綴名不一定是.jsp),然后在index.jsp和register.jsp中調用。
??? header.jsp中的內容如下:
<%@ page contentType="text/html;charset=gb2312"%>
<table? align="center" width=780>
?? <tr height="100">
????? <td align="center"><h1>電子書店</h1></td>
?? </tr>
?? <tr>
????? <td align="center">
???????? <!-- 超鏈接的基本格式? -->
???????? <a href="register.jsp">注冊</a>?
???????? 最新圖書 最暢銷圖書 查詢圖書 修改密碼 查詢訂單 購物車</td>
?? </tr>
?? <tr>
????? <td><hr></td>
?? </tr>
在index.jsp中引入header.jsp的代碼:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ include file="header.jsp"%>
?? <tr>
????? <td>
???????? <table>
???????????? <tr>
???????????????? <td>
???????????????????? <!--登錄界面代碼-->
???????????????????? <form action="login_process.jsp" method="post">
??????????????????????? <!-- 主要是涉及提交信息,就要用到form,action決定了提交給哪個文件處理 -->
??????????????????????? 用戶名:<input type="text" name="username" value="aaa"> <br>
??????????????????????? 口令:<input type="password" name="userpass" value=""> <br>?
??????????????????????? <input type="submit" value="登錄"><input type="reset" value="重寫">
???????????????????? </form>
???????????????? </td>
???????????????? <td>
????????????????????? 歡迎光臨我們的書店!
???????????????? </td>
???????????? </tr>
???????? </table>
????? </td>
?? </tr>
</table>
?
運行過程:在轉換的時候,當遇到include指令的時候會把include指令指向的目標文件的內容拷貝到當前位置,替換include指令,這樣最后形成一個文件。然后才編譯形成class文件,然后運行。
2、<jsp:forward>標簽
?? 我們使用登錄功能的模擬來介紹。
?? 首先,使用Java代碼完成判斷,使用<jsp:forward>完成跳轉,代碼:
<%@ page contentType="text/html;charset=gb2312"%>
<%
?? // 先獲取用戶輸入的用戶名和口令,然后判斷是否合法
?? String username = request.getParameter("username");
?? String userpass = request.getParameter("userpass");
?? if(username.equals("zhangsan") && userpass.equals("zhangsan"))
?? {
%>
?????? <jsp:forward page="success.jsp"/>
<%
?? }else{
%>
?????? <jsp:forward page="index.jsp"/>
<%
?? }
%>
?? 注意:不管跳轉到success.jsp還是index.jsp,地址欄都是處理文件的名字。
?? <jsp:forward>的語法格式:
?????? <jsp:forward page="目標文件"/>
?? page屬性指出轉向的目標文件。最后的結束符為“/>”,斜杠不能省略。
?? 另外一個可以完成跳轉的方式是采用response.sendRedirect()。response和request一樣,都是內容對象,可以直接訪問。修改上面的文件:
<%@ page contentType="text/html;charset=gb2312"%>
<%
?? // 先獲取用戶輸入的用戶名和口令,然后判斷是否合法
?? String username = request.getParameter("username");
?? String userpass = request.getParameter("userpass");
?? if(username.equals("zhangsan") && userpass.equals("zhangsan"))
?? {
?????? response.sendRedirect("success.jsp");
?? }else{
?????? response.sendRedirect("index.jsp");
?? }
%>
?? <jsp:forward>和response.sendRedirect的運行效果相同(針對上面的這個例子)。
?? 相同點:都是轉向目標文件。
?? 不同點:地址欄中顯示的內容是不相同的,如果使用<jsp:forward>,地址欄顯示當前文件的名字,如果使用response,地址欄顯示的是轉向后的文件的名字。執行過程不同:使用<jsp:forward>相當于一次請求,使用response相當于兩次請求。
?? 使用<jsp:forward>的情況:
?? index.jsp中輸入用戶名和口令,提交給login_process.jsp,服務器保存用戶的輸入信息,使用<jsp:forward>轉向success.jsp之后,success.jsp還可以訪問用戶輸入的信息,因為輸入同一次請求。
?? 使用response的請求:
?? index.jsp中輸入用戶名和口令,提交給login_process.jsp,服務器保存用戶的輸入信息,使用response的sendRedirect方法相當于重新向服務器發送一次請求,這樣上次的請求內容(用戶名和口令)就不能共享了。
???
3、<jsp:include>標簽
?? 把index.jsp中<%@ include="header.jsp"%>替換成<jsp:include page="header.jsp"/>
?? 從運行效果上相同。
?? 不同點:1、兩個文件,目標文件是單獨運行的,當前文件運行到<jsp:include>標簽的時候,轉向執行標簽所指向的目標文件,執行之后返回繼續標簽之后的內容。
?? 2、<%@ include%>指令是在編譯(轉換)的時候使用,<jsp:include>在運行的時候起作用。
?? 程序中如何選用:要導入的內容是不是每次都執行,如果每次都執行的話,應該使用<%@ include%>,如果是在特定的條件下,應該使用<jsp:include>。例如,登錄之后要么轉向success.jsp要么轉向index.jsp,如果在程序中使用導入,應該用<jsp:include>。
4、<jsp:include>和<jsp:forward>區別
?? 把login_process.jsp中的<jsp:forward>替換成<jsp:include>:
<%@ page contentType="text/html;charset=gb2312"%>
<%
?? // 先獲取用戶輸入的用戶名和口令,然后判斷是否合法
?? String username = request.getParameter("username");
?? String userpass = request.getParameter("userpass");
?? if(username.equals("zhangsan") && userpass.equals("zhangsan"))
?? {
%>
?????? <jsp:include page="success.jsp"/>
<%
?? }else{
%>
?????? <jsp:include page="index.jsp"/>
<%
?? }
%>
??? 運行效果是相同的。但是有不同點,修改代碼如下:
<%@ page contentType="text/html;charset=gb2312"%>
處理文件的前半部分<br>
<%
?? // 先獲取用戶輸入的用戶名和口令,然后判斷是否合法
?? String username = request.getParameter("username");
?? String userpass = request.getParameter("userpass");
?? if(username.equals("zhangsan") && userpass.equals("zhangsan"))
?? {
%>
?????? <jsp:include page="success.jsp"/>
<%
?? }else{
%>
?????? <jsp:include page="index.jsp"/>
<%
?? }
%>
<br>處理文件的后半部分
兩次運行結果不相同。
分析原因:
?? <jsp:forward>:先執行標簽之前的內容,遇到標簽的時候轉向執行目標文件,執行完不返回,顯示的內容為目標文件的內容,標簽之前的內容執行,但是不顯示。標簽之后的內容不會執行,當然更不會顯示。
?? <jsp:include>:先執行標簽之前的內容,遇到標簽轉向執行目標文件,執行完返回,繼續執行標簽之后的內容,顯示的內容為:標簽之前的內容+目標文件的內容+標簽之后的內容,標簽的前后都執行,都顯示。
5、使用標準標簽庫(JSTL)完成登錄的判斷過程
?? 如何使用標簽標簽庫:(1)得到標簽庫的實現文件,jstl.jar和standard.jar,放在WEB-INF下面的lib子文件夾。(2)在JSP文件中要聲明標簽庫,通過tablib指令進行聲明:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> (3)使用標簽:<c:if test="">? </c:if>
?? 要完成判斷,可以使用標簽標簽庫中的c:if標簽。標簽的基本格式:
?? <c:if? test="">條件成功要執行的內容</c:if>
?? test表示測試條件,測試條件可以寫常量,可以是表達式語言(EL,主要用于輸出),主要使用表達式語言。
?? 例如:要判斷用戶提交的用戶名和口令是否是zhangsan。
?? <c:if test="${param.username==/"zhangsan/" && param.userpass==/"zhangsan/"}">?
?????? <jsp:forward page="success.jsp"/>?
?? </c:if>
?? 注意:添加完標準標簽庫之后,需要重新啟動服務器。
6、使用session保存登錄后的信息
?? 在網站中設置了application session request pageContext對象保存內存中的信息。application是網站所有用戶共享的存儲變量的位置。session是網站為每個訪問網站的人創建的,每個用戶對應一個session,也是存放變量的位置。request是為每個用戶的每次請求設置的存儲信息的位置,每次訪問會有一個request。pageContext是每次訪問的每個頁面對應一個。常用的session和request。多次訪問之間要共享信息可以使用session,如果在某次訪問的多個頁面之間共享信息使用request(例如,使用jsp:forwrad轉向的文件和當前文件就屬于同一次請求)。
?? 登錄后的用戶信息應該放在session中。
?? 要在這些范圍中保存信息,可以使用標準標簽庫中的<c:set>標簽完成。
?? <c:set>的基本語法格式:
?? <c:set var="變量的名字" scope="范圍" value="值"/>
???
?? 要把用戶名放到session中:
?? <c:set var="username" scope="session" value="${param.username}"/>
******http://blog.csdn.net/javaeeteacher*******************************************************************
*************************************************第三講結束************************************************
***********************************************************************李老師的一畝三分地******************
第四講(參考《Java Web程序設計基礎教程》第6章)
1、對Servlet的理解
??? Servlet是一種Java類。
??? Servlet能夠完成與JSP相同的功能。能夠接收用戶的請求,能夠調用功能類的方法,可以對用戶進行響應。
??? Servlet和JSP同屬于Java EE中Web層組件。
2、如何編寫一個Servlet
??? 假設:該Servlet的功能為顯示歡迎信息。
??? Java文件的編寫過程:(1)聲明包 (2)引入用到的其他的類 (3)類的編寫
??? 對于類:(1)類頭——修飾符 class關鍵字 類名 繼承父類 實現接口
??????????? (2)類體——成員變量 構造方法 對屬性進行操作的方法 功能類方法
??? 對于成員變量:修飾符 類型 變量名(對象名)?
??? 對于方法(不包括構造方法):修飾符 返回值類型 方法名 參數列表 異常列表 方法體
??? 對于方法體:變量的聲明 各種運算 調用其他的方法 返回結果
??? (1)聲明包,假設包名為servlet
package servlet;
??? (2)引入用到的類,javax.servlet.* javax.servlet.http.* java.io.*
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
??? (3)類頭的定義
??? 訪問控制符:public
??? 類名:HelloServlet
??? 繼承父類:javax.servlet.http.HttpServlet?
??? 實現接口:沒有要實現的接口
public class HelloServlet extends HttpServlet
??? (4)方法的定義
??? 主要的方法:init方法(用于初始化) destroy方法(釋放資源) doGet或者doPost(完成主要功能)
??? 通常主要實現doGet方法或者doPost方法,分別對應客戶端的get請求和post請求。
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
{
??? // 設置編碼方式
??? response.setContentType("text/html;charset=gb2312");
??? // 得到輸出流對象
??? PrintWriter out = response.getWriter();
??? out.println("歡迎學習JSP!");
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
{
?? doGet(request,response);
}
3、編譯存放
?? 需要用到javax.servlet.*和javax.servlet.http.*,兩個包的實現在tomcat下面的lib中,名字為servlet-api.jar。
?? 放在(編譯后的Servlet):WEB-INF/classes
?? 配置path: 把C:/Program Files/Java/jdk1.6.0/bin添加到path中,但是不能破壞原有的路徑。
?? 配置classpath:把C:/Program Files/Apache Software Foundation/Tomcat 6.0/lib/servlet-api.jar;添加到classpath中。
?? 編譯:在命令行方式下進入到classes目錄,然后使用 javac -d . HelloServlet.java?? -d表示生成包的路徑,.表示在當前位置生成。
4、配置Servlet
?? 配置文件及位置:WEB-INF下面的web.xml。
?? 配置包括兩個方面:Servlet的聲明 以及 Servlet訪問方式的聲明
?? Servlet的聲明:
?? <servlet>
????? <servlet-name>hello</servlet-name>
????? <servlet-class>servlet.HelloServlet</servlet-class>
?? </servlet>
???
?? 其中,<servlet-name>表示這個servlet的名字,可以隨便起。<servlet-class>是對應的Servlet類,應該包含包的信息。
?? Servlet訪問方式的聲明:
?? <servlet-mapping>
????? <servlet-name>hello</servlet-name>
????? <url-pattern>/hello</url-pattern>
?? </servlet-mapping>
?? 其中,<servlet-name>和Servlet聲明中的用法相同,并且應該與Servlet聲明中的名字保持一致。<url-pattern>表示訪問方式,決定了在客戶端如何訪問這個Servlet。
5、訪問Servlet
???http://127.0.0.1:8080/bookstore/hello
6、用Servlet完成login_process.jsp的功能
??? login_process.jsp主要功能,判斷用戶輸入的用戶名和口令是否合法,然后根據判斷的結果選擇界面對用戶響應。
??? 對于JSP文件來說,優勢在于顯示信息,login_process.jsp中的代碼都不是顯示信息的,主要用于控制。在Java Web應用中存在大量的這種現象。是Java Web中的控制功能。主要使用Servlet完成控制。
??? login_process.jsp的基本功能:獲取用戶的輸入信息;進行判斷;轉向。
??? 如果使用Servlet完成,功能代碼應該寫在doGet或者doPost方法中。對應上面的3個功能分別實現如下:
??? 獲取用戶信息:用戶信息存儲在doGet或者doPost方法的第一個參數中,所以從參數中獲取,獲取的代碼為
??????? String username = request.getParameter("username");
??????? String userpass = request.getParameter("userpass");
??? 判斷:
??????? if( username.equals("zhangsan") && userpass.equals("zhangsan") )
??? 轉向響應界面:
??????? 第一種方式:response.sendRedirect("index.jsp");
??????? 第二種方式:與<jsp:forward>功能相同
??????? RequestDispatcher rd = request.getRequestDispatcher("index.jsp");? // 參數是要轉向的頁面
??????? rd.forward(request,response); // 完成跳轉
LoginProcessServlet.java代碼如下:
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class LoginProcessServlet extends HttpServlet
{
? public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
? {
??????? // 獲取用戶輸入的信息
??????? String username = request.getParameter("username");
??????? String userpass = request.getParameter("userpass");
??????? if( username.equals("zhangsan") && userpass.equals("zhangsan") )
??????? {
?????????? RequestDispatcher rd = request.getRequestDispatcher("success.jsp");? // 跳轉到成功的頁面
?????????? rd.forward(request,response); // 完成跳轉?
??????? }else
??????? {
?????????? RequestDispatcher rd = request.getRequestDispatcher("index1.jsp");? // 跳轉到登錄頁面
?????????? rd.forward(request,response); // 完成跳轉?
??????? }
? }
? public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
? {
???? doGet(request,response);
? }
}
配置文件中添加如下代碼:
?? <servlet>
????? <servlet-name>login_process</servlet-name>
????? <servlet-class>servlet.LoginProcessServlet</servlet-class>
?? </servlet>
?? <servlet-mapping>
????? <servlet-name>login_process</servlet-name>
????? <url-pattern>/login_process</url-pattern>
?? </servlet-mapping>
修改index1.jsp的代碼(修改form所在行),修改前:
<form action="login_process.jsp" method="post">
修改后:
<form action="login_process" method="post">
******http://blog.csdn.net/javaeeteacher*******************************************************************
*************************************************第四講結束************************************************
***********************************************************************李老師的一畝三分地******************
第五講(參考《Java Web程序設計基礎教程》第5、7章)
1、JavaBean
?
??? JavaBean是使用Java語言編寫的組件。組件是組成一個大的系統的一部分,并且組件能夠完成特定的功能,能夠共享。
??? 可以認為JavaBean是Java類,但是具有特定的功能,并且這些功能是共享的。例如,連接數據庫的功能可以封裝單獨的Java類,常用處理方法可以封裝成JavaBean。
2、早期的JSP中提供的對JavaBean的支持
?? <jsp:useBean>標簽用于定義JavaBean的對象;<jsp:setProperty>標簽用于設置JavaBean的屬性;<jsp:getProperty>用于獲取并輸出JavaBean的屬性。
?? 因為Java Web中,很少在JSP中直接訪問JavaBean,所以實際上這些標簽幾乎沒有用。現在主要在Servlet中訪問JavaBean。
3、JavaBean的編寫和用法
?? 例:以用戶信息驗證為例介紹JavaBean的編寫。
??
?? 1)聲明包
package bean;
?? 2)引入相應的類或者包
import java.sql.*;
// java.sql是訪問數據庫所需要的包
?? 3)類頭的定義
public class UserBean
?? 4)成員變量
private String username;
private String userpass;
?? 5)構造方法
// JavaBean要求應該提供一個無參數的構造方法
?? public UserBean(){
?? }
?? public UserBean(String username,String userpass){
????? this.username = username;
????? this.userpass = userpass;
?? }
?? 6)對屬性進行操作的方法
?? 包括獲取屬性值的方法和對屬性進行賦值的方法。
?? 命名方法:
?? 對于普通屬性來說,如果屬性為a,應該提供setA(屬性類型 a)方法和getA()方法。
?? 對于布爾類型的屬性來說,應該提供類似于isA()方法。
?? public void setUsername(String username){
????? this.username = username;
?? }
?? public String getUsername(){
????? return username;
?? }
?? public void setUserpass(String userpass){
????? this.userpass = userpass;
?? }
?? public String getUserpass(){
????? return userpass;
?? }
?? 7)功能類方法
?? 該JavaBean完成的功能是判斷用戶信息是否合法,需要在JavaBean中編寫相應的方法。???
?? public boolean login(){
????? return username.equals(userpass);
?? }
?? 8)編譯JavaBean
?? 9)部署
?? 所有的Java類都應該放在WEB-INF下面的classes下面,所以該JavaBean也應該放在這個地方。
4、使用JDBC的準備工作
?? JDBC是Java DataBase Connectivity的縮寫,是一組標準的接口,用于完成Java應用與各種數據庫之間的交互。
?? 要使用JDBC需要做哪些準備工作?
?? 1)創建數據庫?
?? 2)得到JDBC驅動程序,驅動程序是完成具體的交互過程的,每種數據庫有自己特定的驅動程序,從數據庫管理系統的提供商的網站下載?
?? 3)要知道數據庫的相關信息:JDBC驅動程序的名字、數據庫的位置、數據庫的端口、用戶名和口令、url的格式(建立連接的時候用)
?? 注意:我們使用JDBC-ODBC橋的方式連接數據庫。JDBC-ODBC橋是一種類型的驅動程序,共有4種類型的驅動程序,JDBC-ODBC橋是建立在ODBC數據源基礎上的。驅動是JDK中附帶的,不用下載。
5、創建數據庫及測試數據
create table usertable
(
?? username varchar(10) primary key,
?? userpass varchar(10)
)
insert into usertable values('lisi','lisi');
insert into usertable values('zhangsan','zhangsan');
6、創建ODBC數據源
?? 在 開始--〉設置--〉控制面板-->管理工具--〉數據源(ODBC)? 設置ODBC數據源的名字為bookstore
7、修改login方法,通過數據庫進行驗證
?? 1)使用JDBC連接數據庫的基本過程
?? 加載驅動程序;
?? 建立與數據庫之間的連接;
?? 創建一個執行SQL語句的語句對象;
?? 編寫要執行的SQL語句;
?? 使用語句對象執行SQL語句;
?? 如果有結果,需要對結果進行處理;
?? 關閉相關對象;
?? 注意:異常處理。
?? 2)修改login方法
?? public boolean login() throws Exception{
????? // return username.equals(userpass);
????? // 第一步:加載驅動程序,如果使用其它的驅動程序,寫出相應的名字即可
????? Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
????? // 第二步:建立連接,第一個參數是url(定位數據庫),第二個參數是用戶名,第三個參數是口令
????? Connection con = DriverManager.getConnection("jdbc:odbc:bookstore","","");? // bookstore是所創建的ODBC數據源的名字
????? // 第三步:創建SQL語句
????? String sql = "select * from usertable where username=? and userpass=?";
????? // 第四步:創建語句對象,用于執行SQL語句的
????? PreparedStatement stmt = con.prepareStatement(sql);
????? // 對變量賦值,第一個參數表示變量的序號(第幾個問號),第二個參數表示所賦的值
????? stmt.setString(1,username);
????? stmt.setString(2,userpass);
????? // 第五步:執行SQL語句,因為有查詢結果,所以使用executeQuery方法,結果保存在rs中
????? ResultSet rs = stmt.executeQuery();
????? //? rs相當于一個表格,有若干行、若干列組成,指針指向第一條記錄的前面
????? // 第六步:對結果進行處理,使用next方法進行遍歷,使用get方法得到當前行的列
????? boolean b = rs.next();
????? // 第七步:關閉相關對象
????? rs.close();?
????? stmt.close();
????? con.close();
????? return b;??????
?? }
?? 3)修改LoginProcessServlet.java
修改后的代碼為:
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import bean.*;
public class LoginProcessServlet extends HttpServlet
{
? public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
? {
??????? // 獲取用戶輸入的信息
??????? String username = request.getParameter("username");
??????? String userpass = request.getParameter("userpass");
??????? // 調用JavaBean,創建對象、初始化、然后調用方法
??????? UserBean user = new UserBean();
??????? user.setUsername(username);
??????? user.setUserpass(userpass);
??????? boolean b = false;
??????? try{
??????????? b = user.login();
??????? }catch(Exception e){
??????????? // 當產生異常的時候,把異常信息輸出在界面上
??????????????? // 設置編碼方式
??????????????? response.setContentType("text/html;charset=gb2312");
??????????????? // 得到輸出流對象
??????????????? PrintWriter out = response.getWriter();
??????????????? out.println(e.toString());
??????????????? return;
??????? }
??????? // 轉向響應界面
??????? if(b){
?????????? RequestDispatcher rd = request.getRequestDispatcher("success.jsp");? // 跳轉到成功的頁面
?????????? rd.forward(request,response); // 完成跳轉?
??????? }else{
?????????? RequestDispatcher rd = request.getRequestDispatcher("index1.jsp");? // 跳轉到登錄頁面
?????????? rd.forward(request,response); // 完成跳轉?
??????? }
/*
??????? if( username.equals("zhangsan") && userpass.equals("zhangsan") )
??????? {
?????????? RequestDispatcher rd = request.getRequestDispatcher("success.jsp");? // 跳轉到成功的頁面
?????????? rd.forward(request,response); // 完成跳轉?
??????? }else
??????? {
?????????? RequestDispatcher rd = request.getRequestDispatcher("index1.jsp");? // 跳轉到登錄頁面
?????????? rd.forward(request,response); // 完成跳轉?
??????? }
*/
? }
? public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
? {
???? doGet(request,response);
? }
}
找到:
??????? boolean b = user.login();
修改為:??????
??????? boolean b = false;
??????? try{
??????????? b = user.login();
??????? }catch(Exception e){
??????????? // 當產生異常的時候,把異常信息輸出在界面上
??????????????? // 設置編碼方式
??????????????? response.setContentType("text/html;charset=gb2312");
??????????????? // 得到輸出流對象
??????????????? PrintWriter out = response.getWriter();
??????????????? out.println(e.toString());
??????????????? return;
??????? }
******http://blog.csdn.net/javaeeteacher*******************************************************************
*************************************************第五講結束************************************************
***********************************************************************李老師的一畝三分地******************
第六講(參考《Java Web程序設計基礎教程》第6、9章)
1、分析登錄功能
?? 界面:登錄界面index1.jsp;登錄成功的界面login_success.jsp。
?? 功能:UserBean的login方法完成登錄的判斷。
?? Servlet:LoginServlet.java
????? (1)接收用戶輸入的用戶名和口令(2)調用UserBean的login方法進行判斷(3)根據方法的返回值選擇界面響應。
2、MVC模式
??? M表示模型,主要表示系統中的功能處理部分。例如,上面的UserBean就是一個模型,描述用戶信息以及相關功能。
??? V表示視圖,表示系統中與人進行交互的部分。例如,上面的index1.jsp和login_success.jsp。
??? C表示控制器,建立模型與視圖之間的關聯關系。例如,上面的LoginServlet.java。
?????? 輸入界面直接調用控制器,控制器接收用戶在輸入界面上輸入的信息,控制器把信息傳遞給模型,調用模型的方法,方法會給控制器返回一個值,控制器根據這個值選擇輸出界面對用戶響應。
??? MVC模式把系統的每一個功能都分解成這個3個部分。然后分別實現。
3、采用MVC模式實現注冊功能
??? 一般先考慮V,包括輸入界面和輸出界面,對于注冊功能來說,輸入是注冊界面,輸出是注冊成功或者失敗的界面,通常使用JSP文件。
??? 接下來考慮M,功能如何實現,對于注冊功能來說,需要把用戶提交的信息寫到數據庫中。需要在UserBean中編寫添加用戶的方法。
??? 考慮C,如何協調M和V。需要編寫Servlet,在doGet或者doPost方法中主要完成:接收輸入;調用UserBean的方法;選擇界面響應。
4、創建注冊用的表
create table usertable2
(
?? username varchar(10) primary key,
?? userpass varchar(10),
?? sex char(2),
?? fav varchar(20),
?? degree varchar(8),
?? comment varchar(100),
?? email varchar(30)
)
5、V部分
?? 采用原來的register.jsp和success.jsp。
6、M部分
???
?? 在UserBean中添加方法,add方法。方法代碼如下:
?? public boolean add(){
????? // 定義變量
????? Connection con = null;
????? PreparedStatement stmt = null;
????? String driverClass = "sun.jdbc.odbc.JdbcOdbcDriver";
????? String url = "jdbc:odbc:bookstore";
????? String sql = "insert into usertable2 values(?,?,?,?,?,?,?)";
????? boolean success = true;
????? try{
???????? // 第一步:加載驅動
???????? Class.forName(driverClass);
???????? // 第二步:建立連接
???????? con = DriverManager.getConnection(url,"","");
???????? // 第三步:創建語句對象
???????? stmt = con.prepareStatement(sql);
???????? // 第四步:對SQL語句中參數賦值
???????? stmt.setString(1,username);
???????? stmt.setString(2,userpass);
???????? stmt.setString(3,sex);
???????? stmt.setString(4,fav);
???????? stmt.setString(5,degree);
???????? stmt.setString(6,comment);
???????? stmt.setString(7,email);
???????? // 第五步:執行SQL語句
???????? int n = stmt.executeUpdate();
???????? // 執行沒有結果集返回的SQL語句使用executeUpdate方法,方法的返回值是整數,表示操作成功的記錄數
???????? if(n==0)
??????????? success = false;
????? }catch(Exception e){
???????? success = false;
???????? System.out.println(e.getMessage());
????? }finally{
???????? try{ stmt.close(); }catch(Exception ee){}
???????? try{ con.close(); }catch(Exception ee){}
????? }
????? return success;
?? }
7、C部分
??? 編寫Servlet,完成添加的控制。控制器的代碼如下:
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import bean.*;
public class AddUserServlet extends HttpServlet
{
? public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
? {
??????? // 請求中采用的編碼方式是8859_1,當前的編碼是gb2312,需要轉換
??????? request.setCharacterEncoding("gb2312");
??????? // 第一句話:獲取用戶輸入的信息
??????? String username = request.getParameter("username");
??????? String userpass1 = request.getParameter("userpass1");
??????? String sex = request.getParameter("sex");
??????? // 因為允許多選,所以結果有可能是多個,應該使用數組接收。
??????? String fav[] = request.getParameterValues("fav");
??????? String favStr = "";
??????? for(int i=0;i<fav.length;i++)
??????? {
?????????? favStr += fav[i]+";";
??????? }
??????? String degree = request.getParameter("degree");
??????? String comment = request.getParameter("content");
??????? String email = request.getParameter("email");
??????? // 第二句話:調用JavaBean,創建對象、初始化、然后調用方法
??????? UserBean user = new UserBean();
??????? user.setUsername(username);
??????? user.setUserpass(userpass1);
??????? user.setSex(sex);
??????? user.setFav(favStr);
??????? user.setDegree(degree);
??????? user.setEmail(email);
??????? user.setComment(comment);
??????? boolean b = user.add();
??????? // 第三句話:向頁面傳遞信息
??????? if(b)
??????????? request.setAttribute("info","注冊成功!");
??????? else
??????????? request.setAttribute("info","注冊失敗!");
??????? // 第四句話:轉向響應界面
??????? RequestDispatcher rd = request.getRequestDispatcher("success.jsp");?
??????? rd.forward(request,response); // 完成跳轉
/*
??????? if( username.equals("zhangsan") && userpass.equals("zhangsan") )
??????? {
?????????? RequestDispatcher rd = request.getRequestDispatcher("success.jsp");? // 跳轉到成功的頁面
?????????? rd.forward(request,response); // 完成跳轉?
??????? }else
??????? {
?????????? RequestDispatcher rd = request.getRequestDispatcher("index1.jsp");? // 跳轉到登錄頁面
?????????? rd.forward(request,response); // 完成跳轉?
??????? }
*/
? }
? public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
? {
???? doGet(request,response);
? }
}
??? 之后對Servlet進行配置,在web.xml中添加如下代碼:
?? <servlet>
????? <servlet-name>addUser</servlet-name>
????? <servlet-class>servlet.AddUserServlet</servlet-class>
?? </servlet>
?? <servlet-mapping>
????? <servlet-name>addUser</servlet-name>
????? <url-pattern>/addUser</url-pattern>
?? </servlet-mapping>
?? 需要修改register.jsp中的form的屬性action:
?????????? <form action="addUser" method="post" name="form1">
8、測試
??? 編譯、啟動服務器,然后運行。
本人的blog:??http://blog.csdn.net/javaeeteacher
******http://blog.csdn.net/javaeeteacher*******************************************************************
*************************************************第六講結束************************************************
***********************************************************************李老師的一畝三分地******************
第七講(參考《Java Web程序設計基礎教程》第7章)
1、共享連接數據庫的代碼
??? 連接數據庫的基本過程:
??? 1)加載驅動程序;
??? 2)創建連接;
??? 3)編寫SQL語句;
??? 4)創建語句對象;
??? 5)對參數賦值;
??? 6)執行SQL 語句;
??? 7)對結果進行處理;
??? 8)關閉對象。
??? 對于不同的SQL的執行,不同的地方:
??? SQL語句;
??? 參數;
??? 結果的處理方式;
??? 提取相同部分分別編寫成方法:
?? Connection con = null;
?? PreparedStatement stmt = null;
?? ResultSet rs = null;
?? String driverClass = "sun.jdbc.odbc.JdbcOdbcDriver";
?? String url = "jdbc:odbc:bookstore";
?? // 完成連接的創建,相當于第1.2步
?? public Connection getConnection() throws Exception{
????? Class.forName(driverClass); // 加載驅動程序
????? if(con == null)
???????? con = DriverManager.getConnection(url,"","");
????? return con;
?? }
?? // 創建語句對象
?? public PreparedStatement createStatement(String sql) throws Exception{
????? stmt = getConnection().prepareStatement(sql);
????? return stmt;
?? }??
?? // 執行有結果集返回的方法
?? public ResultSet executeQuery() throws Exception{
????? rs = stmt.executeQuery();
????? return rs;
?? }
?? // 執行沒有結果集返回的方法
?? public int executeUpdate() throws Exception{
????? return stmt.executeUpdate();
?? }
?? // 關閉對象
?? public void close(){
????? if(rs != null)?
???????? try{ rs.close();? }catch(Exception e){}?
????? if(stmt != null)?
???????? try{ stmt.close();? }catch(Exception e){}?
????? if(con != null)?
???????? try{ con.close();? }catch(Exception e){}?
?? }
2、修改上一次課的添加功能,使用這些共享方法
????? String sql = "insert into usertable2 values(?,?,?,?,?,?,?)";
????? boolean success = true;????
????? try{
???????? // 創建語句對象
???????? createStatement(sql);
?????????
???????? // 對SQL語句中參數賦值
???????? stmt.setString(1,username);
???????? stmt.setString(2,userpass);
???????? stmt.setString(3,sex);
???????? stmt.setString(4,fav);
???????? stmt.setString(5,degree);
???????? stmt.setString(6,comment);
???????? stmt.setString(7,email);
???????? // 執行SQL語句
???????? int n = executeUpdate();
???????? // 執行沒有結果集返回的SQL語句使用executeUpdate方法,方法的返回值是整數,表示操作成功的記錄數
???????? if(n==0)
??????????? success = false;
????? }catch(Exception e){
???????? success = false;
???????? System.out.println(e.getMessage());
????? }finally{
???????? close();
????? }??
????? return success;
3、查詢所有圖書
?? 1)創建圖書表
?? create table books(
????? bookid varchar(10) primary key,
????? bookname varchar(30),
????? author varchar(20),
????? price float,
????? publisher varchar(20)
?? )
?? 插入一些模擬數據
insert into books values('00001','Java','zhangsan',20,'電子工業')
insert into books values('00002','JSP','lisi',22,'人民郵電')
insert into books values('00003','Java EE','wang',30,'人民郵電')
?? 2)V部分
?? V主要與人進行交互,要考慮輸入和輸出
?? 輸入:在導航條中添加“查看所有圖書”的超鏈。
<a href="findAllBooks">顯示所有圖書</a>
?? 輸出:顯示所有圖書信息的JSP文件。
文件名:books.jsp
文件內容:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ include file="header.jsp"%>
?? <tr>
????? <td>
????????? <table align="center" border="1">
???????????? <tr>
??????????????? <td>圖書編號</td><td>圖書名稱</td><td>作者</td><td>價格</td><td>出版社</td>
???????????? </tr>
???????????? <!--? c:forEach用于循環控制,items屬性指出要循環遍歷的集合,var定義一個循環變量,表示集合中的一個元素 -->
???????????? <c:forEach var="book" items="${books}">
??????????????? <tr>
??????????????????? <td>${book.bookid}</td>
??????????????????? <td>${book.bookname}</td>
??????????????????? <td>${book.author}</td>
??????????????????? <td>${book.price}</td>
??????????????????? <td>${book.publisher}</td>
??????????????? </tr>
???????????? </c:forEach>
????????? </table>
????? </td>
?? </tr>
</table>
?? 3)M部分
?? 完成功能:從數據庫中查詢所有的圖書。
文件名:BookBean.java
文件內容:
package bean;
import java.sql.*;?
import java.util.ArrayList;
public class BookBean extends Base{
?? // 描述圖書的屬性
?? private String bookid;
?? private String bookname;
?? private String author;
?? private float price;
?? private String publisher;
?? // 編寫對乘員進行操作的方法
?? public void setBookid(String bookid){
????? this.bookid = bookid;
?? }
?? public String getBookid(){
????? return bookid;
?? }
?? public void setBookname(String bookname){
????? this.bookname = bookname;
?? }
?? public String getBookname(){
????? return bookname;
?? }
?? public void setAuthor(String author){
????? this.author = author;
?? }
?? public String getAuthor(){
????? return author;
?? }
?? public void setPrice(float price){
????? this.price = price;
?? }
???
?? public float getPrice(){
????? return price;
?? }
?? public void setPublisher(String publisher){
????? this.publisher = publisher;
?? }
?? public String getPublisher(){
????? return publisher;
?? }??
?? public ArrayList findAllBooks(){
????? ArrayList books = new ArrayList();
????? String sql = "select * from books";
????? try{
???????? createStatement(sql);
???????? rs = executeQuery();
???????? // 使用while循環遍歷結果集
???????? while(rs.next())
???????? {
??????????? // 使用rs的getString方法,以字符串的形式獲取第一列,參數也可以是列的名字
??????????? // 可以得到當前記錄的每一列
??????????? String tempBookid = rs.getString(1);
??????????? String tempBookname = rs.getString(2);
??????????? String tempAuthor = rs.getString(3);
??????????? float tempPrice = rs.getFloat(4);
??????????? String tempPublisher = rs.getString(5);
??????????? // 創建圖書對象
??????????? BookBean book = new BookBean();
??????????? book.setBookid(tempBookid);
??????????? book.setBookname(tempBookname);
??????????? book.setAuthor(tempAuthor);
??????????? book.setPrice(tempPrice);
??????????? book.setPublisher(tempPublisher);
??????????? // 把書添加到鏈表中
??????????? books.add(book);
???????? }
????? }catch(Exception e){
???????? System.out.println(e.toString());
????? }finally{
???????? close();
????? }
????? return books;
?? }
}
?? 4)C部分
?? 控制器:4句話。本功能只用到3句。
文件名:FindAllBooks。
文件內容:
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import bean.*;
import java.util.ArrayList;
public class FindAllBooks extends HttpServlet
{
? public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
? {
??????? // 第二句話:調用JavaBean,創建對象、初始化、然后調用方法
??????? BookBean book = new BookBean();
??????? ArrayList books = book.findAllBooks();
??????? // 第三句話:向頁面傳遞信息,第一個參數是使用的名字,應該和顯示時候使用的名字一致,第二個參數傳遞的值本身
??????? request.setAttribute("books",books);
??????? // 第四句話:轉向響應界面
??????? RequestDispatcher rd = request.getRequestDispatcher("books.jsp");?
??????? rd.forward(request,response); // 完成跳轉
? }
? public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
? {
???? doGet(request,response);
? }
}
在web.xml中進行配置
?? <servlet>
????? <servlet-name>findAllBooks</servlet-name>
????? <servlet-class>servlet.FindAllBooks</servlet-class>
?? </servlet>
?? <servlet-mapping>
????? <servlet-name>findAllBooks</servlet-name>
????? <url-pattern>/findAllBooks</url-pattern>
?? </servlet-mapping>
******http://blog.csdn.net/javaeeteacher*******************************************************************
*************************************************第七講結束************************************************
***********************************************************************李老師的一畝三分地******************
第八講(參考《Java Web程序設計基礎教程》第10章)
1、刪除功能設計
?? 1)V部分
?? 輸入:可以在圖書列表界面中添加一列,使用超鏈鏈接到刪除功能,需要把將要刪除的圖書的編號傳遞過去。
?? 輸出:刪除成功或者失敗的提示界面。
?? 2)M部分
?? 刪除功能需要在BookBean添加一個刪除的方法,方法需要參數來指定刪除哪一本書。
?? 3)C部分
?? 4句話:從輸入界面獲取要刪除的圖書的編號;根據編號調用JavaBean的刪除圖書的方法;把刪除成功或者失敗的消息傳遞到界面(通過request);轉向響應界面。
2、輸入界面
?? 在books.jsp中的表格后面增加一列。
<%@ page contentType="text/html;charset=gb2312"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ include file="header.jsp"%>
?? <tr>
????? <td>
????????? <table align="center" border="1">
???????????? <tr>
??????????????? <td>圖書編號</td><td>圖書名稱</td><td>作者</td><td>價格</td><td>出版社</td><td></td>
???????????? </tr>
???????????? <!--? c:forEach用于循環控制,items屬性指出要循環遍歷的集合,var定義一個循環變量,表示集合中的一個元素 -->
???????????? <c:forEach var="book" items="${books}">
??????????????? <tr>
??????????????????? <td>${book.bookid}</td>
??????????????????? <td>${book.bookname}</td>
??????????????????? <td>${book.author}</td>
??????????????????? <td>${book.price}</td>
??????????????????? <td>${book.publisher}</td>
??????????????????? <td> <a href="deleteBook?bookid=${book.bookid}">刪除</a> </td>
??????????????? </tr>
???????????? </c:forEach>
????????? </table>
????? </td>
?? </tr>
</table>
3、輸出界面
??? 把success.jsp作為輸出界面。
4、M部分
??? 在BookBean中添加deleteBook方法,代碼如下:
?? // 根據編號刪除圖書
?? public boolean deleteBook(String bookid){
????? // 表示刪除成功還是失敗
????? boolean success=true;
????? // 編寫SQL語句
????? String sql = "delete from books where bookid=?";
????? try{
???????? // 創建語句對象
???????? createStatement(sql);
???????? // 對SQL中的參數賦值
???????? stmt.setString(1,bookid);
???????? if( stmt.executeUpdate()>0 )
??????????? success = true;
???????? else
??????????? success = false;
????? }catch(Exception e){
???????? success = false;
???????? System.out.println(e.toString());?????????
????? }finally{
???????? close();
????? }
????? return success;
?? }
5、C部分
?? 記住4句話即可。參考代碼如下:
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import bean.*;
import java.util.ArrayList;
public class DeleteBook extends HttpServlet
{
? public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
? {
??????? // 第一句話:獲取要刪除的圖書?
??????? String bookid = request.getParameter("bookid");
??????? // 第二句話:調用JavaBean,創建對象、初始化、然后調用方法
??????? BookBean book = new BookBean();
??????? boolean success = book.deleteBook(bookid);
??????? // 第三句話:向頁面傳遞信息,第一個參數是使用的名字,應該和顯示時候使用的名字一致,第二個參數傳遞的值本身
??????? String info;
??????? if(success)
?????????? info="刪除成功!";
??????? else
?????????? info="刪除失敗";
??????? request.setAttribute("info",info);
??????? // 第四句話:轉向響應界面
??????? RequestDispatcher rd = request.getRequestDispatcher("success.jsp");?
??????? rd.forward(request,response); // 完成跳轉
? }
? public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
? {
???? doGet(request,response);
? }
}
在web.xml中添加配置,相關代碼如下:
?? <servlet>
????? <servlet-name>deleteBook</servlet-name>
????? <servlet-class>servlet.DeleteBook</servlet-class>
?? </servlet>
?? <servlet-mapping>
????? <servlet-name>deleteBook</servlet-name>
????? <url-pattern>/deleteBook</url-pattern>
?? </servlet-mapping>
6、圖書信息修改功能設計
?? 用戶操作過程:首先先顯示要修改的圖書信息,然后修改后提交更新數據庫。
?? 首先考慮顯示信息的過程:根據用戶的選擇顯示相應圖書的信息。
?? 采用MVC模式設計如下:
?? V部分:輸入可以采用與刪除功能類似的方式,在圖書列表之后增加一修改列。輸出是修改界面。
?? M部分:根據圖書編號查詢圖書信息。需要在BookBean中添加一個根據編號查詢圖書的方法。
?? C部分:4句話,獲取圖書編號;把編號作為參數調用JavaBean中查詢圖書的方法;把查詢到的圖書對象保存到request;轉向修改界面。
7、輸入界面
?? 修改books.jsp
<%@ page contentType="text/html;charset=gb2312"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ include file="header.jsp"%>
?? <tr>
????? <td>
????????? <table align="center" border="1">
???????????? <tr>
??????????????? <td>圖書編號</td><td>圖書名稱</td><td>作者</td><td>價格</td><td>出版社</td><td></td><td></td>
???????????? </tr>
???????????? <!--? c:forEach用于循環控制,items屬性指出要循環遍歷的集合,var定義一個循環變量,表示集合中的一個元素 -->
???????????? <c:forEach var="book" items="${books}">
??????????????? <tr>
??????????????????? <td>${book.bookid}</td>
??????????????????? <td>${book.bookname}</td>
??????????????????? <td>${book.author}</td>
??????????????????? <td>${book.price}</td>
??????????????????? <td>${book.publisher}</td>
??????????????????? <td> <a href="deleteBook?bookid=${book.bookid}">刪除</a> </td>
??????????????????? <td> <a href="findBookByID?bookid=${book.bookid}">修改</a> </td>
??????????????? </tr>
???????????? </c:forEach>
????????? </table>
????? </td>
?? </tr>
</table>
8、輸出界面
? 修改界面:顯示從控制器傳遞過來的BookBean對象book。
<%@ page contentType="text/html;charset=gb2312"%>
<%@ include file="header.jsp"%>
?? <tr>
????? <td>
?????????? <form action="updateBook" method="post" name="form1">
?????????????? <table align="center">
????????????????? <tr>?
????????????????????? <td>圖書編號:</td>
????????????????????? <td><input type="hidden" name="bookid" value="${book.bookid}">${book.bookid}</td>
????????????????? </tr>
????????????????? <tr>
????????????????????? <td>圖書名:</td>
????????????????????? <td><input type="text" name="bookname" value="${book.bookname}"></td>
????????????????? </tr>
????????????????? <tr>
????????????????????? <td>作者:</td>
????????????????????? <td><input type="text" name="author"? value="${book.author}"></td>
????????????????? </tr>
????????????????? <tr>
????????????????????? <td>價格:</td>
????????????????????? <td><input type="text" name="price"? value="${book.price}"></td>
????????????????? </tr>
????????????????? <tr>
????????????????????? <td>出版社:</td>
????????????????????? <td><input type="text" name="publisher"? value="${book.publisher}"></td>
????????????????? </tr>
????????????????? <tr>
????????????????????? <td><input type="submit" value="提交"></td>
????????????????????? <td><input type="reset" value="重寫"></td>
????????????????? </tr>
?????????????? </table>
?????????? </form>
????? </td>
?? </tr>
</table>
9、編寫根據ID查詢圖書的方法
??? 在BookBean中添加方法
?? // 根據編號查詢圖書
?? public BookBean findBookByID(String bookid){
????? BookBean book=new BookBean();
????? String sql = "select * from books where bookid=?";
????? try{
???????? createStatement(sql);
???????? stmt.setString(1,bookid);
???????? rs = executeQuery();
???????? // 轉換成對象
???????? rs.next();
???????? // 使用rs的getString方法,以字符串的形式獲取第一列,參數也可以是列的名字
???????? // 可以得到當前記錄的每一列
???????? String tempBookname = rs.getString(2);
???????? String tempAuthor = rs.getString(3);
???????? float tempPrice = rs.getFloat(4);
???????? String tempPublisher = rs.getString(5);
???????? // 創建圖書對象
???????? book.setBookid(bookid);
???????? book.setBookname(tempBookname);
???????? book.setAuthor(tempAuthor);
???????? book.setPrice(tempPrice);
???????? book.setPublisher(tempPublisher);
????? }catch(Exception e){
???????? System.out.println(e.toString());
????? }finally{
???????? close();
????? }
????? return book;
?? }
10、編寫Servlet控制器
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import bean.*;
import java.util.ArrayList;
public class FindBookByID extends HttpServlet
{
? public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
? {
??????? // 第一句話:獲取用戶選擇圖書編號
??????? String bookid = request.getParameter("bookid");
??????? // 第二句話:調用JavaBean,創建對象、初始化、然后調用方法
??????? BookBean book = new BookBean();
??????? book = book.findBookByID(bookid);
??????? // 第三句話:向頁面傳遞信息,第一個參數是使用的名字,應該和顯示時候使用的名字一致,第二個參數傳遞的值本身
??????? request.setAttribute("book",book);
??????? // 第四句話:轉向響應界面
??????? RequestDispatcher rd = request.getRequestDispatcher("updateBook.jsp");?
??????? rd.forward(request,response); // 完成跳轉
? }
? public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
? {
???? doGet(request,response);
? }
}
在web.xml中配置:
?? <servlet>
????? <servlet-name>findBookByID</servlet-name>
????? <servlet-class>servlet.FindBookByID</servlet-class>
?? </servlet>
?? <servlet-mapping>
????? <servlet-name>findBookByID</servlet-name>
????? <url-pattern>/findBookByID</url-pattern>
?? </servlet-mapping>
11、修改功能的設計
??? V部分:輸入是修改界面不用修改,只要設置form的action屬性為updateBook即可。輸出可以采用success.jsp界面。
??? M部分:在BookBean中添加修改方法。
??? C部分:4句話,獲取用戶修改后的信息;調用JavaBean,包括初始化;把執行的結果傳遞到界面;轉向界面。
12、修改BookBean中的代碼
?? 增加update方法,代碼如下:
?? // 更新圖書信息
?? public boolean update(){
????? boolean success = false;
????? String sql = "update books set bookname=?,author=?,price=?,publisher=? where bookid=?";
????? try{
???????? createStatement(sql);
???????? stmt.setString(1,bookname);
???????? stmt.setString(2,author);
???????? stmt.setFloat(3,price);
???????? stmt.setString(4,publisher);
???????? stmt.setString(5,bookid);
??
???????? int n = executeUpdate();
?????????
???????? if(n>0)
??????????? success = true;
???????? else
??????????? success = false;
????? }catch(Exception e){
???????? success = false;?????
???????? System.out.println(e.toString());
????? }finally{
???????? close();
????? }
????? return success;
?? }
13、編寫控制器
??? 為了解決亂碼,在控制器中獲取信息之前,增加如下語句:
??????? request.setCharacterEncoding("gb2312");
??? 代碼如下:
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import bean.*;
import java.util.ArrayList;
public class UpdateBook extends HttpServlet
{
? public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
? {
??????? request.setCharacterEncoding("gb2312");
??????? // 第一句話:獲取用戶選擇圖書編號
??????? String bookid = request.getParameter("bookid");
??????? String bookname = request.getParameter("bookname");
??????? String price = request.getParameter("price");
??????? String author = request.getParameter("author");
??????? String publisher = request.getParameter("publisher");
???
??????? float fPrice = 0f;
??????? try{
?????????? // 把字符串轉換成浮點型變量
?????????? fPrice = Float.parseFloat(price);?
??????? }catch(Exception e){
??????? }
??????? // 第二句話:調用JavaBean,創建對象、初始化、然后調用方法
??????? BookBean book = new BookBean();
??????? book.setBookid(bookid);
??????? book.setBookname(bookname);
??????? book.setPrice(fPrice);?
??????? book.setAuthor(author);
??????? book.setPublisher(publisher);
??????? boolean success = book.update();
??????? String info ;
??????? if(success)
?????????? info = "修改成功!";
??????? else
?????????? info = "修改失敗";
??????? // 第三句話:向頁面傳遞信息,第一個參數是使用的名字,應該和顯示時候使用的名字一致,第二個參數傳遞的值本身
??????? request.setAttribute("info",info);
??????? // 第四句話:轉向響應界面
??????? RequestDispatcher rd = request.getRequestDispatcher("success.jsp");?
??????? rd.forward(request,response); // 完成跳轉
? }
? public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
? {
???? doGet(request,response);
? }
}
修改配置文件:
?? <servlet>
????? <servlet-name>updateBook</servlet-name>
????? <servlet-class>servlet.UpdateBook</servlet-class>
?? </servlet>
?? <servlet-mapping>
????? <servlet-name>updateBook</servlet-name>
????? <url-pattern>/updateBook</url-pattern>
?? </servlet-mapping>
******http://blog.csdn.net/javaeeteacher*******************************************************************
*************************************************第八講結束************************************************
***********************************************************************李老師的一畝三分地******************
第九講(參考《Java Web程序設計基礎教程》第14章)
1、在JSP中如何存儲信息
??? 前面介紹過的:在數據庫中存儲信息;在request對象中存儲信息。
??? 分為兩類:內存 和 持久存儲
??? 內存中如何組織數據:
??? pageContext對象,存儲當前頁面的信息;請求涉及多少個文件,就會創建多少個pageContext對象。
??? request對象,一次請求會創建一個request對象,如果希望在同一次請求的多個文件之間共享信息,可以保存在request中。
??? session對象,每個客戶端對應一個session,session中用于存儲在用戶的整個訪問過程中要使用的信息。最典型的應用把用戶的登錄信息保存在session中,這樣在后續的頁面中使用登錄信息。
??? application對象,整個網站對應這樣一個對象,訪問網站的所有用戶在訪問所有網頁的時候都可以使用。典型的應用是公有的聊天室,聊天信息所有人都可以看到,這時候就應該使用application對象。
??? 持久存儲:
??? 數據庫,通過JDBC訪問。
??? 文件,通過IO進行操作。
??? Cookie,信息存儲在客戶端。如果使用數據庫和文件,信息都存在服務器端。
2、網上購物車的基本功能
???
?? 瀏覽圖書信息;
?? 把圖書添加到購物車中;
?? 對購物車中的物品進行管理;
?? 查看購物車的信息;
?? 生成訂單。
3、如何保存在購物過程中選擇的物品?
?? 關心購物車中有哪些類型的物品,每種類型的物品有多少。物品的種類數量不確定。每次請求只能選擇某一種物品。根據這些特點,應該設計購物車的存儲結構如下:
?? 1)需要把購物車放到session中,這樣才能進行多個頁面之間的共享;
?? 2)因為物品種類不確定,所以一般選擇ArrayList來存儲物品種類以及數量;
?? 3)對于每一種物品,包含物品本身的信息以及物品的購買數量,通常使用訂單項來表示,里面包含了物品對象及其數量。
4、完成向購物車中添加圖書的功能
?? V部分:輸入,是選擇物品向購物車添加的界面,使用物品信息查看界面;
????????? 輸出,顯示購物車信息的頁面。
?? M部分:把選擇的物品添加到購物車中,需要知道原來購物車中有什么信息,購物車在session中保存,所以需要對session進行操作。
?? C部分:第一句話,獲取信息,從輸入界面獲取要添加的圖書,從session中獲取原有的購物車信息。
????????? 第二句話,調用M部分的添加購物車功能。
????????? 第三句話,保存信息,把修改后的購物車重新寫入session中。
????????? 第四句話,轉向顯示購物車信息的頁面。
5、構建訂單項類
package bean;
// 表示購物項
public class Item{
?? private BookBean book;
?? private int quantity;
?? public void setBook(BookBean book){
????? this.book = book;
?? }
?? public BookBean getBook(){
????? return book;
?? }
?? public void setQuantity(int quantity){
????? this.quantity = quantity;
?? }
?? public int getQuantity(){
????? return quantity;
?? }
}
6、輸入界面
???
?? 在books.jsp中的圖書列表后增加“添加到購物車”這樣的超鏈接。
7、刪除功能、修改購物車信息
?? 界面:
?? 刪除的代碼:
?? <form action="deleteItem" method="post">
????? <input type="hidden" name="bookid" value="${item.book.bookid}">
????? <input type="submit" value="刪除">?
?? </form>
?? 修改的:
?? <form action="updateCart" method="post">
????? <input type="text" name="quantity" value="${item.quantity}">
????? <input type="hidden" name="bookid" value="${item.book.bookid}">
????? <input type="submit" value="修改">?
?? </form>
?? M部分:
?? 從ArrayList對象cart中刪除Item對象item:cart.remove(item)?? cart.remove(i)
?? 修改功能:在添加過程中如果要添加的圖書已經存在,就相當于修改。
?? C部分:與添加功能中的代碼非常類似。
******http://blog.csdn.net/javaeeteacher*******************************************************************
*************************************************第九講結束************************************************
***********************************************************************李老師的一畝三分地******************
第十講
1、MVC模式分析
?? 對任何功能來說,首先考慮人如何來使用這個功能。如何把人的請求發送給系統,系統如何把處理的結果返回給用戶,實際上就是輸入和輸出。輸入MVC模式中的V部分。
?? 輸入:用戶發送請求,通過超鏈接,通過瀏覽器的地址欄,通過表單提交。請求時候如何要提交數據,在超鏈接中以及地址欄中可以通過?的形式來傳遞值,表單方式通過表單元素提交信息。非常典型的應用,隱藏域,用于在多個頁面之間傳遞信息。注意:輸入一定要進行客戶端的格式驗證。
?? 輸出:主要服務器得到的信息顯示給用戶。輸出提示信息:${info}? 輸出對象信息:在更新界面中顯示信息${book.bookid}? 輸出多個對象的信息:
??????????? <c:forEach var="book" items="${books}">
??????????????? <tr>
??????????????????? <td>${book.bookid}</td>
??????????????????? <td>${book.bookname}</td>
??????????????????? <td>${book.author}</td>
??????????????????? <td>${book.price}</td>
??????????????????? <td>${book.publisher}</td>
??????????????????? <td> <a href="deleteBook?bookid=${book.bookid}">刪除</a> </td>
??????????????????? <td> <a href="findBookByID?bookid=${book.bookid}">修改</a> </td>
??????????????????? <td> <a href="addToCart?bookid=${book.bookid}">添加到購物車</a> </td>
??????????????? </tr>
???????????? </c:forEach>
??? 功能(M部分):通常轉換成方法。因為Java是面向對象的語言,方法應該輸入某個類的。所以通常需要創建JavaBean(比較特殊的類),然后在JavaBean中添加這個方法。方法的實現主要依賴你的Java基本功。
??? 控制器(C部分):通常使用Servlet來實現。對于控制器需要記住4句話:獲取信息;調用JavaBean;保存信息;響應。
??????? 獲取信息:
??????????? 獲取請求信息request.getParameter(paraname)? request.getParameterValues(paraname)
??????????? 獲取session中信息? session.getAttribute(屬性名)? 注意:獲取到之后需要進行強制類型轉換
??????????? 獲取Cookie中信息? request.getCookies()? 返回的是Cookie數組
??????????? 獲取請求頭信息?
??????????? 獲取Servlet的配置信息
??????????? 通過其他的JavaBean來獲取一些信息
??????? 調用JavaBean的方法:
??????????? 實例化,使用new加上構造方法來實例化,如果要調用的方法是靜態方法,不需要實例化。
??????????? 初始化,可能需要使用上面獲取的信息來對JavaBean進行初始化。
??????????? 調用方法,可以通過參數傳遞需要的信息
??????? 保存信息(主要為后續的頁面和處理服務的):
??????????? 保存到session中,session.setAttribute(屬性名,要保存的對象),供用戶后續的所有訪問過程使用。
??????????? 保存到request中,request.setAttribute(屬性名,要保存的對象),供后續頁面使用(頁面與當前的Servlet屬于同一次請求)
??????????? 保存到cookie,Cookie cookie = new Cookie("name","value"); response.addCookie(cookie);? ,供客戶端在以后的時間訪問
??????? 響應:
??????????? 直接輸出:
?????????????? response.setContentType("text/html;charset=gb2312");
?????????????? PrintWriter out = response.getWriter();
?????????????? out.println("歡迎學習JSP!");
??????????? 使用專門的文件進行響應:
?????????????? 方式一:
?????????????????? RequestDispatcher rd = request.getRequestDispatcher(目標文件);?
?????????????????? rd.forward(request,response); // 完成跳轉?
?????????????? 方式二:
?????????????????? response.sendRedirect(目標文件);
?????????????? 注意:如果當前功能完成的是對數據庫的插入操作,如果用戶刷新就會產生錯誤。要避免錯誤,不能使用RequestDispatcher,可以使用方式二。如果使用方式二,就不能在當前文件和目標文件之間通過request共享信息了。如果要共享可以session,使用session的時候,用完之后一定要刪除這個對象session.removeAttribute(屬性名)。
2、如何使用其他的數據庫管理系統
?? 準備工作:
?? 1)安裝數據庫;創建表。(這個過程通常是由數據庫管理員完成的,對于變成人員來說需要知道數據庫的IP地址、端口、數據庫名字、用戶名、口令)。
?? 2) 要得到數據庫的JDBC驅動程序,通常是壓縮包,可以從響應的數據庫提供商的網站上下載。需要把驅動程序放在:C:/Program Files/Apache Software Foundation/Tomcat 6.0/lib 或者 應用的WEB-INF/lib下面。
?? 在程序中使用:
?? 與現在使用JDBC-ODBC橋方式基本相同,不同點在于:驅動程序的名字;URL(通常包含IP地址、端口、數據庫名字)的格式不同(與驅動程序有關);用戶名和口令。
?? 常見的錯誤:
?? 1)ClassNotFoundException?? 通常是因為JDBC驅動程序加載失敗,找不到。確認JDBC驅動程序在正確的位置以及版本是否正確。
?? 2)沒有合適的驅動程序 Not a suitable driver? 通常是因為URL的格式不正確。
?? 3)連接不能被創建,數據庫服務器沒有正常運行獲取主機、端口、數據庫名有誤。
?? 4)Access Denied? 用戶名和口令錯誤
?? 5)java.sql.SQLException 通常SQL語句錯誤。
******http://blog.csdn.net/javaeeteacher*******************************************************************
*************************************************全十講結束************************************************
***********************************************************************李老師的一畝三分地******************?
from:?http://blog.csdn.net/javaeeteacher/article/details/1932447
總結
以上是生活随笔為你收集整理的JSP快速入门教程——全十讲的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Chrome DevTools 之 Ne
- 下一篇: JSP简明教程