spring mvc4 html访问,SpringMVC4零配置--web.xml(示例代码)

servlet3.0+规范后,允许servlet,filter,listener不必声明在web.xml中,而是以硬编码的方式存在,实现容器的零配置。

ServletContainerInitializer:启动容器时负责加载相关配置

Java代码  89f2545c50a658806543363dc04dae58.png

package javax.servlet;

import java.util.Set;

public interface ServletContainerInitializer {

public void onStartup(Set> c, ServletContext ctx)

throws ServletException;

}

容器启动时会自动扫描当前服务中ServletContainerInitializer的实现类,并调用其onStartup方法,其参数Set> c,可通过在实现类上声明注解javax.servlet.annotation.HandlesTypes(xxx.class)注解自动注入,@HandlesTypes会自动扫描项目中所有的xxx.class的实现类,并将其全部注入Set。

Spring为其提供了一个实现类:

SpringServletContainerInitializer

Java代码  89f2545c50a658806543363dc04dae58.png

package org.springframework.web;

import java.lang.reflect.Modifier;

import java.util.LinkedList;

import java.util.List;

import java.util.ServiceLoader;

import java.util.Set;

import javax.servlet.ServletContainerInitializer;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.annotation.HandlesTypes;

import org.springframework.core.annotation.AnnotationAwareOrderComparator;

@HandlesTypes(WebApplicationInitializer.class)

public class SpringServletContainerInitializer implements ServletContainerInitializer {

@Override

public void onStartup(Set> webAppInitializerClasses, ServletContext servletContext)

throws ServletException {

List initializers = new LinkedList();

if (webAppInitializerClasses != null) {

for (Class> waiClass : webAppInitializerClasses) {

// Be defensive: Some servlet containers provide us with invalid classes,

// no matter what @HandlesTypes says...

if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&

WebApplicationInitializer.class.isAssignableFrom(waiClass)) {

try {

initializers.add((WebApplicationInitializer) waiClass.newInstance());

}

catch (Throwable ex) {

throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);

}

}

}

}

if (initializers.isEmpty()) {

servletContext.log("No Spring WebApplicationInitializer types detected on classpath");

return;

}

AnnotationAwareOrderComparator.sort(initializers);

servletContext.log("Spring WebApplicationInitializers detected on classpath: " + initializers);

for (WebApplicationInitializer initializer : initializers) {

initializer.onStartup(servletContext);

}

}

}

从中可以看出,WebApplicationInitializer才是我们需要关心的接口,我们只需要将相应的servlet,filter,listener等硬编码到该接口的实现类中即可。比如:

xml配置:

Xml代码  89f2545c50a658806543363dc04dae58.png

log4jConfigLocation

classpath:config/properties/log4j.properties

org.springframework.web.util.Log4jConfigListener

hibernateFilter

org.springframework.orm.hibernate4.support.OpenSessionInViewFilter

hibernateFilter

/*

demoServlet

web.function.servlet.DemoServlet

2

demoServlet

/demo_servlet

编码配置:

Java代码  89f2545c50a658806543363dc04dae58.png

@Order(1)

public class CommonInitializer implements WebApplicationInitializer{

@Override

public void onStartup(ServletContext servletContext)

throws ServletException {

//Log4jConfigListener

servletContext.setInitParameter("log4jConfigLocation", "classpath:config/properties/log4j.properties");

servletContext.addListener(Log4jConfigListener.class);

//OpenSessionInViewFilter

OpenSessionInViewFilter hibernateSessionInViewFilter = new OpenSessionInViewFilter();

FilterRegistration.Dynamic filterRegistration = servletContext.addFilter(

"hibernateFilter", hibernateSessionInViewFilter);

filterRegistration.addMappingForUrlPatterns(

EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE), false, "/");

//DemoServlet

DemoServlet demoServlet = new DemoServlet();

ServletRegistration.Dynamic dynamic = servletContext.addServlet(

"demoServlet", demoServlet);

dynamic.setLoadOnStartup(2);

dynamic.addMapping("/demo_servlet");

}

}

Spring为我们提供了一些WebApplicationInitializer的抽象类,我们只需要继承并按需修改即可,比如:

1)org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer : SpringSecurity相关配置

xml配置:

Xml代码  89f2545c50a658806543363dc04dae58.png

org.springframework.security.web.session.HttpSessionEventPublisher

springSecurityFilterChain

org.springframework.web.filter.DelegatingFilterProxy

springSecurityFilterChain

/*

编码配置:

Java代码  89f2545c50a658806543363dc04dae58.png

@Order(2)

public class WebAppSecurityInitializer  extends AbstractSecurityWebApplicationInitializer

{

//servletContext.addListener("org.springframework.security.web.session.HttpSessionEventPublisher");

//session监听器

@Override

protected boolean enableHttpSessionEventPublisher() {

return true;

}

}

2)org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer:MVC相关配置,比如加载spring配置文件,声明DispatcherServlet等等,参看下面的对比:

xml配置:

Xml代码  89f2545c50a658806543363dc04dae58.png

contextConfigLocation

classpath:config/context/applicationContext-AppConfig.xml,

classpath:config/context/applicationContext-SpringSecurityConfig.xml

org.springframework.web.context.ContextLoaderListener

Set Character Encoding

org.springframework.web.filter.CharacterEncodingFilter

encoding

UTF-8

forceEncoding

true

Set Character Encoding

/*

webmvc

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:config/context/applicationContext-MvcConfig.xml

1

webmvc

/

编码方式:

Java代码  89f2545c50a658806543363dc04dae58.png

@Order(3)

//spring DispatcherServlet的配置,其它servlet和监听器等需要额外声明,用@Order注解设定启动顺序

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

/*

* DispatcherServlet的映射路径

*/

@Override

protected String[] getServletMappings() {

return new String[]{"/"};

}

/*

* 应用上下文,除web部分

*/

@SuppressWarnings({ "unchecked", "rawtypes" })

@Override

protected Class[] getRootConfigClasses() {

//加载配置文件类,这里与上面的xml配置是对应的,需要使用@Configuration注解进行标注,稍后介绍

return new Class[] {AppConfig.class, SpringSecurityConfig.class};

}

/*

* web上下文

*/

@SuppressWarnings({ "unchecked", "rawtypes" })

@Override

protected Class[] getServletConfigClasses() {

return new Class[] {MvcConfig.class};

}

/*

* 注册过滤器,映射路径与DispatcherServlet一致,路径不一致的过滤器需要注册到另外的WebApplicationInitializer中

*/

@Override

protected Filter[] getServletFilters() {

CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();

characterEncodingFilter.setEncoding("UTF-8");

characterEncodingFilter.setForceEncoding(true);

return new Filter[] {characterEncodingFilter};

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值