Så har jeg været ved at kigge lidt nærmere på oprettelsen af brugere. Men jeg får en nullpointer exception i metoden Opretbruger når jeg forsøger at med understående, som er stærkt inspireret af javabog.dk/jsp:
UserBean.java:
package vindmolle;
import java.sql.*;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.servlet.*;
import java.sql.*;
import javax.naming.*;
import javax.sql.*;
/**
* Denne javabønne har ansvaret for registrering af en bruger.
*/
public class UserBean
{
private String brugernavn = "";
private String adgangskode = "";
private String epost = "";
private String meddelelse = ""; // fejlmeddelelse til brugeren
public void setBrugernavn(String bn) { brugernavn=bn; }
public String getBrugernavn() { return brugernavn; }
public void setAdgangskode(String ak) { adgangskode = ak; }
public void setEpost(String epost) { this.epost = epost; }
public String getEpost() { return epost; }
public void setMeddelelse(String m) { meddelelse = m; }
public String getMeddelelse() { String m=meddelelse; meddelelse=""; return m; }
/** Forbindelsen til connectionpoolen. Oprettes når klassen indlæses */
private static Context init = null;
private static Context ctx = null;
private static DataSource ds = null;
private static Connection con = null;
private static String postserver = null;
private static String postafsender = null;
/** Initialisering. Skal kaldes før bønnen bruges */
public synchronized static void init(ServletContext application)
{
if (con!=null) return; // initialisér kun hvis det ikke allerede er gjort
// Opret forbindelse til databasen når klassen bruges første gang
try
{
init = new InitialContext();
ctx = (Context) init.lookup("java:comp/env");
ds = (DataSource) ctx.lookup("jdbc/Vindmolle");
con = ds.getConnection();
}
catch(Exception e) {
e.printStackTrace();
System.out.println( e );
}
}
/**
* Registrerer ny bruger og sender adgangskode til epost-adressen
* @return true hvis oprettelsen gik godt, ellers false.
*/
public boolean opretBruger()
{
if (brugernavn.length() >= 1 && epost.length() >= 5 )
try {
String nyAdgangskode = lavNyAdgangskode();
PreparedStatement s = con.prepareStatement(
"INSERT INTO tomcat_users VALUES (?,?,?)");
s.setString(1, brugernavn);
s.setString(2, nyAdgangskode);
s.setString(3, epost);
s.executeUpdate();
s.close();
sendAdgangskode(nyAdgangskode);
return true; // oprettelse lykkedes!
} catch (Exception e) {
e.printStackTrace();
meddelelse = "Fejl under oprettelsen: "+e;
} else{
meddelelse = "Brugernavn og epost skal være udfyldt";
}
return false;
}
/**
* adgangskode genereres til ny bruger
* @return koden
*/
private String lavNyAdgangskode() {
String ord = "";
for (int j=0; j<6; j++) {
ord = ord + (char) ('a' + (char) (Math.random()*25));
}
return ord;
}
/**
* Send adgangskoden til brugeren med E-post
*/
private void sendAdgangskode(String adgangskoden) throws Exception
{
if (postafsender==null) postafsender = "tope01ab@student.cbs.dk";
if (postserver==null) postserver = "smtp.mail.dk";
Properties prop = new Properties();
prop.setProperty("mail.host", postserver); // afhænger af internetudbyder
prop.setProperty("mail.transport.protocol", "smtp");
Session session = Session.getInstance(prop);
// Opbyg beskedden
Message besked = new MimeMessage(session);
besked.setFrom(new InternetAddress(postafsender));
besked.setRecipient(Message.RecipientType.TO, new InternetAddress(epost));
besked.setSubject("Din adgangskode til javabog.dk");
String txt = "Din adgangskode til javabog.dk er: "+adgangskoden+"\n"
+ "Du kan også logge ind ved at klikke på nedenstående henvisning:\n"
+ "
http://javabog.dk:8080/JSP/kode/kapitel_09/log_ind.jsp?brugernavn=" + java.net.URLEncoder.encode(brugernavn,"UTF-8")+"&adgangskode="
+ java.net.URLEncoder.encode(adgangskoden,"UTF-8")+"&handling=log+ind";
besked.setContent(txt, "text/plain"); // put beskedden ind
System.out.println(txt); // skriv også beskedden i serverens log
Transport.send(besked); // send beskedden
meddelelse = "Adgangskoden er sendt til adressen "+ epost;
}
}
*****************************************************************************
newUser.jsp
<%@ page contentType="text/html;charset=windows-1252"%>
<jsp:useBean id="login" class="vindmolle.UserBean" scope="session"/>
<jsp:setProperty name="login" property="brugernavn"/>
<jsp:setProperty name="login" property="epost"/>
<html>
<head><title>Ny bruger</title></head>
<body>
<h1>Registrering af ny bruger</h1>
<form action="newUser.jsp" method="get">
<table>
<tr>
<td>Ønsket brugernavn:</td>
<td><input type="text" name="brugernavn" value="<%= login.getBrugernavn() %>">
</td>
</tr>
<tr>
<td>Epost:</td>
<td><input type="text" name="epost" value="<%= login.getEpost() %>"></td>
</tr>
<% // Ekstra sikkerhedskode som bruger skal aflæse fra billede, se afsnit 2.9.1
String sikkerhedskode = (String) session.getAttribute("sikkerhedskode");
if (sikkerhedskode==null) {
sikkerhedskode = "" + (int) (Math.random()*100000);
session.setAttribute("sikkerhedskode", sikkerhedskode);
}
session.setAttribute("billedtekst", " Sikkerhedskoden er : "+sikkerhedskode);
%>
<tr>
<td>Indtast sikkerhedskode</td>
<td><input type="text" name="sikkerhedskode"></td>
</tr>
<tr>
<td colspan="2"><img src="newUserSikkerhedsBillede.jsp"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="handling" value="opret bruger"></td>
</tr>
</table>
</form>
<font color="red">
<%
String handling = request.getParameter("handling");
if ("opret bruger".equals(handling)) {
if (!sikkerhedskode.equals(request.getParameter("sikkerhedskode"))) {
%>Du har tastet en forkert sikkerhedskode. <%
} else if (login.opretBruger()) {
%><jsp:forward page="log_ind.jsp" /><%
} else {
%>Bruger kunne ikke oprettes. Prøv med et andet brugernavn og tjek epost.<%
}
}
%>
<%= login.getMeddelelse() %>
</font>
<br>
<a href="log_ind.jsp">Gå til login</a>
</body>
</html>
newUserSikkerhedsBillede.jsp laver blot et jpeg billede med 5 tal i, som man skal bekræfte.
Jeg er altså ved at være over i dit forslag 3#.
Eftersom det er ved at blive mere og mere kompliceret skal jeg selvfølgelig nok smide nogle flere point i puljen når spørgsmålet skal lukkes :)
Jeg håber du har en ide til, hvorfor jeg får nullpointer exceptionen, og hvordan jeg kommer videre.