No WebApplicationContext found

来源:互联网 发布:淘宝保税区发货靠谱吗 编辑:程序博客网 时间:2024/06/07 00:59

No WebApplicationContext found: not in a DispatcherServlet request and no ContextLoaderListener registered?


在使maven构建SpringMVC 国际化(i18n) 项目中中出现页面显示异常,尝试查找了所有答案。一度怀疑是tomcat出了问题,但是经过测试得出tomcat是正常的,以下是项目的配置和运行异常。

jsp页面报错信息
这里写图片描述

Eclipse 的控制台报出的错误:

十二月 14, 2017 1:52:40 下午 org.springframework.web.servlet.tags.MessageTag doStartTag严重: No WebApplicationContext found: not in a DispatcherServlet request and no ContextLoaderListener registered?java.lang.IllegalStateException: No WebApplicationContext found: not in a DispatcherServlet request and no ContextLoaderListener registered?    at org.springframework.web.servlet.support.RequestContext.initContext(RequestContext.java:235)    at org.springframework.web.servlet.support.JspAwareRequestContext.initContext(JspAwareRequestContext.java:75)    at org.springframework.web.servlet.support.JspAwareRequestContext.<init>(JspAwareRequestContext.java:49)    at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:77)    at org.apache.jsp.welcome_jsp._jspx_meth_spring_005fmessage_005f0(welcome_jsp.java:167)    at org.apache.jsp.welcome_jsp._jspService(welcome_jsp.java:129)    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100)    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687)    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)    at java.lang.Thread.run(Unknown Source)十二月 14, 2017 1:52:40 下午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.service() for servlet [jsp] in context with path [/Springi18n] threw exception [java.lang.IllegalStateException: No WebApplicationContext found: not in a DispatcherServlet request and no ContextLoaderListener registered?] with root causejava.lang.IllegalStateException: No WebApplicationContext found: not in a DispatcherServlet request and no ContextLoaderListener registered?    at org.springframework.web.servlet.support.RequestContext.initContext(RequestContext.java:235)    at org.springframework.web.servlet.support.JspAwareRequestContext.initContext(JspAwareRequestContext.java:75)    at org.springframework.web.servlet.support.JspAwareRequestContext.<init>(JspAwareRequestContext.java:49)    at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:77)    at org.apache.jsp.welcome_jsp._jspx_meth_spring_005fmessage_005f0(welcome_jsp.java:167)    at org.apache.jsp.welcome_jsp._jspService(welcome_jsp.java:129)    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100)    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687)    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)    at java.lang.Thread.run(Unknown Source)

项目构建样式

这里写图片描述

1.web.xml的相关配置

web.xml

    <?xml version="1.0" encoding="UTF-8"?>    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns="http://xmlns.jcp.org/xml/ns/javaee"    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"    id="WebApp_ID" version="3.1">    <display-name>Springi18n</display-name>    <welcome-file-list>        <welcome-file>login.jsp</welcome-file><!-- web.xml加载的时候初始化到welcom.jsp页面 -->    </welcome-file-list>    <servlet-mapping>        <servlet-name>springmvc</servlet-name><!-- springMVC 映射服务名称 -->        <url-pattern>/springmvc/*</url-pattern><!-- 映射路径,协议+主机+端口+项目名+其他(具体使用的方法),http://localhost:8080/Springi18n/ -->    </servlet-mapping>    <servlet>        <servlet-name>springmvc</servlet-name><!-- springMVC 服务名称 ,注意这里的 <servlet-mapping/>和<servlet/>的<servlet-name/> 的值需要一样 -->        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 使用使用spring框架的   DispatcherServlet调度服务类 -->        <init-param>            <param-name>contextConfigLocation</param-name><!-- context配置位置  -->            <param-value>classpath:applicationContext.xml</param-value><!-- 加载类路径下的 XML文件 -->        </init-param>        <load-on-startup>1</load-on-startup> <!-- web服务加载的优先级 ,正整数数值小的优先级高  -->    </servlet>    </web-app>

这里是web.xml配置,当web.xml加载的时候初始化页面是

2.pox.xml文件的相关配置

pox.xml

<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/maven-v4_0_0.xsd">        <modelVersion>4.0.0</modelVersion>    <groupId>online.shixun.springi18n</groupId>    <artifactId>Springi18n</artifactId>    <packaging>war</packaging>    <version>0.0.1-SNAPSHOT</version>    <name>Springi18n Maven Webapp</name>    <url>http://maven.apache.org</url>    <properties>        <spring-framework.version>4.3.10.RELEASE</spring-framework.version>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    </properties>    <dependencies>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>3.8.1</version>            <scope>test</scope>        </dependency>        <!-- spring-core -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-core</artifactId>            <version>${spring-framework.version}</version>        </dependency>        <!-- spring-context -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context</artifactId>            <version>${spring-framework.version}</version>        </dependency>        <!-- spring-mvc -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-webmvc</artifactId>            <version>${spring-framework.version}</version>        </dependency>        <dependency>            <groupId>javax.servlet</groupId>            <artifactId>jstl</artifactId>            <version>1.2</version>        </dependency>        <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->        <dependency>            <groupId>javax.servlet</groupId>            <artifactId>javax.servlet-api</artifactId>            <version>3.1.0</version>        </dependency>        <dependency>            <groupId>javax.servlet.jsp</groupId>            <artifactId>javax.servlet.jsp-api</artifactId>            <version>2.3.0</version>        </dependency>        <dependency>            <groupId>javax.el</groupId>            <artifactId>javax.el-api</artifactId>            <version>3.0.0</version>        </dependency>        <dependency>            <groupId>commons-logging</groupId>            <artifactId>commons-logging</artifactId>            <version>1.2</version>        </dependency>        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->        <dependency>            <groupId>org.apache.logging.log4j</groupId>            <artifactId>log4j-core</artifactId>            <version>2.8.2</version>        </dependency>        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-api</artifactId>            <version>1.7.21</version>        </dependency>        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-log4j12</artifactId>            <version>1.7.25</version>            <scope>test</scope>        </dependency>    </dependencies>    <build>        <finalName>Springi18n</finalName>        <plugins>            <plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-war-plugin</artifactId>                <configuration>        <failOnMissingWebXml>false</failOnMissingWebXml>                </configuration>            </plugin>        </plugins>    </build></project>

3.springMVC 的applicationContext.xml文件的配置

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="            http://www.springframework.org/schema/beans             http://www.springframework.org/schema/beans/spring-beans-4.0.xsd             http://www.springframework.org/schema/mvc             http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd            http://www.springframework.org/schema/context             http://www.springframework.org/schema/context/spring-context-4.0.xsd ">    <!-- 扫描包 -->    <context:component-scan base-package="online.shixun.springi18n.controllers"></context:component-scan>    <!-- 启动注解标签,控制 -->    <mvc:annotation-driven />    <!-- 试图解析器 -->    <bean        class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <property name="suffix" value=".jsp" />        <property name="prefix" value="/" />    </bean>    <!-- messageSource bean 配置系统message的资源 -->    <bean id="messageSource"        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">        <!-- 国际化信息所在的文件名,加载messages 目录下,所有以message开头的priperties 资源文件 -->        <property name="basename" value="classpath:messages" />        <!-- 默认编码字符集 -->        <property name="defaultEncoding" value="UTF-8" />        <!-- 如果国际化资源文件中找不到对应代码的信息,则使用默认资源文件,即:message.properties -->        <property name="useCodeAsDefaultMessage" value="true" />    </bean>    <!-- 用于提取请求包含的区域语言的拦截器 -->    <mvc:interceptors>        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">            <property name="paramName" value="lang"></property>        </bean>    </mvc:interceptors></beans>

4.两个国际化资资源文件的配置(“zh”是 中文,”en” 是 英文)

messages_en_US.properties

app=shixun.onlineusername= user namepassword=passwordlogin=loginwelcome=welcome

messages_zh_CN.properties

app=\u8F7B\u5B9E\u8BADusername=\u7528\u6237\u540Dpassword=\u5BC6\u7801login=\u767B\u5F55welcome=\u6B22\u8FCE

注意:“乱码”是经过Unicode编码的,例如“\u6B22\u8FCE”的中文是“欢迎”

5.springMVC控制跳转配置

LoginController.java

package online.shixun.springi18n.controllers;import java.util.Locale;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.servlet.ModelAndView;@Controllerpublic class LoginController {    /**     * 判断springMVC是否连接成功     * @return      */    @RequestMapping(value = "login", method = RequestMethod.GET)    public ModelAndView login() {        System.out.println("222355");        return new ModelAndView("welcome");    }}

6. login.jsp和welcome.jsp页面的主要body配置

welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@taglib prefix="spring" uri="http://www.springframework.org/tags" %><!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=UTF-8"><title>欢迎</title></head><body>    <spring:message code="welcome"/>:${username }</body></html>

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@taglib prefix="spring" uri="http://www.springframework.org/tags" %><!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=UTF-8"><title>登陆</title></head><body>    <div style="text-align: center;">        <h2>            <spring:message code="app" />        </h2>        <form action="${pageContext.request.contextPath }/springmvc/welcome"            method="post">            <input name="username" style="width: 200px;" type="text"                placeholder='<spring:message code="username"/>'> <br>            <br> <input style="width: 200px;" type="text"                placeholder='<spring:message code="password"/>'> <br>            <br> <input style="width: 80px;" type="submit"                value='<spring:message code="login"/>'>        </form>        <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a            href="${pageContext.request.contextPath }/springmvc/loginPage?lang=zh_CN">中文</a>/<a            href="${pageContext.request.contextPath }/springmvc/loginPage?lang=en_US">Englist</a>    </div></body></html>

错误分析:

这里写图片描述

  1. 翻译:没有发现WebApplicationContext:不是在DispatcherServlet请求中,也不存在已注册的ContextLoaderListener ? (是有道翻译)

  2. web容器在加载web.xml的时候,初始化页面是web.xml配置中的login.jsp页面,login需要引用国际化(i18n)的文件并没有被WebApplicationContext加载。

  3. 解决思路:通过SpringmMVC 的 Controller视图跳转,来加载WebApplicationContext。然而该Context存在了,会自动加载国际化文件。

  4. 总结:初始化页面是,引用了未创建WebApplicationContext中的国际化文件,是不合法的,必须先创建好了Contxt容器了,才可以引用容器的资源。

  5. 笔者是编程小白,初次写博客还存在许多不足之处,希望能够得到批评和指正。

调试成功后的运行结果:

  1. 中文国际化
    这里写图片描述
  2. 英文国际化
    这里写图片描述
阅读全文
0 0