Webapplikation mit JSP und Beans - Eingaben sichern, wie?

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi Leute,

ich bin (nicht ganz) Newbie bei Java, aber das was ich jetzt machen soll übersteigt meine Fähigkeiten und ich hoffe mit Eurer Hilfe meinen Kenntnisstand zu erweitern.
Folgende Situation:
- ich möchte ein Web-Frontend in Java bzw. HTML erstellen
- ich entwickle mit dem WebsphereApplicationDeveloper (falls der einem was sagt)
- das ganze möchte ich modular aufbauen, so dass man einzelne Komponenten hinzufügen oder entfernen kann
- ich arbeite mit der Oracle-DB9i und entsprechendem JDBC-Treiber
- ich benötige wegen der Vielzahl von Modulen ein dynamisches Menue (bisher habe ich ein extra Frame dafür und arbeite da mit JavaScript, auch wenn das nur ne Notlösung ist)
- mithilfe von JavaBeans möchte ich einige Werte sichern, um sie in anderen Modulen zu verwenden
- das System soll mehrsprachig geführt werden, dazu muss jeder Text und jede Buttonbezeichnung etc. in den entsprechenden Sprachen verfügbar sein
- es werden mehrere Formulare verbaut, die nach Usereingaben geprüft und ausgewertet werden sollen

und so weit bin ich:
ich habe einige JSP-Files mit dem HTML-Context erstellt, ein zentrales Bean, in dem alle Variablen instanziert werden und das alle Getter und Setter enthält, außerdem steht die Datenbankverbindung und ich komme an meine Daten ran.

Problem: bei Java gibt es keine globalen Variablen und ich kenne mich in Sachen Cookies nicht aus. Fakt ist, dass mehrere Benutzer gleichzeitig auf das System zugreifen müssen und ich nichtmal zwischen den einzelnen Modulen Daten sichern kann (sobald die JSP-Seite wechselt, z.B. durch nen Forward, kann ich die Werte nicht mehr auslesen).
Ich habe bzgl. "Beans" einen ähnlichen Ansatz probiert:
eine zentrale Klasse wie eben das Bean (Variablen, Getter, Setter)
Code:
public class Vars implements Serializable{
	static int 		b_help	= 0;	//ID Hilfe-Button
	static int 		b_logout	= 1;	//ID Logout-Button
	static int 		b_contact	= 2;	//ID Kontakt-Button
...
dazu in jedem Modul (JSP-Seite) eine eigene Instanz auf die "BeanKlasse"
Code:
<%@ page 
language="java"
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"
import="programm.*"
%>
<%! Vars var2 	 = new Vars(); 	//Instanz auf die Klasse Vars (BeanKlasse) %>
<%! DbAccess db2 = new DbAccess();	//Instanz auf die Klasse DbAccess (DB-Zugriff) %>

Die sprachabhängigen Texte werden durch Variablen gesetzt.
Ich komme innerhalb eines Moduls an alle Werte, die ich brauche, aber sobald ich die Seite wechsle verschwinden alle Werte (damit kann ich auch nicht sichern, welche Sprache der User am Anfang gewählt hat, welcher User eingloggt ist um nicht immer im System abfragen zu müssen etc.).

Falls jemand Zeit und Lust hat mich bei diesem (für mich) anspruchsvollen Vorhaben zu unterstützen, der möge sich bitte melden (dann könnte ich auch den bisherigen Code versenden, momentan arbeite ich an einer Umgebung mit Mysql und Apache Tomcat, damit Oravle und Websphere nicht nötig sind...müsste bis morgen tun).

Ich vermute, dass es wahrscheinlich am ganzen Konstrukt von JSP- und Java-Files liegt, dass es so nicht funktionieren kann, aber vielleicht hat jemand ne Idee wie man das (ohne Applets) lösen kann.

Also: Java bzw. JSP als Basis (Webapplikation über InternetExplorer erreichbar)
dynamisches Menü
modulare Bausweise (ein Modul soll eine Übersicht über Maschinen ausgeben, ein weiteres die Statistiken dazu erstellen etc.)
Mehrsprachigkeit


Danke Euch vorab für Anregungen!
Grüße,
rob
 
Hallo rob,

das ist für den Anfang ziemlich viel.

Sieh dir mal das Struts Framework an. An einem einfachen Beispiel solltest du schon die wesentlichen Vorteile erkennen können. Dann kannst du auch den Aufruf der Klasse für den Datenbankzugriff (derzeit in deiner JSP) in eine Actionklasse verschieben. Das sollte auch unabhängig von der Struts-Verwendung erfolgen.

Die sprachabhängigen Texte kannst du in property-Files auslagern. Den Rest macht dein Applicationserver fast allein.

Mehrere Benutzer sollten auch kein Problem sein, da jeder eine eigene Session benutzt.

Bei weiteren Fragen versuche diese aufzuteilen.

Gruss

Ives
 
erstmal lernen was der sessionscope ist

der ist genau dazu da, javabeans für einen Benutzer über seitengrenzen hinweg aufzubewahren...

<%! Vars var2

lass das lieber, gute jspseiten kommen ohne Membervariablen <%! aus (die ohnehin nur für diese eine Seite existieren)
 
Danke Euch erstmal, ich werde mich mal weiter einlesen müssen.
@Bleiglanz: ich weiß bisher nicht genau wie ich das ohne Membervariablen machen kann..ich bräuchte hier eigentlich nur einen globalen Zugriff auf die Klasse Vars (BeanKlasse) und das habe ich bislang nicht ohne Instanzierung geschafft.
So habe ich bislang die Parameter ausgelesen:
<% java.util.Enumeration parameters = request.getParameterNames();
while(parameters.hasMoreElements()) //solange es weitere Parameter gibt
{
String parameterName = (String)parameters.nextElement(); //Parametername ermitteln
String parameterValue = request.getParameter(parameterName);//Parameterwert ermitteln
%>
<!--<TR><!-- Test-Ausgaben der ermittelten Werte >
<TD><%=parameterName%></TD>
<TD><%=parameterValue%></TD>
</TR-->
<% //Sichern der Werte
//var2.setVarsLogin(parameterName,parameterValue);
if(parameterName.equals("name"))
{ var2.setLog_iv_name(parameterValue);%>
<jsp:setProperty name="bean1" property="log_iv_name" value="<%= parameterValue %>" />
<%
System.out.println("gesetzt wurde "+parameterName+": "+parameterValue);
}
else if(parameterName.equals("pw"))
{ var2.setLog_iv_pw(parameterValue);%>
<jsp:setProperty name="bean1" property="log_iv_pw" value="<%= parameterValue %>" />
<%
System.out.println("gesetzt wurde "+parameterName+": "+parameterValue);
}
else if(parameterName.equals("lang"))
{ var2.setLog_sv_lang(parameterValue);%>
<jsp:setProperty name="bean1" property="log_sv_lang" value="<%= parameterValue %>" />
<%
System.out.println("gesetzt wurde "+parameterName+": "+parameterValue);
}
}
%>
wobei var2 die Instanz der Klasse mit den Variablen, Gettern und Settern ist und daraufhin die Variable gesetzt wird. Wie kann ich das anstatt mit "request" mit "session" machen?
 
So jetzt bin ich mal eingeloggt...
Zu den Scopes:
Ich habe folgendes ausprobiert und es funktioniert 🙂
Setzen von Scope-Variablen:
Code:
<%
    // Check if attribute has been set
    Object o = pageContext.getAttribute("name", PageContext.PAGE_SCOPE);
    if (o == null) {
        // The attribute com.mycompany.name1 may not have a value or may have the value null
    }

    // Save data
    pageContext.setAttribute("name", "PageVariable");  // PAGE_SCOPE is the default
    pageContext.setAttribute("name", "SessionVariable", PageContext.SESSION_SCOPE);
    pageContext.setAttribute("lang", "ApplicationVariable", PageContext.APPLICATION_SCOPE);
%>
Ausgabe:
Code:
<%-- Show the values --%>
<% out.println("
Nur auf dieser Seite verfuegbar: "); %>
<%= pageContext.getAttribute("name")%><% // Defaultmaeßig: PAGE_SCOPE %>
<% out.println("
Waehrend der Session verfuegbar: "); %>
<%= pageContext.getAttribute("name", PageContext.SESSION_SCOPE) %>
<% out.println("
Applikationsweit verfuegbar: "); %>
<%= pageContext.getAttribute("lang", PageContext.APPLICATION_SCOPE) %>

Danke erstmal, sollte ich weitere Probleme haben werde ich mich bei Euch melden, sofern gestattet 🙂
Rob
 
UAHHH

a) verwende in deinen jsps sowenig <% %> wie möglich

b) warum pageContext? die vordefinierten Variablen session, application usw. sind da viel besser, auch wenn du sie vermeiden solltest

c) schau dir mal das jsp:useBean Element an, das würde deinen ersten FAll ("setzen") vollautomatisch OHNE Java-code erledigen...

gewöhn dir lieber gleich ein Muster an, bei dem

request an servlet
servlet macht was und legt beans in die scopes
servlet macht mit Dispatcher forward (oder include) auf jsp
jsp holt sich nur die Beans aus den scopes und zeigt was an

ist VIEL besser als das jsp <% java gestrüpp
 
Kannst Du mir mal Beispielcode für Servlet, JSP-Files (ein Sender und ein Empfänger) und Bean liefern? Was ich darstellen muss sind Formulare wie in HTML, nur müssen die Eingaben vom User gesichert werden, da ich Datenbankabfragen darauf machen muss...wäre Dir sehr dankbar für ein solches Minimalkonstrukt.

Grüße,
Rob
 
@Bleiglanz: mit <jsp:useBean habe ich bereits Versuche gestartet, habe aber Probleme die Eingaben vom User aus dem Formular zu setzen. normalerweise müsste ich doch damit alle Felder auslesen und setzen können:
Code:
<jsp:useBean id="vars" class="programm.Vars" scope="session"/>
	<jsp:setProperty name="vars" property="*" />
</jsp:useBean>

@all: Kann mir irgendjemand diesbezüglich weiterhelfen (ein einfaches Formular mit SprachSelect, Name und Passwort auf einer JSP-Webseite und eine weitere JSP-Seite, die die Eingaben ausgibt, dazu eben das nötige Servlet und Bean)?

Bean hätte ich hier
Code:
import java.io.Serializable;

public class myBean() implements Serializable{
private String name;
private String pw;

public setName(String n) {name=n;}
public getName() {return name}

public setPw(String p){pw=p;}
public getPw(){return pw}
}

Mein Grundgerüst vom Servlet:
Code:
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet implements Servlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws ServletException, IOException {

	}

	public void doPost(HttpServletRequest req, HttpServletResponse resp)
		throws ServletException, IOException {

	}

	public void init() throws ServletException {

		super.init();

	}
}
 
kalaha hat gesagt.:
Code:
<jsp:useBean id="vars" class="programm.Vars" scope="session"/>
	<jsp:setProperty name="vars" property="*" />
</jsp:useBean>

du bringst da glaube ich was bei den tags durcheinander. schau dir mal genau an, wann man das / am ende des tags setzt und wann nicht.
 
Sorry, ein Tippfehler, im Code habe ich den Tag richtig gesetzt. So schaut´s bei mir momentan aus:
Senderseite:
Code:
<jsp:useBean id="vars" class="programm.Vars" scope="session">
	<jsp:setProperty name="vars" property="*" />
</jsp:useBean>

<FORM name="form" method="post">
...
    

<INPUT type='text' name='name' width='125px' maxlength='10'></P>		
    

<INPUT type='password' name='pw' width='125px' maxlength='10'></P>
    

<SELECT name='lang' >
                <% db2.getLangs();	//erfasst aus DB wieviele und welche Sprachen angeboten werden
	String temp[] = new String[var2.getLog_dv_numb()];
	temp = var2.getLog_t_langs();//Array mit verfuegbaren Sprachen in Textform
	for(int i=0;i<var2.getLog_dv_numb();i++)
	{	out.println("<OPTION value="+temp[i]);
		out.println(" >");
		out.println(temp[i]);
		out.println("</OPTION>");
	}
	%>
<INPUT type='submit' value='Enter' onClick="MM_goToURL('parent','index2.jsp');return document.MM_returnValue" >
...
</FORM>
...
Empfängersseite:
Code:
<jsp:useBean id="vars" class="programm.Vars" scope="session">
</jsp:useBean>

<jsp:getProperty name="vars" property="log_iv_name" />
<jsp:getProperty name="vars" property="log_iv_pw" />
<jsp:getProperty name="vars" property="log_sv_lang" />
...
 
Also ich hab jetzt folgende Lösung:
Meine Seite (Startseite.jsp), die das Formular enthält:

Code:
<jsp:useBean id="vars" class="programm.Vars" scope="session"/>
<jsp:setProperty name="vars" property="*"/>
<% session.setAttribute( "name", request.getParameter( "name" ) );
      session.setAttribute( "pw", 	 request.getParameter( "pw" ) );
      session.setAttribute( "lang",   request.getParameter( "lang" ) );
%>
...
<FORM action="Startseite.jsp" method="post" >
<INPUT type='text' name='name' width='125px' maxlength='10'></P>
<INPUT type='password' name='pw' width='125px' maxlength='10'></P>
<SELECT name='lang' >
    <% for(int i=0;i<var2.getLog_dv_numb();i++)
        {	out.println("<OPTION value="+temp[i]);
	out.println(" >");
	out.println(temp[i]);
	out.println("</OPTION>");
        }
	%>
</SELECT></P> 
<INPUT type='submit' value='Enter' onClick="MM_goToURL('parent','index2.jsp')" >
</FORM>
...

und die auslesende Seite (Welcome.jsp, ist ein Frame von index2.jsp):
Code:
<jsp:useBean id="vars" class="programm.Vars" scope="session"/>
...
<% 	out.println("
Name: "+session.getAttribute("name"));
	out.println("
PW:   "+session.getAttribute("pw"));
	out.println("
Lang: "+session.getAttribute("lang"));
%>
...
Die SessionVariablen muss ich innerhalb derselben Seite setzen, da ich mit Frames arbeite und sie nciht erst umständlich über Parameterauslesen setzen will, so kann ich auch gezielt einzelne SessionAttribute setzen.
Da es später sehr viele Seiten werden, möchte ich den Umweg über eine weitere JSP-Handler-Datei sparen, auch Servlet-Klassen möchte ich meiden, da die Seiten dynamisch aufgebaut werden und sowohl SessionAttribute als auch Werte aus der Datenbank usw. genutzt werden.
Vielleicht ist das keine sehr schöne Lösung den Code so zu mischen, allerdings möchte ich am Ende nicht zu viele Dateien haben und es soll nach mir jemand weiter daran arbeiten können (ich denke es hat den Vorteil, dass das wie HTML-Code aufgebaut ist, der Einfachheit der Struktur wegen...selbstverständlich wird der komplette Code kommentiert).
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben