Avatar billede baitianlong Nybegynder
15. juni 2008 - 19:28 Der er 11 kommentarer og
1 løsning

problem med java.lang.IllegalStateException

Jeg har en masse information fra en form, bland andet nogle lister osv. Det er nok for meget at sende med til resultatsiden i URL'en, derfor har jeg proevet at gemme det hele i request.getSession().

Men naar jeg saa kalder response.sendRedirect gaar min app i fejl og siger dette:

---------------------------------------------------------------

java.lang.IllegalStateException
    org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:433)
    org.apache.jsp.overview_jsp._jspService(overview_jsp.java:99)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

---------------------------------------------------------

Er der nogen, der kan hjaelpe med det problem?
Avatar billede arne_v Ekspert
15. juni 2008 - 19:37 #1
Den brokker sig over at du har sendt response headere og evt. noget respons body til
client før du prøver at lave en redirect - det kan man ikke - heller ikke i Java.
Avatar billede baitianlong Nybegynder
15. juni 2008 - 19:44 #2
Der er ingen response metoder foer redirect kaldet... Her er hele koden frem til sendRedirect:

List<String> categories = CategoryFunctions.getCategories();
    List<MonitoredBlog> blogs = DatabaseFunctions.getMonitoredBlogs();
    List<String> subjects = CategoryFunctions.getSubjects();
    if(request.getMethod().equals("POST")) {
        List<String> urls = new ArrayList<String>();
        List<String> cats = new ArrayList<String>();
        for(Object o : request.getParameterMap().keySet()) {
            String key = o.toString();
            String value = request.getParameter(key);
            if(value.indexOf("http://") > -1) {
                urls.add(value);
            }
            if(value.indexOf("cate") == 0) {
                cats.add(value.substring(4,value.length()-3));
            }
            int crityearafter = 0;
            if(request.getParameter("crityearafter") != null) crityearafter = Integer.parseInt(request.getParameter("crityearafter"));
            int critmonthafter = 0;
            if(request.getParameter("critmonthafter") != null) crityearafter = Integer.parseInt(request.getParameter("critmonthafter"));
            int crityearbefore = 0;
            if(request.getParameter("crityearbefore") != null) crityearafter = Integer.parseInt(request.getParameter("crityearbefore"));
            int critmonthbefore = 0;
            if(request.getParameter("critmonthbefore") != null) crityearafter = Integer.parseInt(request.getParameter("critmonthbefore"));
            int searchtitles = 0;
            if(request.getParameter("searchtitles") != null) searchtitles = Integer.parseInt(request.getParameter("searchtitles"));
            int searchtext = 0;
            if(request.getParameter("searchtext") != null) searchtitles = Integer.parseInt(request.getParameter("searchtext"));
            int searchcomments = 0;
            if(request.getParameter("searchcomments") != null) searchcomments = Integer.parseInt(request.getParameter("searchtitles"));
            String searchphrase = "";
            if(request.getParameter("searchphrase") != null) searchphrase = request.getParameter("searchphrase");
            String catitem = "";
            if(request.getParameter("catitem") != null) catitem = request.getParameter("catitem");

            request.getSession().setAttribute("urls", urls);
            request.getSession().setAttribute("cats", cats);
            request.getSession().setAttribute("crityearafter", crityearafter);
            request.getSession().setAttribute("critmonthafter", critmonthafter);
            request.getSession().setAttribute("crityearbefore", crityearbefore);
            request.getSession().setAttribute("critmonthbefore", critmonthbefore);
            request.getSession().setAttribute("searchtitles", searchtitles);
            request.getSession().setAttribute("searchtext", searchtext);
            request.getSession().setAttribute("searchcomments", searchcomments);
            request.getSession().setAttribute("searchphrase", searchphrase);
            request.getSession().setAttribute("catitem", catitem);
            response.sendRedirect("searchresults.jsp?source=session");
        }
    }
Avatar billede arne_v Ekspert
15. juni 2008 - 19:55 #3
Hvis den kode ligger i en servlet, så burde det faktisk virke.

Hvis den kod eligger i en JSP side med <% %>, så kan der godt blive sendt noget
til response fra det som ligger udenfor <% %> blokken.
Avatar billede baitianlong Nybegynder
15. juni 2008 - 20:30 #4
Jeg har loest det paa en lidt plat maade.

I stedet for response.sendRedirect skriver jeg window.location.href i <script> blokken med out.write

Maaske ikke den mest prof. maade at goere det paa, men det virker og alle objekterne ligger i Session til resultat siden...

Hvis du har et andet bud (mere ordentligt) er jeg lutter oere, men ellers lader jeg det vaere ved det javascript.

I JSP sider bliver koden jo som regel til mellemrum og linieskift paa html dokumentet, saa du har sikkert ret i at det bliver fortolket som response paa et eller andet plan.

I hvert fald gav din fornemmelse mig selv en ide til en loesning, saa du kan smide et svar og indkassere points'ne.
Avatar billede arne_v Ekspert
15. juni 2008 - 20:38 #5
Hvis den kode altid skal lave en redirect, så ville jeg erstatte den JSP side med
en servlet.

Næstbedste forslag:

<% i linie 1
kald response.reset() inden response.sendRedirect
Avatar billede baitianlong Nybegynder
15. juni 2008 - 20:52 #6
Den fejler stadig selv om jeg skriver response.reset() uanset om det er i linie 1 eller lige foer sendRedirect.

Jeg bruger bare min aandssvage javascript loesning og husker at bruge en servlet naeste gang :)

Smider du et svar...
Avatar billede arne_v Ekspert
15. juni 2008 - 20:55 #7
svar
Avatar billede arne_v Ekspert
15. juni 2008 - 20:55 #8
PS: det var <% ikke response.reset jeg ville have i linie 1 !
Avatar billede baitianlong Nybegynder
15. juni 2008 - 21:07 #9
De foerste par linier er jo import statements...
Avatar billede arne_v Ekspert
15. juni 2008 - 21:12 #10
Ja.

<%@ page import="bla bla" %><% // start of code

er faktisk valid JSP.

Jeg har før måttet bruge det for at undgå at der blev skrevet noget til respons.
Avatar billede baitianlong Nybegynder
16. juni 2008 - 08:46 #11
Naarh ok. Du mener droppe linie skift mellem imports og mellem imports og kode..

Tak for hjaelpen her.
Avatar billede arne_v Ekspert
16. juni 2008 - 15:09 #12
Jeps.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester