BC4J/Struts Integration classes

Does anyone know of any documentation on the BC4J classes that are used in Jdeveloper for struts integration?
I have access to the source that came packaged in jdeveloper but I still have questions about the classes BC4JActionMapping,BC4JRequestProcessor,BC4JActionForm,BC4JUtils,BC4JContext, and HTTPContainer.
One of my initial questions is whether I should specify the view object name I'm using in an action in my struts-config.xml file as I do with the application module? Also, when I do this how do I programmatically access it.
I'm also interested in how the BC4J Client Data Model ".cpx" is used and if this needs to be packaged when deploying a bc4j/struts web application.
The postings at Re: re:Using Struts without Datatags <jbo:xxx> by Steven Muench were terrific. A great start for understanding the integration of the two technologies. I would just like more detail on how/why bc4j leverages struts extension points.
Thanks in advance!

part 2 of posting:
<action path="/navigateEmpView1" parameter="jboEvent" type="oracle.jbo.html.struts11.actions.NavigationAction">
<set-property property="viewobject" value="EmpView1"/>
<set-property property="application" value="Mypackage1Module"/>
<set-property property="releasemode" value="Stateful"/>
</action>
Since NavigationAction is a Struts DispatchAction (instead of calling the execute method on the action, the method name to execute is passed using a request parameter), you will need to specify the event name on the request with the URL:
/nextEmpView1.do?jboEvent=next
To understand how this work, you need to look at how the BC4JContext is initialized:
The following code is extracted from BC4JrequestProcessor:
BC4JContext context = (BC4JContext)request.getAttribute(BC4JContext.ContextAttrName);
// Instantiate the context and save it on the request
if (context == null)
context = new BC4JContext();
request.setAttribute(BC4JContext.ContextAttrName, context);
if (initPageFromPath(bc4jMapping, request, response))
// First initialize context with the existing mapping values
bc4jMapping.initializeContext(request, response, context);
// Then use request para[i]Long postings are being truncated to ~1 kB at this time.

Similar Messages

  • BC4J Struts Integration

    Hi, I am trying to develop a sample application based on BC4J and Struts. I used the native integration between these two framework (as it is explained in the "Building a Web Store with Struts & BC4J Frameworks") but I have a problem:
    I need to access more than one applicationModule within a page. The problem is the native integration uses only one ApplicationModule per page (the one that is specified in the &lt;set-property property="application" value="ToyStore"/&gt; in the action tag for each action.
    Is there an easy way to access more then one applicationModule from one StrutsAction and JSP page?
    Thanks in advance

    part 2 of posting:
    <action path="/navigateEmpView1" parameter="jboEvent" type="oracle.jbo.html.struts11.actions.NavigationAction">
    <set-property property="viewobject" value="EmpView1"/>
    <set-property property="application" value="Mypackage1Module"/>
    <set-property property="releasemode" value="Stateful"/>
    </action>
    Since NavigationAction is a Struts DispatchAction (instead of calling the execute method on the action, the method name to execute is passed using a request parameter), you will need to specify the event name on the request with the URL:
    /nextEmpView1.do?jboEvent=next
    To understand how this work, you need to look at how the BC4JContext is initialized:
    The following code is extracted from BC4JrequestProcessor:
    BC4JContext context = (BC4JContext)request.getAttribute(BC4JContext.ContextAttrName);
    // Instantiate the context and save it on the request
    if (context == null)
    context = new BC4JContext();
    request.setAttribute(BC4JContext.ContextAttrName, context);
    if (initPageFromPath(bc4jMapping, request, response))
    // First initialize context with the existing mapping values
    bc4jMapping.initializeContext(request, response, context);
    // Then use request para[i]Long postings are being truncated to ~1 kB at this time.

  • Need help with BC4J/Struts application using a Stored Procedure

    Hi,
    I am doing a proof of concept for a new project using JDeveloper, Struts and BC4J. We want to reuse our Business logic that is currently residing in Oracle Stored Procedures. I previously created a BC4J Entity Object based on a stored procedure Using Oracle Stored Procedures but this stored procedure is a bit different in that it returns a ref cursor as one of the paramters. http://radio.weblogs.com/0118231/stories/2003/03/03/gettingAViewObjectsResultRowsFromARefCursor.html
    I tried the above method, but I am having some trouble with it. I keep getting the error ORA-01008: not all variables are bound when I test it using the AppModule tester.
    Here is the store procedure definition:
    CREATE OR REPLACE PACKAGE pprs_test_wrappers IS
    TYPE sn_srch_results IS REF CURSOR;
    PROCEDURE sn_srch_main_test
    (serial_num_in IN OUT VARCHAR2
    ,serial_coll_cd_in IN OUT NUMBER
    ,max_rows_allowed IN OUT NUMBER
    ,total_rows_selected IN OUT NUMBER
    ,message_cd_out IN OUT VARCHAR2
    ,query_results          OUT sn_srch_results
    END pprs_test_wrappers;
    And here is my code:
    package pprs;
    import java.math.BigDecimal;
    import java.sql.CallableStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Timestamp;
    import java.sql.Types;
    import oracle.jbo.JboException;
    import oracle.jbo.domain.Number;
    import oracle.jbo.server.DBTransaction;
    import oracle.jbo.server.ViewObjectImpl;
    import oracle.jbo.server.ViewRowImpl;
    import oracle.jbo.server.ViewRowSetImpl;
    import oracle.jdbc.driver.OracleCallableStatement;
    import oracle.jdbc.driver.OracleTypes;
    // --- File generated by Oracle Business Components for Java.
    public class LienCheckImpl extends ViewObjectImpl
    * This is the PLSQL block that we will execute to retrieve the REF CURSOR
    private static final String SQL =
    "begin ? := pprs_test_wrappers.sn_srch_main_test(?, ?, ?, ?, ?, ?);end;";
    public LienCheckImpl() {}
    * Overridden framework method.
    * Executed when the framework needs to issue the database query for
    * the query collection based on this view object. One view object
    * can produce many related result sets, each potentially the result
    * of different bind variable values. If the rowset in query is involved
    * in a framework-coordinated master/detail viewlink, then the params array
    * will contain one or more framework-supplied bind parameters. If there
    * are any user-supplied bind parameter values, they will PRECEED the
    * framework-supplied bind variable values in the params array, and the
    * number of user parameters will be indicated by the value of the
    * numUserParams argument.
    protected void executeQueryForCollection(Object qc,Object[] params,int numUserParams) {
    * If there are where-clause params (for example due to a view link)
    * they will be in the 'params' array.
    * We assume that if some parameter is present, that it is a Deptno
    * value to pass as an argument to the stored procedure.
    * NOTE: Due to Bug#2828248 I have to cast to BigDecimal for now,
    * ---- but this parameter value should be oracle.jbo.domain.Number type.
    String serialNumIn = null;
    BigDecimal serialCollCdIn = null;
    BigDecimal maxRowsAllowed = null;
    BigDecimal totalRowsSelected = null;
    String messageCdOut = null;
    if (params != null) {
    serialNumIn = (String)params[0];
    serialCollCdIn = (BigDecimal)params[1];
    maxRowsAllowed = (BigDecimal)params[2];
    totalRowsSelected = (BigDecimal)params[3];
    messageCdOut = (String)params[4];
    storeNewResultSet(qc,retrieveRefCursor(qc,serialNumIn,
    serialCollCdIn,
    maxRowsAllowed,
    totalRowsSelected,
    messageCdOut));
    super.executeQueryForCollection(qc, params, numUserParams);
    * Overridden framework method.
    * Wipe out all traces of a built-in query for this VO
    protected void create() {
    getViewDef().setQuery(null);
    getViewDef().setSelectClause(null);
    setQuery(null);
    * Overridden framework method.
    * The role of this method is to "fetch", populate, and return a single row
    * from the datasource by calling createNewRowForCollection() and populating
    * its attributes using populateAttributeForRow().
    protected ViewRowImpl createRowFromResultSet(Object qc, ResultSet rs) {
    * We ignore the JDBC ResultSet passed by the framework (null anyway) and
    * use the resultset that we've stored in the query-collection-private
    * user data storage
    rs = getResultSet(qc);
    * Create a new row to populate
    ViewRowImpl r = createNewRowForCollection(qc);
    try {
    * Populate new row by attribute slot number for current row in Result Set
    populateAttributeForRow(r,0, nullOrNewNumber(rs.getBigDecimal(1)));
    populateAttributeForRow(r,1, nullOrNewNumber(rs.getBigDecimal(2)));
    populateAttributeForRow(r,2, rs.getString(3));
    populateAttributeForRow(r,3, rs.getString(4));
    populateAttributeForRow(r,4, rs.getString(5));
    catch (SQLException s) {
    throw new JboException(s);
    return r;
    * Overridden framework method.
    * Return true if the datasource has at least one more record to fetch.
    protected boolean hasNextForCollection(Object qc) {
    ResultSet rs = getResultSet(qc);
    boolean nextOne = false;
    try {
    nextOne = rs.next();
    * When were at the end of the result set, mark the query collection
    * as "FetchComplete".
    if (!nextOne) {
    setFetchCompleteForCollection(qc, true);
    * Close the result set, we're done with it
    rs.close();
    catch (SQLException s) {
    throw new JboException(s);
    return nextOne;
    * Overridden framework method.
    * The framework gives us a chance to clean up any resources related
    * to the datasource when a query collection is done being used.
    protected void releaseUserDataForCollection(Object qc, Object rs) {
    * Ignore the ResultSet passed in since we've created our own.
    * Fetch the ResultSet from the User-Data context instead
    ResultSet userDataRS = getResultSet(qc);
    if (userDataRS != null) {
    try {
    userDataRS.close();
    catch (SQLException s) {
    /* Ignore */
    super.releaseUserDataForCollection(qc, rs);
    * Return a JDBC ResultSet representing the REF CURSOR return
    * value from our stored package function.
    private ResultSet retrieveRefCursor(Object qc,
    String serialNum,
    BigDecimal serialColCd,
    BigDecimal maxRows,
    BigDecimal totalRows,
    String messageCd ) {
    CallableStatement st = null;
    try {
    st = getDBTransaction().createCallableStatement(SQL,DBTransaction.DEFAULT);
    * Register the first bind parameter as our return value of type CURSOR
    st.registerOutParameter(1,OracleTypes.CURSOR);
    * Set the value of the 2nd bind variable to pass id as argument
    if (serialNum == null) st.setNull(2,Types.CHAR);
    else st.setString(2,serialNum);
    if (serialColCd == null) st.setNull(3,Types.NUMERIC);
    else st.setBigDecimal(3,serialColCd);
    if (maxRows == null) st.setNull(4,Types.NUMERIC);
    else st.setBigDecimal(4,maxRows);
    if (totalRows == null) st.setNull(5,Types.NUMERIC);
    else st.setBigDecimal(5,totalRows);
    if (messageCd == null) st.setNull(6,Types.CHAR);
    else st.setString(6,messageCd);
    st.execute();
    ResultSet rs = ((OracleCallableStatement)st).getCursor(1);
    * Make this result set use the fetch size from our View Object settings
    rs.setFetchSize(getFetchSize());
    return rs ;
    catch (SQLException s) {
    throw new JboException(s);
    finally {try {st.close();} catch (SQLException s) {}}
    * Store a new result set in the query-collection-private user-data context
    private void storeNewResultSet(Object qc, ResultSet rs) {
    ResultSet existingRs = getResultSet(qc);
    // If this query collection is getting reused, close out any previous rowset
    if (existingRs != null) {
    try {existingRs.close();} catch (SQLException s) {}
    setUserDataForCollection(qc,rs);
    hasNextForCollection(qc); // Prime the pump with the first row.
    * Retrieve the result set wrapper from the query-collection user-data
    private ResultSet getResultSet(Object qc) {
    return (ResultSet)getUserDataForCollection(qc);
    * Return either null or a new oracle.jbo.domain.Number
    private static oracle.jbo.domain.Number nullOrNewNumber(BigDecimal b) {
    try {
    return b != null ? new oracle.jbo.domain.Number(b) : null;
    catch (SQLException s) { }
    return null;
    I created the view object in expert mode so there is no entity object. Can someone help? I don't have much time left to finish this.
    Also, could I have done this from the Entity object instead of the view object by registering the ref cursor OUT parameter in handleStoredProcInsert()?
    Thanks
    Natalie

    I was able to get the input parameter by putting the following in my struts actions class
    vo.setWhereClauseParam(0,request.getParameter("row0_SerialNum"));
    The full code is:
    package mypackage2;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import oracle.jbo.html.BC4JContext;
    import oracle.jbo.ViewObject;
    import oracle.jbo.html.struts11.BC4JUtils;
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    public class LienCheckView1QueryAction extends Action
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
    BC4JContext context = BC4JContext.getContext(request);
    // Retrieve the view object instance to work with by name
    ViewObject vo = context.getApplicationModule().findViewObject("LienCheckView1");
    vo.setRangeSize(3);
    vo.setIterMode(ViewObject.ITER_MODE_LAST_PAGE_PARTIAL);
    // Do any additional VO setup here (e.g. setting bind parameter values)
    vo.setWhereClauseParam(0,request.getParameter("row0_SerialNum"));
    // default value for serialCollCd 1 is for Motor Vehicles
    vo.setWhereClauseParam(1,new oracle.jbo.domain.Number(1));
    // Default value for maxRows_allowed
    vo.setWhereClauseParam(2,new oracle.jbo.domain.Number(20));
    return BC4JUtils.getForwardFromContext(context, mapping);
    This doesn't always work properly though. The first time I press the query button, the SerialNum parameter is still null, however if I re-execute the query by pressing the query button again. It will work, and return the rows. I always have to query twice. Also the SerialNum attribute is set to a String in my view object, it is a varchar column in the database, but some serial number I enter give a "Error Message: oracle.jbo.domain.Number ". This happens even though the underlying BC4J is returning values for the query. I also get a "500 Internal Server Error java.lang.ClassCastException: java.lang.String on my View object's code at line 65 which is
    if (params.length>1) serialCollCdIn = (BigDecimal)params[1];
    This is an input paramter to the oracle stored procedure that defaults to a Number value of 1.
    Any idea what the problem is? Here is the full code for my view object:
    package mypackage1;
    import java.math.BigDecimal;
    import java.sql.CallableStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Timestamp;
    import java.sql.Types;
    import oracle.jbo.JboException;
    import oracle.jbo.domain.Number;
    import oracle.jbo.server.DBTransaction;
    import oracle.jbo.server.ViewObjectImpl;
    import oracle.jbo.server.ViewRowImpl;
    import oracle.jbo.server.ViewRowSetImpl;
    import oracle.jdbc.driver.OracleCallableStatement;
    import oracle.jdbc.driver.OracleTypes;
    // --- File generated by Oracle Business Components for Java.
    public class LienCheckViewImpl extends ViewObjectImpl
    * This is the PLSQL block that we will execute to retrieve the REF CURSOR
    private static final String SQL =
    "begin pprs_test_wrappers.sn_srch_main_test(?, ?, ?, ?, ?, ?);end;";
    private BigDecimal totalRows = null;
    private String messageCd = null;
    private BigDecimal serialColCd = null;
    private BigDecimal maxRows = null;
    public LienCheckViewImpl() {}
    * Overridden framework method.
    * Executed when the framework needs to issue the database query for
    * the query collection based on this view object. One view object
    * can produce many related result sets, each potentially the result
    * of different bind variable values. If the rowset in query is involved
    * in a framework-coordinated master/detail viewlink, then the params array
    * will contain one or more framework-supplied bind parameters. If there
    * are any user-supplied bind parameter values, they will *PRECEED* the
    * framework-supplied bind variable values in the params array, and the
    * number of user parameters will be indicated by the value of the
    * numUserParams argument.
    protected void executeQueryForCollection(Object qc,Object[] params,int numUserParams) {
    * If there are where-clause params (for example due to a view link)
    * they will be in the 'params' array.
    * We assume that if some parameter is present, that it is a Deptno
    * value to pass as an argument to the stored procedure.
    * NOTE: Due to Bug#2828248 I have to cast to BigDecimal for now,
    * ---- but this parameter value should be oracle.jbo.domain.Number type.
    String serialNumIn = null;
    BigDecimal serialCollCdIn = null;
    BigDecimal maxRowsAllowed = null;
    BigDecimal totalRowsSelected = null;
    String messageCdOut = null;
    if (params != null) {
    if (params.length>0) serialNumIn = (String)params[0];
    if (params.length>1) serialCollCdIn = (BigDecimal)params[1];
    if (params.length>2) maxRowsAllowed = (BigDecimal)params[2];
    storeNewResultSet(qc,retrieveRefCursor(qc,serialNumIn,
    serialCollCdIn,
    maxRowsAllowed));
    super.executeQueryForCollection(qc, params, numUserParams);
    * Overridden framework method.
    * Wipe out all traces of a built-in query for this VO
    protected void create() {
    getViewDef().setQuery(null);
    getViewDef().setSelectClause(null);
    setQuery(null);
    * Overridden framework method.
    * The role of this method is to "fetch", populate, and return a single row
    * from the datasource by calling createNewRowForCollection() and populating
    * its attributes using populateAttributeForRow().
    protected ViewRowImpl createRowFromResultSet(Object qc, ResultSet rs) {
    * We ignore the JDBC ResultSet passed by the framework (null anyway) and
    * use the resultset that we've stored in the query-collection-private
    * user data storage
    rs = getResultSet(qc);
    * Create a new row to populate
    ViewRowImpl r = createNewRowForCollection(qc);
    try {
    * Populate new row by attribute slot number for current row in Result Set
    //AddedByRegisNum
    populateAttributeForRow(r,0, nullOrNewNumber(rs.getBigDecimal(1)));
    System.out.println("AddedByRegisNum :" + rs.getBigDecimal(1));
    // OrigRegisNum
    populateAttributeForRow(r,1, nullOrNewNumber(rs.getBigDecimal(2)));
    System.out.println("OrigRegisNum :" + rs.getBigDecimal(2));
    // SerialNum
    populateAttributeForRow(r,2, rs.getString(3));
    System.out.println("SerialNum :" + rs.getString(3));
    // SerialNumDesc
    populateAttributeForRow(r,3, rs.getString(4));
    System.out.println("SerialNumDesc :" + rs.getString(4));
    // FlagExactMatch
    populateAttributeForRow(r,4, rs.getString(5));
    System.out.println("FlagExactMatch :" + rs.getString(5));
    // MessageCd
    populateAttributeForRow(r,5, messageCd);
    // TotalRows
    populateAttributeForRow(r,6, totalRows);
    catch (SQLException s) {
    throw new JboException(s);
    return r;
    * Overridden framework method.
    * Return true if the datasource has at least one more record to fetch.
    protected boolean hasNextForCollection(Object qc) {
    ResultSet rs = getResultSet(qc);
    boolean nextOne = false;
    try {
    nextOne = rs.next();
    * When were at the end of the result set, mark the query collection
    * as "FetchComplete".
    if (!nextOne) {
    setFetchCompleteForCollection(qc, true);
    * Close the result set, we're done with it
    rs.close();
    catch (SQLException s) {
    throw new JboException(s);
    return nextOne;
    * Overridden framework method.
    * The framework gives us a chance to clean up any resources related
    * to the datasource when a query collection is done being used.
    protected void releaseUserDataForCollection(Object qc, Object rs) {
    * Ignore the ResultSet passed in since we've created our own.
    * Fetch the ResultSet from the User-Data context instead
    ResultSet userDataRS = getResultSet(qc);
    if (userDataRS != null) {
    try {
    userDataRS.close();
    catch (SQLException s) {
    /* Ignore */
    super.releaseUserDataForCollection(qc, rs);
    * Overridden framework method
    * Return the number of rows that would be returned by executing
    * the query implied by the datasource. This gives the developer a
    * chance to perform a fast count of the rows that would be retrieved
    * if all rows were fetched from the database. In the default implementation
    * the framework will perform a SELECT COUNT(*) FROM (...) wrapper query
    * to let the database return the count. This count might only be an estimate
    * depending on how resource-intensive it would be to actually count the rows.
    public long getQueryHitCount(ViewRowSetImpl viewRowSet) {
    Object[] params = viewRowSet.getParameters(true);
    String serialNumIn = (String)params[0];
    BigDecimal serialCollCdIn = (BigDecimal)params[1];
    BigDecimal maxRowsAllowed = (BigDecimal)params[2];
    CallableStatement st = null;
    try {
    st = getDBTransaction().createCallableStatement(SQL,DBTransaction.DEFAULT);
    * Register the fourth bind parameter as our return value of type NUMERIC
    st.registerOutParameter(4,Types.NUMERIC);
    * Set the value of the 3 bind variables to pass as arguments
    if (serialNumIn == null) st.setNull(1, Types.CHAR);
    else st.setString(1,serialNumIn);
    if (serialCollCdIn == null) st.setNull(2,Types.NUMERIC);
    else st.setBigDecimal(2,serialCollCdIn);
    if (maxRowsAllowed == null) st.setNull(3, Types.NUMERIC);
    else st.setBigDecimal(3, maxRowsAllowed);
    st.execute();
    System.out.println("returning value of :" + st.getLong(4));
    return st.getLong(4);
    catch (SQLException s) {
    throw new JboException(s);
    finally {try {st.close();} catch (SQLException s) {}}
    * Return a JDBC ResultSet representing the REF CURSOR return
    * value from our stored package function.
    private ResultSet retrieveRefCursor(Object qc,
    String serialNum,
    BigDecimal serialColCd,
    BigDecimal maxRows) {
    CallableStatement st = null;
    try {
    st = getDBTransaction().createCallableStatement(SQL,DBTransaction.DEFAULT);
    * Set the value of the bind variables
    System.out.println("SerialNumIn :" + serialNum);
    if (serialNum == null) st.setNull(1,Types.CHAR);
    else st.setString(1,serialNum);
    if (serialColCd == null) st.setNull(2,Types.NUMERIC);
    else st.setBigDecimal(2,serialColCd);
    if (maxRows == null) st.setNull(3,Types.NUMERIC);
    else st.setBigDecimal(3,maxRows);
    st.registerOutParameter(1, Types.CHAR); // serialNum
    st.registerOutParameter(2, Types.NUMERIC); // serialColCd
    st.registerOutParameter(3, Types.NUMERIC); // maxRows
    st.registerOutParameter(4, Types.NUMERIC); // totalRows
    st.registerOutParameter(5, Types.CHAR); // messageCd
    * Register the 6th bind parameter as our return value of type CURSOR
    st.registerOutParameter(6,OracleTypes.CURSOR);
    st.execute();
    ResultSet rs = ((OracleCallableStatement)st).getCursor(6);
    serialColCd = st.getBigDecimal(2);
    System.out.println("SerialColCd= " + serialColCd);
    maxRows = st.getBigDecimal(3);
    System.out.println("maxRows= " + maxRows);
    totalRows = st.getBigDecimal(4);
    System.out.println("totalRows= " + totalRows);
    messageCd = st.getString(5);
    System.out.println("messageCd= " + messageCd);
    * Make this result set use the fetch size from our View Object settings
    rs.setFetchSize(getFetchSize());
    return rs ;
    catch (SQLException s) {
    throw new JboException(s);
    finally {try {st.close();} catch (SQLException s) {}}
    * Store a new result set in the query-collection-private user-data context
    private void storeNewResultSet(Object qc, ResultSet rs) {
    ResultSet existingRs = getResultSet(qc);
    // If this query collection is getting reused, close out any previous rowset
    if (existingRs != null) {
    try {existingRs.close();} catch (SQLException s) {}
    setUserDataForCollection(qc,rs);
    hasNextForCollection(qc); // Prime the pump with the first row.
    * Retrieve the result set wrapper from the query-collection user-data
    private ResultSet getResultSet(Object qc) {
    return (ResultSet)getUserDataForCollection(qc);
    * Return either null or a new oracle.jbo.domain.Number
    private static oracle.jbo.domain.Number nullOrNewNumber(BigDecimal b) {
    try {
    return b != null ? new oracle.jbo.domain.Number(b) : null;
    catch (SQLException s) { }
    return null;
    Natalie

  • Polling in BC4J Struts

    Hi folks,
    How would I achieve a polling functionality? One of our applications is setup with the 10gR2 version which comes with BC4J and Struts(Struts was a personal choice). I understand we have an af:poll tag with jsf which helps us to achieve the polling functionality. My query is how would I go about doing the same thing through Struts and BC4j. We don't have JSF, so its kind of tricky.
    My actual requirement is as follows:-
    I basically need to call an oracle report from java. I do this by having a custom implementation of the rwservlet. The oracle report generates a PDF file locally. Which I then need to store on my Database as a BLOB.
    I know how to call the report.
    I know where the pdf is located.
    I know how to store and retrieve the pdf from the DB through Struts.
    My only issues is in instructing my application from the report side to pick up the pdf file when the report is complete. I was thinking in these lines:-
    Rather than passing the instruction from the report side,in my struts action class i would set up some polling mechanism(which i don't know how to) that would tell me to look for the report in 2 minutes(which is how long the report takes to be generated), then pick it up and store it onto the DB.
    Since i "lose control" of the handle after redirecting to a different servlet for the report call, I don't see another alternative other than polling.
    Is there an alternative approach i can adopt to achieve the above functionality?
    If not, is it possible to poll through BC4J/Struts (as against ADF/JSF)?
    If not, please help :) .
    Cheers,
    K

    There is another danger related to this security hole:
    Struts suggests to locate JSPs below the WEB-INF directory to protect them from direct access. A JSP located here cannot be accessed directly but only using the appropriate action.
    One common approach implement security in a struts framework is to perform the required checks in actions. A user not logged in might for example been forwarded to the login screen instead of the requested page.
    If an Application relies on this fact and assumes that it is not possible to call a JSP located in WEB-INF without using the appropriate actions, this bug here opens another hole:
    The "currentPath" Parameter allows a user to call any JSP on your Web-Server! Simply modify the URL to look like this:
    navigate.do?amId=...&jboViewObject=...&currentPath=WEB-INF\path\to\any\page.jsp
    and you are in!
    Frank Brandstetter

  • WebToGo BC4J + Struts + UIX application

    Is there any possibility to write a complete BC4J + Struts + UIX web application to run in the Oracle Lite platform??
    The documentation says about implementing a Servlet, but is it possible to install the .jar files of the struts & uix frameworks and register the *.do & *.uix extensions? What is the specification of the HttpServlet to be implemented?
    What about performance? Could this combination run in a WinXP PIV offline Laptop with reasonable performance?
    Where can I find this kind of information??
    Thanks
    Eduardo

    UIX is not supported in 5.0.2.x release. The next release (10g) will have complete UIX support. Beta release of 10g is already out in case you are interested in trying UIX with it.
    For BC4J refer to 'Chapter 6 BC4J Tutorial' of 'Oracle9i Lite Developer’s Guide'
    Limited support for Struts is there in 5.0.2.10.0 release. If you have the handler for .do extension files then you can use following:
    You can add mime handler to Mobile Server for .do extension by using a ini file. Copy following lines in a file called addmime.ini
    [DATABASE]
    TYPE=ORACLE
    [MIMETYPES]
    NAME = do
    VALUE=text/html
    PLUGIN=<handler class name>
    and run this ini file as following
    wsh -c addmime.ini mobileadmin/[email protected]

  • BC4J/Struts NavigationAction Functionality Request

    Jdev team,
    Has there been any thought on on extending the functionality in the NavigationAction class (and related BC4J/struts classes) to support navigating through 2 viewobjects set up in a master/detail relationship.
    The current implementation only supports mapping one view object in the struts action mapping which then limits the NavigationAction class to support navigating on only one viewobject.
    We have worked out a way to extend the BC4JActionMapping/BC4JContext to give us this functionality but we needed to overwrite some of the BC4JRequestProcessor/NavigationAction code to support this functionality.
    I think this type of functionality could be useful for other BC4J/Struts developers. BTW ... I understand that there are jbo tags that support this type of functionality but we have decided to use only JSTL/Struts tags.
    Thank you!
    -Mark

    Could you send us the errors that you are getting?
    Thanks,
    Jeanne

  • Extend the BC4J JUnit Integration Extension

    I am working on extending the BC4J JUnit Integration
    I want to Add base classes for View and AppModule tests by default and have some more basic test cases.
    Also to add jtestcase libraries in order to use jests xml.
    Is it posible to have the source code of BC4J JUnit Integration so i dont start from ground zero?
    Thanks

    My point is:
    The JDeveloper Extensions from partners are open source.
    JDeveloper provide IDE to create extensions.
    It also provide sample extensions.
    It would be helpfull if it was open source so ppl can contribute to it.
    The BC4J JUnit Integration Extension is not so sophisticated. it can be reproduced easy.
    But as it is you need first to create your base test classes and then to run the extension and then to add some more code.
    i.e. it does provide jtestcase xml but not the libraries for jtestcase
    My intention is to contribute.
    I guess i have to create my own extension.

  • Struts controller classes and ADF in JDeveloper 10.1.3 EA

    I've noticed that ADF Struts has changed quite a bit from JDev 10.1.2. In the previous version of ADF Struts, the default data action class was oracle.adf.controller.struts.actions.DataForwardAction. In version 2 of ADF Struts, the default action class is oracle.adf.controller.v2.lifecycle.PageController. When overiding a lifecycle method in the DataForwardAction class, the method was always passed a DataActionContext object. The DataActionContext class had a method called getHttpServletRequest() so I could get a handle on the request object. On the other hand, the PageController lifecycle methods use the LifecycleContext object and I have yet to find a way to get access to the request object. Does anyone know of a way to get a handle on the Http request object? I've looked at the javadocs for the new Struts action classes but have found nothing that would help.
    I also noticed that the DataForwardAction class (package = oracle.adf.controller.v2.struts.actions) has been changed in version 2 of ADF Struts and only a few methods remain. So I would assume that this class will no longer be used the same way it was in the past. Is this a safe assumption?

    The task of customizing the PageLifecycle or handling events are now delegated to the PageController. These tasks were previously done in a subclass of the DataForwardAction. The DataForwardAction is now only responsible of bootstrapping the PageLifecycle.
    </br></br>
    In 10.1.2, reference to the model BindingContainer was done using a <set-property> for each DataAction. This is now done in the DataBindings.cpx file using a mapping between the path and the BindingContainer. This new mechanism is identical for Struts or Faces. Same with the PageController which is in 10.1.3 the common place to extend the behavior of the PageLifecycle or a ControlBinding for Struts and Faces.

  • Display the id of new Record in the browse page of BC4J Struts App

    I am working on an application using BC4J Struts with backbone on Oracle 8i.I am using DBSequence Type for my Employee ID.Since I am using this Id as search criteria for employee, I want to show Employee Id after insertion of new Employee.How can I display this ID to the user after insertion of new employee...

    Hi and welcome,
    please find a technical forum that matches to your question. Certification is the wrong forum.
    Mod: I'm locking this OT thread.

  • How can i get struts stub classes using struts_config.xml

    Hi
    Is there any tools to get Struts stub classes (i.e Action classes,Action Forms) using struts_config.xml?
    if there, please provide the information about tools.

    Hi all,
    We have HPROF functionality in our latest roadmap, so you will see that feature in our next major release called JRockit R28.
    I recommend, above from the MemLeak documentation suggested by Makiey, the following information on how to use JRockit tools.
    Performance Tuning & Profiling:
    http://download.oracle.com/docs/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/part_02.html
    Using JRockit tools:
    http://download.oracle.com/docs/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/part_03.html
    Diagnostics & Troubleshooting
    http://download.oracle.com/docs/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/part_04.html
    Best Regards,
    Tuva
    JRockit PM

  • Link for BC4J Struts-JSP and Tiles

    Hi,
    I have a JSP-Struts application. By the default generation, JDeveloper build a main.html Page. This page have many Frames and one Frame is "navFrame". On this frame I have a link for a JSP Page : Browse. The call is OK. No Problems.
    No I have another Page with Tiles :
    <template:insert page="IMDLayout.jsp" flush="true">
    <template:put name="title" value="Invoices Interface" />
    <template:put name="header" value="/tiles/common/header.jsp" />
    <template:put name="footer" value="/tiles/common/footer.jsp" />
    <template:put name="menu" value="/tiles/common/menu.jsp" />
    <template:put name="body" value="VInvoiceUsersView1_Browse.do" />
    </template:insert>
    The "body" Tiles call the same JSP Page as the link on the "navFrame", but now I have the following error :
    [ServletException in:VInvoiceUsersView1_Browse.do] Response has already been committed'
    Why ?
    Please help me, I need a solution. Does somebody use BC4J/Struts/Tiles ? Any Experience ? Problem ?
    Thanks
    Yves

    Repost

  • Bc4j, struts and query form (where)

    I have a query form on 1 table created by the wizards (bc4j - struts).
    For ex. in the name field I can insert 'Dimi' and the query form will find my record.
    But when somebody inserts 'dimi' (not initcap), he doesn't find my record.
    How can I adapt the default where clause in the query like eg. WHERE UPPER(FIRSTNAME)=document.form.field.toUpperCase(); ??
    In the next release this should be more simple!

    You can call setUpperColumns(true) on any instance of your view criteria row that you want to apply this UPPER() function to.
    Do you have a functional index at the database level on the UPPER(FIRSTNAME) function?
    If not, the query will do a full table scan with the UPPER(FIRSTNAME) in there.

  • 'Integration Class not found' - Please help

    Hi Guys
    My EM from browser stopped working unexpectedly.
    What happens is when I start login in, I can't move over login screen, no error messages displayed on browser screen. I use IE.
    Here is what I find in emoms.log:
    1510 2006-10-30 14:42:32,062 [Orion Launcher] ERROR app.Co
    ntextInitializer contextInitialized.256 - Integration Class n
    ot found: oracle.sysman.ocs.mntr.target.OcsOvfIntegration
    1511 2006-10-30 14:42:32,062 [Orion Launcher] ERROR app.Co
    ntextInitializer contextInitialized.256 - Integration Class n
    ot found: oracle.sysman.ocs.mntr.target.OcsWebconfIntegration
    1512 2006-10-30 14:42:32,078 [Orion Launcher] ERROR app.Co
    ntextInitializer contextInitialized.256 - Integration Class n
    ot found: oracle.sysman.ocs.mntr.target.OcsWirelessIntg
    1513 2006-10-30 14:42:32,078 [Orion Launcher] ERROR app.Co
    ntextInitializer contextInitialized.256 - Integration Class n
    ot found: oracle.sysman.ocs.mntr.target.OcsCalGrpIntegration
    1514 2006-10-30 14:44:23,015 [HttpRequestHandler-6627600]
    ERROR sec.auth doLogon.207 - Error logging on:
    1515 java.lang.NumberFormatException: multiple points
    1516 at java.lang.FloatingDecimal.readJavaFormatString(F
    loatingDecimal.java:1067)
    I tried to recompile package as it say in:
    http://forums.oracle.com/forums/thread.jspa?threadID=337544&tstart=0&messageID=1356947#1356947
    but only received message back:
    ORA-04043: object MGMT_AUDIT_LOG does not exist
    Is there anyway for me to fix this problem without database re-installation?
    Thank you, Gene.

    Hi guys
    Thank you for your support.
    Here is an answer on your question Ugonic.
    ( I use mks tools ksh port for windows 2k)
    Here is an output: ls C:/oracle/10/Db_1/opmn/bin
    ons.exe onsclient.dll
    C:/oracle/10/Db_1/opmn/bin> ./ons -help
    Usage: .\ons [-d]
    -d Daemon mode: forks and detached OPMN server process
    -a <admin command> Please type ".\ons -a" for usage
    I guess ons is a replacement of opmnctl on version 10.
    I could not find opmnctl on my SUSE installation neither.
    Now, I tried to experiment with em by using different URLs:
    http://127.0.0.1:5501/em this is a loopback ip
    http://10.104.3.79:5501/em this is my current ip
    http://n513gg0_d1:5501/em this is my pc name
    on
    netscape 8.1.2 ( by the way problem started when i - stupid me - upgraded it from 8.1 to 8.1.2)
    ie 6.0.280
    On netscape: all 3 commands do not work.
    ie: first two commands work and display all em functionality and the last one which uses my pc name - does not.
    I did not mention to you that my pc uses dhcp and from what I read em DOES NOT like it. It likes permanent address.
    I beleive I came accross of 2 problems:
    1. netscape 8.1.2 is an uncompatible browser for em application.
    2. name resolution does not work well with em. The proof for the last is error when I use http://n513gg0_d1:5501/em on ie, it does not trunslate it to ip address.
    I also went to page: http://n513gg0_d1:5501 and displayed page:
    Oracle Application Server Containers for J2EE 10g (9.0.4.0.0)
    At the end of it I found test examples for:
    JSP
    servlets
    Each group provides multiple exampls. It's interesting that no netscape neither ie are not able to work with all JSP examples.
    For now I will be working with ie for em and I beleive problem is solved - you should be progmatic because dhcp/em/browser compatibility is too much to worry as long as it works.
    My only concern - and I only study oracle - that I view it as a major architectural flaw in Oracle 10 - this dependence on em windows interface.
    One can say: "you can do the same from command prompt" But how many of us who is learning Oracle or who used to use an old ie will be able to use command interface efficently specially when you need to react fast?
    And, if Oracle provides such a great tool and wants you to use it heavily, don't they have to provide a separate installation option for just a re-installation of em itself ?
    I was about to scratch my test installation and re-install it again. Would it be an option in production environment?
    Thank you guys for your help and I with best to you.
    Gene.

  • Can we call the pure java variable into the struts action class?

    Hi Everybody,
    I have created the binary tree data structure in java,Could I use the value of the variable called value in the struts action class?,pls help me thro ur reply.I have attached the java code here.Thanks in Advance
    package com.recipes.wizard.common;
    public class BinaryTreeTest {
      public static void main(String[] args) {
        new BinaryTreeTest().run();
      static class Node {
        Node left;
        Node right;
        int value;
        public Node(int value) {
          this.value = value;
      public void run() {
        Node root = new Node(5);
        System.out.println("Binary Tree Example");
        System.out.println("Building tree with root value " + root.value);
        insert(root, 1);
        insert(root, 8);
        insert(root, 6);
        insert(root, 3);
        insert(root, 9);
      public void insert(Node node, int value) {
        if (value < node.value) {
          if (node.left != null) {
            insert(node.left, value);
          } else {
            System.out.println("  Inserted " + *value* + " to left of "
                + node.value);
            node.left = new Node(value);
        else if (value > node.value) {
          if (node.right != null) {
            insert(node.right, value);
          } else {
            System.out.println("  Inserted " + *value* + " to right of "
                + node.value);
            node.right = new Node(value);
          if(node.value==1)
               System.out.println("The value is one");
             int output=node.value;
               System.out.println(output);
    }

    Hi,
    You can change the filter with the new cost element variable,Or you can assign the value of the new variable(if of same type)to old cost element ,but for that assignment again u have to change  planning function which you don't want.
    Regards,
    Indu

  • Suggested Migration Path (BC4J/Struts - ?)

    We built a BC4J/Struts apps a couple years back closely modeled after the BC4J ToyStore. It has been quite successful for us. However, I'm feeling like its technology stack is a bit dated, and would like some suggestions on bringing it more current.
    BC4J (ADF) has been pretty solid for us, so I'm thinking of sticking with that instead of considering something else (Toplink, Hibernate, JPA, ...).
    It would be cool to hear from others who were/are in a similar situation, and what they decided to do (tips, tricks, lessons learning from the trenches, ...). Thank you.
    - Matt

    I've worked in situations like this.
    Personally, I think that if ADF BC/BC4J is working for you, there's no need whatsoever to migrate away from it. I imagine some might disagree with me on this, though.
    The logical successor to Struts is JSF--since you're working in ADF, you'd probably want to use the ADF Faces components. Here, so far as I can tell, is the deal:
    1) The UIX -> Faces migration utility is pretty smooth, unless you made heavy use of .uit templates. There's no equivalent in Faces, so you'll have to drop what was previously template code into place on your individual faces pages.
    2) Moving from Struts to Faces...well, it depends on how heavily you used Struts, beyond the declarative bit. The declarative part is pretty easy to duplicate, but migrating controller code you've written in Struts over to Faces is manual, and in my experience not always 100% smooth. There isn't, for example, a clear action/page separation, so you'll need to find something to do with code you had written in Struts Actions and DataActions.
    Desppite these hurdles, I'd still recommend making the switch--the ADF Faces components are in many ways a big improvement over UIX components.

Maybe you are looking for

  • How can I stop my lock-in results from oscillating. The low pass filter is creating artificial noise

    I am using the lock in amplifier kit and sort of sending some of the parameters manually. I choose manually the low pass filter. Now I find strange behavior depending on the filter I choose.  The lock in results oscillates in time, the higher the dB

  • Nokia Suite no longer recognises N9 after upgradin...

    I have been regularly using Nokia Suite 3.2 with my N9, and so I recently upgraded to Nokia Suite 3.5. After some initial problems getting ownership of the Nokia file in the ProgramData folder, the install worked however now when I connect using 'Syn

  • Link lines in Adobe forms

    Dear Experts, how can i link lines so that the line break cant happen between them ? Thanks a lot.

  • Skype name connnected to country

    I like to know how it is possible that my skype name (and I know that there is not somebody else with the same skype name) appears in 2 countries ( Romanian and Dutch) I am living in the Netherlands so thats correct and i have visit Romania and used

  • Writing Mp3 in garage band?

    I like to post some of my jams on my facebook etc, but they only accept Mp3 format. it seems that gargage band only writes in mp4... I know how to buy software to do this... but will the program write files in Mp3, without having to import 3rd party