Spring MVC基于xml的配置 - 空白页面

时间:2017-03-12 23:22:25

标签: spring-mvc tomcat intellij-idea

我试图编写我的第一个Spring MVC应用程序,但我遇到了一个无法解决的问题。

当我在Tomcat上运行应用程序时,它会启动,但每当我请求控制器处理的url时,它都会进入控制器,但不会返回视图。

我知道网上有很多类似的问题。不幸的是,这些都没有帮助我解决我的问题。

所以我写了IntellijIdea 2016.2.3,并为该项目提供Maven支持 我的Tomcat服务器是8.5版本。

所以我有一个控制器文件,如下所示:

MyController.java

package com.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * Created by tomko_2 on 2017-03-07.
 */
@Controller
public class MyController {

        @RequestMapping("/mytest")
        public String home() {

            System.out.println("controller at work");
            return "index";
        }
}

Application.java

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by tomko_2 on 2017-03-08.
 */
@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    public Application() {
        super();
        setRegisterErrorPageFilter(false);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }


    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

}

这是我的服务器输出日志。第二行看起来很可疑,但我无法找到原因。

"C:\Program Files\Apache Software Foundation\Tomcat 8.5\bin\catalina.bat" run
[2017-03-12 10:22:49,247] Artifact spring-mvc-show:war exploded: Server is not connected. Deploy is not available.
Using CATALINA_BASE:   "C:\Users\tomko_2\.IntelliJIdea2016.2\system\tomcat\Unnamed_spring-mvc-show"
Using CATALINA_HOME:   "C:\Program Files\Apache Software Foundation\Tomcat 8.5"
Using CATALINA_TMPDIR: "C:\Program Files\Apache Software Foundation\Tomcat 8.5\temp"
Using JRE_HOME:        "C:\Program Files\Java\jdk1.8.0_73"
Using CLASSPATH:       "C:\Program Files\Apache Software Foundation\Tomcat 8.5\bin\bootstrap.jar;C:\Program Files\Apache Software Foundation\Tomcat 8.5\bin\tomcat-juli.jar"
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.5.11
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Jan 10 2017 21:02:52 UTC
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         8.5.11.0
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Windows 8.1
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            6.3
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             C:\Program Files\Java\jdk1.8.0_73\jre
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           1.8.0_73-b02
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         C:\Users\tomko_2\.IntelliJIdea2016.2\system\tomcat\Unnamed_spring-mvc-show
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         C:\Program Files\Apache Software Foundation\Tomcat 8.5
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=C:\Users\tomko_2\.IntelliJIdea2016.2\system\tomcat\Unnamed_spring-mvc-show\conf\logging.properties
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote=
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.port=1099
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.ssl=false
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.authenticate=false
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.rmi.server.hostname=127.0.0.1
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=C:\Users\tomko_2\.IntelliJIdea2016.2\system\tomcat\Unnamed_spring-mvc-show
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=C:\Program Files\Apache Software Foundation\Tomcat 8.5
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=C:\Program Files\Apache Software Foundation\Tomcat 8.5\temp
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded APR based Apache Tomcat Native library 1.2.10 using APR version 1.5.2.
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
12-Mar-2017 22:22:50.475 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
12-Mar-2017 22:22:51.507 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized (OpenSSL 1.0.2j  26 Sep 2016)
12-Mar-2017 22:22:51.725 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
12-Mar-2017 22:22:51.757 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
12-Mar-2017 22:22:51.772 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"]
12-Mar-2017 22:22:51.772 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
12-Mar-2017 22:22:51.772 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 1872 ms
12-Mar-2017 22:22:51.835 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service Catalina
12-Mar-2017 22:22:51.835 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.11
12-Mar-2017 22:22:51.851 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler [http-nio-8080]
12-Mar-2017 22:22:51.866 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler [ajp-nio-8009]
12-Mar-2017 22:22:51.866 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 92 ms
Connected to server
[2017-03-12 10:22:51,991] Artifact spring-mvc-show:war exploded: Artifact is being deployed, please wait...
12-Mar-2017 22:22:54.991 INFO [RMI TCP Connection(5)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.1.RELEASE)

2017-03-12 22:22:56.851  INFO 208 --- [on(5)-127.0.0.1] com.example.Application                  : Starting Application on komp-TN with PID 208 (started by tomko_2 in C:\Program Files\Apache Software Foundation\Tomcat 8.5\bin)
2017-03-12 22:22:56.866  INFO 208 --- [on(5)-127.0.0.1] com.example.Application                  : No active profile set, falling back to default profiles: default
2017-03-12 22:22:56.960  INFO 208 --- [on(5)-127.0.0.1] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@7de0fc9: startup date [Sun Mar 12 22:22:56 CET 2017]; root of context hierarchy
2017-03-12 22:22:58.991  INFO 208 --- [on(5)-127.0.0.1] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration' of type [org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-03-12 22:22:59.148  INFO 208 --- [on(5)-127.0.0.1] trationDelegate$BeanPostProcessorChecker : Bean 'validator' of type [org.springframework.validation.beanvalidation.LocalValidatorFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2017-03-12 22:22:59.195  INFO 208 --- [on(5)-127.0.0.1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2235 ms
2017-03-12 22:23:00.148  INFO 208 --- [on(5)-127.0.0.1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2017-03-12 22:23:00.148  INFO 208 --- [on(5)-127.0.0.1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'errorPageFilter' to: [/*]
2017-03-12 22:23:00.148  INFO 208 --- [on(5)-127.0.0.1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2017-03-12 22:23:00.148  INFO 208 --- [on(5)-127.0.0.1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2017-03-12 22:23:00.148  INFO 208 --- [on(5)-127.0.0.1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2017-03-12 22:23:00.148  INFO 208 --- [on(5)-127.0.0.1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2017-03-12 22:23:00.976  INFO 208 --- [on(5)-127.0.0.1] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@7de0fc9: startup date [Sun Mar 12 22:22:56 CET 2017]; root of context hierarchy
2017-03-12 22:23:01.148  INFO 208 --- [on(5)-127.0.0.1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/mytest]}" onto public java.lang.String com.example.controller.MyController.home()
2017-03-12 22:23:01.148  INFO 208 --- [on(5)-127.0.0.1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2017-03-12 22:23:01.148  INFO 208 --- [on(5)-127.0.0.1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2017-03-12 22:23:01.242  INFO 208 --- [on(5)-127.0.0.1] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-03-12 22:23:01.242  INFO 208 --- [on(5)-127.0.0.1] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-03-12 22:23:01.335  INFO 208 --- [on(5)-127.0.0.1] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-03-12 22:23:01.742  INFO 208 --- [on(5)-127.0.0.1] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2017-03-12 22:23:01.789  INFO 208 --- [on(5)-127.0.0.1] com.example.Application                  : Started Application in 6.251 seconds (JVM running for 12.433)
2017-03-12 22:23:01.835  INFO 208 --- [on(5)-127.0.0.1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcher': initialization started
2017-03-12 22:23:01.835  INFO 208 --- [on(5)-127.0.0.1] o.s.w.c.s.XmlWebApplicationContext       : Refreshing WebApplicationContext for namespace 'dispatcher-servlet': startup date [Sun Mar 12 22:23:01 CET 2017]; parent: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@7de0fc9
2017-03-12 22:23:01.835  INFO 208 --- [on(5)-127.0.0.1] o.s.b.f.xml.XmlBeanDefinitionReader      : Loading XML bean definitions from ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
12-Mar-2017 22:23:01.851 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\manager
12-Mar-2017 22:23:02.242 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\manager has finished in 375 ms
2017-03-12 22:23:04.070  INFO 208 --- [on(5)-127.0.0.1] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2017-03-12 22:23:04.117  INFO 208 --- [on(5)-127.0.0.1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcher': initialization completed in 2282 ms
[2017-03-12 10:23:04,132] Artifact spring-mvc-show:war exploded: Artifact is deployed successfully
[2017-03-12 10:23:04,132] Artifact spring-mvc-show:war exploded: Deploy took 12 141 milliseconds
controller at work
2017-03-12 22:27:25.668 ERROR 208 --- [nio-8080-exec-7] o.s.boot.web.support.ErrorPageFilter     : Cannot forward to error page for request [/mytest] as the response has already been committed. As a result, the response may have the wrong status code. If your application is running on WebSphere Application Server you may be able to resolve this problem by setting com.ibm.ws.webcontainer.invokeFlushAfterService to false

正如您所见,控制器正在运行(&#34;控制器正在工作&#34;在倒数第二行),但没有返回任何视图。

我的项目结构如下:

src  
----main  
--------java  
------------com.example  
----------------config  
----------------controller  
--------------------MyController.java  
----------------Application.java  
----test  
--------java  
web  
----WEB-INF  
--------pages  
------------index.jsp  
--------applicationContext.xml  
--------dispatcher-servlet.xml  
--------web.xml
----META-INF
--------context.xml
pom.xml

的web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
        </init-param>

        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

调度-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: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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="com.example"/>
    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

我没有applicationContext.xml文件,因为我只有一个servlet,而且应用程序非常简单。我只是想让它得到工作。

的index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  $END$
  </body>
</html>

/META-INF/context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/">
</Context>

编辑:
我还把我的pom.xml放在那里

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>spring-mvc-show</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>1.5.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>1.4.2.RELEASE</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
            </plugin>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
            </plugin>
        </plugins>
    </build>


    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

</project>

不幸的是,我的声誉并不允许我包含IntelliJ的一些图片,所以我要准确地描述它:

file-&gt;项目结构 - &gt; facets-&gt; web:

我有2个部署描述符:

Web Module Deployment Descriptor (path_to_project/web/WEB-INF/web.xml)

Tomcat Context Descriptor (path_to_project/web/META-INF/context.xml)

Web Resource Directory (path_to_project/web)

file-&gt;项目结构 - &gt; facets-&gt; spring:

Spring Application Context (dispatcher-servlet.xml) # here I'm not sure if it should be so, maybe I need applicationContext.xml, but as my project is really simple and based on single servlet I wanted to place all configuration in dispatcher-servlet.xml
MVC dispatcher servlet context (dispatcher-servlet.xml)
Application (Application)

运行 - >编辑配置:

我在那里注册了我的本地Tomcat服务器。 在部署选项卡中,我只有war:使用applicationContext&#34; /&#34;

爆炸

请原谅我,如果我犯了非常愚蠢的错误,但是我应对Spring MVC基本配置半个星期,而且我完全没有想法那里可能出现的问题。

0 个答案:

没有答案