版权声明:此文章如需转载请联系听云College团队成员阮小乙,邮箱:ruanqy#tingyun.com
无web.xml搭建web工程就是要将一般用web.xml配置的类及参数用编程的方式实现。用Annotation的方式可实现无xml化,或是减少一些xml配置。这里只是一个java web工程一般的配置,简单的可启用的web工程。给大家做个参考,大家要是有更复杂的需求可以在些基础上做添加。
工程是用maven建立的,我用的是apache-maven-3.0.5先看一眼pom.xml
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"> <modelVersion>4.0.0</modelVersion> <groupId>demo</groupId> <artifactId>demo</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>demo Maven Webapp</name> <url>http://maven.apache.org</url> <build> <finalName>demo</finalName> </build> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.2.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.2.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.2.1.RELEASE</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.2-b02</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> </dependencies> <profiles> <profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile> </profiles> </project>
工程目录结构如下:
DefaultConfigration.java 为工程起动类。
要实现org.springframework.web.
WebApplicationInitializer接口的onStartup 方法。
内容如下:
package com.demo.common; import java.util.EnumSet; import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.ContextLoaderListener; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.servlet.DispatcherServlet; public class DefaultConfigration implements WebApplicationInitializer { @Override public void onStartup(ServletContext context) throws ServletException { //以annotation的方式装来加载配置 AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); //扫描spring的配置类。 rootContext.scan("com.demo.common"); context.addListener(new ContextLoaderListener(rootContext)); //添加DispatcherServlet ServletRegistration.Dynamic dispatcher = context.addServlet("dispatcher", new DispatcherServlet(rootContext)); dispatcher.setLoadOnStartup(1); //设置servlet mapping dispatcher.addMapping("/"); // Set whether this servlet should dispatch an HTTP OPTIONS request to the #doService method. dispatcher.setInitParameter("dispatchOptionsRequest", "true"); // Set whether this servlet should dispatch an HTTP TRACE request to the #doService method. dispatcher.setInitParameter("dispatchTraceRequest", "true"); dispatcher.setAsyncSupported(true); // 设置编码 CharacterEncodingFilter encodingfilter = new CharacterEncodingFilter(); encodingfilter.setEncoding("UTF-8"); encodingfilter.setForceEncoding(true); FilterRegistration.Dynamic encodingfilterDynamic = context.addFilter("encodingfilter", encodingfilter); encodingfilterDynamic.addMappingForServletNames(EnumSet.of(DispatcherType.REQUEST), true, "dispatcher"); // 加载国际化消息 context.setInitParameter("javax.servlet.jsp.jstl.fmt.localizationContext", "message"); } }
SpringConfig.java,自己定义的类,主要用以bean的方式加载spring的配置。
内容如下:
package com.demo.common; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.core.io.ClassPathResource; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.view.InternalResourceViewResolver; //声明spring要加载类中的以@bean标注的bean @Configuration // 支持mvc @EnableWebMvc // 相当于<context:component-scan> @ComponentScan(basePackages = "com.demo") // 加载.properties配置文件 @PropertySource("classpath:sys-conf.properties") // 加载.xml如果没有使用到额外的.xml配置文件,则无需加载 @ImportResource({ "classpath:spring-config.xml" }) public class SpringConfig { @Autowired Environment env; @Bean // 设置 InternalResourceViewResolver. 为跳转页面自动加上前缀及后缀 public InternalResourceViewResolver jspViewResolver() { InternalResourceViewResolver jspViewResolver = new InternalResourceViewResolver(); // 前缀 jspViewResolver.setPrefix("/jsp/"); // 后缀 jspViewResolver.setSuffix(".jsp"); return jspViewResolver; } @Bean // 加载配置文件,加载之后,可以在 @ImportResource({ "classpath:*.xml" })导入的文中使用占位符${} public PropertyPlaceholderConfigurer placeholderConfigurer() { PropertyPlaceholderConfigurer placeholderConfigurer = new PropertyPlaceholderConfigurer(); placeholderConfigurer.setFileEncoding("UTF-8"); // 用ClassPathResource的方式加载 placeholderConfigurer.setLocations(new ClassPathResource("sys-conf.properties")); return placeholderConfigurer; } }
WebConfig.java实现
org.springframework.web.servlet.config.
annotation.WebMvcConfigurerAdapter
用来自定义一些sprngmvc关于web的配置。如需配置,可直接重写其相关的方法。
Global.java主要是用做存放全局变量。在这里只演示如何加载*.properties中的值
内容如下:
package com.demo.common; import java.util.HashMap; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; //@Component会自动导入SpringConfig.java中已经加载过的*.properties文件内容到 Environment中。 @Component public class Global { @Autowired Environment env; public static int KEY_PAGE_ROWS = 12; // 定义允许上传的文件扩展名 public static final HashMap<String, String> uploadExtMap = new HashMap<String, String>(); @PostConstruct public void init() { KEY_PAGE_ROWS = Integer.parseInt(env.getProperty("page.rows", "12")); } }
TestController.java用来做测试的Controller,内容如下:
package com.demo.controller; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class TestController { @RequestMapping(value = "/hw") public String hello(HttpServletRequest request, Model model) throws IOException { model.addAttribute("hello", "Hello World!"); return "hello"; } }
工程启动后可访问:http://localhost/demo/demo.html
http://localhost/demo/hw.do