開發基於JSP Servlet JavaBean的網上交易系統(含原始檔)

切夢刀發表於2019-01-05


獲取專案原始檔,聯絡Q:1225467431,可指導畢設,課設



開發基於JSP Servlet JavaBean的網上交易系統
第1章 JavaEE的概述
1 瞭解性知識(jsp的弊端,什麼是JavaEE,什麼是框架,javaEE的結構體系)
表示層技術(HTML JavaScript Ajax)
中間層技術(JSP Servlet JSTL JavaBean Strusts)
資料庫技術(JDBC技術 資料層框架技術Hibernate)
系統整合技術(JAX-WS技術 JNDI)
2 HTTP協議
http是一個無狀態協議,預設輸出埠為80
3 Post與Get提交資料方法的差別(Get方法是瀏覽器預設的提交方法)
(1)Post請求陣列在位址列不可見,相對比較安全
(2)Post請求提交的資料在理論上沒有長度的限制
(3)Get請求將字串新增到URL中,是頁面可以被設定成書籤或使用電子郵件傳送,Post請求則不能
4 為Eclipse新增資料監控工具TCP/IP Monitor進行資料監控
(1)單擊視窗”--》首選項”命令,彈出首選項”視窗
(2)展開左側的執行/除錯”節點,選擇TCP/IP Monitor選項,並選中Show the…..核取方塊
(3)新增監視視窗,單擊add按鈕後,彈出對話方塊,按圖新增內容
(4)啟動監控,執行程式,把地址內的埠號8080改為8088檢視監控結果
第2章 Servlet基礎
1 Servlet是一個java程式,是在伺服器端執行以處理客戶端請求並作出響應的程式。建立Servlet類必須繼承HttpServlet類,實現doGet()或者doPost()方法
2 單擊右建選擇新建Servlet命令,在彈出的視窗中輸入Servlet名稱,選擇超類為javax.servlet.http.HttpServlet,並選中Create doGet和doPost兩個核取方塊,單擊完成按鈕
3 Servlet的生命週期
(1)例項化 Servlet容器建立Servlet的例項
(2)初始化 該容器呼叫Init()方法
(3)服務 如果請求Servlet,則容器呼叫service()方法
(4)銷燬 銷燬例項之前呼叫destory()方法
4 Servlet的部署與配置:web檔案

AddServlet
servlet.AddServlet


AddServlet
/AddServlet

5 Servlet處理Get/Post請求
(1)HttpServletRequest request物件常用方法
Request.getParameter(param”)獲取客戶請求的資料
Request.setCharacterEncoding(GBK”);將輸入內容轉化成中文
Request.setAttribute(loginname”,user);在request作用域儲存資料
(2)HttpServletResponse response物件常用方法
Response.setContentType(text/html;charset=GBK”);設定輸出中文,解決中文亂碼問題
Response.sendRedirect(URL”);讓瀏覽器重定向到指定的資源
(3)轉發
RequestDispatcher dispatcher=request.getRequestDispatcher(url);首選定義轉發器
dispatcher.forward(request, response);
然後實現轉發的功能
第3章 基於Servlet的會話跟蹤(一)
1 會話的建立
HttpSession session = request.getSession(Boolean value);
HttpSession session = request.getSession();
在第一種方法中,布林值為true時,如果存在與當前請求關聯的會話,就返回該會話。否則建立一個新會話,並把會話返回。布林值為false時,如果存在與當前請求關聯的會話,就返回該會話。否則返回null,不建立會話。
2 會話的使用
Session.setAttribute(String name,Object value);
Session.getAttribute(String name);
值得注意的是:Session.getAttribute(String name);方法返回的是Object物件,所以在取出資料是需要進行資料型別轉化,是與存入的一致。
3 HttpSession物件的結束
(1)關閉瀏覽器,關閉Session
(2)呼叫HttpSession的invalidate()方法,刪除HttpSession物件和資料。
(3)兩次訪問的時間間隔大於Session定義的非活動時間間隔
第4章 基於Servlet的會話跟蹤(二)
1 購物車的設計分析
HttpSession session = request.getSession(false);
RequestDispatcher dispatcher;
// 如果session不存在,轉向 /ch04/books.jsp
if (session == null) {
dispatcher = request.getRequestDispatcher(/cho4/books.jsp);
dispatcher.forward(request, response);
}
// 取出購物車和新增的書籍
Map cart = (Map)session.getAttribute(cart);
BookBean book = (BookBean) session.getAttribute(bookToAdd);
// 如果購物車不存在,建立購物車
if (cart == null) {
cart = new HashMap();
// 將購物車存入session之中
session.setAttribute(cart, cart);
}
// 判斷書籍是否在購物車中
CartItemBean cartItem = (CartItemBean) cart.get(book.getISBN());
// 如果書籍在購物車中,更新其數量.
// 否則,建立一個條目到Map中.
if (cartItem != null){
cartItem.setQuantity(cartItem.getQuantity() + 1);
}else{
cart.put(book.getISBN(), new CartItemBean(book, 1));
}
// 轉向viewCart.jsp顯示購物車
response.sendRedirect(/Y2JavaEE/cho4/viewCart.jsp);
實現購物車列表
<%
Map cart = (Map) session.getAttribute(cart);
double total = 0;
if (cart == null || cart.size() == 0){
out.println(

購物車當前為空。

);
out.println(

繼續購物

);
}
else {
// 建立用於顯示內容的變數
Set cartItems = cart.keySet();
Object[] isbn = cartItems.toArray();
BookBean book;
CartItemBean cartItem;
int quantity;
double price, subtotal;
%>
<% // continue scriptlet
int i = 0;
while (i < isbn.length) {
// 計算總和
cartItem = (CartItemBean) cart.get(isbn[i]);
book = cartItem.getBook();
quantity = cartItem.getQuantity();
price = book.getPrice();
subtotal = quantity * price;
total += subtotal;
i++;
%>
我們通過Map介面的keySet()方法,可以把Map中的key建以set形式返回,在通過toArray()方法,將Set物件轉換為Object型別陣列,之後我們遍歷陣列,以陣列元素為key值,取出map中所儲存的資料
2 格式化問題
在處理數字格式方面,Java API為我們提供了DecimalFormat類,為我們解決十進位制數字的格式化問題。
<%=new DecimalFormat( 0.00 ).format( subtotal ) %>
3 常用集合類,介面
(1)List介面(List介面與Set介面都繼承自Collection介面)
ArrayList是以Array方式實現的List,允許快速隨機存取,相對與LinkedList不適合進行插入和移除元素操作
LinkedList提供最佳順序存取,適合插入和移除元素
(2)Set介面(set是一種不包含重複元素的Collection,也就是說在Set中最多隻能有一個null元素)
HashSet能夠快速定位一個元素,但是它要存入HashSet的物件必須實現HashCode()方法
TreeSet將放入其中的元素按順序存取
(3)Map介面(Map是一種把鍵物件與值物件進行關聯的容器,像Set一樣,一個map容器中的鍵物件不允許重複,這是保證查詢結果的一致性)
HashMap類是Map類的實現類,實現一個鍵到值對映的雜湊表,通過鍵取得值物件。
Properties類一般是把屬性檔案讀入流中後,以鍵-值的形式進行儲存,以方便程式設計師讀取其中的資料
第5章 基於Servlet的MVC設計模式
MVC是一種流行的軟體設計模式
(1)模型(Modle):對應的元件是JavaBean(Java類)
(2)檢視(View):對應的元件是JSP或HTML檔案
(3)控制器(Controller):對應的元件是Servlet
MVC設計模式的好處
《1》各司其職,互不干涉
《2》有利於開發中的分工
《3》有利於組建的重用
第6章 Model層開發:高階JDBC
1 資料庫連池
(1)資料連線池
在JDBC 2.0 中提供了javax.sql.DateSoure(資料來源)介面,它負責建立與資料庫的連線,在應用程式中訪問資料據庫不必編寫連線資料庫的程式碼,可直接從資料來源獲得資料庫連線。
資料庫連線池負責分配,管理和釋放資料庫連線,它允許應用程式重複使用一個現有的資料庫連線,而不再重新建立一個;釋放空閒時間超過最大空閒時間的資料庫連線,以避免因為沒有釋放資料庫連線而引起的資料庫連線遺漏。這項技術明顯的提高了對資料庫的操作效能。
資料庫連線池在初始時將建立一定的資料庫連線放到連線池中,這些資料庫連線的數量是有最小資料庫連線數來確定的。無論這些資料庫連線是否被使用,連線都一直保證至少擁有這麼多的連線數量。連線池的最大資料庫連線數量限定了這個連結池能佔用的最大連線數量,當應用程式向連線池請求的連線數量超過最大連線數量時,這些請求將被加入到等待列中。
(2)資料來源與JNDI資源
DataSoure物件是由Web容器(Tomcat)提供的,因此不能在程式中採用建立一個例項的方法來生成DataSource物件,而需要採用Java的另一個技術JNDI,來獲得DataSource物件
可以簡單的把JNDI理解為一種將物件和名字繫結的技術,容器產生出物件,這些物件都和唯一的名字繫結。外部程式可以通過名字來訪問該物件。
Javax.naming,Context提供了查詢JNDI Resource的介面,例如,可以通過以下的程式碼獲得jdbc/books的資料來源的引用:
Context ic = new InitialContext();
DataSource source = (DataSource)ic.lookup(java:comp/env/jdbc/books);
conn=source.getConnection(); //獲取資料庫連線
當程式結束資料庫訪問後,應該呼叫Connection的close()方法,及時將Connection返回給資料庫連線,是Connection恢復空閒狀態。
Context介面的lookup()方法
方法 說明
lookup(String name) 返回與指定的名字繫結的物件
Tomcat把DataSource作為一種可配置的JNDI資源來處理。生成DataSource物件的工廠為org.apache.commons.dbcp.BasicDataSourceFactory.配置多個DataSource,可以通過lookup(String name)自動查詢連線。
(3)JNDI的配置
<1>context.xml檔案的配置
在Tomcat根目錄confcontext.xml檔案中節點中新增資訊,內容新增如下:
maxIdle=30 maxWait=10000 username=hafei password=513810
driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:sqlserver://localhost:1433;DatabaseName=books/>
的屬性
屬性 說明
Name 指定Resource的JNDI名字
Auth 指定管理Resource的Manager,他有兩個值可選:Container和Application.Container表示有容器來建立Resource,Application表示有Web來建立和管理Resource
Type 指定Resource所屬的Java類名
maxActive 指定資料庫連線池中的資料庫連線處於活動狀態的最大數目,取值為0表示不受限制
maxIdle 指定資料庫連線池中的資料庫連線處於空閒狀態的最大數目,取值為0表示不受限制
maxWait 指定資料庫連線池中的資料庫連線處於空閒狀態的最長時間(以毫秒為單位),超出這一時間會丟擲異常。取值為-1可以無限制等待
Username 制定連線資料庫的使用者名稱
Password 指定連線資料庫的口令
driverClassName 指定連線資料庫的JDBC驅動程式
url 指定連線資料庫的URl
<2>web.xml檔案的配置

E-Books DataSource
jdbc/books
javax.sql.DataSource
Container

的屬性
屬性 說明
description 對所引用資源的說明
res-ref-name 指定所引用資源的JNDI名字,與元素中的name屬性對應
res-type 指定所引用資源的類名字,與元素中的type屬性對應
res-auth 指定管理所引用資源的Manager,與元素中的auth屬性對應
3 基於資料庫檔案的資料庫配置
(1)資料配置資訊
private static final String DRIVER_CLASS=com.microsoft.sqlserver.jdbc.SQLServerDriver;
private static final String DATABASE_URL=jdbc:sqlserver://localhost:1433;databaseName=news;
private static final String DRIVER_USER=hafei;
private static final String DRIVER_PASSWORD=513810;
(2)屬性檔案
driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:sqlserver://localhost:1433;databaseName=ownHome
user=hafei
password=513810
在Java中提供了Properties類,來讀取.properties(屬性)檔案。
在程式呼叫Properties類的load()方法時,系統把db.properties檔案的內容載入到記憶體中。因為Properties繼承類Hashtable, Properties類把=”之前的內容新增到Hashtable物件的key值,並同時新增key值對應的value.所以在編寫.properties檔案時一定要使用=號把名稱與值分隔開
(3)讀取屬性檔案
import java.io.InputStream;
import java.util.Properties;;
public class ProReader extends Properties{
//定義靜態物件
private static ProReader instance;
/**
* 公有的獲取例項的方法
* @return Env 例項
*/
public static ProReader getInstance() {
if (instance != null) {
return instance;
} else {
makeInstance();
return instance;
}
}
/**
* 同步的建立例項方法
*
*/
private static synchronized void makeInstance() {
if (instance == null) {
instance = new ProReader();
}
}

/**
* 私有的構造方法,確保例項的唯一性
*
*/
private ProReader() {
InputStream is = (InputStream) getClass().getResourceAsStream(/common/dbInfo.properties);
try {
load(is);
}
catch (Exception e) {
System.err.println(錯誤:沒有讀取屬性檔案,請確認db.property檔案是否存在。);
return;
}
}
}
讀取配置資訊
String driverClassName = ProReader.getInstance().getProperty(driver);
String url = ProReader.getInstance().getProperty(url);
String user = ProReader.getInstance().getProperty(user);
String password = ProReader.getInstance().getProperty(password);
在讀取配置資訊時,使用單列模型建立,獲得物件例項,並呼叫Properties類提供的方法getProperty(key”)方法獲得HashTable的value值,進行建立資料庫連線類的操作。
4 Class與Object小結
(1)Class類
Class.forName(String className):該方法生成以一個String型別引數指定的classname的class物件,如Class.forName(sun.jdbc.odbc.JdbcOdbcDriver”);
InputStrean getResourceAsStream(String name):該方法是開啟並讀取一個String型別引數指定的檔案到系統記憶體中,以方便獲得系統資訊,如
InputStream is = (InputStream) getClass().getResourceAsStream(/common/dbInfo.properties);
Properties p = new Properties();
P.Load(in);
(2)Object類
Object類是所有類的根類,我們自定義的類都預設的繼承於這個類,所以所有的類包括陣列都具有這個類的方法。
getClass():返回一個物件的執行時類
toString():返回該物件的字串表示,在Object類中是返回物件的地址資訊
equals(Object obj):判斷obj與當前物件是否相等。
5 自定義異常
(1)定義異常類
public class DBAccessException extends Exception {
private static final long serialVersionUID = 1L;
protected Throwable throwable;
/**
* 構造方法
*
* @param message
*/
public DBAccessException(String message) {
super(message);
}
/**
* 構造方法
*
* @param message
* @param throwable
*/
public DBAccessException(String message, Throwable throwable) {
super(message);
this.throwable = throwable;
}
/**
* 返回底層異常原因
*
* @return Throwable
*/
public Throwable getCause() {
return throwable;
}
}
使用者自定義異常類要繼承Exception類,雖然Exception類中沒有定義自己的任何方法,但從Throwable類繼承了所有的方法。建立的使用者自定義異常類都將具有Throwable類的所有方法。
(2)使用自定義異常類
//資料庫連線
public static synchronized Connection getConn() throws DBAccessException {
// 讀出配置資訊
String driverClassName = Env.getInstance().getProperty(driver);
String url = Env.getInstance().getProperty(url);
String user = Env.getInstance().getProperty(user);
String password = Env.getInstance().getProperty(password);

Connection conn=null;
try{
Class.forName(driverClassName);
conn = DriverManager.getConnection(url,user,password);
}catch(Exception ex){
throw new DBAccessException(不能獲得資料庫連線!);
}
return conn;
}
6通用的DAO類
(1)通用的DAO類的實現
package dao.impl;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import javax.servlet.jsp.jstl.sql.Result;
import javax.servlet.jsp.jstl.sql.ResultSupport;
public class DBConnection {
private static final String DRIVER_CLASS=com.microsoft.sqlserver.jdbc.SQLServerDriver;
private static final String DATABASE_URL=jdbc:sqlserver://localhost:1433;databaseName=e_pai;
private static final String DRIVER_USER=hafei;
private static final String DRIVER_PASSWORD=513810;

private Connection conn;
private String sqlvalue;
private List values;
//設定資料庫連線
public void setConn() throws ClassNotFoundException, SQLException {
Class.forName(DRIVER_CLASS);
conn = DriverManager.getConnection(DATABASE_URL,DRIVER_USER,DRIVER_PASSWORD);
}
//設定SQl語句
public void setSqlvalue(String sqlvalue) {
this.sqlvalue = sqlvalue;
}
//設定語句引數
public void setValues(List values) {
this.values = values;
}
//資料庫連線
public static Connection getConn() throws ClassNotFoundException,SQLException{
Class.forName(DRIVER_CLASS);
Connection conn = DriverManager.getConnection(DATABASE_URL,DRIVER_USER,DRIVER_PASSWORD);
return conn;
}
//釋放資源 一個方法關閉三個
public static void closeAll(Connection conn,PreparedStatement pStatement,ResultSet res){
try{
if(res !=null){
res.close();
res=null;
}
}
catch(SQLException ex){
ex.printStackTrace();
}
try{
if(pStatement !=null){
pStatement.close();
pStatement=null;
}
}
catch(SQLException ex){
ex.printStackTrace();
}
try{
if(conn!=null &&(!conn.isClosed())){
conn.close();
}
}
catch(SQLException ex){
ex.printStackTrace();
}
}
//設定語句的引數
private void setValues(PreparedStatement pstmt,List values)throws SQLException{
//迴圈將SQL語句引數列表中 的值一次付給執行語句
for(int i=0;i Object v = values.get(i);
//注意,setObject()的索引是從1開始的
pstmt.setObject(i+1, v);
}
}
//執行查詢
public Result executeQuery() throws SQLException{
Result result=null;
ResultSet rs=null;
PreparedStatement pstmt=null;
Statement stmt =null;
try{
if(values!=null && values.size()>0){
//使用預處理語句,並設定所有的SQL語句的所有引數值
pstmt=conn.prepareStatement(sqlvalue);
setValues(pstmt,values);
//執行查詢返回查詢結果集
rs =pstmt.executeQuery();
}else{
stmt=conn.createStatement();
rs=stmt.executeQuery(sqlvalue);
}
//將ResultSet轉化為Result
result=ResultSupport.toResult(rs);
}
finally{
this.closeAll(conn, pstmt, rs);
}
return result;
}
//執行sqL語句實現增刪改但 不能執行查詢
public int executeUpdate() throws SQLException{
int noOfRows=0;
PreparedStatement pstmt=null;
Statement stmt =null;
/*處理SQL執行SQL*/
try{
if(values!=null && values.size()>0){
//使用預處理語句,並設定所有的SQL語句的所有引數值
pstmt=conn.prepareStatement(sqlvalue);
setValues(pstmt,values);
//執行更新語句,返回受影響的行數
noOfRows =pstmt.executeUpdate();
}else{
stmt=conn.createStatement();
noOfRows=stmt.executeUpdate(sqlvalue);
}
}finally{
this.closeAll(conn, pstmt, null);
}
return noOfRows;
}

}
(2)通用DAO類的使用
public List search(Users condition) {
List list =new ArrayList();
String sql= select * from users where 1=1;
if(condition!=null){
if(condition.getUserId()!=0){
sql+=and userId=+condition.getUserId();
}
if(condition.getUserName()!=null && !condition.getUserName().trim().equals()){
sql+=and userName like %+condition.getUserName()+%;
}
}
try {
DBConnection dbConnection = new DBConnection();
dbConnection.setConn();
dbConnection.setSqlvalue(sql);
Result result = dbConnection.executeQuery();
if (result == null || result.getRowCount() == 0) {
// 沒有查出Book
System.out.println(沒有使用者!!!);
} else {
int rowCount = result.getRowCount();
// 讀取行資料
for (int i = 0; i < rowCount; i++) {
Map row = result.getRows()[i];
Users item = new Users();
item.setUserId((Integer) row.get(userId));
item.setUserName((String) row.get(userName));
item.setPassword((String) row.get(password));
item.setUserCode((String) row.get(userCode));
item.setUserTel((String) row.get(userTel));
item.setUserAddr((String) row.get(userAddr));
item.setUserZip((String) row.get(userZip));
item.setUserStatus((Integer) row.get(userStatus));
list.add(item);
}
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
第7章 View層開發:JavaBean在Jsp中的使用
1 什麼是JavaBean
JavaBean實際上就是一個Java類,這個類可以重用。從javaBean的功能上可以分為兩類
(1)封裝資料
(2)封裝業務
JavaBean一般情況下滿足一下要求
<1>是一個公有類,並提供無參的公有的構造方法
<2>屬性私有
<3>具有公有的訪問屬性的getter和setter方法
2 JSP與JavaBean
JSP標準動作在瀏覽器請求JSP頁面時執行,JSP標準動作可使用現有的JavaBean元件和屬性,以及使用者請求轉發到另一個頁面
JSP標準動作使用作為字首,JSP標準動作中的屬性區分大小寫,屬性中的值必須至於雙引號內。JSP標準的語法如下:

其中,action_name是要執行的動作;attribute將被指定動作的屬性所替換
(1)
(2)
setProperty動作用於設定useBean中指定的JavaBean的屬性值。SetProperty動作指定名,稱屬性,值和引數,用於賦給JavaBean的屬性。

name指定userBean中使用的JavaBean的id;property指定要獲取JavaBean的屬性名稱,value指定要為屬性設定值;param指定用於輸入資料的表單元素名稱,並給屬性賦值
(3)
useBean中的Id所指定的物件通過setProperty中對property指定的屬性進行賦值後,可以使用動作獲取JavaBean中指定的屬性值

name指定userBean中使用的JavaBean的id;property指定要獲取JavaBean的屬性名稱
(4)

Page屬性指定欲跳轉到的頁面路徑
例項
<%@ page contentType=text/html;charSet=GBK pageEncoding=GBK%>



<%
if (userManager.getValid()) {
%>

<%
} else {
%>

<%
}
%>
第8章 View層開發:EL和JSTL
1 EL語法
EL可以操作物件,陣列,對映,還可以進行表示式的計算以及邏輯運算。
在EL中只能進行邏輯的運算,但是不能進行邏輯的控制。
${EL表示式}
(1)點操作符
在使用EL時,EL表示式一般有兩部分組成,如${teache.name},其中,.”被稱作點號操作符,在操作符的左邊可以是一個JavaBean物件,也可以是EL隱式物件,點操作符的右面可以是一個JavaBean屬性,也可以是一個對映鍵。
(2)[]操作符
如果使用EL運算元據組,則使用點操作符就不能進行有效的操作,這時應該使用[]”,如${list[0]}.但這並不代表[]”只能運算元組,點操作符能操作的物件,都可以使用[]”來進行操作,如${teacher[name”]},注意,使用[]”操作符時,[]”中應該含有”””
2 JSTL標準標籤庫
<%@ taglib uri=http://java.sun.com/jsp/jstl/core prefix=c%>
(1)通用標籤
<1>:設定指定範圍的變數值,如果該變數不存在,則建立它

其中,var指定變數的名稱以儲存value指定的值;value設定var指定的變數的值:acope指定變數的範圍,只能為 page|request|session|application,預設為page
<2>:用於刪除變數

其中,var指定要刪除的變數的名稱;acope指定變數的範圍。
<3>:計算表示式並將結果顯示在頁面上

其中,value指定表示式或變數
(2)條件標籤

//條件為true時,執行程式碼

其中,test指定條件,通常使用EL方式進行條件的運算:${條件運算},運算可以使用<,>,==,也可以使用and,or,還可以使用lt,eq,gt等;var指定變數,並把EL運算結果付給變數。Scope指定範圍。
(3)迭代標籤

//迴圈體內容

其中,var指定變數的名稱;items指定要遍歷的物件集合,可以是陣列,List和Map.
例項


varStatus=status>



3 EL隱式物件
(1)作用域訪問物件
物件名稱 說明
PageScope 返回頁面範圍內的變數,這些名稱已對映至相應的值
requestScope 返回請求範圍內的變數,這些名稱已對映至相應的值
sessionScope 返回會話範圍內的變數,這些名稱已對映至相應的值
applicationScope 返回應用範圍內的變數,並將變數名對映至相應的值
如果在獲取變數值時,不使用作用域訪問物件,系統會按照page|request|session|application的順序來查詢
(2)引數訪問物件
物件名 說明
param 返回客戶端的請求引數的字串值
paramValues 返回對映至客戶端的請求引數的一組值
(3)JSP隱式物件
JSP和EL有一個公共物件,pageContext,具體的說明見表。EL可以通過pageContext來訪問JSP中其他的隱式物件(request,session)如${pageContext.request.requestURI}
物件名 說明
pageContext 提供對使用者請求和頁面資訊的訪問
4 SQL標籤
(1)使用SQL標籤修改資料庫中的資訊
url=jdbc:sqlserver://localhost:1433;DataBaseName=books
user=hafei password=513810 var=conn />


insert into BookOrder(username,zipcode,phone,creditcard,total)values(?,?,?,?,?)






url=jdbc:sqlserver://localhost:1433;DataBaseName=books
user=hafei password=513810 var=conn />
其中,url指定與資料庫關聯的URL;DateSource指定JNDI資源的資料來源名稱,如jdbc/books;user指定資料庫的使用者名稱;password指定使用者密碼,var指定變數的名稱;scope指定變數範圍。

//Sql語句

其中,var指定變數的名稱;dataSource指定資料來源的名稱,與
標籤的var的變數名一致;scope指定變數範圍;SQL語句可以是INSERT,UPDATE,或者DELETE

其中,value指定為SQL語句中的引數中?”處的值
(2)使用SQL標籤查詢資料庫中的資訊
url=jdbc:sqlserver://localhost:1433;DataBaseName=books
user=hafei password=513810 var=conn />

select orderid,username,zipcode,total from BookOrder order by orderid

















//Sql語句

其中,var指定變數的名稱;dataSource指定資料來源的名稱,與
標籤的var的變數名一致;scope指定變數範圍;
第9章 Web服務
1 web服務的建立和釋出
(1)新增XFire庫
(2)新增xfire-all-1.2.6.jar檔案
(3)在lib資料夾下新增xalan.jar檔案
2 建立服務介面和實現類
3 services.xml檔案配置



AddBookService
www.jbapteach.com.cn/AddBookService
operation.IBookService
operation.ProcessBookService


在services.xml檔案中,name指定當前服務的名稱,它會被客戶端應用程式所使用,指定伺服器的名稱空間,而指定元素說繫結的class類(介面),如果指定的是介面,那麼就由來指定介面的實現類。
4 web.xml檔案配置

XFireServlet
org.codehaus.xfire.transport.http.XFireConfigurableServlet


XFireServlet
/servlet/XFireServlet/*


XFireServlet
/services/*

在web.xml中指定了當客戶端的應用程式訪問了/services/*”或/servlet/XFireServlet/*”,由XFire框架進行處理。
5建立客戶端程式呼叫Web服務
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//獲取會話
HttpSession session = request.getSession();
//從order.html頁面讀取信用卡號,並且要與Account表中的相對應
String creditCard=request.getParameter(creditcard);
double total=((Double)session.getAttribute(total)).doubleValue();
//建立服務的後設資料
org.codehaus.xfire.service.Service serviceModle=new ObjectServiceFactory().create(IProcessCredit.class);
System.out.println(返回服務的模型);
XFire xfire =XFireFactory.newInstance().getXFire();
XFireProxyFactory factory=new XFireProxyFactory(xfire);
//服務地址
String serviceUrl=http://localhost:8080/Y2JavaEE/services/CreditCard;
IProcessCredit client=null;
try{
client=(IProcessCredit)factory.create(serviceModle,serviceUrl);
}catch(MalformedURLException ex){
System.out.println(客戶端呼叫異常:+ex.toString());
}
//呼叫服務
int serviceResponse=0;
try{
serviceResponse = client.creditProcess(creditCard, total);
}catch(Exception ex){
System.out.println(WsClient.callWebService():Exception+ex.toString());
}
if(serviceResponse==1){
response.sendRedirect(/Y2JavaEE/cho9/bye.jsp);
//request.getRequestDispatcher(/cho9/bye.jsp).forward(request, response);
}else{
response.sendRedirect(/Y2JavaEE/cho9/error.jsp);
//request.getRequestDispatcher(/cho9/error.jsp).forward(request, response);
}
session.invalidate();
}
6 Web服務執行原理
(1)單元測試
<1>新增JUnit庫
<2>建立測試類 例項如下:
import java.net.MalformedURLException;
import org.codehaus.xfire.XFire;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.aegis.AbstractXFireAegisTest;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.ServiceFactory;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.codehaus.xfire.service.invoker.ObjectInvoker;
public class CreditcardTest extends AbstractXFireAegisTest {
/**
* 初始化
*/
public void setUp() throws Exception {
super.setUp();
// 使用XFire獲得web服務資訊,一登陸Web服務
XFire xfire = getXFire();
ServiceFactory factory = new ObjectServiceFactory(xfire
.getTransportManager(), null);
Service service = factory.create(IProcessCredit.class);
service.setProperty(ObjectInvoker.SERVICE_IMPL_CLASS,
ProcessCreditCard.class);
xfire.getServiceRegistry().register(service);
}
/**
* 客戶端測試
*
* @throws Exception
*/
public void testcreditProcess() throws Exception {
// 建立Web服務後設資料
Service serviceModel = new ObjectServiceFactory()
.create(IProcessCredit.class);
System.out.println(callSoapServiceLocal(): got service model.);
// 建立Web服務代理
XFire xfire = XFireFactory.newInstance().getXFire();
XFireProxyFactory factory = new XFireProxyFactory(xfire);
String serviceUrl = http://localhost:8080/store/services/CreditCard;
IProcessCredit client = null;
try {
client = (IProcessCredit) factory.create(serviceModel, serviceUrl);
} catch (MalformedURLException e) {
System.out.println(WsClient.callWebService(): EXCEPTION:
+ e.toString());
}
// 呼叫服務方法
int serviceResponse = 0;
try {
serviceResponse = client.creditProcess(12345678901, 200);
assertNotNull(test fail:serviceResponse is null,serviceResponse);
assertEquals(程式執行錯誤, 1, serviceResponse);
} catch (Exception e) {
System.out.println(WsClient.callWebService(): EXCEPTION:
+ e.toString());
}
System.out.println(WsClient.callWebService(): status=
+ serviceResponse);
}
}
在例項中覆蓋了setUp()方法,用於初始化物件,並以testCreditProsess()方法驗證CreditProsess()方法的正確性。同時還使用瞭如下的assert(斷言)方法。
assertNotNull(String message,Object obj)
其中,message:當引數expected與actual不等時,顯示的錯誤資訊;obj:欲判斷的物件
assertEquals(String message,int expected,int actual)
其中,message:當引數expected與actual不等時,顯示的錯誤資訊;expected:被呼叫被測試方法,預期得到的值;actual:呼叫被測試方法,實際返回的值
(2)Web服務的監控
PAGE
10
獲取專案原始檔,聯絡Q:1225467431,可指導其它畢設,課設
 

訂單ID 使用者名稱 郵編 總價
${row.orderid} ${row.username} ${row.zipcode} ${row.total}
();i++){

相關文章