Found a solution!

Here is a simple example of HOW TO EXTEND THE TILESACTION which not only
allows tile definitions but just as important allows using the DataSource
functionalilty of the Struts action(the implement Controller would not allow
the Data Source functionalilty):

public final class LoadUserCategoriesAction extends TilesAction{
public ActionForward execute( ComponentContext tilesContext,
                                                    ActionMapping mapping,
                                                    ActionForm form,
                                                    HttpServletRequest request,
                                                    HttpServletResponse response) 
throws Exception
{    

//This just sets up a datasource                    
Statement stmt = null;
ResultSet rs = null;
DataSource dataSource;
Connection conn=null; 
try {
dataSource = getDataSource(request);
conn = dataSource.getConnection(); 
stmt = conn.createStatement(); 
//Example Query
rs = stmt.executeQuery("select * from users where email=\'"
+ userName + "'");
if ( rs.next() ) { 
//get parameters
rs.getString("userid"); 
}
else {
throw new Exception("User " + userName + " not found!");
} 
} catch (SQLException sqle) {
getServlet().log("Connection.process", sqle);
} finally {        
//enclose this in a finally block to make
//sure the connection is closed
try {
conn.close(); 
} catch (SQLException sqle) {
getServlet().log("Connection.close", sqle);
}
} 

//Here we have only a TEST but could put the database results into the tilesContext

tilesContext.putAttribute("TEST" , "TEST THIS!");

return null;
} 


}


Here is what goes in the struts-config:

<action path="/Test"
      type="com.example.LoadUserCategoriesAction">      
   </action> 

Here is what goes in the tiles-def:

<definition name=".sample.view" path="/tiles/sampleview.jsp"
 controllerUrl ="/Test.do">
</definition>

Here is what goes in the sampleview.jsp

<tiles:importAttribute/>

<tiles:getAsString name="TEST"/>



Now make the call (insert) in any desired jsp page.  This insert can be used
in several jsp pages and the tile view will be displayed.


<tiles:insert definition=".penguin.view" flush="true" />

 NOTES:

I found that using controllerClass which would have been a bit easier to use
would not allow me to use the getDataSource(request) function even when I
extended the Action class (required for getDataSource).  I could not pass
the database results from the Action class to the Controller class.


Hope this helps anyone looking to use the tilesAction with database connectivity!

Barry







----- Original Message ----- 
From: "Barry Volpe" <[EMAIL PROTECTED]>
To: "Struts Users Mailing List" <[EMAIL PROTECTED]>
Sent: Tuesday, September 23, 2003 10:35 AM
Subject: Data Source issue in tiles controller execute()


> Hi,
> 
> In the following (SEE CODE BELOW) when I attempt to inititialize
> 
> getDataSource(request) in the Tiles Controller execute method it
> causes a null in the fowarding JSP which looks for the string "TEST"
> initialized by this:
> 
>  tilesContext.putAttribute("TEST" , "TEST");
> 
> If I remove the getDataSource(request) then the "TEST" string
>  tilesContext.putAttribute("TEST" , "TEST");
> displays correctly in the fowarding jsp.
> 
> It appears that the getDataSource(request); does not work
> in the tilesController execute but works in the action execute.
> 
> Does anyone know why?
> 
> In addition the problem I have is I want to query the database for data
> and put it in the tiles controller execute so I can pass it to the fowarding
> JSP.
> 
> So I could query the database in the Action execute() and pass the data to
> the
> tiles controller execute() and display in the fowarding jsp.
> 
> I have tried declaring a:
> static private String mystring;  outside the Action execute() and the tiles
> controller execute()
> 
> but when I try to update the string in the Action execute() the string
> (mystring) does not show
> the new string value in the tiles controller execute() method.
> 
> 
> In summary either the database query is performed in the Action execute and
> data fowarded in the Tiles Controller execute()
> 
> or
> 
> The database query is performed in the Tiles Controller execute() and the
> query results will already by available to be fowarded to the JSP.
> 
>  BOTH DO NOT WORK!
> 
> 
> HERE IS THE CODE:
> 
> public class LoadUserCategoriesController extends Action implements
> Controller{
> 
>             static private String myString = "string";
> 
> public ActionForward execute( ComponentContext tilesContext,
>                         ActionMapping mapping,
>                         ActionForm form,
>                         HttpServletRequest request,
>                         HttpServletResponse response) throws Exception
> {
>                 //Data source works here but require results to be in
> Controller execute
>                 myString = "newstring";
> 
> 
> 
> }
>         public void execute(ComponentContext tilesContext,
>                 HttpServletRequest request,
>                 HttpServletResponse response,
>                 ServletContext servletContext)throws Exception{
> 
>                 Statement stmt = null;
>                 ResultSet rs = null;
>                 DataSource dataSource;
>                 Connection conn=null;
> 
>                 try {
>                         dataSource = getDataSource(request);
>                 }.............................
> 
> 
>                 //myString does not show "newString" here.
> 
>                  tilesContext.putAttribute("TEST" , "TEST");   //only works
> if I remove the dataSource = getDataSource(request) statement.
> 
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 
> 
> 

Reply via email to