I have spring mvc application
if in web.xml i write so:
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
I go to http://localhost:8080/Mvc/controllerPath/sayHello
I see my page
if I write
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/controllerPath/*</url-pattern>
</servlet-mapping>
I go to http://localhost:8080/Mvc/controllerPath/sayHello - I see 404
I think you understood what I want.
Can you hel me?
UPDATE
controller:
#Controller
#RequestMapping("/controllerPath")
public class MyController {
#RequestMapping("/sayHello")
public String sayHello(Model model){
model.addAttribute("name", "Vasya");
return "hello";
}
}
if I write
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/Mvc/controllerPath*</url-pattern>
</servlet-mapping>
i see 404
If you remove:
#RequestMapping("/controllerPath")
to
#RequestMapping("/")
the new servlet mapping will work.
The reason for this is that whatever you have in the servlet mapping url is stripped before spring tries to match it to a controller.
For example, in your first url mapping with just / (and assuming your web appllication is deployed to /mvc), your path of /mvc/controllerPath/sayHello spring strips the url mapping away from the url and expects to find a controller that maps to /controllerPath/sayHello
When you change the url-pattern to /controllerPath, since will strip that as well and look for a controller that answers to just /sayHello, which your controller won't since it's expecting /controllerPath/sayHello
Related
I have a Controller which is designed to accept all requests and do all the required processing. However it is not working for all requests. My Controller is such:
#RequestMapping("/*")
public class GatewayDummyController
and my web.xml configuration is:
<servlet-name>sample-apis-servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<servlet-mapping>
<servlet-name>sample-apis-servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
The name of the war is sampleApi. I am able to access urls:
localhost/8080/sampleApi
localhost/8080/sampleApi/rest
the URL that I cannot access is:
localhost/8080/sampleApi/rest/v1.
I need to access all urls after sampleApi/. Please suggest a way to do that.
Add #RequestMapping("/**") to the controller to accept all urls
After setting up the default security page with Spring security (in memory), I receive the following error:
No mapping found for HTTP request with URI [/myproject/] in DispatcherServlet with name 'appServlet'
Update:
This problem was fixed by moving the component-scan (which scans my security package) from the servlet-context.xml to root-context.xml
You error messaege tells No mapping found for HTTP request with URI [/addressbook/]. In other words, you have not mapped a request mapping for the URL /addressbook
If you want your project to have a base URL as /addressbook then change the web.xml as below
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
....
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/addressbook/*</url-pattern>
</servlet-mapping>
Controller
#Controller
public class HomeController {
#RequestMapping(value="/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
return "home";
}
}
Then goto the browser and type the below. There should be a / at end.
http://hostname:port/addressbook/
But if you want to change the context root, you cannot do this by web.xml. Context root isn't part of the standard web.xml file. You can change this by doing the following in the eclipse
In project properties click on Web Project Settings (assuming you are in a dynamic web project.) The only configuration value there is "Context root:"
Change "Context root" to /addressbook
Change the web.xml url-pattern to <url-pattern>/</url-pattern>
rebuild
remove the project from tomcat
redeploy.
Quoted from digitaljoel
I am writing spring mvc application.
In my application I have web pages as well as rest web services to handle ajax call.
I have done below entry in web.xml
<servlet>
<servlet-name>myapp</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring_myapp-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myapp</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
Should I map my rest url with same servlet like
<servlet-mapping>
<servlet-name>myapp</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
Or should I make new servlet entry for rest.
I have done required entries in pom.xml for "org.codehaus.jackson" and also I have made required entries in my spring_myapp-servlet.xml.
For html page I am using below code in my controller
#RequestMapping(value = "/htmlUrl")
public ModelAndView ModifyValiodation(HttpServletRequest request) {
// my code
}
For rest service I am using
#RequestMapping(value = "/restUrl")
public #ResponseBody Map<String, String> restUrl(HttpServletRequest request) {
// my code
}
If I am using only one servlet for two url mapping, then total 4 url will be made.
myapp/htmlUrl.html
myapp/restUrl.html
myapp/rest/htmlUrl
myapp/rest/restUrl
If I am using two different servlet with individual dispacherServlet then will i have to make entry of every component and service of spring in both the servlet.xml?
Please point out the solution for exposing rest web service.
Thanks!
use
<servlet-mapping>
<servlet-name>myapp</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
If you use two DispatcherServlet entries , it will load two ApplicationContext Objects in your application. Since you are using spring mvc to handle all the requests to your app, you should be fine with this configuration. Any request url that ends with .html or any urls that contains /rest/ will be handled by spring.
It is up to you to design the server side of the infrastructure.
Neither the RESTful specifications have any instructions for doing this nor the Servlet specifications enforce anything on this.
On the Applications design I think it is better idea to keep two different servlets to handle different URLs because over time the classes will become complex and long. These to may be used as front controllers and may have common logic class in the backend.
I am working on my Spring application and as per below code, I am mapping multiple URL's to one method. I am making one method "root" to serve all the request which starts with index and root.
#RequestMapping(value = {"/", "index*"}, method = RequestMethod.GET)
public String root(Model model) {
logger.info("Welcome to index page.");
model.addAttribute("hello", "Welcome to index page." );
return "index";
}
The above "index*" is working fine in case of "index", "index123", "index.html" and "index.txt" and request is directed to the mapped method i.e. "root" but its not working for "index.jsp". In case of "index.jsp" i am getting "HTTP Status 404" "The requested resource is not available".
Excerpt from web.xml
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Can someone let me know the reason behind this and how can I make it work?
I think this may be happening because the servlet container maps *.jsp requests to the JspServlet in order to compile and execute the jsp. If you're using Tomcat this happens in the top level web.xml in Tomcat's conf directory. This would mean that requests ending in *.jsp would be intercepted before they reached your controller. The JspServlet would attempt to load the index.jsp file based on the path in the webapp and would return a 404 when it couldn't find it.
For /index.jsp, you may do best to actually create this file in the root of the webapp so that you don't see a 404. You could add some code to it to redirect requests somewhere else (perhaps to /index.html - or to some other entry point of your application).
I'm having an issue regarding #RequestMapping on classes. Say I have these two controllers:
#Controller
#RequestMapping(value="/controller1")
public class Controller1 {
#RequestMapping(value="/method11.do")
public #ResponseBody method11(){
//...
}
#RequestMapping(value="/method12.do")
public ModelAndView method12(){
//This method redirects me to another jsp where I'll call Controller2 methods
return new ModelAndView("test");
}
}
#Controller
#RequestMapping(value="/controller2")
public class Controller2 {
#RequestMapping(value="/method21.do")
public #ResponseBody method21(){
//...
}
}
When I first call via AJAX method11, it works fine, the url generated is http://mydomain/myapp/controller1/method11.do
Then, I call method12 and get redirected to test.jsp, and from there, I call to method21, and here is the problem, the url generated is not the expected http://mydomain/myapp/controller2/method21.do, but something else, depending on how I make the AJAX call:
url:'controller2/method21' --> http://mydomain/myapp/controller1/controller2/method21.do
url:'/controller2/method21' --> http://mydomain/controller2/method21.do
So, in what way should I make the calls so that they always start at http://mydomain/myapp/...?
I believe I could just use url:'/myapp/controller2/method21.do', but I guess there should be a more generic way in which I don't have to use 'myapp' on every call.
This is my web.xml:
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
You should make the client aware of the proper URL by retrieving the context root within your script using JSP EL.
In JSP
<script>var ctx = "${pageContext.request.contextPath}"</script>
You can then use ctx as a prefix to the URLs constructed via Javascript.
var url = ctx + "/rest_of_url"
On the server side, you can use:
${pageContext.request.contextPath} or JSTL has a tag, <c:url> which will append your context root.