我创建了一个spring应用程序( Spring版本3.2.8 )。该应用程序工作正常,但我面临的问题是,当我尝试通过URL使用控制器服务时,我收到404错误
我尝试通过浏览器网址使用的网址如下所示,我希望返回test
字符串
http://localhost/Spring3Sample/user/getPersonDetails
我的代码如下所示
调度-servlet.xml中
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/" p:suffix=".jsp" />
</beans>
的applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="com.controllers" />
</beans>
UserController.java
package com.controllers;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/user")
public class UserController {
private static final String APP_JSON = "application/json";
@RequestMapping(value = "/getPersonDetails", method = RequestMethod.GET, produces = APP_JSON)
public String getPersonDetails() {
return "test";
}
}
的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>Spring3Sample</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>1</session-timeout>
</session-config>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
</web-app>
任何人都可以告诉我一些解决方案吗
更新1
的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>Spring3Sample</display-name>
:
:
:
答案 0 :(得分:2)
您已将DispatcherServlet
的网址格式映射为
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
每当您想要请求控制器方法时,您必须将此URL模式添加到请求中。这样Spring就会找到正确的映射。
将您的请求网址更改为以下内容: -
http://localhost:8080/Spring3Sample/user/getPersonDetails.do
您希望返回测试字符串:
添加
@ResponseBody
对你控制器方法的注释。因此,Spring不会查找名为test
的JSP页面,而是将test
作为String返回。
修改强>
来自聊天中的讨论:
你也缺少<mvc:annotation-driven /> in applicationContext.xml
。
从请求网址中删除*.do
:
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
答案 1 :(得分:2)
在观察了applicationContext.xml之后,我发现你遗失了<mvc:annotation-driven/>
你的更新代码如下所示
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.controllers" />
<mvc:annotation-driven/>
</beans>
解释
<annotation-driven />
意味着您可以定义spring bean依赖项而无需在xml中指定一堆元素或实现接口或扩展基类.Means @Controller告诉spring指定的类包含的方法将处理http请求,而无需实现Controller接口或扩展实现控制器的子类。
<context:component-scan base-package="com.controllers" />
告诉spring它应该在com.controllers
下搜索所有类的类路径并查看每个类以查看它是否有@Controller,@ Repository或@Service,或者@Component,如果确实如此,那么Spring将使用bean工厂注册该类,就像在xml配置文件中定义一样
根据用户评论
我们是否需要applicationContext.xml和dispatcher-servlet.xml
实际上,Spring允许您在父子层次结构中定义多个上下文。
applicationContext.xml
定义根webapp上下文的bean意味着与webapp关联的上下文。
dispatcher-servlet.xml
为一个servlet的应用程序上下文定义bean。 webapp中可以有很多dispatcher-servlet.xml
,即servlet spring1的servlet1-servlet.xml,servlet spring2的spring2-servlet.xml
note :: spring-servlet.xml中的Bean可以引用bean applicationContext.xml,但反之亦然。
答案 2 :(得分:1)
答案 3 :(得分:1)
首先在Spring MVC手册中
@Controller注释充当注释的构造型 类,表明它的作用。调度员扫描这样的注释 映射方法的类,并检测@RequestMapping注释 (见下一节)。
所以删除这个
@RequestMapping("/user")
因为下一步没有意义
@RequestMapping("/user/getPersonDetails")
你应该注意我添加&#34; / user&#34;到网址。 你也不会返回任何jSon。首先,如果我是你,我用我在这个答案中输入的字符串改变第二个请求映射(在方法getUserDetails上)。
看起来你想念配置文件...... 在web.xml中检查此字符串
<url-pattern>*.do</url-pattern>
它只会发送带有&#34; .do&#34;的网址。在他们的最后。
答案 4 :(得分:1)
我将其添加到扩展WebMvcConfigurer
的配置类中:
@Bean
public ViewResolver viewResolver() {
final InternalResourceViewResolver bean = new InternalResourceViewResolver();
bean.setViewClass(JstlView.class);
bean.setPrefix("/WEB-INF/view/pages/");
bean.setSuffix(".jsp");
return bean;
}
您必须添加此依赖项才能使其起作用:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>