我正在尝试访问计算机上的http://localhost:8080/EventTracker/greeting。但是,我收到404错误。我正在关注PluralSight Spring MVC4简介教程,看起来我的代码与视频中的代码相匹配。我使用两个java文件WebConfig和WebAppInitializer来配置我的应用程序。我错过了什么吗?我想我已经逐行复制但仍然没有工作。
HelloController.java
@Controller
public class HelloController {
@RequestMapping(value="/greeting")
public String sayHello(Model model) {
model.addAttribute("greeting", "Hello World");
return "hello.jsp";
}
}
WebAppInitializer.java
public class WebAppInitializer implements WebApplicationInitializer{
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
WebApplicationContext context = getContext();
servletContext.addListener(new ContextLoaderListener(context) );
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context) );
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("*.html");
}
private WebApplicationContext getContext() {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.pluralsight.WebConfig");
return context;
}
}
WebConfig.java
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.pluralsight")
public class WebConfig {
}
的hello.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>${greeting}</h1>
</body>
</html>
在太平洋标准时间9月15日下午4:25 使用http://localhost:8080/EventTracker/greeting.html时,我仍然会收到相同的错误,错误是:
16:24:41.925 [http-nio-8080-exec-3] DEBUG o.s.web.servlet.DispatcherServlet - DispatcherServlet with name 'DispatcherServlet' processing GET request for [/EventTracker/greeting.html]
16:24:41.931 [http-nio-8080-exec-3] WARN o.s.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/EventTracker/greeting.html] in DispatcherServlet with name 'DispatcherServlet'
16:24:41.931 [http-nio-8080-exec-3] DEBUG o.s.web.servlet.DispatcherServlet - Successfully completed request
答案 0 :(得分:6)
因为这是我在谷歌发现的第一个问题,这里没有正确答案,这就是帮助我的。
您应该添加 WebAppInitializer.java 下一步
context.register(com.pluralsight.WebConfig.class);
所以你的文件应该是这样的:
public class WebAppInitializer implements WebApplicationInitializer{
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
WebApplicationContext context = getContext();
servletContext.addListener(new ContextLoaderListener(context) );
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context) );
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("*.html");
}
private WebApplicationContext getContext() {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.pluralsight.WebConfig");
context.register(com.pluralsight.WebConfig.class);
return context;
}
}
答案 1 :(得分:0)
我从来没有创建过没有XML配置文件的Spring MVC应用程序。我确定这是可能的,但我必须深入研究它。如果你不介意使用XML文件进行配置,你可以做类似以下的事情(这是我前一段时间做的一个小方面项目,以便更好地熟悉Spring MVC):
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>Spring3MVC</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<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>*.html</url-pattern>
</servlet-mapping>
<!--if not using jsp, can omit this -->
<jsp-config> <!-- if taglib not inside jsp-config, will cause deployment errors -->
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/taglib/c.tld</taglib-location>
</taglib>
</jsp-config>
web.xml是配置的顶层。从上面开始,要记住的重要一点是文件的名称(它也是一个XML文件)是调度程序的servlet文件。无论你在内部标记中包含什么内容都会附加-servlet.xml,因此在这种情况下,我的调度程序servlet将是一个名为spring-servlet.xml的文件。标签告诉应用程序哪种类型的url模式与调度程序servlet相关联。所以在这个例子中,任何以.html结尾的url都将由spring-servlet.xml处理。
如果您使用的是JSP,请确保所有标记都在标记内,否则它将无法正常工作。
<强>弹簧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"
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="net.viralpatel.spring3.controller" />
<!-- declares package where controller(s) stored. Don't need to declare indvd controllers -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" /> <!-- hello.jsp must be located in this directory for link to work -->
<property name="suffix" value=".jsp" />
</bean>
这就是调度程序servlet文件的样子。您可以忽略顶部的代码。根据您发布的错误,我的猜测是您的java代码遗漏或错误地映射了您的视图解析器。视图解析器将您传递给控制器的字符串(即:hello)转换为相对URL路径(即:/WEB-INF/jsp/hello.jsp)。为了使其正常工作,请确保所有jsp文件都在同一目录中,并将该目录列为前缀值的一部分。在这个例子中,我将所有的jsp文件存储在我的WEB-INF目录中名为jsp的目录中。此示例中的后缀只是文件扩展名。任何未存储在此目录中的文件都会导致您的应用在尝试加载该丢失的文件时抛出404错误。
我知道这并不是你想要做的,但如果你选择使用XML文件,我希望这会有所帮助。如果您有任何问题,请告诉我。
答案 2 :(得分:0)
我遇到了同样的问题。 问题是我的Tomcat安装文件夹中没有“本机库”。 我用以下方法解决了这个问题:
sudo apt-get install libtcnative-1
然后我遇到了我的本机库版本太旧的问题,我通过升级解决了这个问题:
sudo apt-get upgrade libtcnative-1
我希望它会有所帮助:)
答案 3 :(得分:0)
"review_start_datetime" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss"
},
将其添加到webapp初始化器中将解决您的问题
答案 4 :(得分:-1)
您的网址http://localhost:8080/EventTracker/greeting
与您的调度程序映射不匹配:dispatcher.addMapping("*.html");
。试试http://localhost:8080/EventTracker/greeting.html