如何在JSP上使用preparedstatement.setObject?

时间:2012-10-24 03:19:30

标签: java mysql jsp

我还是JSP或Java的新手。我目前正在使用现有的Java代码,所谓的 Conn.java 如下:

  package org.myclass.auth;

  import java.sql.*;
  import org.myclass.global.Variable;
  import org.myclass.auth.LoadProps;
  import org.apache.commons.dbcp.BasicDataSource;
  import javax.sql.DataSource;

  public class Conn {
     String success = "";
  public LoadProps app;
  public Variable var = new Variable();
  Connection conn = null;
  Statement st = null;
  ResultSet rs = null;
  int x = 0;

  public Conn(String path)  {
     app = new LoadProps(path);
  }
  public Conn()  {
     app = new LoadProps(var.getPATH());
  }
  public boolean open() {
     boolean success = false;

    try {
        DataSource dataSource = setupDataSource(app.getUrl(), app.getUser(), app.getPassword());
        conn = dataSource.getConnection();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return success;
  }
  public DataSource setupDataSource(String connectURI, String connectUser, String connectPassword) {
    BasicDataSource ds = new BasicDataSource();
    ds.setDriverClassName("com.mysql.jdbc.Driver");
    ds.setUsername(connectUser);
    ds.setPassword(connectPassword);
    ds.setUrl(connectURI);
return ds;
   }
  public static void printDataSourceStats(DataSource ds) throws SQLException {
     BasicDataSource bds = (BasicDataSource) ds;
  }

  public static void shutdownDataSource(DataSource ds) throws SQLException {
     BasicDataSource bds = (BasicDataSource) ds;
     bds.close();
  }

  public String getUrl()  {
     return app.getUrl();
  }
  public String getUser()  {
     return app.getUser();
  }
  public String getPassword()  {
    return app.getPassword();   
  }

  public void close() throws SQLException {
      if(!conn.isClosed())    {
        conn.close();
     }
  }
  public ResultSet query(String query)    {
      try {         
         st = conn.createStatement();  
         rs = st.executeQuery(query);
     }
     catch(SQLException sqle) {
        sqle.printStackTrace();
     }
    return rs;
   }
   public boolean queryInsert(String query)    {
       boolean value = false;
      try {
        st = conn.createStatement();
        value = st.execute(query);            
        value = true;
    }
    catch(SQLException sqle) {
        sqle.printStackTrace();
    }
    return value;
    }
   public int queryUpdate(String query)    {
       int value = 0;
       try {
            st = conn.createStatement();
           value = st.executeUpdate(query);
       }
       catch(SQLException sqle) {
          sqle.printStackTrace();
     }
    return value;
}

}

为了使用PreparedStatement,所以稍后我只在我的JSP代码上调用它,例如:

    <%@ page import="java.io.*,java.util.*,java.sql.*"%>
    <%@ page import="javax.servlet.http.*,javax.servlet.*" %>
    <%@ page import="org.myclass.auth.Conn" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>


    <%    
        String query = "SELECT adminid FROM administrator where username =  '"+ session.getAttribute("username") +"'";
        Conn conn = new Conn();
        ResultSet rsQ;
        conn.open();
        rsQ = conn.query(query);
        rsQ.next();

        int adminid = rsQ.getInt(1);
        conn.close();


        Conn conn1 = new Conn();
        String insert = "INSERT INTO campaign  (uid,sender_id,content,Starttime,status,lastmodifiedid,creationtime,msisdnfile) VALUES('"+ adminid +"','"+ request.getParameter("sender_id") +"','"+request.getParameter("message")+"','"+request.getParameter("startTime")+"','Running','"+adminid+"',now(),'file2.txt')";
        out.print(insert);
        conn1.open();
        conn1.queryInsert(insert);
        conn1.close();
    %>

我应该做些什么来修改Conn.java,因为当我运行JSP时,它返回NULL,当它转到 conn1.queryInsert(insert)时?还有一件事,如果我使用PreparedStatement,那么我应该怎样做以保持我的JSP与上面相同? 提前致谢

3 个答案:

答案 0 :(得分:0)

请注意: 不建议在JSP中保留任何业务或数据访问逻辑。 JSP仅用于演示目的。此类数据访问相关代码应在服务器端JAVA类中移动。请阅读 MVC (模型 - 视图 - 控制器)模式以了解更多信息。

使用statement获取connection个对象,传递字符串查询并运行executeUpdate,如下所示:

   conn1.open();
   Statement statement = conn1.createStatement();
   statement.executeUpdate(insert);
   conn1.close();

答案 1 :(得分:0)

请不要这样做。保留在Data Access Layer。不要使用SQL相关代码搞乱JSP。

此外,不要使用Java代码污染JSP。因此,请改为使用JSTL / EL代替字谜。

答案 2 :(得分:0)

根据MVC2规则,所有与数据库问题相关的逻辑应该使用DB bean或Hibernate,类似JDO的框架保存在持久层中。并且所有业务逻辑都应保存在bean类或spring bean,ejb会话bean组件中。 如果您在任何小型应用程序中仅使用jsp,请按照以下步骤操作:

  1. 创建一个单独的简单或Bean类,将所有属性作为私有
  2. 以公共方法的形式在该课程中编写您的逻辑
  3. 在jsp页面中使用<jsp:useBean>, <jsp:setProperty> and <jsp:getProperty>之类的标签来访问bean类的对象
  4. 使用id(object refrence)
  5. 调用Bean类的必需方法

    不建议将java代码放在jsp中,因此请尝试使用jstl或自定义标记。

    我希望它能帮助你...... :)。