带有servlet的DataSource - javax.naming.NameNotFoundException

时间:2013-04-12 10:24:43

标签: html xml tomcat servlets datasource

我正在尝试使用HTML创建登录表单,并使用DataSource使用Oracle数据库中的用户名和密码登录。 FirstServlet.java

    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    import javax.naming.*;
    import javax.sql.*;
    import oracle.jdbc.*;
    import java.sql.*;
    import javax.annotation.Resource;
    public class FirstServlet extends HttpServlet
    {

        DataSource ds;
        Connection con;
        public void init() throws ServletException
       {
                InitialContext ic=new InitialContext();
            Context cont=(Context)ic.lookup("java:comp");
                DataSource ds=(DataSource)cont.lookup("jdbc/xe");
       }
        protected void doPost(HttpServletRequest request,HttpServletResponse response                     throws ServletException,IOException
        {
              response.setContentType("text/html");
              PrintWriter pw=response.getWriter();
              String user=request.getParameter("username");
              String pass=request.getParameter("pass");
              boolean status=false;
             try
            {

            con=ds.getConnection("sys","password");
            PreparedStatement ps=con.prepareStatement("select * from example where name=? and pass=?");
            ps.setString(1,user);
            ps.setString(2,pass);
            ResultSet rs=ps.executeQuery();
            status=rs.next();
            }
            catch(Exception e)
            {
             System.out.println(e);
            }
            if(status)
            {
                RequestDispatcher rd=request.getRequestDispatcher("Welcome");
                rd.forward(request,response);
            }
          else
           {
              pw.println("Username/Password error");
              RequestDispatcher rd=request.getRequestDispatcher("index.html");
              rd.include(request,response);
           }
    pw.close();
    }
  }

index.html(主页)

     <html>
<form action="servlet1" method=post>
Name:<input type=text name=username></input>
<br />
Password:<input type=text name=pass>
<input type=submit value=login/>
    </html>

的web.xml

     <?xml version="1.0" encoding="utf-8"?>
     <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javae
/web-app_2_5.xsd" id="WebApp_ID" version="2.5">


<resource-ref>
<description>Example </description>
<res-ref-name>jdbc/xe</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>


<servlet>
    <servlet-name>FirstServlet</servlet-name>
    <servlet-class>FirstServlet</servlet-class>
</servlet>
<servlet>
    <servlet-name>WelcomeServlet</servlet-name>
    <servlet-name>WelcomeServlet</servlet-name>
</servlet>
<servlet-mapping>
    <servlet-name>FirstServlet</servlet-name>
    <url-pattern>servlet1</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>WelcomeServlet</servlet-name>
    <url-pattern>servlet2</url-pattern>
</servlet-mapping>
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>
    </web-app>

WelcomeServlet.java

    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    import javax.naming.*;
    import javax.sql.*;
    import oracle.jdbc.*;
    public class WelcomeServlet extends HttpServlet
   {
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException
     {
        response.setContentType("text/html");
        PrintWriter out=response.getWriter();
        String username=request.getParameter("username");
        out.println("Welcome "+username);
      }

}

最后是conf文件夹中的context.xml:

     <?xml version='1.0' encoding='utf-8'?>
     <Context>


<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/xe" auth="Container"
          type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
          url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
          username="sys" password="password" maxActive="20" maxIdle="10"
          maxWait="-1"/>
      </Context>

但是当我尝试从Tomcat Manager执行应用程序时,它无法部署。这是Catalina日志文件中的错误:

    Apr 12, 2013 3:11:25 PM org.apache.catalina.deploy.NamingResources cleanUp
    WARNING: Failed to retrieve JNDI naming context for container                      [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/login]] so no cleanup was performed for that container
    javax.naming.NameNotFoundException: Name [comp/env] is not bound in this Context. Unable to find [comp].
at org.apache.naming.NamingContext.lookup(NamingContext.java:820)
at org.apache.naming.NamingContext.lookup(NamingContext.java:168)
at org.apache.catalina.deploy.NamingResources.cleanUp(NamingResources.java:988)
at org.apache.catalina.deploy.NamingResources.stopInternal(NamingResources.java:970)
at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5590)
at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:141)
at org.apache.catalina.manager.ManagerServlet.start(ManagerServlet.java:1256)
at org.apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.java:714)
at org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:219)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:213)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:581)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

context.xml文件有什么问题吗?

编辑:我已将路径更改为java:/ comp / env / jdbc / xe但我收到另一个错误:

    org.apache.catalina.startup.HostConfig deployDirectory
    SEVERE: Error deploying web application directory C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\login
    java.lang.IllegalStateException: ContainerBase.addChild: start:    org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/login]]
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:904)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1114)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1673)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source) 

1 个答案:

答案 0 :(得分:0)

我认为您在检索env时遗漏了DataSource。尝试:

InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/xe");