请教大侠struts程序中的数据访问层应该怎么写啊?谢谢!我看了些struts方面的教程,现在想自己动手用struts写一个简单的有增、删、改等操作的jsp网页,我想把业务逻辑层(比如实现添加信息 修改信息 更新信息 插入信息 删除信息这些方法和各个验证的方法)放在struts的mvc中的m层(也就是模型层),然后把业务逻辑层的javabean放在jsp页面的html状态下调用。可数据访问层(比如 添加信息 修改信息 更新信息 插入信息 删除信息等具体的操作过程和连接数据库的字符串)到底是应该像传统的model1那样把select from..  insert into...等直接写在jsp页面的html状态下还是先把(比如 添加信息 修改信息 更新信息 插入信息 删除信息等具体的操作过程和连接数据库的字符串)先编译为java类文件(也就是javabean)然后把数据访问层的javabean放在jsp页面的html状态下调用???这二种方法在单纯的struts程序中(也就是数据访问层不用hibernation)哪个用得普遍些啊???谢谢!

解决方案 »

  1.   

    以下为我的个人理解:
    view主要是jsp实现显示,一般都是通过标签控制值对象来实现这样
    model就是我们平时说的业务逻辑以及值对象(javabean)值对象继承了ActionForm
    control就是实现了action的java类一般来说数据库操作都是写在业务逻辑类里面的,我们把要处理的数据封装进值对象然后业务逻辑类对这些值对象进行处理
    control类对上述过程进行控制,操作完成后返回相应的页面
      

  2.   

    谢谢!我可能没说清楚啊!我看有的教程上规定struts的mvc2中不包括数据访问层啊!m层中只有业务逻辑层啊!数据访问层是要另建的啊!(如果是struts+hibernation,那hibernation就是数据访问层了啊!) 可我问的是单纯的struts程序中(也就是数据访问层不用hibernation)下面的问题怎么回答啊???这二种方法在单纯的struts程序中哪个用得普遍些啊???谢谢!
    数据访问层(比如 添加信息 修改信息 更新信息 插入信息 删除信息等具体的操作过程和连接数据库的字符串)到底是应该像传统的model1那样把select from..  insert into...等直接写在jsp页面的html状态下还是先把(比如 添加信息 修改信息 更新信息 插入信息 删除信息等具体的操作过程和连接数据库的字符串)先编译为java类文件(也就是javabean)然后把数据访问层的javabean放在jsp页面的html状态下调用???这二种方法在单纯的struts程序中(也就是数据访问层不用hibernation)哪个用得普遍些啊???谢谢!
      

  3.   

    不知道是不是你想要得import java.lang.reflect.Field;
    import java.sql.*;
    import java.util.ArrayList;import javax.naming.*;
    import javax.sql.*;public class PmsDBConnection {

    protected static PmsDBConnection instance_m = null; 

    protected static String PMS_JNDI_NAME = "PMS_JNDI"; 

    protected DataSource pmsDataSource_m = null; 

    protected Connection dbCon_m = null; 

    /**
     * 
     */
    protected PmsDBConnection() throws PmsException
    {  
    // try
    // {
    //
    // Context initContext = new InitialContext();
    // Context envCtx = (Context)initContext.lookup("java:comp/env");
    // DataSource ds = (DataSource)envCtx.lookup("jdbc/oracle");
    // } catch (NamingException e)
    // {
    // System.out.println(e.getMessage());
    // throw new PmsException(10); 
    // }
    }

    protected Statement getStatement() throws PmsException
    {
    Context initCtx;
    try

    dbCon_m = pmsDataSource_m.getConnection(); 
    Statement stmt = dbCon_m.createStatement();
    return stmt; 
    }catch (SQLException e)
    {
    //TODO SQLException
    throw new PmsException(1); 

    }

    protected static PmsDBConnection getInstance() throws PmsException
    {
    if(null == instance_m)
    {
    instance_m = new PmsDBConnection(); 
    }
    return instance_m; 
    }
    /*******************************************************************************************/
    public boolean executeUpdate(String sql) throws PmsException
    {
    try
    {
    Connection conn = pmsDataSource_m.getConnection();
    Statement stmt = conn.createStatement(); 
    stmt.executeUpdate(sql); 
    } catch (SQLException e)
    {
    //TODO SQLException
    throw new PmsException(1); 
    }

    return true; 
    }

    public boolean executeUpdate(ArrayList sqls) throws PmsException
    {
    for(int i = 0; i < sqls.size(); i++)
    {
    this.executeUpdate(sqls.get(i).toString()); 
    }
    return true; 
    }


    public ArrayList executeQuery(String sql, String beanName) throws PmsException 

    ArrayList result = new ArrayList(); 
    try
    {
    Connection conn = pmsDataSource_m.getConnection();
    Statement stmt = conn.createStatement(); 
    ResultSet rs = stmt.executeQuery(sql); 
    Class cl = Class.forName(beanName); 
    Field fs [] = cl.getDeclaredFields();  
    while(rs.next())
    {  
    Object obj = cl.newInstance();   
    for(int i = 0; i < fs.length; i++)
    {
    fs[i].set(obj, rs.getObject(fs[i].getName())); 
    }
    result.add(obj); 

    rs.close(); 
    conn.close(); 
    } catch (SQLException e)
    {
    //TODO SQLException
    throw new PmsException(1); 
    } catch (ClassNotFoundException e)
    {
    //TODO ClassNotFoundException
    throw new PmsException(2); 
    } catch (InstantiationException e)
    {
    //TODO InstantiationException
    throw new PmsException(3); 
    } catch (IllegalAccessException e)
    {
    //TODO IllegalAccessException
    throw new PmsException(4); 
    }

    return result; 
    }
    }
      

  4.   

    package com.neusoft.pms.common;import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    public class pmsDataSource
    {
    public static Connection getConnection() 
    {
    // Step1
    Connection theConnection = null;
    try
    {
    DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
     

      //Step2
      String url = "jdbc:oracle:thin:@localhost:1521:DONGDONG";
      String userName = "scott";
      String password = "tiger";

       theConnection = DriverManager.getConnection(url,userName,password);
    }
    catch (SQLException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }catch(Exception e)
    {
    e.printStackTrace();
    }
      
    return theConnection;

    }
    }
      

  5.   

    LZ:楼上bobking1983的意思应该是把(比如 添加信息 修改信息 更新信息 插入信息 删除信息等具体的操作过程和连接数据库的字符写在javabean中
    然后这些操作数据库的方法应该在action中调用,而不是在jsp中,
      

  6.   

    gaojian189(无尽空虚)
    是个东软的.呵呵.
      

  7.   

    gaojian189(无尽空虚)谢谢你的热心,可我不是这意思啊! 我的意思就是HeiSeWaiKe(黑色外壳) 说的啊!请问有没有这种写法?把(比如 添加信息 修改信息 更新信息 插入信息 删除信息等具体的操作过程和连接数据库的字符)写在javabean中,然后在jsp页面中调用!也就是帮忙回一下下面的问题!谢谢!我觉得我问得很清楚啊!
    在单纯的struts程序中
    数据访问层(比如 添加信息 修改信息 更新信息 插入信息 删除信息等具体的操作过程和连接数据库的字符串)到底是应该像传统的model1那样把select from..  insert into...等直接写在jsp页面的html状态下还是先把(比如 添加信息 修改信息 更新信息 插入信息 删除信息等具体的操作过程和连接数据库的字符串)先编译为java类文件(也就是javabean)然后把数据访问层的javabean放在jsp页面的html状态下调用???这二种方法在单纯的struts程序中(也就是数据访问层不用hibernation)哪个用得普遍些啊???谢谢!
      

  8.   

    具体的项目中很少有把逻辑直接写到JSP页面中,不安全隐患。
    所以选择写成javabean的是最普遍的
      

  9.   

    如果按照项目做法,都是写一个JavaBean来实现业务,再写一个JavaBean实现DAO操作,然后在业务的JavaBean调用DAO的JavaBean
      

  10.   

    谢谢楼上的老大,你说得使我明白了很多!还想问一下你:在单纯的struts程序的实际项目中(也就是数据访问层不用hibernation),数据访问层的javaBean是不是也要放在jsp页面的html状态下调用?(就像业务逻辑层的JavaBean那样放在jsp页面的html中)
      

  11.   

    谢谢楼上的老大,你说得使我明白了很多!还想问一下你:在单纯的struts程序的实际项目中(也就是数据访问层不用hibernation),数据访问层的javaBean是不是也要放在jsp页面的html状态下调用?(就像业务逻辑层的JavaBean那样放在jsp页面的html中)我问这的意思就是 数据访问层的javaBean既然已被业务逻辑层的JavaBean调用了,那还需不需要再把数据访问层的javaBean也像业务逻辑层的JavaBean那样那样直接放在jsp页面的html中???(我以前是搞asp.net的,做过一些三层结构的东西,在asp.net中是这样的: 表示层,也就相当于jsp页面的html,调用业务逻辑层,业务逻辑层再调用数据访问层,不会直接把数据访问层的东西写在表示层中,不知道jsp中是不是也是这样的啊!)
      

  12.   

    我觉得你还是误解了一点,就是你说的"业务逻辑层的JavaBean那样放在jsp页面的html中"
    我说的意思是说jsp只负责接收业务逻辑层的数据并显示.而业务逻辑是放在action中调用,数据访问封装成一个bean,然后业务逻辑bean的方法中调用这个bean
      

  13.   

    我明白HeiSeWaiKe(黑色外壳)说的意思啊!
    但我确是看到一些教程把业务逻辑层的JavaBean那样放在jsp页面的html中啊!孙卫琴的"精通struts"书中第二章的例子里hello.jsp 文件的html中就有下面的代码啊!其中personbean.class这个JavaBean就是业务逻辑层啊!这怎么解释啊?请知道的回一下啊!
    <logic:present name="personbean" scope="request">
    <h2>
    <bean:message key="hello.jsp.page.hello"/>
    <bean:write name="personbean" property="userName" />!<p>
    </h2>
    </logic:present>
      

  14.   

    你的两种方式都不是很好,在你的页面直接调用了业务逻辑的javabean[也就是你说的数据访问层的javabean]那样你的view 合业务对象还是有很大的耦合度,要在jsp直接写那就更不好。
     就算你不用hibenate,你写个接口利用DAO模式和普通的POJO,同样可以做到他们的分离。
     然后再你的DAO中可以解耦合jsp与业务逻辑对象的关系。
     
      

  15.   

    model就是我们平时说的业务逻辑以及值对象(javabean)值对象继承了ActionForm,这个说法有一定的局限性,这个继承了ActionForm的javabean不是业务逻辑对象,他是web层的数据模型对象,业务逻辑对象是在business tier来用的。
      

  16.   

    struts中数据库的访问是不固定的。
    可以直接jdbc连接,也可以用服务器连接池,还可以用hibernate之类的东西。不知道对不对,请大家指教。