一、简单说明
本篇springMVC的配置涉及到springMVC配置、sitemesh配置、log4j2的配置
二、相关库文件
根据myeclipse中创建gradle web项目建立完成后(建议使用idea进行,本系列也已用idea进行分析),在build.gradle中添加下面库文件
apply plugin: 'java'
apply plugin: 'war'
sourceCompatibility = 1.5
version = '1.0'
jar {
manifest {
attributes 'Implementation-Title': 'Gradle Quickstart',
'Implementation-Version': version
}
}
repositories {
jcenter()
mavenCentral()
}
dependencies {
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
testCompile group: 'junit', name: 'junit', version: '4.+'
//servlet
providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0' //在配置apply plugin: 'war'才可用
runtime("jstl:jstl:1.2")
//spring
def springVersion = "4.3.2.RELEASE";
compile "org.springframework:spring-context:$springVersion"
compile "org.springframework:spring-core:$springVersion"
compile "org.springframework:spring-webmvc:$springVersion"
//sitemesh
compile "org.sitemesh:sitemesh:3.0.0"
//log4j2
def log4j_version = "2.2";
compile "org.apache.logging.log4j:log4j-api:$log4j_version"
compile "org.apache.logging.log4j:log4j-core:$log4j_version"
compile "org.apache.logging.log4j:log4j-slf4j-impl:$log4j_version"
}
test {
systemProperties 'property': 'value'
}
uploadArchives {
repositories {
flatDir {
dirs 'repos'
}
}
}
三、web.xml
虽然spring从3.1版本后可以采用java配置的方式配置springMVC(具体可参见《spring实战第四版》)。但本文还是采用传统的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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>SpringMango</display-name>
<!--==================== LISTENER Spring容器====================-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 防止内存泄漏 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<!--==================== SERVLET Spring MVC====================-->
<servlet>
<servlet-name>Mango</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Mango</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--START 设置字符编码过滤器-->
<filter>
<description>字符集过滤器</description>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<description>字符集编码</description>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--END 设置字符编码过滤器-->
<!--sitemesh装饰器-->
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>
org.sitemesh.config.ConfigurableSiteMeshFilter
</filter-class>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
DispatcherServlet配置文件采用默认从/WEB-INF/下Mango-servlet.xml加载的方式,也可以通过contextConfigLocation指定xml文件路径:
<servlet>
<servlet-name>Mango</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:Mango-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
四、servlet配置文件:Mango-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">
<!-- 扫描web包,应用Spring的注解 -->
<mvc:annotation-driven/>
<context:component-scan base-package="com.mango.jtt.controller"/>
<!-- jsp视图 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 静态资源不走controller -->
<mvc:resources mapping="/resources/**" location="/resources/" />
<!-- or <mvc:default-servlet-handler/> 与上面mvc:resources标签选其一即可,这里如果配置,必须配置<mvc:annotation-driven/>其他controller才可正常工作-->
</beans>
通过<mvc:annotation-driven/>启用springMVC的注解配置,该标签注册了多个特性:包括JSR-303校验支持,信息转换以及对域格式化的支持。
<context:component-scan/>标签时查找对应支持的注解类并注册到容器中的bean
<mvc:resources/>标签配置静态资源文件不需要走控制器,直接映射到mapping下,该标签3.0.4及以后才有
五、controller
/**
*
*/
package com.mango.jtt.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author HHL
*
* @date 2016年11月22日
*/
@Controller
public class PageController {
/**
* 首页 映射/和/index路径
*
* @return
* @throws Exception
*/
@RequestMapping({ "/", "/index" })
public String index() throws Exception {
return "index";
}
}
六、index.jsp
采用了sitemesh装饰器
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%>
<%@ include file="../includes/taglibs.jsp"%>
<!DOCTYPE html>
<html>
<head>
<title>Mango-Index</title>
<meta name="menu" content="home" />
</head>
<body>
<h1>欢迎光临!</h1>
<div style="text-align:center"><img src="<c:url value='/resources/images/team.jpg'/>" /></div>
</body>
</html>
装饰器sitemesh3.xml
<?xml version="1.0" encoding="UTF-8"?>
<sitemesh>
<mapping path="/" decorator="/WEB-INF/views/decorators/default.jsp" />
<mapping path="/index" decorator="/WEB-INF/views/decorators/default.jsp" />
</sitemesh>
default.jsp
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%>
<%@ include file="../includes/taglibs.jsp"%>
<!doctype html>
<html>
<head>
<title><sitemesh:write property='title' /></title>
<meta http-equiv="Content-Type" content="text/html; charset=GBK"/>
<link rel="stylesheet" type="text/css" href="<c:url value='/resources/css/style.css'/>" />
<sitemesh:write property='head' />
<script type="text/javascript" src="<c:url value='/resources/js/jquery.js'/>"></script>
</head>
<div id="page">
<div id="header">
<jsp:include page="../includes/header.jsp"/>
</div>
<div id="content">
<ul id="tabmenu">
<li><a href="<c:url value='/'/>" class="current">首页</a></li>
</ul>
<div id="tabcontent">
<sitemesh:write property='body'></sitemesh:write>
</div>
</div>
<div id="footer">
<jsp:include page="../includes/footer.jsp"/>
</div>
</div>
</body>
</html>
顺带着提下log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss.SSS} [%t] %-5level %l %msg%n"/>
</Console>
<RollingFile name="test_logger" filename="${sys:catalina.home}/logs/test_logger.log"
filepattern="${sys:catalina.home}/logs/test_logger.%d{yyyy-MM-dd-HH}.log">
<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss.SSS} %5p [%t] %c(%F:%L) - %msg%n" />
<Policies>
<!-- 文件大小配置 -->
<SizeBasedTriggeringPolicy size="100 KB"/>
</Policies>
<!-- 共存log文件数量 -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
<!-- springMVC log配置 -->
<Logger name="org.springframework.web" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<!-- log文件配置 -->
<Logger name="test_logger" level="info" additivity="true">
<AppenderRef ref="test_logger"/>
</Logger>
</Loggers>
</Configuration>
七、异常处理(具体可参见《spring实战第四版》)
这里配置全局异常处理APPWideExceptionHandler.java
/**
*
*/
package com.mango.jtt.controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
* 全局异常处理器
*
* @author HHL
*
* @date 2016年11月23日
*/
@ControllerAdvice
public class APPWideExceptionHandler {
@ExceptionHandler(Exception.class)
public String exceptionHandler(){
return "errorPage/404";
}
}
404.jsp
<h2>Sorry, that page doesn't exist!</h2>
八、运行效果如下:
九、完整代码下载:
https://github.com/honghailiang/SpringMango
十、springMVC框架图