Avatar billede mik28 Seniormester
03. oktober 2004 - 12:49 Der er 24 kommentarer og
1 løsning

At mappe en servlet i Resin

Hej Eksperter,

Jeg har købt et webhotel som anvender Resin. Jeg er ikke helt med på hvordan jeg mapper en servlet. Virker det efter samme princip som i Tomcat? Der skriver jeg i web.xml filen som følger.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<welcome-file-list>
<welcome-file>/start.jsp</welcome-file>
<welcome-file>/index.htm</welcome-file>
<welcome-file>/index.wml</welcome-file>
</welcome-file-list>

<servlet>
<servlet-name>Opret</servlet-name>
<servlet-class>Opret</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Opret</servlet-name>
<url-pattern>/Opret</url-pattern>
</servlet-mapping>

</web-app>
Avatar billede arne_v Ekspert
03. oktober 2004 - 13:00 #1
web.xml formatet er angivet i standarden d.v.s. den er ens på Tomcat og Resin
Avatar billede arne_v Ekspert
03. oktober 2004 - 13:06 #2
Server konfigurationen (conf/server.xml i Tomcat) er server specific.

Og brug af eventuelle org.apache klasser er Tomcat specifik.

Men din kode bør kunne deployes uden ændringer på Resin.
Avatar billede mik28 Seniormester
03. oktober 2004 - 13:10 #3
Hmmm, det virker bare ikke
Avatar billede arne_v Ekspert
03. oktober 2004 - 13:13 #4
Hvilken fejl får du ?

Er placering af filer og URL korrekt ?
Avatar billede mik28 Seniormester
03. oktober 2004 - 13:15 #5
Det eneste jeg egenligt har gjort er at flytte mit site fra Tomcat til Resin, så det går jeg da ud fra.
Avatar billede mik28 Seniormester
03. oktober 2004 - 13:15 #6
500 Servlet Exception
java.lang.NullPointerException
    at util.Databaseforbindelsemysqlprepared.close(Databaseforbindelsemysqlprepared.java:72)
    at Opret.doPost(Opret.java:88)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:165)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:103)
    at com.caucho.server.http.FilterChainServlet.doFilter(FilterChainServlet.java:96)
    at com.caucho.server.http.Invocation.service(Invocation.java:315)
    at com.caucho.server.http.CacheInvocation.service(CacheInvocation.java:135)
    at com.caucho.server.http.RunnerRequest.handleRequest(RunnerRequest.java:346)
    at com.caucho.server.http.RunnerRequest.handleConnection(RunnerRequest.java:274)
    at com.caucho.server.TcpConnection.run(TcpConnection.java:139)
    at java.lang.Thread.run(Thread.java:534)


--------------------------------------------------------------------------------
Resin 2.1.14 (built Thu Jul 1 18:39:55 PDT 2004)
Avatar billede arne_v Ekspert
03. oktober 2004 - 13:18 #7
Hm.

Det ligner jo et MySQL JDBC problem !

Er MySQL JDBC jar fil smidt ind i Resin ?

Er der andre opsætnings mæssige ting ?  (f.eks. brug af connection pool)
Avatar billede mik28 Seniormester
03. oktober 2004 - 13:22 #8
Jeg tror jeg har fundet problemet, ikke at jeg forstår at det er et problem. I den klasse jeg bruger til at oprette JDBC forbindelser har jeg en metode til at lukke forbindelsen.

public void close()
    {
        try
        {
            pstmt.close();
        }
        catch(SQLException s)
        {
            System.out.println("Close fejlede");
        }
       
    }

Men når jeg kalder den får jeg en fejl
Avatar billede arne_v Ekspert
03. oktober 2004 - 13:23 #9
Og en null pointer exception i den metode kan kun ske, hvis pstmt er null.
Avatar billede mik28 Seniormester
03. oktober 2004 - 13:50 #10
Det var det som var galt. Jeg forstår som sagt bare ikke hvorfor jeg får den fejl. pstmt burde altså ikke være null
Avatar billede mik28 Seniormester
03. oktober 2004 - 13:52 #11
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import util.*;
import java.util.Vector;

public class Opret extends HttpServlet
{
     
        public void doPost (HttpServletRequest request,
                      HttpServletResponse response)
        throws ServletException, IOException
        {
        PrintWriter        out;
        out = response.getWriter();
        StringBuffer buffer = new StringBuffer();

        response.setContentType("text/html");
       
        String onavn = request.getParameter ("onavn");
        String opass = request.getParameter ("opass1");
       
       
        Databaseforbindelsemysqlprepared d = new Databaseforbindelsemysqlprepared("jdbc:mysql://URL/DB?user=USER&password=PASSWORD", "com.mysql.jdbc.Driver");
     
     
        buffer.append("<html><head><title>Opret</title>\n");
        buffer.append("<script language=\"JavaScript\" src=\"./script/script.js\"></script>");
        buffer.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"./style/golf.css\">");
        buffer.append("</head>");

           
            try
            {
           
            Vector vi0 = new Vector();
       
           
            ResultSet rs = d.select("SELECT username,pass FROM users", vi0);
            boolean result=false;
               
            while(rs.next())
            {
               
                   
            String navn = rs.getString("username");
           
           
                    if(navn.equals(onavn))
                    {
                        result=true;
                    }
                }
                if(result) {
               
                buffer.append("<body>");
                buffer.append("<div style=\"text-align:center;\"><h1>Beklager, det navn er optaget. Prøv igen :-)</h1></div>");
                buffer.append("<div style=\"text-align:right;\"><button class=\"knap\" onclick=\"window.open('./index/ny_bruger_form.html', 'NY');\">Prøv igen</button></div>");
                buffer.append("</body></html>");
                }
               
                else if(!result)
                {   
               
                Vector vi1 = new Vector();
                vi1.addElement(onavn);
                vi1.addElement(opass);
               
                d.insertUpdate("INSERT INTO users (username,pass) VALUES (?,?)", vi1);
               
               
                buffer.append("<body onload=\"opener.name='opener';document.opret.target='opener';document.opret.submit();self.close();\">");
                buffer.append("<form name=\"opret\" action='./' method='post'>");
                buffer.append("<input type=\"hidden\" name=\"user\" value=\""+onavn+"\">");
                buffer.append("<input type=\"hidden\" name=\"pass\" value=\""+opass+"\">");
                buffer.append("</body></html>");
               
                }
               
                } catch (SQLException s) {
                    out.println("<h3>SQL fejl: " + s.toString() + " "
                    + s.getErrorCode() + " " + s.getSQLState() + "</h3>");
                }
   
        out.println(buffer.toString());
        out.close();   
//        d.close();
        }
}
Avatar billede mik28 Seniormester
03. oktober 2004 - 13:55 #12
Jeg ved godt at jeg burde skrive det om til JSP, men der har jeg det samme problem. Er det ikke god praksis at lukke forbindelsen når man er færdig med at bruge den?
Avatar billede arne_v Ekspert
03. oktober 2004 - 14:14 #13
Jo.

Hvad sker der i Databaseforbindelsemysqlprepared constructor ?
Avatar billede mik28 Seniormester
03. oktober 2004 - 14:44 #14
public Databaseforbindelsemysqlprepared(String data, String driver)
    {
       
        try
        {
            Class.forName(driver);
            conn = DriverManager.getConnection(data, "", "");

        }
        catch(Exception s)
        {
            System.out.println("SQL dataforbindelse fejlede"+s);
        }   
    }
Avatar billede arne_v Ekspert
03. oktober 2004 - 14:46 #15
Og den exception det bliver ikke smidt ?

(det er ikke altid godt at vide hvor System.out.println ender henne på et
web hotel)
Avatar billede mik28 Seniormester
03. oktober 2004 - 14:47 #16
Nej den bliver ikke smidt :-) Databaseforbindelsen bliver oprettet fint
Avatar billede arne_v Ekspert
03. oktober 2004 - 14:50 #17
Bliver pstmt initialiseret i d.select ?
Avatar billede mik28 Seniormester
03. oktober 2004 - 14:52 #18
public ResultSet select(String sql, Vector params)
    {
        ResultSet r = null;
        try
     
        {
    //    System.out.println("SQL=" + sql);
        PreparedStatement pstmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);
         
            for (int i=0; i < params.size(); i++) {
        //    System.out.println("arg " + (i + 1) + "=" + (String)params.elementAt(i));
            pstmt.setString(i+1, (String)params.elementAt(i));
            } 
     
        r = pstmt.executeQuery();
 
        }
        catch(SQLException s)
        {
            System.out.println("Select fejlede: "+s);
        }     
        return r;
    }
Avatar billede arne_v Ekspert
03. oktober 2004 - 14:54 #19
Bingo !

PreparedStatement pstmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);
         

sætter en lokal variabel pstmt i select - IKKE instans variablen pstmt som
close bruger !
Avatar billede mik28 Seniormester
03. oktober 2004 - 14:58 #20
okay. Jeg er bange for at jeg ikke helt forstår. Hvordan skal jeg så lukke forbindelsen?
Avatar billede arne_v Ekspert
03. oktober 2004 - 15:01 #21
Prøv og erstat


PreparedStatement pstmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);

med

pstmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);
Avatar billede arne_v Ekspert
03. oktober 2004 - 15:01 #22
men iøvrigt lukker

pstmt.close();

ikke forbindelse.

Det ville:

conn.close();

gøre
Avatar billede mik28 Seniormester
03. oktober 2004 - 15:14 #23
public void close()
    {
        try
        {
            conn.close();
        }
        catch(SQLException s)
        {
            System.out.println("Close fejlede");
        }
       
    }
Avatar billede mik28 Seniormester
03. oktober 2004 - 15:19 #24
Det ser ud til at virke. Mange tak for hjælpen
Avatar billede arne_v Ekspert
03. oktober 2004 - 15:20 #25
så ligger jeg et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Uanset kodesprog, så giver vi dig mulighederne for at udvikle det, du behøver.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester