# JSP mit java Bean



## chipmount (13. Dez 2004)

hi, 
ich möchte folgendes tun: 
JSP die nach eingabe einer BestNR uf einer html seite dazugehörige positionen(name. preis etc) auf dem browser anzeigt. 
dazu habe ich eine Java Bean angelegt(JDBC-anbindung): 


```
import java.sql.*; 

public class Bean { 
   private String inout; 
   public Bean(){} 
   public String getinout(){ return inout;} 
    
public  void setinout (String in) 
  { 
    Connection c = null; 
    PreparedStatement p = null; 
    
    
  String sql="SELECT bestnr,bestelldatum,bestsum FROM Bestellung WHERE name =?"; 
    
  String answer="<table style= \"width: 450px\">"+ 
     "<tr><td>bestnr</td><td>bestelldatumr</td><td>bestsum</td></tr>"; 
    try 
    { 
      Class.forName ("oracle.jdbc.driver.OracleDriver"); 
      c = DriverManager.getConnection("jdbc:oracle:thin:@alwina:1521:ALWINA", "scott", "tiger"); 
      PreparedStatement ps = c.prepareStatement(sql); 
        
         Statement s = c.createStatement(); 
         ps.setString(1, in); 
      ResultSet rs = ps.executeQuery(); 
            
      while (rs.next()) 
      { 
         answer = answer +"<tr>"+ 
         "<td>" + rs.getString("bestnr") +"</td>"+ 
         "<td>" + rs.getString("bestelldatum") +"</td>"+ 
         "<td>" + rs.getString("bestsum") +"</td>"+ 
         "</tr>"; 
               
         }//end while 
         c.close(); 
         answer = answer + "</table>"; 
    } 
    catch (Exception e) 
    { 
      e.printStackTrace(); 
      answer = e.toString(); 
    } 
     inout=answer; 
  } 
}
```

diese klasse hab ich unter Tomcat5/webapps/root/web-inf/classes gespeichert 

meine html seite sieht so aus:

```
html>
<head>
<title>Servlet-Aufruf</title>
</head>

<body>



<FORM ACTION="http://localhost:8081/jsp.jsp" METHOD=GET >
<INPUT name=inp>
<INPUT TYPE=SUBMIT VALUE="Suchen">

</FORM>
</P>
</body>
</html>
```

meine frage  wie füttere ich meine jsp.jsp mit diesen daten und wie binde ich meine bean ein??

danke


----------



## foobar (13. Dez 2004)

Du brauchst keine HtmlSeite, denn deine Jsp ersetzt die statische HtmlSeite. Warum willst du umbedingt aus der JDBC-Klasse eine Java Bean machen?


----------



## chipmount (13. Dez 2004)

man möchte es so haben  :lol:


----------



## meez (13. Dez 2004)

Meinst du ne EJB?


----------



## chipmount (13. Dez 2004)

eine JAVA BEAN


----------



## foobar (13. Dez 2004)

Dann mußt du aber erstmal folgende Fehler bereinigen:
- deine Bean muß serializable implementieren
- der Getter und der Setter entsprechen nicht der Namenskonvention


----------



## chipmount (13. Dez 2004)

foobar hat gesagt.:
			
		

> Dann mußt du aber erstmal folgende Fehler bereinigen:
> - deine Bean muß serializable implementieren
> - der Getter und der Setter entsprechen nicht der Namenskonvention



was meinst du damit???


----------



## chipmount (13. Dez 2004)

wo muss denn die bean.class hin damit die ..jsp die findet muss ich das der ..jsp mitteilen wo die classe liegt???
kennt jemand ein gutes tutorial???


----------



## chipmount (14. Dez 2004)

also das java bean mit jsp geht jetzt
nur habe ich ein kkleines problem

wie übergebe ich meine variable(bestnr) von einer html seite zur ..jsp

meine html

```
<html>
<head>
<title>Servlet-Aufruf</title>
</head>

<body>



<FORM ACTION="http://localhost:8081/dbjsp.jsp" METHOD=GET >
<INPUT inout=inout>
<INPUT TYPE=SUBMIT VALUE="Suchen">

</FORM>
</P>
</body>
</html>
```


meine ...jsp:


```
<html>
<head>
<title> Bestellung jsp</title>
</head>
<jsp:useBean id="Bean" scope="page" class="jsp.Bean"/>
<% String param = request.getParameter("param");
	int inout = (param==null) ? 0: Integer.parseInt(param);
%>
<jsp:setProperty name="Bean" property="inout" value="<%=inout%>"/>
<body>
 
Ergebniss:<jsp:getProperty name="Bean" property="bean"/>
</body>
</html>
```

und wie komme ich wieder ins eingabe menü "SUCHEN"???


----------



## foobar (14. Dez 2004)

Das ergibt alles überhaupt keinen Sinn, was du das machst.


```
<INPUT inout=inout>
```
Es gibt kein Attribut mit dem Namen inout.

Die Htmlseite sollte ungefähr so aussehen:

```
<html>
<head>
<title>Servlet-Aufruf</title>
</head>
<body>



<FORM ACTION="http://localhost:8081/dbjsp.jsp" METHOD="GET" >
<INPUT type="text" name="inout" value="23">
<INPUT TYPE="SUBMIT" VALUE="Suchen">
</FORM>
</P>
</body>
</html>
```

Guck dir mal diese Seite an http://www.jsp-develop.de/, da findest du viele Informationen zum Thema Jsp und Servlets.


----------



## chipmount (15. Dez 2004)

ok danke

aber wie komme ich von der ...jsp wieder auf die html(anfang) seite drauf


----------



## foobar (15. Dez 2004)

> aber wie komme ich von der ...jsp wieder auf die html(anfang) seite drauf


Ich hab es in einem meiner vorherigen Posts schon geschrieben, ersetz die Htmlseite durch eine JSP, damit hast du viel mehr Möglichkeiten.


----------



## chipmount (15. Dez 2004)

ich MUSS aber eine HTML-Startseite verwenden  :cry:


----------



## foobar (15. Dez 2004)

> Ich MUSS aber eine HTML-Startseite verwenden


Warum? Ist das eine Vorgabe?



> aber wie komme ich von der ...jsp wieder auf die html(anfang) seite drauf


z.b. durch einen Link

```
[url="/MyContextName/myHtmlPage.htm"]home[/url]
```


----------



## chipmount (15. Dez 2004)

dass kann ich dir leider auch nicht sagen  :?:  :?:

hab jetz diesen gemacht (ist das unsauber??)


```
<FORM ACTION="http://localhost:8081/myjsp.html" METHOD="GET" > 

<INPUT TYPE="SUBMIT" VALUE="Zurück">
```


----------



## foobar (15. Dez 2004)

> hab jetz diesen gemacht (ist das unsauber??)


Nööö, wenn du einen Button haben willst ist das in Ordnung. Aber wenn schon dann solltest du den Form-Tag auch wieder schließen ;-)


----------



## chipmount (15. Dez 2004)

danke

kannst du mir noch einen tipp geben wie ich aus diesem beispiel  eine eigene Customer Tag Library(die einen gezielten zugriff auf die DB Tabelle ermöglicht) erstelle


----------



## foobar (15. Dez 2004)

> kannst du mir noch einen tipp geben wie ich aus diesem beispiel eine eigene Customer Tag Library(die einen gezielten zugriff auf die DB Tabelle ermöglicht) erstelle


Meinst du einen Universal-Tag mit dem man DB-Abfragen absetzen kann?


----------



## chipmount (15. Dez 2004)

ja


----------



## foobar (15. Dez 2004)

```
package forum;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class DBUtil 
 {
	private Connection con;
	private DBConnectionPool pool;
	private Statement stmt;
	
	public DBUtil()
	{
		this.pool = DBConnectionPool.getConnectionPool();
		this.con = this.pool.getConnection();
	}
	
	public ResultSet fireSql(String sql_stmt)
	{
		try 
		{
			this.stmt = this.con.createStatement();
			if (stmt.execute(sql_stmt))
			{
				return stmt.getResultSet();
			}
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
		catch (NullPointerException e)
		{
			try 
			{
				if (this.con != null)
				{
					this.stmt = this.con.createStatement();
					if (stmt.execute(sql_stmt))
					{
						return stmt.getResultSet();
					}
				}
			}
			catch (SQLException e1) 
			{
				e1.printStackTrace();
			}
		}
		return null;
	}
	
	public String fireSqlGetSingleValue(String sql)
	{
		ResultSet rs  =  this.fireSql(sql);
		try
		{
			while (rs.next())
			{
				return rs.getString(1);
			}
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		return null;
	}
	
	public void closeConnection()
	{
		this.pool.returnConnection(this.con);
	}	
}
```


```
package forum;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.HashMap;
import java.util.Iterator;

public class DBConnectionPool
{
	private static DBConnectionPool pool;
	private HashMap connections;
	private final int MAX_CONNECTIONS = 30;
	private final int INCREMENT 				  = 1;
	private final String JDBC = "jdbc:mysql://127.0.0.1:3306/forum";
	private DBConnectionPool()
	{
			this.connections = new HashMap();
			this.fillPool(MAX_CONNECTIONS);
	}

	private Connection createConnection()
	{
		Connection con = null;
		try 
		{
				Class.forName("org.gjt.mm.mysql.Driver");
				con = DriverManager.getConnection(JDBC,Config.DB_USERNAME,Config.DB_PASSWD);
		}
		catch (Exception e) 
		{
				e.printStackTrace();
		}
		return con; 
	}
	
	private void fillPool(int size)
	{
		for (int i =0; i <= size;i++)
		{
			this.connections.put(this.createConnection(), Boolean.FALSE);
		}
	}
	
	public synchronized Connection getConnection()
	{
		Iterator it = this.connections.keySet().iterator();
		while (it.hasNext())
		{
			Connection con = (Connection)it.next();
			if ((Boolean)this.connections.get(con) == Boolean.FALSE)
			{
				try
				{
					con.setAutoCommit(true);
				}
				catch (Exception e)
				{
					con = this.createConnection();
				}
				this.connections.put(con,Boolean.TRUE);
				return con;
			}
		}
		this.fillPool(INCREMENT);
		return this.getConnection();
	}

	public void returnConnection(Connection returncon)
	{
		Iterator it = this.connections.keySet().iterator();
		while (it.hasNext())
		{
			Connection oldcon = (Connection)it.next();
			if (oldcon == returncon)
			{
				this.connections.put(oldcon,Boolean.FALSE);
				break;
			}
		}
	}

	public static DBConnectionPool getConnectionPool()
	{
		if (pool == null) pool = new DBConnectionPool();
		return pool;
	}
}
```


```
package forum.tags.db;

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;

import forum.DBUtil;



public class DBOutputTag extends BodyTagSupport 
{
	String ident, name;
	JspWriter out;
	ResultSet rs;
	private DBUtil dbu;
	public String getIdent() 
	{
		return ident;
	}

	public String getName() 
	{
		return name;
	}

	public JspWriter getOut() 
	{
		return out;
	}
	
	public void setIdent(String string) 
	{
		ident = string;
	}

	public void setName(String string) 
	{
		name = string;
	}

	public void setOut(JspWriter writer) 
	{
		out = writer;
	}

	public int doStartTag() throws JspException
	{
		this.rs   = (ResultSet) pageContext.findAttribute(this.name);
		this.dbu = (DBUtil) pageContext.findAttribute("dbutil");
		this.pageContext.setAttribute(this.ident,rs);
		return EVAL_BODY_AGAIN;		
	}
	
	
	public int doAfterBody() throws JspException
	{
		try 
		{
			BodyContent myBody = getBodyContent();
			myBody.writeOut(getPreviousOut());
			myBody.clearBody();
			return rs.next() ? EVAL_BODY_AGAIN : SKIP_BODY;
		}
		catch (IOException e) 
		{
			e.printStackTrace();
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
		
		return 0;
	}

	public int doEndTag() throws JspException
	{
		this.dbu.closeConnection();
		return EVAL_PAGE;
	}
	
	public ResultSet getRs() {
		return rs;
	}

	public void setRs(ResultSet set) {
		rs = set;
	}

}
```


```
package forum.tags.db;

import javax.servlet.jsp.tagext.TagData;
import javax.servlet.jsp.tagext.TagExtraInfo;
import javax.servlet.jsp.tagext.VariableInfo;

public class DBOutputTei extends TagExtraInfo 
{
	public VariableInfo[] getVariableInfo(TagData tag) 
	{
		return new VariableInfo[]{new VariableInfo(tag.getAttributeString("ident"), 
													"java.sql.ResultSet", 
													true, 
													VariableInfo.NESTED)};
	}

}
```


```
package forum.tags.db;
import java.sql.ResultSet;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;

import forum.DBUtil;


public class DBQueryTag extends BodyTagSupport
{
	private String indent;
	private JspWriter out;
	private DBUtil dbu;
	
	
	public void setIdent(String string) 
	{
		indent = string;
	}


	public int doStartTag() throws JspException
	{
		this.dbu = new DBUtil();
		return EVAL_BODY_BUFFERED;
	}
	
	public int doAfterBody() throws JspException
	{
		String sql = getBodyContent().getString();
		getBodyContent().clearBody();
		ResultSet rs = this.dbu.fireSql(sql);
		pageContext.setAttribute(this.indent, rs);	
		pageContext.setAttribute("dbutil", this.dbu);		
		return SKIP_BODY;
	}


	public int doEndTag() throws JspException
	{	
		return EVAL_PAGE;
	}
}
```


```
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" 
           "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
	<tlib-version>1.0</tlib-version>
	<jsp-version>1.4</jsp-version>
	<short-name>DBAccess</short-name>
	<tag>
		<name>query</name>
		<tag-class>forum.tags.db.DBQueryTag</tag-class>
		<attribute>
			<name>ident</name>
			<required>true</required>
		</attribute>
	</tag>
	<tag>
		<name>output</name>
		<tag-class>forum.tags.db.DBOutputTag</tag-class>
		<tei-class>forum.tags.db.DBOutputTei</tei-class>
		<attribute>
			<name>ident</name>
			<required>true</required>
		</attribute>
		<attribute>
			<name>name</name>
			<required>true</required>
		</attribute>
	</tag>
</taglib>
```

Verwendung in der JSP:

```
<%@ taglib uri="taglibs/dbTag.tld" prefix="db"%>
....

<db:query ident="all">
Select * from table
</db:query>

....

<db:output name="all" ident="row">
<% while(row.next()){%>
<%= row.getString(1) %>
<% } %>
</db:output>
```

BTW Ich kann dir von der Verwendung aber nur abraten. Es gibt weitaus bessere Möglichkeiten um von einer JSP auf einen DB zuzugreifen.


----------



## chipmount (15. Dez 2004)

uuuuuuuupppps  :? 

werde mal ausprobieren

danke


----------



## bronks (18. Dez 2004)

foobar hat gesagt.:
			
		

> ... BTW Ich kann dir von der Verwendung aber nur abraten. Es gibt weitaus bessere Möglichkeiten um von einer JSP auf einen DB zuzugreifen.


Es ist zwar ein bissl Text, aber erscheint mir eigentlich alles einleuchtend, obwohl da einige Sachen verwendet werden, die ich noch nicht kenne. Ist es dieses Beispiel wert als ernstzunehmende Grundlage studiert zu werden oder ist das nur so zusammengeschnitten, damit der Chipmount seinem Ziel auf seinem eingeschlagenen Weg näher kommt?


----------



## foobar (18. Dez 2004)

> Ist es dieses Beispiel wert als ernstzunehmende Grundlage studiert zu werden oder ist das nur so zusammengeschnitten, damit der Chipmount seinem Ziel auf seinem eingeschlagenen Weg näher kommt?


Es zeigt auf jeden Fall was man mit Customtags machen kann z.b. TeiClass, iterieren etc. , aber für den produktiven Einsatz ist es wohl weniger geeignet. Denn es ist einfach schlechter Stil eine JSP mit Sql zu vermischen, da kann man ja gleich PHP und Konsorten verwenden.


----------

