Search code examples
javaweb-applicationszk

ZK multiple webapps in a single project


Background:

I programmed 2 ZK web applications (ZK653CE) with netbeans 8.1 both are moduls for a single task. Now I want to access application B from within application A both projects are on the same Tomcat 8 webserver.

Why I want to do this:

Application A has a user login and presents data to the user. Application B allows anybody to create a pattern for displaying data. I want a user to start application B and create a pattern (Press save close app). This pattern shall be send back to application A that then changes the display behaviour of the data to the new pattern. I do not want to mix those 2 applications together, because I want them to stay independent.

What I already figured out while searching this topic:

  • It is not possible to directly access an external webapp from within a zk project
  • It would be possible to use a shared ressource concept from tomcat (but I don't want that because I want this to run on different webservers like glasfish and others)

The real question:

Is there a way to have both apps independent (if yes please explain or show an example) or do I have to merge them?


Solution

  • I had much time to try differnt things I'll show the 2 best solutions I came a cross:

    1. Using Cookies

    One can use Cookies to store data at the client and use the server to access it. It's commonly used for sessionmanagement or other parts that control the content for the current user.

    To access Cookies one would use this code in a ZK Class (Controller or Viewmodel):

     HttpServletRequest req = (HttpServletRequest) Executions.getCurrent().getNativeRequest();
     Cookie[] cookies = req.getCookies();
    

    This will load all cookies of the current session. The HttpServletRequest class can be found in the java docs for more information (it represents the raw client http request). One can then iterrate through the array and look for a Cookie

    HttpServletResponse resp = (HttpServletResponse) Executions.getCurrent().getNativeResponse();
    for(Cookie c : cookies) {
            if(c.getName().equals(COOKIE_MODE)) {
                externalAccess = Boolean.parseBoolean(c.getValue());             
                c.setMaxAge(0);
                c.setValue(null);
                c.setPath(NAMESPACE);
                resp.addCookie(c);
            } 
    }
    

    externalAccess stores if the modul was loaded from an external modul. This external module would have to create that Cookie first of course. The set parameters are used to delete the Cookie setting the age to 0 means its expiered one also sets the value and if a path was used to create it one must also set the path because it must be known where the old Cookie was placed. The cookie must be added to a HTTP Response for the client (from the server) so that the client replaces its old Cookie.

    To create a cookie one would use this:

    Cookie cookie = new Cookie(COOKIE_NAME, COOKIE_VALUE);
                    cookie.setPath(NAMESPACE);
                    HttpServletResponse resp = (HttpServletResponse) Executions.getCurrent().getNativeResponse();
                    resp.addCookie(cookie);
    

    This is very similar to the for loop before.

    1. Approach Just add a parameter to the URL (commonly used to provide parameters):

    If one hase a webserver on localhost its address is probably this: http://localhost:8080/ a modul is loaded to / or if a subfolder is specified /modul

    if one has a .zul in /modul named index.zul

    one can access it by using http://localhost:8080/modul/index.zul

    if one want's to add a parameter it would be done like this: http://localhost:8080/modul/index.zul?externalAccess=1

    one can then access this in the viewmodel or controller of index.zul (i used MVVM) with the following code:

    String external = Executions.getCurrent().getParameter("externalAccess");
    

    One can then cast the parameter to ones liking.

    To create a redirect that uses the URL above one can use this:

    Executions.sendRedirect("http://localhost:8080/modul/index.zul?externalAccess=1");
    

    one can get the URL to ones server and the current application like this: Server:

    String server = Executions.getCurrent().getScheme() + "://" + Executions.getCurrent().getServerName() + ":" + Executions.getCurrent().getServerPort();
    

    For the path to the application starting with "/":

    Executions.getCurrent().getContextPath() +  Executions.getCurrent().getDesktop().getRequestPath();
    

    One could also use a config file that has the URLs stored (on webserver) but i won't cover that here