千里马

天马行空

jsp+javaBean

1,什么是可重用组件:是指能够完成某种特定的功能,并提供了一个或多个访问接口的聚合模块程序,可重复使用是它最大的特点。
  在java企业级开发中,最重要的两类组件是javabean和EJB。
javabean本质就是一个java类,但是这个java类的组成必须符合一定的规则,这个规则也就是javabean规范,其中包括缺省的构造方法,setXXX和getXXXde风格来构造属性等。他可以很容易的被组合到程序中去,一般包括业务逻辑代码和数据访问代码等。jsp在使用他的时候可以用普通的java脚本实例化这个类,像其他java对象一样使用,也可以使用jsp提供的动态标签来访问。
EJB 相对于javabean来说是一个大得多的组件,他必须生存在符合javaee规范的应用服务器中,它的定义和调用都要复杂的多,在实际的java开发中很小使用EJB组件。
2,javabean规范:
(1),它是一个公开类(public class);
(2),他有一个公开的无参数 的构造方法。
(3),提供了公开的setXXX和getXXX方法来决定javabean的属性,
3,用jsp完成一种特定的功能时,有三种实现方式:
(1),在html代码中间夹杂java语言写成的jsp脚本,功能逻辑就在java语言中完成。缺点是:代码可读性差,很难维护。
(2),把功能逻辑包装在一个javabean内,然后在jsp脚本中,用new关键字实例化这个javabean,在调用set和get方法来完成特定的功能,这种方式虽然维护比第一种好一些,但是可读性仍然不好。
(3),同样先把功能逻辑包装在一个javabean钟,再利用jsp提供的动作标签来访问javabean的属性,这种方式比第二种耦合度进一步降低了,是一种值得推荐的方式。
4,jsp使用javabean的标签详解:
  (1),定义javabean的动作标签<jsp:useBean>
        <jsp:useBean>标签用于在特定的范围内实例化或查找一个javabean,基本语法如下:
         <jsp:useBean id="唯一标示名字"
                       scope="page|request|session|application";
                       type="父类型"
                        class="实现类">
      id:表示在特定范围内的唯一标示的名字;
      scope:指定bean的存活范围,有4种:page:默认是page,标示jsp的页面范围,如果是同一个请求的另外一个jsp也页面就不见了。request:当前这一次的请求范围,包含多个jsp页面;session:标示会话范围;application:标示整个web应用,与servlet上下文同义。
     class:javabean的实例类名,必须是完整类名。
     type:javabean的父类或者一实现接口。
 <jsp:useBean>动作标签的基本工作机制如下:
            (1),在指定范围内寻找是否已有名字为id属性指定的对象。
             (2),如果存在,且指定了type属性,则用该type做一次强制类型转换后再返回该对象的引用,如果没用指定                     ,则直接返回该对象的引用。
            (3),如果不存在,则用class属性指定的类实例化一个新的对象并返回,并将该对象保存到scope内。
(2),设置javabean属性动作标签<jsp:setProperty>
        <jsp:setProperty>:是为javabean的可写属性赋值,它既可以放在<jsp:useBean>中间,也可以单独使用,基本语法如下:
         <jsp:setProperty
               id="与javabean的属性同名"
               property="可写属性名"
                value="字面值"
                  params="请求参数的名字"/>
       name:bean的id
       property:可写属性名,如setAge(),属性名为age,如果是*,则表示将所有的属性一一与请求参数按名匹配赋值。
       value:为属性复字面值,
        params:http请求的参数名。
3,获取javabean属性动作标签<jsp:getProperty>
              <jsp:getProperty>是获取javabean的可读属性,它既可以放在<jsp:useBean>中间,也可以单独使用,基本语法如下:           <jsp:getProperty
                       name="与javabean的id属性值相同"
                       property="可读属性名">
4,javaBean封装数据库操作的代码如下:
    private static final String url="jdbc:mysql://localhost:3306/test";
     private static final String username="root";
      private static final String  password="123";
       private String table;
       private Object[] params;
       public Connection getCon(){
        Connection conn=null;
        try {
   Class.forName("com.mysql.jdbc.Driver");
   conn=DriverManager.getConnection(url, username, password);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return conn;
       }
       public void close(Connection conn,Statement st,ResultSet rs){
        if(rs!=null){
         try {
    rs.close();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
        }
        if(st!=null){
         try {
    st.close();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
        }
        if(conn!=null){
         try {
    conn.close();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
        }
       }
 public String getTable() {
  return table;
 }
 public void setTable(String table) {
  this.table = table;
 }
 public Object[] getParams() {
  return params;
 }
 public void setParams(Object[] params) {
  this.params = params;
 }
5,javaBean封装添加数据操作:
     public boolean getInsertData(){
  //Æ´½ÓsqlÓï¾ä
  String sql="insert into "+table+" values(";
  for (int i = 0; i <params.length; i++) {
   sql+="?";
   if(i!=params.length-1){
    sql+=",";
   }
  }
  sql+=")";
  boolean rst=false;//¶¨Òå²Ù×÷½á¹û
  Connection conn=null;//¶¨ÒåÁ¬½Ó¶ÔÏó
  PreparedStatement pst=null;//¶¨Òå»á»°¶ÔÏó
  
  try {
   conn=this.getCon();//»ñÈ¡Êý¾Ý¿âÁ¬½Ó
   conn.setAutoCommit(false);//¹Ø±Õ×Ô¶¯Ìá½»
   pst=conn.prepareStatement(sql);//´´½¨»á»°
   //Ñ­»·ÉèÖòÎÊý
   for (int i = 0; i < params.length; i++) {
    pst.setObject(i+1,params[i]);
   }
   int num=pst.executeUpdate();//Ö´ÐÐsqlÓï¾ä
   conn.commit();//Ìá½»ÊÂÎñ
   //Èç¹ûÖ´Ðнá¹û´óÓÚ0 £¬´ú±íÖ´Ðгɹ¦
   if(num>0){
    rst=true;
   }
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   if(conn!=null){
    try {
     conn.rollback();//»Ø¹öÊÂÎñ
    } catch (SQLException e1) {
     // TODO Auto-generated catch block
     e1.printStackTrace();
    }
   }
   e.printStackTrace();
  }finally{
   close(conn,pst,null);//¹Ø±ÕÁ¬½Ó
  }
  return rst;
 }
6,javabean封装删除数据操作:
public boolean getDeleteData(){
  String sql="delete from "+table+" where "+params[0]+" =?";
  boolean rst=false;
  Connection conn=null;
  PreparedStatement ps=null;
 
  try {
   conn=this.getCon();
   conn.setAutoCommit(false);
   ps=conn.prepareStatement(sql);
   ps.setObject(1,params[1]);
   int num=ps.executeUpdate();
   conn.commit();
   if(num>0){
    rst=true;
   }
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }finally{
   close(conn,ps,null);
  }
  return true;
 }   
7,javabean封装修改数据操作:
public boolean getModifyData(){
  String sql="update "+table+" set "+params[0]+" =? where "+params[2]+"=?";
  boolean rst=false;
  Connection conn=null;
  PreparedStatement ps=null;
  
  try {
   conn=this.getCon();
   conn.setAutoCommit(false);
   ps=conn.prepareStatement(sql);
   ps.setObject(1,params[1]);
   ps.setObject(2,params[3]);
   int num=ps.executeUpdate();
   conn.commit();
   if(num>0){
    rst=true;
   }
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }finally{
   close(conn,ps,null);
  }
  return rst;
 }
8,javabean封装查询数据操作:
private Connection conn=null;
 private PreparedStatement ps=null;
 private ResultSet rs=null;
 public void setQuery(String sql){
  
  try {
   conn=this.getCon();
   ps=conn.prepareStatement(sql);
   rs=ps.executeQuery();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 public List getList(){
  List list=new ArrayList();
  try {
   while(rs.next()){
    String str="";
    for (int i = 0; i <params.length; i++) {
     str +=rs.getObject(params[i].toString());
     if(i!=params.length){
      str +=",";
     }
     list.add(str);
    }
   }
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally{
   this.close(conn,ps, rs);
  }
  return list;
 }
9,分页技术:逻辑分页和物理分页
      逻辑分页:查询sql语句不变,只不过通过java代码从逻辑上控制结果集光标的位置,从而实现分页;
     物理分页:改变sql语句,在数据库查询的时候只需取出需要的结果集,但是各个数据库控制结果集的sql语句不一样,;mysql:limit,orcale:rownum
   两种分页技术各有优缺点:逻辑分页效果低,但是程序容易控制,但不能跨数据库。
10,逻辑分页:逻辑分页的关键点在于根据当前的节点去定位结果集的下标位置,把下标定位好以后,就知道它是否有下一页和上一页信息等。
实现逻辑分页的步骤:(1),确定每页的最大记录数。(2),查询总共记录数。(3),根据总记录数和每页最大记录数确定最大页码。(4)查询结果集。(5),根据每页最大记录数和当前页码对结果集的下表进行定位。(6),不超过最大记录数的循环打印结果集。
11,物理分页的实现思想还是需要确定每页的最大记录数、当前页码、最大页码、总记录数的信息,但是它把结果集下标定位交个数据库来完成了,开发者需要做的就是把sql写好。
   对于mysql数据库,需要开发者熟悉他的limit语句,limit语句需要追加到查询语句的后面,告诉sql只返回规定行数的记录,基本语法如下:
       limit n #返回前 n行数据
      limit n,m #返回从n+1行开始,最多m行的数据。

posted on 2012-05-22 12:13 Mr Lee 阅读(880) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

My Links

Blog Stats

常用链接

留言簿

随笔分类

随笔档案

文章档案

(hibernate)http://www.blogjava.net/dyllove98/archive/2012/05/12/377959.html

搜索

最新评论

阅读排行榜

评论排行榜