I defined my Dispatcher servlet's url mapping in web.xml like this:
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
<url-pattern>/data/*</url-pattern>
</servlet-mapping>
my controller's method is annotated with:
#RequestMapping(value="/data/sys/CodeCatalogs")
when I request the url in browser I got 404 error, if I change the mapping to this:
#RequestMapping(value="/sys/CodeCatalogs")
the full url:
http://localhost:8080/cwe/data/sys/CodeCatalogs
it works, why? I am new to spring mvc, please help.
I tested url that contain no wildcard:
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
<url-pattern>/data/*</url-pattern>
url-pattern>/test/foo</url-pattern>
</servlet-mapping>
then this request mapping will works:
#RequestMapping(value="/test/foo")
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
<url-pattern>/data/*</url-pattern>
</servlet-mapping>
In the preceding example, all requests starting with /data and anything which ends with *.do will be handled by the DispatcherServlet instance named dispatcher.
So for controller's method is annotated with:
#RequestMapping(value="/data/sys/CodeCatalogs")
http://localhost:8080/cwe/data/sys/CodeCatalogs - Does not match
http://localhost:8080/cwe/data/data/sys/CodeCatalogs - Does matches
URL passes from browser will be first matched against URL pattern specified and
then the URL specified in #RequestMapping.
For controller's method is annotated with :
#RequestMapping(value="/test/foo")
http://localhost:8080/cwe/test/foo - Matches since URL matches the exact pattern which is allowed as per Servlet Specification.
http://localhost:8080/cwe/data/test/foo - This will also match because of pattern /data/*
For an incoming request of the form /data/sys/CodeCatalogs, your servlet container will consume the /data/ portion before passing the pattern to your Spring servlet. So the controller will receive /sys/CodeCatalogs and hence this is why your second #RequestMapping works and the first does not.
Related
Basically I have a servlet say: gubis.
To be precise: I need my gubis servlet be accessed as servs/gubis
The goal I want to reach is that if I made the request as localhost:8080/EclipsePro/servs/gubis the request should be redirected to localhost:8080/EclipsePro/gubis
I tried:
<servlet>
<servlet-name>servs/gubis</servlet-name>
<servlet-class>duck.reg.pack.gubis</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servs/gubis</servlet-name>
<url-pattern>/gubis</url-pattern>
</servlet-mapping>
But it didn't worked
If you need gubis servlet be accessed as servs/gubis
<servlet>
<servlet-name>gubis</servlet-name>
<servlet-class>duck.reg.pack.gubis</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gubis</servlet-name>
<url-pattern>servs/gubis</url-pattern>
</servlet-mapping>
The goal I want to reach is that if I made the request as localhost:8080/EclipsePro/servs/gubis the request should be redirected to localhost:8080/EclipsePro/gubis
You can use url-rewriting to achieve the above.
I declared below url pattern within servelet definition for handler mapping.
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Now i have some specific url with above '/' pattern (ex: /demo/), but i dont want to allow this request to get handled by dispatcher servlet (since i dont have any handler mapping in controller for this request).
Is there any similar prototype like mvc:resources ?
It would be very thankful if someone tells how to find out whether the declared resources are invoked properly or not?
I declared like this:
<mvc:resources mapping="/resources/**" location="/resources/MainTemplate/"/>
In jsp:
<link rel="stylesheet" href="/resources/css/components.css">
<script type="text/javascript" src="/resources/js/jquery-1.8.3.min.js"></script>
You can write an interceptor for the pattern you want and handle it there. Configure your interceptor as shown below for specific patterns. You can also exclude the url patterns you want from entering into the interceptor.
<mvc:interceptor>
<mapping path="/url_pattern/**"/>
<exclude-mapping path="/exclude/**"/>
..
</mvc:interceptor>
I have a several servlets and in my case I need to implement ServletRequestListener. But, I don't want the listener to react on every request in any servlet. I would like to know if there any possibility to map a specific ServletRequestListener to a specific certain servlet. My web.xml looks like:
<servlet>
<servlet-name>CommonsServlet</servlet-name>
<servlet-class>
com.promptlink.dslib.gwt.common.server.rpc.CommonsServletImpl</servlet-class>
</servlet>
...
<listener>
<listener-class>
com.promptlink.dslib.gwt.common.server.httpListeners.ServletRequestListenerImpl
</listener-class>
</listener>
That's not possible with a ServletRequestListener. A servlet request listener listens on every servlet request. Just create a Filter instead which you can simply map directly to servlet name (no, not to its URL pattern, that's maintenance unfriendly).
<filter>
<filter-name>CommonFilter</filter-name>
<filter-class>com.example.CommonFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CommonFilter</filter-name>
<servlet-name>CommonsServlet</servlet-name>
</filter-mapping>
See also:
Our servlet filters wiki page
Why do we need a servlet name?
If you only want to react on the requests of a specific servlet then the servlet itself would be the ideal place to do this.
If you don't control the servlet code you can write a Filter and give it the same URL pattern as the servlet or directly refer to the servlet in the filter mapping.
We have an existing application not using Spring MVC. We decided to keep existing features as is and add Spring MVC in for any other new features through a url like "/admin/*.
so here is the web.xml mapping:
<servlet>
<servlet-name>springRouted</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/mvc-config.xml</param-value>
</init-param>
<load-on-startup>4</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springRouted</servlet-name>
<url-pattern>/admin/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ExistingServlet</servlet-name>
<url-pattern>existing.do</url-pattern>
</servlet-mapping>
Here in the ExistingServlet, there is a call to request.getRequestDispatcher().forward("/admin/...jsp"), somehow Spring will detect this fowarding and report an error that not able to find mapping for "/admin/...jsp". It seems calling request.getRequestDispatcher().forward("/admin/...jsp") will make servlet container to recheck the web.xml and reroute through Spring's DispatchServlet. is it true? I thought this kind of internal forward won't be intercepted by Spring's DispatchServlet
A RequestDispatcher will be resolved against the mappings you have in your deployment descriptor (web.xml) or other Servlet configuration, basically all servlet mappings.
When you do
request.getRequestDispatcher("/admin/...jsp");
The Servlet container finds the Servlet (or other resource) meant to handle that path and wraps it in a RequestDispatcher object. When you then perform RequestDispatcher#forward(..) on the returned object, you are executing the service() method of the Servlet that was previously found.
In your example, that would be the DispatcherServlet. If your DispatcherServlet is configured to handle a request to /admin/...jsp, then it will do so. If not, it will throw its own custom exception, responding to the HTTP request with a 404.
Here are some more details on how getRequestDispatcher() works.
I am new to struts and as far as i know that .do extension causes the tomcat to call the action servlet and action servlet has resource process object that invokes a particular action class
But lets suppose we have a jsp page
first.jsp
<%# taglib uri="http://struts.apache.org/tags-html" prefix="s" %>
<s:form action="myform">...
when we submit this form
action-mapping in struts.config.xml is called and it picks from there as:
<action input="/first.jsp" name="actionformbean" path="/myform" scope="session"
type="actionclass"/>
whenever http://....myform.do is encountered, tell the resource process object of the action servlet to invoke actionclass
BUT how is action mapping related to servlet mapping(as url pattern .do is given in here ?)
I am confused with this .do, that how is it appended to the url :(
HELP plz
thanks !!
The standard Action Servlet mapping for Struts is defined in your web.xml, the deployment descriptor. It goes like this:
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
The servlet-name is defined earlier in the deployment descriptor:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
...
</init-param>
<load-on-startup>2</load-on-startup>
...
</servlet>
The url-pattern binds all urls ending with .do to the Action Servlet. The Action Servlet in turn delegates all calls to the responsible action.
Now, there are action mappings like the one you mention:
<action input="/first.jsp" name="actionformbean" path="/myform" scope="session"
type="actionclass"/>
Action mappings have a path that specifies their URL. The URL doesn't need a .do suffix because Struts already "knows" it was called, otherwise the action mapping itself couldn't be executed. Once the specified action is executed, it silently appends a .do suffix since only URL with those suffixes will be matched - otherwise the next request would be lost.
"Thanks for the reply, but you have written that url-pattern binds all urls ending with .do to action servlet. I am still confused is how .do will be appended to the url"
The .do is automatically appended by default by the Struts Frame work(Hope it's been done by ActionServlet itself). If you wish to change the extension(say .abc), then you should modify the action value accordingly (as action="actionsomthing.abcd").
Corrections are appreciated