Avatar billede trp79 Nybegynder
08. november 2004 - 22:47 Der er 34 kommentarer og
1 løsning

Brugerhåndtering - ideer til hvordan søges

Hejsa
Jeg benytter container managed declarative security med Tomcat. Jeg har 3 brugerniveauer: user, admin, superadmin. Nu vil jeg så gerne lave det sådan, at:
En user kun kan redigere sig selv
En admin kan redigere users(men ikke give dem bedre roller), oprette users, og redigere sig selv.

Jeg forestiller mig, at jeg lister alle brugere. En bruger skal man så kunne redigere, hvis man har de rigtige rettigheder til det, ved at trykke på det pågældende brugernavn. Når man redigerer en bruger skal man så kunne tildele brugeren en højere rolle, dog aldrig en rolle på højde med en selv. Oprettelse af bruger siger vel sig selv i dette tilfælde - altså man må ikke kunne oprette en bruger på samme niveau som en selv.

En superadmin kan redigere admins, oprette admins, give user adminrolle, og redigere sig selv.

Håber jeg kan få noget indput til og evt eksempler på, hvordan man plejer at lave sådan noget. Sig endelig til, hvis mine forestillinger lyder helt hen i vejret! :o)

På forhånd tak, mvh
Torben
Avatar billede arne_v Ekspert
08. november 2004 - 22:51 #1
Det er vist rimeligt normale krav. Den slags må være lavet mange gange før.

container managed security er ikke noget problem

jeg tror at du får problemer med declarative security i denne sammenhæng

jeg tror at at det vil være nemmere med noget programmatic security

if(request.isUserInRole("admin")) {
Avatar billede arne_v Ekspert
08. november 2004 - 22:54 #2
F.eks.:

showallusers.jsp med en SELECT bagved
editoneuser.jsp med en SELECT bagved
CreateUserServlet.java med en INSERT bagved og en redirect
UpdateUserServlet.java med en UPDATE bagved og en redirect
Avatar billede trp79 Nybegynder
08. november 2004 - 23:21 #3
Kan jeg ikke få dig til at uddybe, hvad du mener med dine eksempler? ( "showallusers.jsp med en SELECT bagved" osv)

Altså jeg viser brugerne således:

<%@ page contentType="text/html;charset=windows-1252"%>
<%@ page language="java" import="java.sql.*" import="javax.naming.*" import="javax.sql.*" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>
Brugerliste - man skal minimum være admin for at se denne side
</title>
</head>
<body>
Liste over alle brugere:
<br>
<table  cellspacing="2" cellpadding="1" border="1" width="300" align="left">
<%  Context init = new InitialContext();
    Context ctx = (Context) init.lookup("java:comp/env");
    DataSource ds = (DataSource) ctx.lookup("jdbc/Vindmolle");
    Connection con = ds.getConnection();
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT username, role FROM tomcat_roles");
    while(rs.next()) {
    out.print("<tr>");
    out.print("<td><a href=\"linkTilRedigerUser.jsp?parameterUserName="+rs.getString("username")+"\">"+rs.getString("username")+"</a></td>");
    out.print("<td>"+rs.getString("role")+"</td>");
    out.print("</tr>");
    } // slut på while-løkke
      // oprydning
    rs.close();
    stmt.close();
    con.close();
%>
</table>
</body>
</html>

og regner så med at når man klikker på dem, så kan man redigerer dem, hvis man har de rigtige rettigheder. Hvis jeg forstår dig rigtig, så skal tjekker jeg så(programmatic security) på det i editoneuser.jsp. Men jeg er ikke lige med på hvad du mener fx med "select bagved" osv.

Lige for oplysningen skyld... så er jeg først ved pcen igen onsdag aften.
Avatar billede arne_v Ekspert
09. november 2004 - 19:24 #4
Din JSP side svarer til min showallusers.jsp (og den SELECT jeg snakker om er den SELECT du har)

Din linkTilRedigerUser.jsp er min editoneuser.jsp og den skal vel have samme
SELECT med en WHERE således at den kun henter for den bruger.

UpdateUserServlet laver så en UPDATE i databasen og redirecter til en af
de 2 ovenstående JSP sider (afhængig af hvad du foretrækker).
Avatar billede arne_v Ekspert
09. november 2004 - 19:25 #5
Jeg forestillede mig at showallusers.jsp havde en form med et enkelt felt hvor
man submittede til CreateUserServlet som oprettede brugeren og redirectede
til den anden JSP side for redigering af roller.
Avatar billede trp79 Nybegynder
10. november 2004 - 07:47 #6
Hej Arne og tak for svaret indtil videre. Jeg kan lige nå, at stille et spørgsmål mere inden jeg smutter på arbejde. Når man nu skal redigere i en bruger, vil man så typisk have en brugerbønne, hvori opdateringen(sql'en) udføres, eller hvordan er det skik at gøre sådan noget? Mit mål er at få en pæn kode, da jeg kunne forestille mig, at jsp sider kan blive "ret" rodede...
Jeg er tilbage i aften igen.
Avatar billede arne_v Ekspert
10. november 2004 - 07:56 #7
Du kan vælge forskellige måder at lave SQL på:

1) JDBC kald embedded i JSP siden med <% %>

2) JSTL's SQL tags

3) JDBC kald i en bean klasse

#2 og #3 er pænere end #1
Avatar billede arne_v Ekspert
10. november 2004 - 07:59 #8
Ved #3 bør du overveje en data klasse med kun constructor + get og set metoder og en
aktiv database klasse som henter og gemmer.

Så begynder vi jo at nærme os noget der ligner Struts.
Avatar billede trp79 Nybegynder
10. november 2004 - 19:21 #9
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.
Avatar billede trp79 Nybegynder
10. november 2004 - 19:24 #10
Øjeblik! Jeg kan se, at der er noget mere info i tomcat loggen... så jeg kigger lige lidt på det!
java.lang.NullPointerException
    at vindmolle.UserBean.opretBruger(UserBean.java:71)
    at org.apache.jsp.admin.newUser_jsp._jspService(newUser_jsp.java:114)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
    at java.lang.Thread.run(Thread.java:534)
Avatar billede arne_v Ekspert
10. november 2004 - 19:27 #11
Hvad er linie 71 i UserBean ?
Avatar billede trp79 Nybegynder
10. november 2004 - 19:38 #12
Det må være brugernavnet der er null så i forbindelse med skrivning til db... linie 71: s.setString(1, brugernavn);
Avatar billede arne_v Ekspert
10. november 2004 - 19:41 #13
Det kan ikke være null fordi så ville vi dø på brugernavn.length()
Avatar billede arne_v Ekspert
10. november 2004 - 19:44 #14
Er du sikker på at ovenstående source code og den binære kode der bruges på serveren
matcher ?
Avatar billede arne_v Ekspert
10. november 2004 - 19:44 #15
.class og .jar filer reloades ikke ved ændring - det kræver en genstart
af server eller web applikation
Avatar billede trp79 Nybegynder
10. november 2004 - 19:51 #16
Jeg prøvede lige at deploye igen for en sikkerhedsskyld. Havde lavet lidt "ændringer" for at fejlfinde tidligere, hvilket havde rykket på linietallene... Sorry :(

Linien den fejler på er 69: PreparedStatement s = con.prepareStatement(
Avatar billede arne_v Ekspert
10. november 2004 - 19:55 #17
Det tyder på at der sker en exception her:

try
  {
    init = new InitialContext();
    ctx = (Context) init.lookup("java:comp/env");
    ds = (DataSource) ctx.lookup("jdbc/Vindmolle");
    con = ds.getConnection();
  }
  catch(Exception e) {

inden con bliver initialiseret
Avatar billede trp79 Nybegynder
10. november 2004 - 20:05 #18
Underligt... understående virker ellers på en anden side i samme applikation:

<%  Context init = new InitialContext();
    Context ctx = (Context) init.lookup("java:comp/env");
    DataSource ds = (DataSource) ctx.lookup("jdbc/Vindmolle");
    Connection con = ds.getConnection();
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT username, role FROM tomcat_roles WHERE username NOT IN (SELECT username FROM tomcat_roles WHERE role='admin')");
    while(rs.next()) {
    out.print("<tr>");
    out.print("<td><a href=\"editUser.jsp?brugernavn="+rs.getString("username")+"\">"+rs.getString("username")+"</a></td>");
    out.print("<td>"+rs.getString("role")+"</td>");
    out.print("</tr>");
    } // slut på while-løkke
      // oprydning
    rs.close();
    stmt.close();
    con.close();
%>
Avatar billede arne_v Ekspert
10. november 2004 - 20:14 #19
Hm.

Jeg tror at du skal have noget debug udskrift ind og finde ud af hvad der sker !
Avatar billede arne_v Ekspert
10. november 2004 - 20:16 #20
Iøvrigt er hele pointen med en connection pool at det er lyhurtigt at kalde getConnection og at man derfor kalder den, bruger connection og closer connection
igen hele tiden. Og altså ikke gemmer connection.
Avatar billede trp79 Nybegynder
10. november 2004 - 20:40 #21
Okidoki - jeg roder lige videre med det. Tak for hjælpen indtil videre. Jeg er dog ikke helt med på, hvad du mener med din sidste kommentar - jeg er dog overbevidst om, at du mener jeg kan min connectionpool mere effektiv men lige hvordan er jeg ikke med på...
Avatar billede arne_v Ekspert
10. november 2004 - 20:47 #22
Debug:

masser af System.err.println og så kig i Tomcat vinduet
Avatar billede arne_v Ekspert
10. november 2004 - 20:48 #23
Brug af connection:

drop init metode
drop alle de static members
lav en connection når du skal bruge den
udfør statements
close connection

(close på en connection pool connection betyder frigiv til pool)

Ikke noget performance problem.

Thread safe (hvilke de static alt muligt ikke er).
Avatar billede trp79 Nybegynder
11. november 2004 - 08:30 #24
Godmorgen
Nå, jeg vil se om jeg ikke kan få et lidt større overblik, så jeg forsøger nu at dele min kode op så jeg har en aktiv dbklasse, som du foreslår. Som jeg forstår dig så skal jeg i den have noget ala:

package vindmolle;

import java.sql.*;
import javax.naming.*;
import javax.sql.*;

public class DbHandler
{
  private Context init = null;
  private Context ctx = null;
  private DataSource ds = null;
  private Connection con = null;
  private PreparedStatement s = null;

  public boolean open()
  {
    if(ds==null)
    {
      try
      {
        init = new InitialContext();
        ctx = (Context) init.lookup("java:comp/env");
        ds = (DataSource) ctx.lookup("jdbc/Vindmolle");
      }
      catch(NoInitialContextException e){System.err.println(e);}
      catch(NamingException e){System.err.println(e);}
      return true;
    }
    else return true;
  }
  public DbHandler()
  {
  }

  public boolean opretBruger(String brugernavn, String nyAdgangskode, String epost)
  {
  try
  {
  con = ds.getConnection();
  s = con.prepareStatement(
  "INSERT INTO tomcat_users VALUES (?,?,?)");
    s.setString(1, brugernavn);
    s.setString(2, nyAdgangskode);
    s.setString(3, epost);
    s.executeUpdate();
    s.close();
    return true;
  }
  catch(SQLException e){System.err.println(e);}
  return false;
  }
}

Er det rigtigt forstået?
Avatar billede trp79 Nybegynder
11. november 2004 - 08:31 #25
hov opretBruger skulle vist have været synchronized.
Avatar billede arne_v Ekspert
11. november 2004 - 08:43 #26
Det ser meget bedre ud efter min mening
Avatar billede trp79 Nybegynder
11. november 2004 - 09:16 #27
Super - så går jeg videre med det :)
Avatar billede trp79 Nybegynder
15. november 2004 - 17:45 #28
Nå, så har jeg fået lavet sådan at jeg kan oprette en bruger. Jeg gør det dog gennem understående JSP side, samt en UserBean. Men jeg er ikke helt med på, hvordan jeg griber redigeringen af brugeren an, så jeg håber du kan komme med et par ideer til det. Du foreslå en servlet, men burde jeg ikke kunne lave en jsp side magen til understående og istedet på denne jsp side lavet et request på parameteren brugernavn og ud fra dette brugernavn hentet oplysninger om brugeren gennem min UserBean? eller er jeg helt skævt på den? Hvis det kan lade sig gøre kunne jeg godt tænke mig et par input til, hvordan jeg ud fra requestet brugernavn henter brugerens oplysninger gennem UserBean. Jeg har lavet en Updatebruger-metode i min UserBean.

Lige en anden ting også - hvordan kan det være du foretrækker servlets til insert og update af brugere? Du har jo formentlig en overbevisende grund.... :)

<%@ page contentType="text/html;charset=windows-1252"%>
<jsp:useBean id="userBean" class="vindmolle.UserBean" scope="session"/>
<jsp:setProperty name="userBean" property="brugernavn"/>
<jsp:setProperty name="userBean" property="epost"/>
<jsp:setProperty name="userBean" property="adgangskode"/>

<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="<%= userBean.getBrugernavn() %>">
    </td>
</tr>
<tr>
    <td>Epost:</td>
    <td><input type="text" name="epost" value="<%= userBean.getEpost() %>"></td>
</tr>
<tr>
    <td>Adganskode</td>
    <td><input type="text" name="adgangskode" value="<%= userBean.getAdgangskode() %>"></td>
</tr>
<tr>
    <td></td>
    <td><input type="submit" name="handling" value="opret bruger"></td>
</tr>
</table>
</form>
<font color="blue">Der sendes automatisk en e-mail til brugeren om, at han nu oprettelsen (incl. brugernavn og password).</font><br>
<font color="red">
<%
    String handling = request.getParameter("handling");
    if ("opret bruger".equals(handling)) {
    if (userBean.opretBruger()) {
      %>Succecfuld oprettelse - <%
        }
    else {
            %>Bruger kunne ikke oprettes. <%
        }
    }
%>
<%= userBean.getMeddelelse() %>
</font>

<br>
<a href="userList.jsp">userList</a>
</body>
</html>
Avatar billede arne_v Ekspert
15. november 2004 - 20:17 #29
Du kan sagtens redigere en bruger via sådan en JSP side.

Strukturen skal vel være:

- lav bean med info fra database
- generer form med felt værdier fra bean
- hvis post så skal der laves en bean med værdier og der skal laves en update
Avatar billede trp79 Nybegynder
17. november 2004 - 17:56 #30
Jeg får desværre nok brug for et par lidt mere detaljerede hints - Det skyldes nok, at jeg ikke lige er helt med på hvordan jeg opretter den her bean med info fra databasen og indsætter værdier i textfields :(

Altså jeg forestiller mig jo, at jeg har en liste med alle brugere. Når man klikker på et brugernavn, så sendes man til editoneuser.jsp(fx editoneuser.jsp?username=testbruger). Hvis jeg forstår dig rigtig, så skal der på editoneuser siden oprettes en userbean, hvorfra siden henter sine data til textfelterne. Jeg har lavet min update metode til når der er lavet ændringer - denne ligger også i min userbean klasse.
Avatar billede trp79 Nybegynder
17. november 2004 - 18:24 #31
Har nu fundet ud af, hvordan jeg putter data i en form. Men ellers er jeg stadig ikke nået længere i forhold til ovenstående kommentar :(
<form>
<input type="text" name="username" value="<%= request.getParameter("username")%>">
</form>
Avatar billede arne_v Ekspert
17. november 2004 - 18:27 #32
Du skal have noget kode som udfører en SELECT og returnerer en bean.
Avatar billede arne_v Ekspert
17. november 2004 - 19:00 #33
Du kan enten lave en ren bean klasse (kun contructor + get + set) og en db
klasse med en static save og en static load eller du kan have det hele
i en klasse.
Avatar billede trp79 Nybegynder
22. november 2004 - 08:07 #34
Nå Arne - det går fremad nu. Men vil lige arbejde lidt videre på det, hvorefter jeg har tænkt mig at poste det her, så andre evt. kunne gøre brug af det (ærgeligt man ikke kan vedhæfte filer til en kommentar). Så jeg vil sige tak for hjælpen og bede dig smide et svar :)
Hvornår det bliver postet tør jeg ikke sige.... vi er jo på vej ind i eksamenstiden, så jsp bliver nedprioriteret pt.
Avatar billede arne_v Ekspert
22. november 2004 - 08:09 #35
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
Kurser inden for grundlæggende programmering

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