標籤:
背景:
目前業界很流行的MVC(model-view-control)開發模式,理解為
模型是Bean,
視圖是 Html/Jsp,
控制是Servlet,
關聯資料庫的Dao
web的運行機制:
資料首先在Jsp上被展示出來,使用者看到頁面後觸發一些事件,並可能傳遞資料,這些資料和請求被控制器接收到,然後開始處理(往往會需要有一些資料庫的操作(查詢,修改資料庫資料)),當這些處理結束後,我們就需要將資料反饋到JSP上顯示給使用者看,完成一次完整的互動過程。
本文:
根據背景所述的順序,我們依次介紹----如何從JSP傳資料到servlet並接收、如何在servlet裡面獲得資料庫資料並處理、如何將servlet內的資料傳遞給jsp並顯示在網頁上。
(一)從JSP到servlet
1、發資訊
表單提交
Html代碼
<form action="URL" name="表單名字" method="提交方式(post、get{兩個提交方式的區別}*)">
<input type="text" name="文字框名字" /><!--一個文本輸入框-->
</form>
定義一個函數來處理表單文字框檢查非空並提交表單事件
Html代碼
<script>
$(document).ready(function(){
$("#被單擊按鈕的ID").click(function(){
if(document.all.文字框名字.value.length==0){
alert("輸入不可為空");
return false;
}
document.all.表單名字submit();
return true;});
});
</script>
2、收資訊來到表單提交時URL所指向的servlet檔案,擷取傳遞過來的參數值
Java代碼
String search = java.net.URLDecoder.decode(request.getParameter("文字框名字"),"utf-8");
System.out.println("在search的servlet中接收到的search參數為-->"+search);
(二)從servlet到資料庫
1、獲得資料(MySql為例)
①建立資料庫連接池
建立一個設定檔,
確保名字一致,
Xml代碼
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/LeLe"
auth="Container"
type="javax.sql.DataSource"
maxActive="50"
maxIdle="5"
maxWait="10000"
logAbandoned="true"
username=""
password=""
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/lele" />
</Context>
<!-- jdbc/LeLe為項目名 -->
②擷取連結
Java代碼
public static Connection getConnection() {
Connection con = null; //建立用於串連資料庫的Connection對象
DataSource ds = null;
try {
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
ds = (DataSource)envContext.lookup("jdbc/LeLe");
System.out.println(ds.getConnection());
} catch (Exception e1) {
System.out.println("載入資料庫驅動失敗"+e1);
return null;
}// 載入Mysql資料驅動
try {
con = ds.getConnection();// 建立資料連線
System.out.println("資料庫連接成功了");
return con; //返回所建立的資料庫連接
} catch (Exception e) {
System.out.println("資料庫連接失敗" + e.getMessage());
return null;
}
}
③執行SQL語句,並返回結果
Java代碼
/* 查詢資料庫,輸出符合要求的記錄的情況*/
private static Connection conn;
private static Statement st;
private static ResultSet rs;
// public static void main(String [] args){
// query("select * from agreement");
// }
public static ResultSet query(String sql ) {
System.out.println("函數DBQuery日誌");
if(conn == null){
conn = DBConnection.getConnection(); //同樣先要擷取串連,即串連到資料庫
if(conn == null){
System.out.println("資料庫連接失敗" );
return null;
}
}
System.out.println("查詢函數中串連到資料庫資料成功"+conn);
try {
st = (Statement) conn.createStatement(); //建立用於執行靜態sql語句的Statement對象,st屬局部變數
rs = (ResultSet)st.executeQuery(sql); //執行sql查詢語句,返回查詢資料的結果集
if(!rs.next()){
System.out.println("資料庫中未查詢到資料");
return null;
}
System.out.println("資料庫中已經查詢到資料");
// String agreement_id = rs.getString(1);
// String agreement_content = rs.getString(2);
// System.out.println("已經查詢到資料的資料為----agreement_id:"+agreement_id+"\tagreement_content:"+agreement_content);
return rs;
} catch (SQLException e) {
System.out.println("資料庫中查資料失敗");
return null;
}
}
public static void closeDB() throws SQLException{
if(null != rs)
rs.close();
if(null != st)
st.close();
if(null != conn)
conn.close(); //關閉資料庫連接
}
2、處理資料(使用javaBean儲存資料)
Java代碼 收藏代碼
if(rs != null){
do{
User user0=new User();//一個javaBean的執行個體化對象
user0.setUser_id(rs.getString("user_id"));
user0.setUser_name(rs.getString("user_name"));
user0.setUser_email(rs.getString("user_email"));
user0.setUser_password(rs.getString("user_password"));
collection.add(user0);
System.out.println(rs.getString("user_id"));
System.out.println(rs.getString("user_name"));
System.out.println(rs.getString("user_email"));
System.out.println(rs.getString("user_password"));
}while(rs.next());
}
Java代碼
public class User {
private String user_id;//使用者編號
private String user_email;//使用者郵編
private String user_name;//使用者名稱
private String user_password;//使用者密碼
public String getUser_id() {
return user_id;
}
public void setUser_id(String userId) {
user_id = userId;
}
public String getUser_email() {
return user_email;
}
public void setUser_email(String userEmail) {
user_email = userEmail;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String userName) {
user_name = userName;
}
public String getUser_password() {
return user_password;
}
public void setUser_password(String userPassword) {
user_password = userPassword;
}
}
(三)從servlet到JSP
1、發資料
使用重新導向將request和response轉寄給一個JSP
Java代碼
//將資料發到JSP
RequestDispatcher rd = request.getRequestDispatcher("index_search.jsp");
request.setAttribute("test",collection);//存值
rd.forward(request,response);//開始跳轉
2、接收資料
來到重新導向指向的URL中擷取剛才發送過來的資料,並顯示在網頁上
Java代碼
Collection<User> collectionUser=(Collection<User>)request.getAttribute("test");
Iterator it=collectionUser.iterator();
while(it.hasNext())
{
User user=(User)it.next();
out.println("<td ><div align=‘center‘>"+user.getUser_name()+"</td>");
out.println("<td ><div align=‘center‘><a href=‘#‘ onclick=window.open(‘MyJsp.jsp?usid="+user.getUser_id().trim()+"‘,‘newwindow‘,‘width=600,height=350,top=300,left=300‘)>管理</a></td>");
out.println("</tr>");
}
JSP、servlet、SQL三者之間的資料傳遞(前台與後台資料互動)