jsp+jdbc+mysql开发模式案例解析

     网站写完后部署到tomcat的webapps下面,用自己申请的公网ip和端口去访问,奈何就是打不开,报404错误,把360关掉居然就能访问了,气死俺了。。这个网站访问数据库的网址不用更改,这个数据库网址和访问这个网站的网址不是一回事,有各自的网址和端口号。

一:jdbc是数据库连接技术缩写,jdbc有两种连接数据库系统的技术,一种是连接池技术(书写更少些),另一种是JDBC驱动程序。用JDBC驱动为了减少书写,可以把连接路径,属性设置等写在一个静态类里面,写一个静态的连接方法,每次要连接数据库就去调用这个公共静态方法就可以。

   1.连接池技术步骤:

  • 配置数据源
  • 连接数据库    
  • 关闭结果集陈述和连接

(1)配置数据源

在服务器安装程序的lib目录下添加mysql数据库驱动程序。数据库驱动程序在网址:http://dev.mysql.com/downloads/connector下载到,然后解压找到里面名字为:mysql-connector-java-5.??-bin的jar包,注意结尾是bin的包,把它复制到Tomcat的lib目录下。

在网站工程目录的META-INF下新建一个context.xml文件,在里面配置数据源参数。url中网址:打开的端口号/数据库名称?是否使用SSL加密技术。driverClassName链接数据库的驱动程序名,com.mysql.jdbc.Driver是jdbc的mysql的驱动程序名字。maxActive:数据库连接池中的最大活动连接数目,这些连接关闭后就能回到池中,下一次重复使用。maxIdle,连接空闲的最大数目0是不受限制。maxWait请求数据库连接的最长等待时间,超时抛出异常。

<?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)关闭对象

 <%
     //关闭结果集
       if(result!=null) result.close();
     //关闭陈述
       if(statement!=null) statement.close();
     //关闭连接
       if(conn!=null) conn.close();
     %>

     2.JDBC驱动技术。                                                                                               

  • 添加驱动程序包到服务器的lib目录下并注册驱动程序
  • 书写连接路径和属性并连接
  • 数据库访问

(1)添加驱动程序包到服务器的lib目录下并注册驱动程序

在服务器安装程序的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();

二、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对象

重定向跳转到任何网页包括本网站以外的网页、定时刷新的功能,不太了解。

三、案例代码

<%@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>Insert title here</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>Insert title here</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>

猜你喜欢

转载自my.oschina.net/u/3630543/blog/1787911