java - spring mvc forward to jsp -
i have web.xml configured catch 404s , send them spring controller perform search given original url request.
the functionality there far catch , search go, trouble begins arise when try return view.
<bean class="org.springframework.web.servlet.view.contentnegotiatingviewresolver" p:order="1"> <property name="mediatypes"> <map> <entry key="json" value="application/json" /> <entry key="jsp" value="text/html" /> </map> </property> <property name="defaultcontenttype" value="application/json" /> <property name="favorpathextension" value="true" /> <property name="viewresolvers"> <list> <bean class="org.springframework.web.servlet.view.beannameviewresolver" /> <bean id="viewresolver" class="org.springframework.web.servlet.view.internalresourceviewresolver"> <property name="prefix" value="/web-inf/jsp/" /> <property name="suffix" value="" /> </bean> </list> </property> <property name="defaultviews"> <list> <bean class="org.springframework.web.servlet.view.json.mappingjacksonjsonview" /> </list> </property> <property name="ignoreacceptheader" value="true" /> </bean>
this snippet mvc config file.
the problem lies in resolving view's path /web-inf/jsp/
directory. using logger in jboss setup, can see when test search controller going non-existent page, following occurs:
server can't find request
request sent 404 error page (in case search controller)
search controller performs search
search controller returns view name (for illustration, we'll assume
test.jsp
returned)based off of server logger, can see
org.springframework.web.servlet.view.jstlview
initialized once search controller returns view name (so can assume being picked correctlyinternalresourceviewresolver
)server attempts return content browser resulting in 404!
a couple things confuse me this:
i'm not 100% sure why isn't resolving when
test.jsp
exists under/web-inf/jsp/
directory.even if there other problem, why result in 404? shouldn't 404 error page results in 404 theoretically create infinite loop?
thanks or pointers!
controller class [incomplete]:
@controller public class sitemapcontroller { //-------------------------------------------------------------------------------------- @autowired(required=true) private searchservice search; @autowired(required=true) private catalogservice catalog; //-------------------------------------------------------------------------------------- @requestmapping(value = "/sitemap", method = requestmethod.get) public string sitemap (httpservletrequest request, httpservletresponse response) { string forwardpath = ""; try { long starttime = system.nanotime() / 1000000; string pathquery = (string) request.getattribute("javax.servlet.error.request_uri"); scanner pathscanner = new scanner(pathquery).usedelimiter("\\/"); string context = pathscanner.next(); list<productlightdto> results = new arraylist<productlightdto>(); stringbuilder query = new stringbuilder(); string currentvalue; while (pathscanner.hasnext()) { currentvalue = pathscanner.next().tolowercase(); system.out.println(currentvalue); if (query.length() > 0) query.append(" , "); if (currentvalue.contains("-")) { query.append("\""); query.append(currentvalue.replace("-", " ")); query.append("\""); } else { query.append(currentvalue + "*"); } } //results.addall(this.dosearch(query.tostring())); system.out.println("request: " + pathquery); system.out.println("built query:" + query.tostring()); //system.out.println("result size: " + results.size()); long totaltime = (system.nanotime() / 1000000) - starttime; system.out.println("total ttp: " + totaltime + "ms"); if (results == null || results.size() == 0) { forwardpath = "home.jsp"; } else if (results.size() == 1) { forwardpath = "product.jsp"; } else { forwardpath = "category.jsp"; } } catch (exception ex) { system.err.println(ex); } system.out.println("returning view: " + forwardpath); return forwardpath; } }
1 . i'm not 100% sure why isn't resolving when test.jsp exists under /web-inf/jsp/ directory.
this because did configure view resolver suffix = ""
file must named test
(no extension).
2 . if there other problem, why result in 404? shouldn't 404 error page results in 404 theoretically create infinite loop?
i'm pretty sure this's result of protection against infinite redirect loop in spring mvc.
note: in controllers, spring expect view name result test
not test.jsp
(or better, use modelandview
)
Comments
Post a Comment