# HttpServletRequest-instanz in servlet und JSP unterschiedlich?



## ruutaiokwu (10. Feb 2011)

hallo zusammen,

mir liegt folgender code vor:


```
import java.util.Map;

import com.aastra.ch.commons.collections.sorting.SortMap;

@SuppressWarnings("unchecked")
public class RequestAnalyzer
{
    public static void printFields(Object request)
    {
        System.out.println(RequestAnalyzer.getFields(request));
    }

    public static String getFields(Object request)
    {
        Map parameterMap = null;

        final StringBuilder sb = new StringBuilder();

        try
        {
            parameterMap = (Map) request.getClass().getMethod("getParameterMap").invoke(request, (Object[]) null);
        }
        catch (final Exception e)
        {
            e.printStackTrace();
        }

        final Map<String, String[]> sortedParameterMap = (Map<String, String[]>) SortMap.getTreeMapAsMap(parameterMap);

        for (final Map.Entry<String, String[]> entry : sortedParameterMap.entrySet())
        {
            final String key = entry.getKey();
            final String[] value = entry.getValue();
            sb.append("Key: " + key + ", Value: " + value[0] + "\r\n");
        }

        return sb.toString();
    }
}
```


anmerkung: reflection verwendet ich nur, weil ich das ganze teil einer library ist, wo ist servlet-engine (javax.servlet)-abhängigkeit nicht aufgelöst ist. persönlich mag ich das gar nicht, libraries zu packen, wo abhängigkeiten zur beim kompilieren nicht aufgelöst werden können. *dass meine strategie auch nachteile hat, braucht mir niemand zu erklären. z.b. die das problem warum ich hier nachfrage:*

wenn ich meine methode in einem servlet verwende (doGet, doPost oder service-funktionen) funktioniert das. wenn ich die methode in einem JSP verwende (mit der request-"konstante"...) geht das nicht, dann erhalte ich folgende meldung: 

java.lang.IllegalAccessException: Class com.aastra.ch.commons.http.debug.RequestAnalyzer can not access a member of class org.apache.catalina.core.ApplicationHttpRequest with modifiers "public"
	at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.aastra.ch.commons.http.debug.RequestAnalyzer.getFields(RequestAnalyzer.java:23)
	at org.apache.jsp.WEB_002dINF.presentation.jsf.test.ERBDataJSP_jsp._jspService(ERBDataJSP_jsp.java:444)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at com.aastra.ch.commons.http.request.PageResolver.gotoPage(PageResolver.java:34)
	at tests.jmarti.jsf.ERBDataServlet.processRequest(ERBDataServlet.java:59)
	at com.aastra.ch.sls.commons.servlets.SLSDispatcher.myService(SLSDispatcher.java:321)
	at com.aastra.ch.sls.commons.servlets.SLSDispatcher.doPost(SLSDispatcher.java:466)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at com.aastra.ch.sls.commons.servlets.SLSDispatcher.service(SLSDispatcher.java:353)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
	at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:574)
	at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1527)
	at java.lang.Thread.run(Unknown Source)



...im moment kann ich nichts anderes machen, als die HttpServletRequest-instanz vom servlet her per request-dispatch (!) an das JSP weiterzuleiten, dort wieder zu holen und dann der getFields()-funktion mitzugeben...


grüsse, jan


----------



## maki (10. Feb 2011)

> anmerkung: reflection verwendet ich nur, weil ich das ganze teil einer library ist, wo ist servlet-engine (javax.servlet)-abhängigkeit nicht aufgelöst ist.


Hä?

Wieso nicht die Servlet API mit in den Classpath nehmen?


----------



## ruutaiokwu (10. Feb 2011)

@maki: später dann schon, mag aber keine anderen libraries in meinem eigenen library-projekt. habe die philisophie dass meine libraries WENN MÖGLICH keine anderen libraries verwenden müssen, sonst hat man später möglicherweise das totale chaos.

und wenn es mal nicht anders geht, verwende ich reflection. in meinem library-projekt will ich

1. keine weiteren libraries haben
2. keine zur kompilierzeit nicht aufgelösten abhängigkeiten haben

...darum das ganze! ob das jetzt gut oder schlecht ist, ist mir eigentlich egal. (ja, ich mache mir teilweise selbst probleme -> konkret z.b. die frage, welche ich stelle ;-)) das war nicht das thema, danke für's verständtnis.


----------



## tagedieb (11. Feb 2011)

Die Klasse *org.apache.catalina.core.ApplicationHttpRequest* scheint in deinem Applikationserver nicht als _public_ deklariert zu sein, deswegen ist der Zugriff via Reflection verboten und erzeugt eine Fehlermeldung.

Ich hab das ganze mit Glassfish3 getestet, da funktioniert dein Code einwandfrei. Allerdings ist die Klasse ApplicationHttpRequest in meiner Library als public deklariert.


Eventuell muss du mal deinen Applikationsserver updaten oder auf einen andern umsteigen.
Alternativ kannst du auch in deinem JSP den HttpServletRequestWrapper verwenden.


```
<%=RequestAnalyzer.getFields(new HttpServletRequestWrapper(request))%>
```


PS. Deine Philisophie kann ich nicht wirklich verstehen. Deine Klasse gehoert eigentlich ein ein Webprojekt, aber jeder darf sich selber das Leben schwer machen wie er will


----------



## maki (11. Feb 2011)

jmar83 hat gesagt.:


> @maki: später dann schon, mag aber keine anderen libraries in meinem eigenen library-projekt.


Ganz ehrlich: Du bist in Java falsch. Nicht böse gemeint.
In Java werden Erweiterungen schon immer als externe Library (Jars) hinzugefügt, die Sprache ändert sich höchstens minimal, so verhält es sich nicht nur mit JEE, sondern eigentlich mit allem in Java.



> habe die philisophie dass meine libraries WENN MÖGLICH keine anderen libraries verwenden müssen, sonst hat man später möglicherweise das totale chaos.


Deine Philosophie hört sich für mich eher nach unerfahrenheit an.



> und wenn es mal nicht anders geht, verwende ich reflection. in meinem library-projekt will ich


Das ist definitiv der falsche Weg.

Sieh es mal so: Du nutzt die Servlet API, diese Abhängigkeit wirst du immer haben, egal ob mit oder ohne Reflection.

Reflection dazu zu missbrauchen klingt für mich so, als ob du dir eine Hand abhackst um deine Fingernägel nicht mehr schneiden zu müssen 

Tatsache ist, dass du die Serlvet API brauchst, und jeder der deine Lib verwenden will auch.
Dann wäre es nur richtig diese als explizite Abhängigkeit zu führen.

Dein Problem: Du versuchst dich an der Servlet API, einen Standard, nutzt diesen aber falsch.


----------



## ruutaiokwu (11. Feb 2011)

hallo zusammen,

wenn schon *getFields(Map parameterMap)*

in angewandter form: *Map m  = getFields(request.getParameterMap())*

so löst sich die abhängigkeit von der servlet api...

(keine ahnung, was ich mir vorher dabei überlegt habe...)


grüsse, jan


----------

