No WebApplicationContext found

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 cause
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)

项目构建样式

这里写图片描述

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.online

username= user name

password=password

login=login

welcome=welcome

messages_zh_CN.properties

app=\u8F7B\u5B9E\u8BAD

username=\u7528\u6237\u540D

password=\u5BC6\u7801

login=\u767B\u5F55

welcome=\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;

@Controller
public 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. 英文国际化
    这里写图片描述
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值