0

基本的に、Web アプリケーションには 2 つのクラスがあります。1 つのクラス 'FormProcess.java' は、HTML フォームに情報を挿入し、いくつかの計算を実行して、結果を HTML として出力します。これは絶対にうまくいきます。

MySQL データベースの新しい行にデータを追加するためのクラスもあります。このクラスは「SqlConnect.java」と呼ばれます。これは、サーバー上で個別に実行した場合にも正常に機能します (つまり、テーブルに行を正しく挿入します)。

私が苦労しているのは、SqlConnect メソッドを FormProcess クラスから実行することです。FormProcess に以下を追加すると:

private SqlConnect sql;

そしてメソッドで:

sql.doPost(request, response);

次のエラーが表示されます。

java.lang.NullPointerException
crunch.FormProcess.doGet(FormProcess.java:27)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

これは現時点での SqlConnect クラスです (インポートなどは省きました)。

@WebServlet(name="sql",urlPatterns={"/sql"})
public class SqlConnect extends javax.servlet.http.HttpServlet {

    FormProcess process = new FormProcess();

    private static final long serialVersionUID = 1L;

    public SqlConnect() {

    }

    public void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        performTask(request, response);
    }

    public void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        performTask(request, response);
    }

    public void performTask(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        testJndiDataSource();
    }

    public void testJndiDataSource() {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            InitialContext ctx = new InitialContext();
            DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/CrunchDB");

            conn = ds.getConnection();

            st = conn.createStatement();
            st.executeUpdate("INSERT INTO log " + "VALUES (20, '1', '1', " + process.salaryInt + ", "+ process.takeHomePAYE +", "+ process.takeHomeContractor +", 2)");


        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try { if (rs != null) rs.close(); } catch (SQLException e) { e.printStackTrace(); }
            try { if (st != null) st.close(); } catch (SQLException e) { e.printStackTrace(); }
            try { if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); }
        }
    }

}

これを行う簡単な方法があると確信していますが、SqlConnect クラスはそれ自体で正常に実行されると言ったので、うまくいきません。

乾杯

4

1 に答える 1

2

残念ながら、現在のクラス構造には欠陥があります。SqlConnectのサブクラスであってはなりませHttpServletん。Web ページであるかのように直接呼び出すべきではないからです。代わりに、FormProcessおよび他の実際のサーブレットのみが にアクセスする必要がありますSqlConnect

したがって、コードは次のようになります。

public void testJndiDataSource(int salaryInt, double takeHomePAYE, String takeHomeContractor) {
    Connection conn = null;
    Statement st = null;
    ResultSet rs = null;
    try {
        InitialContext ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/CrunchDB");

        conn = ds.getConnection();

        st = conn.createStatement();
        st.executeUpdate("INSERT INTO log " + "VALUES (20, '1', '1', " + process.salaryInt + ", "+ process.takeHomePAYE +", "+ process.takeHomeContractor +", 2)");


    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        try { if (rs != null) rs.close(); } catch (SQLException e) { e.printStackTrace(); }
        try { if (st != null) st.close(); } catch (SQLException e) { e.printStackTrace(); }
        try { if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); }
    }
}

次に、でFormProcess

public void performTask(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    int salaryInt = //extract from form... 
    double takeHomePAYE = //extract from form... 
    String takeHomeContractor = //extract from form... 
    SqlConnect sqlConnect = new SqlConnect();
    sqlConnect.testJndiDataSource(salaryInt, takeHomePAYE, takeHomeContractor);
}

これは、サイトがどのように機能するかをモデル化するための、より論理的なアプローチです。注: 現在のクエリは、SQL インジェクションに対して完全に脆弱です。ここの指示に従って変更Statementしてください: http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.htmlPreparedStatement

于 2013-10-06T17:56:08.740 に答える