Skip to Main Content

Java EE (Java Enterprise Edition) General Discussion

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

Help! pageContext is NULL in custom tag constructor!

843833Oct 11 2001 — edited Oct 12 2001
I'm having a problem with a custom tag class, and I'm not sure whether it's because I'm doing something wrong, or because I'm running into a bug with Tomcat, JDK1.4b2, or something else. Basically, I'm finding that the pageContext object is null in the constructor of a custom tag class... something that I'm pretty sure is NOT supposed to happen.

I'm running JDK1.4b2 with Forte CE 3.1 (the bug predates the jumbo fix that brought it up to 3.0) and using Forte's embedded Tomcat.

I'm not sure whether it matters, but here's the sequence of events:

A servlet gets launched,
instantiates an object of type Error_list,
binds Error_list to the request object, and
forwards to a JSP that uses the custom tag defined by ListErrorsTag.
Unfortunately, pageContext is null in ErrorListTag's constructor, so the attempt to get the request object from the pageContext object generates a NullPointerException.

The SERVLET: *****************************************
// relevant lines from the servlet instantiating the object, binding it, and forwarding...

     Error_list errors = new Error_list("BAD_THINGS", "crash and burn");
     request.setAttribute("errors",errors);

     ServletContext sc = this.getServletContext();
     RequestDispatcher rd = sc.getRequestDispatcher("admin_category_create.jsp");
     rd.forward(request,response);
The JSP: ************************************************
In the JSP "admin_category_create.jsp" itself, I specify the taglib:
     
     <%@ taglib uri='/WEB-INF/AdminTags.tld' prefix = 'admin' %>
and reference it:
     <admin:listErrors>The errors will be listed here</admin:listErrors>
The Explosion of the Taglib: ************************
// beginning of Taglib class:

public class ListErrorsTag extends BodyTagSupport {
    
    private Error_list errors;
    
    public ListErrorsTag() {
    super()
    
    try {
    
         if (pageContext == null)
             System.out.println("uh oh! pageContext is null");
         
         ServletRequest request = pageContext.getRequest();
         
         errors = (Error_list)request.getAttribute("errors");
    
    }
    catch (NullPointerException e) {
         System.out.println("boom!");
    }
}
The Result: **************************************

Tomcat's error log:


uh oh! pageContext is null
boom!

*************************************
if I eliminate the try/catch and allow the NullPointerException to take place, I get:


Error: 500
Location: /admin_category_create.jsp
Internal Servlet Error:

javax.servlet.ServletException
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:459)
at _0002fadmin_0005fcategory_0005fcreate_0002ejspadmin_0005fcategory_0005fcreate_jsp_0._jspService(_0002fadmin_0005fcategory_0005fcreate_0002ejspadmin_0005fcategory_0005fcreate_jsp_0.java:338)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:177)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:318)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:391)
at org.netbeans.modules.web.tomcat.JspServlet.service(JspServlet.java:91)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:404)
at org.apache.tomcat.core.Handler.service(Handler.java:286)
at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
at org.apache.tomcat.facade.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:194)
at admin.processRequest(admin.java:126)
at admin.doPost(admin.java:144)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:404)
at org.apache.tomcat.core.Handler.service(Handler.java:286)
at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:797)
at org.apache.tomcat.core.ContextManager.service(ContextManager.java:743)
at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:210)
at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)
at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:498)
at java.lang.Thread.run(Thread.java:539)

Root cause:
java.lang.NullPointerException
at AdminTags.ListErrorsTag.(ListErrorsTag.java:32)
at _0002fadmin_0005fcategory_0005fcreate_0002ejspadmin_0005fcategory_0005fcreate_jsp_0._jspService(_0002fadmin_0005fcategory_0005fcreate_0002ejspadmin_0005fcategory_0005fcreate_jsp_0.java:272)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:177)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:318)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:391)
at org.netbeans.modules.web.tomcat.JspServlet.service(JspServlet.java:91)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:404)
at org.apache.tomcat.core.Handler.service(Handler.java:286)
at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
at org.apache.tomcat.facade.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:194)
at admin.processRequest(admin.java:126)
at admin.doPost(admin.java:144)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:404)
at org.apache.tomcat.core.Handler.service(Handler.java:286)
at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:797)
at org.apache.tomcat.core.ContextManager.service(ContextManager.java:743)
at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:210)
at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)
at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:498)
at java.lang.Thread.run(Thread.java:539)

Comments

737905
Your insert statements are incorrect. Could you please post the correct inserts?

Edited by: AP on Aug 11, 2010 7:59 AM
737905
try this:
SELECT (select region from region_lookup where region_id = x.region_id) region,
       10_Jun,
       10_Jul,10_Jun + 10_Jul 
FROM (SELECT region_id, 
             SUM(CASE WHEN IND_REV_DATE = '10-Jun' THEN IND_REVENUE ELSE 0 END) 10_Jun, 
            SUM(CASE WHEN IND_REVENUE = '10-Jul' THEN IND_REVENUE ELSE 0 END) 10_Jul 
FROM IND_REVENUE GROUP BY region_id) x
/
PS: Not tested

Edited by: AP on Aug 11, 2010 8:07 AM
ATael-Oracle
Sorry about that, I've fixed them.

-Andy
ATael-Oracle
The statement gives me:
ORA-00911: invalid character
Cheers,
Andy
Aketi Jyuuzou
I llke rollup using Composite Columns :D
select case grouping(a.REGION_ID)
       when 1 then 'Total' else a.REGION end as Region,
sum(decode(b.IND_REV_DATE,'10-Jun',b.IND_REVENUE)) as "10-Jun",
sum(decode(b.IND_REV_DATE,'10-Jul',b.IND_REVENUE)) as "10-Jul",
sum(b.IND_REVENUE) as Total
  from REGION_LOOKUP a Join IND_REVENUE b
    on a.REGION_ID = b.REGION_ID
group by rollup((a.REGION_ID,a.REGION))
order by grouping(a.REGION_ID),a.REGION;

REGIO  10-Jun  10-Jul  TOTAL
-----  ------  ------  -----
APAC     28.6    12.4     41
EMEA       64    19.8   83.8
JAPAN     6.6     4.7   11.3
LAD       3.2      .3    3.5
NAS      73.1    49.3  122.4
Total   175.5    86.5    262
ATael-Oracle
Thanks, this works like a charm but the column containing 10-Jun and 10-Jul today will soon have another column called 10-Aug etc. So the number of columns will extend every month, basically a non known number of columns.

Ideas?

Cheers,
Andy
Frank Kulash
Hi, Andy,
A Tael wrote:
Thanks, this works like a charm but the column containing 10-Jun and 10-Jul today will soon have another column called 10-Aug etc. So the number of columns will extend every month, basically a non known number of columns.
See the following thread for several ways to deal with a variable number of columns:
3529823
ATael-Oracle
A nice solution, but isn't there a way to avoid the spooling into a file?

Cheers,
Andy
Frank Kulash
Answer
Hi, Andy,
A Tael wrote:
A nice solution,
Thanks, but which solution do you mean? There were at least 4 different soltuions on that page.
but isn't there a way to avoid the spooling into a file?
Do you mean the dynamic SQL solution? Yes, SPOOLing is just one way to do dynamic SQL.
In SQL*Plus you can write the variable part of the query to a substitution variable (see below).
In PL/SQL, you can assemble a SELECT statement in VARCHAR2 variables.
PROMPT	==========  2. Dynamic Pivot using Substitution Variable  ==========

--	*****  Preliminary Query:  *****

COLUMN	sql_txt_col	NEW_VALUE	sql_txt

WITH	all_jobs	AS
(
	SELECT DISTINCT
		job
	,	DENSE_RANK () OVER (ORDER BY job)	AS r_num
	FROM	scott.emp
)	
SELECT	SYS_CONNECT_BY_PATH ( job || '''	THEN 1 END) AS '
				  || job
				  || '_CNT'
				  || CHR (10)			-- Newline, for legibility only
			    , ', COUNT (CASE WHEN job = '''	-- Delimiter, goes before each entry
			    ) 	       	     	      	AS sql_txt_col
FROM	all_jobs
WHERE	CONNECT_BY_ISLEAF	= 1
START WITH	r_num = 1
CONNECT BY	r_num = PRIOR r_num + 1
;

--	*****  Main Query  *****

SELECT	deptno
&sql_txt	-- Ends with newline, so occupy that line
FROM	scott.emp
GROUP BY	deptno
ORDER BY	deptno
;

/*
EXPLANATION:

Using a substitution variable is very similar to using a script.
The main difference is that the output of the preliminary query has to
go into one row.  This is done with SYS_CONNECT_BY_PATH, and getting
that requires that the jobs be numbered with consecutive integers, 1, 2, 3, ...
which we get from DENSE_RANK.

The NEWLINE character was added just to make the output line easier
to read during debugging.
*/
Marked as Answer by ATael-Oracle · Sep 27 2020
1 - 9
Locked Post
New comments cannot be posted to this locked post.

Post Details

Locked on Nov 9 2001
Added on Oct 11 2001
3 comments
931 views