Java-код JSP говорит, что «javax.naming» не существует при использовании в <%! - PullRequest
1 голос
/ 06 января 2012

Когда я пишу код в <%, я могу использовать javax.naming, но когда я пишу код в <%!, я получаю сообщение об ошибке, что javax.naming не существует.

некоторые примеры:

<% Javax.naming.InitialContext ic = new Javax.naming.InitialContext(); %> fine
<%! void foo() { Javax.naming.InitialContext ic2 = new Javax.naming.InitialContext(); } %> error

Точная ошибка:

rptCountsRecon_jsp.java:22: package Javax.naming does not exist
    Javax.naming.Context init = new Javax.naming.InitialContext();

Я новичок в Java и очень плохо знаком с JSP.

РЕДАКТИРОВАТЬ: добавили метод foo во второй пример, потому что это может помочь понять мою проблему. Также добавлена ​​точная ошибка от Tomcat. РЕДАКТИРОВАТЬ 2: попытался добавить префикс в Context, и получил аналогичную ошибку.

РЕДАКТИРОВАТЬ 3: Дополнительный вопрос ... Текущий код выдает следующую ошибку:

    try
    {
        javax.naming.Context init = new javax.naming.InitialContext();
        Context ctx = (Context) init.lookup("java:comp/env");
        String jndiName = getServletContext().getInitParameter("jndiName");
        DataSource ds = (DataSource) ctx.lookup(jndiName);
        Connection dbConn = ds.getConnection();
        PreparedStatement pstmnt = dbConn.prepareStatement(sql);
        for(int i=0; i!=binds.size(); ++i)
            pstmnt.setString(i+1, binds.elementAt(i)); //binds index starts at 1 -_-

        return pstmnt.executeQuery();
    } catch (Exception e) {
        //out.println("A naming exception occured... I don't know how to get the info of it.");
        return null;
    }

rptCountsRecon_jsp.java:28: unreported exception java.sql.SQLException; must be caught or declared to be thrown
        Connection dbConn = ds.getConnection();

Ответы [ 2 ]

4 голосов
/ 06 января 2012

Прежде всего этот код типа должен быть в сервлете, а не в JSP.

Декларация (<%!):

<%! 
    javax.naming.InitialContext ic2 = new javax.naming.InitialContext();
%>

ic2 является переменной-членом.И причина, по которой вы не можете сделать ic2 = new javax.naming.InitialContext();, заключается в том, что конструктор выдает javax.naming.NamingException.

Представьте себе что-то следующее:

public class JspServlet {
    //there is no way to handle that exception here
    javax.naming.InitialContext ic2 = new javax.naming.InitialContext();
    //...

Scriptlet (<%):

<% 
    javax.naming.InitialContext ic = new javax.naming.InitialContext(); 
%>

И причина того, что это можно сделать там (внутри скрипта), заключается в том, что все в скрипте идет внутри блока try сгенерированного метода сервиса JSP.

Представьте себе следующее:

public class JspServlet {

    public void _jspService(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, java.io.IOException {             
        try {
            javax.naming.InitialContext ic = new javax.naming.InitialContext(); 
        } catch (Exception e) { 
            //...
        }

Я думаю, что будет больше смысла, если вы узнаете больше о жизненном цикле JSP.

2 голосов
/ 06 января 2012

Я согласен с тем, что написал Bhesh.Но вы можете сделать следующее.

<%! 
   public void jspInit(){
  try{
      javax.naming.InitialContext ic2 = new javax.naming.InitialContext(); 
   } catch (javax.naming.NamingException ne){
                                             // do something when exception occurs
                                            }
   }
%> 

Контейнер JSP вызывает метод jspInit при загрузке страницы.

...