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> <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>
错误分析:
翻译:没有发现WebApplicationContext:不是在DispatcherServlet请求中,也不存在已注册的ContextLoaderListener ? (是有道翻译)
web容器在加载web.xml的时候,初始化页面是web.xml配置中的login.jsp页面,login需要引用国际化(i18n)的文件并没有被WebApplicationContext加载。
解决思路:通过SpringmMVC 的 Controller视图跳转,来加载WebApplicationContext。然而该Context存在了,会自动加载国际化文件。
总结:初始化页面是,引用了未创建WebApplicationContext中的国际化文件,是不合法的,必须先创建好了Contxt容器了,才可以引用容器的资源。
- 笔者是编程小白,初次写博客还存在许多不足之处,希望能够得到批评和指正。
调试成功后的运行结果:
- 中文国际化
- 英文国际化