On Mon, Sep 11, 2023 at 9:47 AM Christopher Schultz <ch...@christopherschultz.net> wrote: > > Aryeh, > > On 9/9/23 19:36, Aryeh Friedman wrote: > > On Sat, Sep 9, 2023 at 1:23 PM Mark Thomas <ma...@apache.org> wrote: > >> > >> On 09/09/2023 11:52, Aryeh Friedman wrote: > >>> Every other jsp in my webapp (and other webapps on the same tomcat > >>> instance [9.0.75]) works and I am using a the default container but as > >>> curl/catalina.out show BasePage is *NEVER* being called (either the > >>> _jspService() or the getX()): > >> > >> How have you configured your JSP(s) to use this alternative base class? > > > > sudo cat /usr/local/apache-tomcat-9.0/webapps/tlaitc-dashboard-1a1/index.jsp > > <!-- Copyright (C) 2023 TLAITC and contributors --> > > <%@page extends="dashboard.web.pages.BasePage"%> > > hi x is ${x} > > > > Output shown in log (sorry for not including the JSP the first time) > > but to make it easier to find the output is "hi x is " when it should > > be "hi x is 123234"... as you notice there are zero errors/warning in > > catalina but there is none of the println's also... so the only thing > > I can surmise is BasePage is never being called <%@page > > extends="dashboard.web.pages.BasePage"%> somehow failed but I have > > verified that correct spelling several times and also verified any > > syntextual errors [including the contents of the string literal] will > > show up in catalina.out (i.e. wrong class name is logged as an error) > > Your _jspService method in your base class will never be called, because > it is overridden by the auto-generated class for your JSP, which does > not call super._jspService. > > I do not believe that this: > > Hi X is ${x} > > ...will result in this.getX() being called from the JSP. References in > EL ${...} expressions will be resolved against the PageContext (and > other wider contexts), not against the JSP class currently executing. > > If you want to call this.getX() then you will need to do this: > > Hi X is <% getX() %> > > I wouldn't bother messing-around with class hierarchies in JSP. It > usually doesn't get you much but almost always requires you to bind > yourself very closely with the specific implementation of the JSP engine. > > It would be far better to use typical MVC-style development where a > servlet (or similar) handles the real work of the request, possibly > including writing a value of "x" to the request attributes. Then forward > your request to your JSP to produce the response content. This will be > much more straightforward and you will have fewer problems like this, > where expected behavior is confused by all the magic that JSP provides.
Thanks but I have a very specific use case which the following working example below should make more clear: <!-- Copyright (C) 2023 TLAITC and contributors --> <%@page import="dashboard.web.page.Page"%> <% // THIS WOULD NOT BE NEEDED if <%@page extends="..."%> worked // // for now we don't need to keep the page object just // the setAttributes in our ctx new Page(pageContext); %> <html> <head> <%@include file="/widgets/scripts/scripts.jsp"%> </head> <body> <jsp:include page="${pagePath}"/> </body> </html> and the Page class: package dashboard.web.page; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.PageContext; import org.petitecloud.util.PetiteCloudNullException; // making this extend the right subclass plus working page extends="...." would mean zero in-line Java // Copyright (C) 2023 TLAITC and contributors public class Page { public Page(PageContext ctx) { _dbc_construction(ctx); this.ctx=ctx; HttpServletRequest req=(HttpServletRequest) ctx.getRequest(); String[] parts=req.getRequestURI().split("/"); int split=2; if(parts[0].equals("http:")) split+=2; name=""; for(int i=split;i<parts.length;i++) name+="/"+parts[i]; if(name.length()==0) name="/index.jsp"; // we can safely asssume all valid requests will end with // .jsp at this point name=name.substring(1,name.length()-".jsp".length()); path="/content/"+name+"/main.jsp"; ctx.setAttribute("pagePath",path); } // only used in testing public Page(String name) { this.name=name; } public String getName() { return name; } public String getPath() { return path; } public PageContext getPageContext() { return ctx; } @Override public String toString() { return name; } @Override public int hashCode() { return name.hashCode(); } @Override public boolean equals(Object o) { if(o==null||!o.getClass().equals(getClass())) return false; Page other=(Page) o; return name.equals(other.name); } private String name; private String path; private PageContext ctx; // ----- # DBC # ------------------------------------------- private void _dbc_construction(PageContext ctx) { if(ctx==null) throw new PetiteCloudNullException("ctx is null"); } } So all I am attempting to do is write it like this (get rid of the last remaining in-line java but not be forced to use tag instead of ${} either): <!-- Copyright (C) 2023 TLAITC and contributors --> <%@page extends="dashboard.web.page.Page"%> <html> <head> <%@include file="/widgets/scripts/scripts.jsp"%> </head> <body> <jsp:include page="${pagePath}"/> </body> </html> Side note I am currently adding user detection to the above page class to that it can auto-enforce ACL's -- Aryeh M. Friedman, Lead Developer, http://www.PetiteCloud.org --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org