jsp+jdbc+mysql開發模式案例解析

     網站寫完後部署到tomcat的webapps下面,用本身申請的公網ip和端口去訪問,奈何就是打不開,報404錯誤,把360關掉竟然就能訪問了,氣死俺了。。這個網站訪問數據庫的網址不用更改,這個數據庫網址和訪問這個網站的網址不是一回事,有各自的網址和端口號。css

一:jdbc是數據庫鏈接技術縮寫,jdbc有兩種鏈接數據庫系統的技術,一種是鏈接池技術(書寫更少些),另外一種是JDBC驅動程序。用JDBC驅動爲了減小書寫,能夠把鏈接路徑,屬性設置等寫在一個靜態類裏面,寫一個靜態的鏈接方法,每次要鏈接數據庫就去調用這個公共靜態方法就能夠。html

   1.鏈接池技術步驟:java

  • 配置數據源
  • 鏈接數據庫    
  • 關閉結果集陳述和鏈接

(1)配置數據源mysql

在服務器安裝程序的lib目錄下添加mysql數據庫驅動程序。數據庫驅動程序在網址:http://dev.mysql.com/downloads/connector下載到,而後解壓找到裏面名字爲:mysql-connector-java-5.??-bin的jar包,注意結尾是bin的包,把它複製到Tomcat的lib目錄下。web

在網站工程目錄的META-INF下新建一個context.xml文件,在裏面配置數據源參數。url中網址:打開的端口號/數據庫名稱?是否使用SSL加密技術。driverClassName連接數據庫的驅動程序名,com.mysql.jdbc.Driver是jdbc的mysql的驅動程序名字。maxActive:數據庫鏈接池中的最大活動鏈接數目,這些鏈接關閉後就能回到池中,下一次重複使用。maxIdle,鏈接空閒的最大數目0是不受限制。maxWait請求數據庫鏈接的最長等待時間,超時拋出異常。sql

<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/mysql"
          type="javax.sql.DataSource"
          auth="Container"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/students?useSSL=false"
          username="root"
          password="root"
          maxActive="4"
          maxIdle="0"
          maxWait="30000"
/>
</Context>

  (2)鏈接數據庫訪問數據庫數據庫

<% 
   // Class.forName("com.mysql.jdbc.Driver");
	//1.使用JDBC的鏈接池技術訪問數據庫
	   //(1)得到對數據源的引用,Context提供了查找數據源鏈接誒信息的引用
	   Context context=new InitialContext();
	//jdbc/sql後兩位要和context頁面中的name的值如出一轍才能查找到這個數據源;
	   DataSource ds=(DataSource)context.lookup("java:comp/env/jdbc/sql");
	     //(2)返回一個鏈接對象
	   Connection conn=ds.getConnection();
	    //(3)準備SQL語句
	    String sql="select * from stu_info where hight>?";
	   //(4)返回一個陳述對象PreparedStatement發送sql語句到數據庫系統;
	    statement=conn.prepareStatement(sql);
	  //(5)執行SQL返回一個結果集
	    statement.setFloat(1, 0);//第一個?號參數實參
	   //執行查詢返回一個結果值
	    result=statement.executeQuery();
%>

    (3)關閉對象tomcat

<%
     //關閉結果集
       if(result!=null) result.close();
     //關閉陳述
       if(statement!=null) statement.close();
     //關閉鏈接
       if(conn!=null) conn.close();
     %>

     2.JDBC驅動技術。                                                                                               服務器

  • 添加驅動程序包到服務器的lib目錄下並註冊驅動程序
  • 書寫鏈接路徑和屬性並鏈接
  • 數據庫訪問

(1)添加驅動程序包到服務器的lib目錄下並註冊驅動程序session

在服務器安裝程序的lib目錄下添加mysql數據庫驅動程序。數據庫驅動程序在網址:http://dev.mysql.com/downloads/connector下載到,而後解壓找到裏面名字爲:mysql-connector-java-5.??-bin的jar包,注意結尾是bin的包,把它複製到Tomcat的lib目錄下。

Class.forName("com.mysql.jdbc.Driver");//註冊加載程序包,括號內mysql的驅動程序名

(2)書寫鏈接路徑和屬性並鏈接

String username="";//用戶名
String passWord="";//密碼
String databaseName="";//數據庫名
String url1="jdbc:mysql://網址:端口號/"+databaseName;
String url2="?user="+username+"&password"+passWord+"&useUnicode=true&characterEncoding=UTF-8"
String url=url1+url2;
//DriverManager類提供了數據庫鏈接方法
Connection conn=DriverManager.getConnection(url);

(3)訪問數據庫

和鏈接池技術如出一轍。

//(3)準備SQL語句
	    String sql="select * from stu_info where hight>?";
	   //(4)返回一個陳述對象PreparedStatement發送sql語句到數據庫系統;
	    statement=conn.prepareStatement(sql);
	  //(5)執行SQL返回一個結果集
	    statement.setFloat(1, 0);//第一個?號參數實參
	   //執行查詢返回一個結果值
	    result=statement.executeQuery();

2、JSP技術的4大內置對象

  • request

用到的時候很是多.request客戶端請求的信息的對象,用它的方法能夠得出客戶點請求的不少詳細信息。request不須要用戶手動建立和銷燬,發起請求時JSP頁面就已經建立好了request對象,直接拿來用就好,它一般用來傳輸少許數據,相似安卓的intent,值鍵對的方式傳輸,form的action和jsp的forward都會自動把上頁面的東西傳輸到下一個頁面,request生命週期是它所能跳轉到的頁面連續的後面幾個頁面都行,至於它沒有跳轉到的頁面是取不出值的。

  • session

session是一次會話的意思。生命週期:當用戶打開網站開始就自動爲這個用戶建立一個session,直到用戶關閉網站,關閉網站全部網頁時session會自動銷燬掉。每一個用戶都建立session,他們的值不共享。不過通常20分鐘沒有再次請求網頁也會自動銷燬,當同一個用戶再次進入網站時又開始建立新的。session存儲的數據能夠在本網站的任何頁面使用傳輸,不一樣於request只能在它跳轉到的地方傳輸。使用session.setAttribute(String,Object)存儲,session.getAttribute(String)取出。

  • application對象

生命週期:服務器開啓時都一直存在。服務器爲每個網站程序創建一個application對象。能夠用來統計網站訪問次數。

  • response對象

重定向跳轉到任何網頁包括本網站之外的網頁、定時刷新的功能,不太瞭解。

3、案例代碼

<%@page import="javax.naming.InitialContext"%>
<%@page import="java.sql.*" %>
<%@page import="javax.sql.*" %>
<%@page import="javax.naming.*" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>列出所有學生信息模塊</title>
</head>
<body>

<%!	
//定義全局變量;
ResultSet result=null;
PreparedStatement statement=null;
 %>
<% 
   // Class.forName("com.mysql.jdbc.Driver");
	//1.使用JDBC的鏈接池技術訪問數據庫
	   //(1)得到對數據源的引用,Context提供了查找數據源鏈接誒信息的引用
	   Context context=new InitialContext();
	//jdbc/sql後兩位要和context頁面中的name的值如出一轍才能查找到這個數據源;
	   DataSource ds=(DataSource)context.lookup("java:comp/env/jdbc/sql");
	     //(2)返回一個鏈接對象
	   Connection conn=ds.getConnection();
	    //(3)準備SQL語句
	    String sql="select * from stu_info where hight>?";
	   //(4)返回一個陳述對象PreparedStatement發送sql語句到數據庫系統;
	    statement=conn.prepareStatement(sql);
	  //(5)執行SQL返回一個結果集
	    statement.setFloat(1, 0);//第一個?號參數實參
	   //執行查詢返回一個結果值
	    result=statement.executeQuery();

//指針移動到結果集最後一行
result.last();
//getRow()返回當前行的行號,以1開始不是0
%>
    <p style="font-size: 5;color: black;">你要查詢的學生共有:<%=result.getRow()%>人</p>
    <table border="2">
    	 <tr>
	    <td>學生學號</td><td>姓名</td><td>性別</td><td>年齡</td><td>身高</td><td>體重</td>
	    </tr>
    <% result.beforeFirst();
//注意resultSet的返回結果集若是是沒有記錄不是null也不是空字符串,而是用first()或者next()返回來判斷
    while(result.next()){
    	//id,name,sex等都是數據庫表的列名,必須一一是真的書寫;
    %>
         <tr>
         <td><%=result.getString("id") %></td><td><%=result.getString("name") %></td>
         <td><%=result.getString("sex") %></td><td><%=result.getInt("age") %></td>
         <td><%=result.getFloat("hight") %></td><td><%=result.getFloat("weight") %></td>
         </tr>
     <% } %>
    </table>
     <%
     //關閉結果集
       if(result!=null) result.close();
     //關閉陳述
       if(statement!=null) statement.close();
     //關閉鏈接
       if(conn!=null) conn.close();
     %>
</body>
</html>

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>插入學生信息頁面</title>
<style type="text/css">
.inputfront{font-size: 18px;margin-left:10px;}
.p1{margin-left:260px;}
</style>
</head>
<body>
<br>

<form method="post" action="insert_stu_2.jsp">
<table class="p1">
<tr><td>學生學號 :</td><td><input type="text" name="id" class="inputfront"/></td></tr>
<tr><td>姓名 :</td><td><input type="text" name="name" class="inputfront"/></td></tr>
<tr><td>性別 :</td><td><input type="text" name="sex" class="inputfront"/></td></tr>
<tr><td>年齡 :</td><td><input type="text" name="age" class="inputfront"/></td></tr>
<tr><td>身高/釐米 :</td><td><input type="text" name="hight" class="inputfront"/></td></tr>
<tr><td>體重/斤 :</td><td><input type="text" name="weight" class="inputfront"/></td></tr>
</table>

<input type="submit" name="submit" value="提交" style="margin-left:400px;margin-top:18px;font-size:20px;"/>
</form>

</body>
</html>

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="java.sql.*" %>
<%@page import="javax.sql.*" %>
<%@page import="javax.naming.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>反饋插入學生信息是否成功</title>
</head>
<body>
<%
//request若是沒填接收到的是空值不是null,由於是input的text類型變爲了空值;
request.setCharacterEncoding("UTF-8");
String id=request.getParameter("id");
String name=request.getParameter("name");
String sex=request.getParameter("sex");
String age=request.getParameter("age");
String hight=request.getParameter("hight");
String weight=request.getParameter("weight");
if("".equals(id)||"".equals(name)||"".equals(sex)||"".equals(age)||"".equals(hight)||"".equals(weight))
	out.println("不容許有空值!");

Context context=new InitialContext();
DataSource ds=(DataSource)context.lookup("java:comp/env/jdbc/sql");
Connection conn=ds.getConnection();
String sql="select * from stu_info where id=?";
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1,id);
ResultSet rs=ps.executeQuery();
if(rs.first()) out.println("您輸入的學號在數據庫裏已經存在!");
else
%>
<jsp:forward page="insert_stu_3.jsp"></jsp:forward>
<%
if(rs!=null) rs.close();
if(ps!=null) ps.close();
if(conn!=null) conn.close();
%>
</body>
</html>
相關文章
相關標籤/搜索