Struts 2
  1. Struts 2
  2. WW-3381

Suport for decorating static content

    Details

    • Type: Improvement Improvement
    • Status: Closed
    • Priority: Critical Critical
    • Resolution: Not a Problem
    • Affects Version/s: 2.1.8
    • Fix Version/s: 2.3.1
    • Component/s: Plugin - SiteMesh
    • Labels:
      None

      Description

      In my case this issue is occuring when trying to decorate static content with sitemesh, but it generally is more an struts-core ActionMapper issue.

      I was trying to decorate plain html files using the sitemesh-plugin.
      I expected it to work using the empty-string action mapper, and thus added a link to /decorated_html/foo.html . The reslut was an error page since all the variables in the template could not be resolved, due to a missing action.
      If org.apache.struts2.dispatcher.mapper.DefaultActionMapper.dropExtension(String, ActionMapping) would not return null for any url containing a dot but no slash and no supported action-extension after it, it would have worked.
      By looking at the tests, I found that the returned null was expected behaviour introduced for WW-2163.

      I think to resolve this issue it would have been better to promote more sofisticated filter mappings in the web.xml to avoid the empty action side effects described in a previous comment.

      In my case it would be sufficient to use filter mappings

      <filter-mapping>
      <filter-name>struts2-prepare</filter-name>
      <url-pattern>*.action</url-pattern>
      </filter-mapping>
      <filter-mapping>
      <filter-name>struts2-prepare</filter-name>
      <url-pattern>decorated_html/*</url-pattern>
      </filter-mapping>

      <filter-mapping>
      <filter-name>sitemesh-struts</filter-name>
      <url-pattern>/*</url-pattern>
      </filter-mapping>

      <filter-mapping>
      <filter-name>struts2-execute</filter-name>
      <url-pattern>*.action</url-pattern>
      </filter-mapping>
      <filter-mapping>
      <filter-name>struts2-execute</filter-name>
      <url-pattern>/decorated_html/*</url-pattern>
      </filter-mapping>

        Issue Links

          Activity

          Hide
          Philipp Leusmann added a comment - - edited

          I don't know what changed in my setup, but something has. Suddenly decorating stati content works with the default ActionMapper and serving static content from jars does not work anymore.

          I will look into the issue again as soon as I have some spare time.

          Show
          Philipp Leusmann added a comment - - edited I don't know what changed in my setup, but something has. Suddenly decorating stati content works with the default ActionMapper and serving static content from jars does not work anymore. I will look into the issue again as soon as I have some spare time.
          Hide
          Lukasz Lenart added a comment -

          Could you attach a patch?

          Thanks in advance!

          Show
          Lukasz Lenart added a comment - Could you attach a patch? Thanks in advance!
          Hide
          Philipp Leusmann added a comment -

          One addition:

          To keep serving static content from jars working, an additional mapping is required:

          <filter-mapping>
          <filter-name>struts2-prepare</filter-name>
          <url-pattern>/struts/*</url-pattern>
          </filter-mapping>

          Show
          Philipp Leusmann added a comment - One addition: To keep serving static content from jars working, an additional mapping is required: <filter-mapping> <filter-name>struts2-prepare</filter-name> <url-pattern>/struts/*</url-pattern> </filter-mapping>
          Hide
          Philipp Leusmann added a comment - - edited

          Possible solution:

          Change org.apache.struts2.dispatcher.mapper.DefaultActionMapper.dropExtension(String, ActionMapping) to:

          protected String dropExtension(String name, ActionMapping mapping) {
          if (extensions == null)

          { return name; }

          for (String ext : extensions) {
          if ("".equals(ext))

          { return name; }

          else {
          String extension = "." + ext;
          if (name.endsWith(extension))

          { name = name .substring(0, name.length() - extension.length()); mapping.setExtension(ext); return name; }

          }
          }
          return null;
          }

          Thus, if the empty extension is enabled, it accepts any URL, Which I think is what the user expects. If enabling the empty action by default is another story. I do not recomment it.

          But IF the empty extension is enabled, it should be mapped as described in the original description of this issue.
          Or maybe by some addition parameters in struts.properties.

          An idea for struts.properties would be adding something like:

          struts.action.emptyExtension.enabled=true
          struts.action.emptyExtension.mapping=/decorated_html/*,some_other_regExp

          The result will, in my case, be a sitemesh-decorated html page when accession the url /decorated_html/foo.html

          Show
          Philipp Leusmann added a comment - - edited Possible solution: Change org.apache.struts2.dispatcher.mapper.DefaultActionMapper.dropExtension(String, ActionMapping) to: protected String dropExtension(String name, ActionMapping mapping) { if (extensions == null) { return name; } for (String ext : extensions) { if ("".equals(ext)) { return name; } else { String extension = "." + ext; if (name.endsWith(extension)) { name = name .substring(0, name.length() - extension.length()); mapping.setExtension(ext); return name; } } } return null; } Thus, if the empty extension is enabled, it accepts any URL, Which I think is what the user expects. If enabling the empty action by default is another story. I do not recomment it. But IF the empty extension is enabled, it should be mapped as described in the original description of this issue. Or maybe by some addition parameters in struts.properties. An idea for struts.properties would be adding something like: struts.action.emptyExtension.enabled=true struts.action.emptyExtension.mapping=/decorated_html/*,some_other_regExp The result will, in my case, be a sitemesh-decorated html page when accession the url /decorated_html/foo.html

            People

            • Assignee:
              Unassigned
              Reporter:
              Philipp Leusmann
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Time Tracking

                Estimated:
                Original Estimate - 8h
                8h
                Remaining:
                Remaining Estimate - 8h
                8h
                Logged:
                Time Spent - Not Specified
                Not Specified

                  Development