完整的项目案例: springmvc.zip

目录

实例

项目结构:

父级的pom配置:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>edu.nf</groupId>
<artifactId>springmvc</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>ch01</module>
<module>ch02</module>
<module>ch03</module>
<module>ch04</module>
<module>ch05</module>
<module>ch06</module>
<module>ch07</module>
<module>ch08</module>
<module>ch09</module>
<module>ch10</module>
<module>ch11</module>
</modules>
<packaging>pom</packaging> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
<!-- spring版本 -->
<spring.version>5.1.1.RELEASE</spring.version>
<servlet.version>4.0.1</servlet.version>
</properties> <dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<!-- Spring mvc依赖,会传递依赖context、core等核心包-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies> <!-- war插件 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<warSourceDirectory>web</warSourceDirectory>
<!-- 指定web.xml路径 -->
<!--<webXml>web\WEB-INF\web.xml</webXml>-->
<!-- 打包时忽略web.xml文件-->
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build> </project>

子级的pom(ch11)配置:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springmvc</artifactId>
<groupId>edu.nf</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ch11</artifactId>
<packaging>war</packaging> <dependencies>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.13.Final</version>
</dependency>
</dependencies> </project>

取代web.xml的配置类

package edu.nf.ch11.config;

import edu.nf.ch11.filter.EncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; import javax.servlet.DispatcherType;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import java.util.EnumSet; /**
* @author wangl
* @date 2018/11/6
* 取代web.xml
*/
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer { @Override
protected Class<?>[] getRootConfigClasses() {
return null;
} /**
* 指定mvc的核心配置类
* @return
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
} /**
* 等同于将DispatcherServlet的url-pattern设置为"/"
* @return
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
} /**
* 也可以在onStartup中可以添加自定义的Servlet、Listener、Filter
* 这里以添加过滤器为演示
* addMappingForUrlPatterns方法参数说明:
* 参数一: 请求过滤的类型,如果要使用默认的EnumSet.of(DispatcherType.REQUEST)(表示过滤所有的请求),则为null
* 参数二: 如果给定的过滤器映射应在其他任何声明的过滤器映射之后匹配,则为true;
* 如果在获得此FilterRegistration的ServletContext的任何已声明过滤器映射之前应该匹配,则为false
* 参数三: 过滤器映射的url
* @param servletContext
* @throws ServletException
*/
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.addFilter("encodingFilter", EncodingFilter.class)
.addMappingForUrlPatterns(null, false, "/*");
//必须调用回父类的onStartup方法,否则不会初始化DispatcherServlet
super.onStartup(servletContext);
}
}

mvc配置类,取代dispatcher-servlet.xml

package edu.nf.ch11.config;

import edu.nf.ch11.interceptors.LoginInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver; /**
* @author wangl
* @date 2018/11/6
* mvc配置类,取代dispatcher-servlet.xml
*/ /**
* 声明配置类
*/
//@Configuration
/**
* 启用包扫描
*/
@ComponentScan(basePackages = "edu.nf.ch11")
/**
* 启用mvc注解驱动
*/
@EnableWebMvc
/**
* 如果需要扩展webmvc配置,可以实现WebMvcConfigurer接口,
* 覆盖相关的default方法
*/
public class WebConfig implements WebMvcConfigurer { /**
* 配置静态资源处理方式一:使用容器的默认Servlet处理
*/
/*@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
//启用默认Servlet支持
configurer.enable();
}*/ /**
* 配置静态资源处理方式二:springmvc处理静态资源
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations("/static/");
} /**
* 添加拦截器
* addInterceptor方法指定自定义拦截器对象
* addPathPatterns方法指定哪些请求经过拦截器
* excludePathPatterns方法指定哪些请求放行
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).
addPathPatterns("/**").
excludePathPatterns("/static/login.html","/static/js/**","/userLogin");
} /**
* 配置commons-upload上传
*/
@Bean
public CommonsMultipartResolver multipartResolver(){
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
//设置限制上传大小
resolver.setMaxUploadSize(104857600);
//设置编码
resolver.setDefaultEncoding("UTF-8");
return resolver;
} /**
* 配置默认的视图解析器
*/
@Bean
public InternalResourceViewResolver viewResolver(){
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
//如果页面需要使用JSTL标签库
//viewResolver.setViewClass(JstlView.class);
return viewResolver;
}
}

BaseController:

package edu.nf.ch11.controller;

import edu.nf.ch11.controller.vo.ResponseVO;

/**
* @author wangl
* @date 2018/11/6
*/
public class BaseController { protected ResponseVO success(Object value){
ResponseVO vo = new ResponseVO();
vo.setValue(value);
return vo;
} protected ResponseVO success(){
ResponseVO vo = new ResponseVO();
return vo;
} protected ResponseVO error(int code, String message){
ResponseVO vo = new ResponseVO();
vo.setCode(code);
vo.setMessage(message);
return vo;
}
}

UserController:

package edu.nf.ch11.controller;

import edu.nf.ch11.controller.vo.ResponseVO;
import edu.nf.ch11.entity.Users;
import edu.nf.ch11.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpSession; /**
* @author wangl
* @date 2018/11/6
*/
@Controller
public class UserController extends BaseController{ @Autowired
private UserService userService; @PostMapping("/userLogin")
public @ResponseBody ResponseVO login(Users user, HttpSession session){
user = userService.getUser(user);
session.setAttribute("user", user);
return success("/static/index.html");
}
}

EncodingFilter:

package edu.nf.ch11.filter;

import org.springframework.context.annotation.ComponentScan;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException; /**
* @author wangl
* @date 2018/11/6
*/
//@WebFilter(urlPatterns = "/*")
public class EncodingFilter implements Filter { @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("字符过滤器...");
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
//请求放行
filterChain.doFilter(servletRequest, servletResponse);
} @Override
public void init(FilterConfig filterConfig) throws ServletException {
} @Override
public void destroy() {
}
}

Spring MVC 全注解配置 (十一)的更多相关文章

  1. java spring mvc 全注解

    本人苦逼学生一枚,马上就要毕业,面临找工作,实在是不想离开学校.在老师的教导下学习了spring mvc ,配置文件实在繁琐,因此网上百度学习了spring mvc 全注解方式完成spring的装配工 ...

  2. spring mvc 基于注解 配置默认 handlermapping

    spring mvc 是类似于 Struts 的框架.他们都有一个最主要的功能就是URL路由.URL路由能将请求与响应请求处理逻辑的类(在Struts中即是action,在spring mvc 中即是 ...

  3. 基于spring mvc的注解DEMO完整例子

    弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件.本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mv ...

  4. spring mvc 基于注解的使用总结

    本文转自http://blog.csdn.net/lufeng20/article/details/7598801 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Sprin ...

  5. 基于IDEA 最新Spirng3.2+hibernate4+struts2.3 全注解配置 登录

    原文 基于IDEA 最新Spirng3.2+hibernate4+struts2.3 全注解配置 登录 首先说说 IDEA 12,由于myeclipse越来越卡,我改用idea12 了,发现其功能强悍 ...

  6. Spring MVC原理及配置详解

    Spring MVC概述: Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单.这些控制 ...

  7. Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍

    Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍 spring集成 mybatis Spring4.x零配置框架搭建 两年前一直在做后 ...

  8. Spring MVC 学习 之 - 配置简单demo

    1.环境参数: Maven:3.1.1 JDK  :1.6 2.项目文件结构图: 3.各文件配置: 3.1. pom.xml <project xmlns="http://maven. ...

  9. Spring学习 6- Spring MVC (Spring MVC原理及配置详解)

    百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...

随机推荐

  1. Long类型时间如何转换成视频时长?

    数据库中存放的视频时长是一个Long类型的毫秒/秒时间,现在需要把这个时间转换成标准的视频时长格式,在我看来这应该是一个很常用的转化有一个很常用的转换方法工具才对,可是我百度找了许久,没有一个简单直观 ...

  2. Elasticsearch 学习总结 - 相关配置补充说明

    一.   Elasticsearch的基本概念 term索引词,在elasticsearch中索引词(term)是一个能够被索引的精确值.foo,Foo Foo几个单词是不相同的索引词.索引词(ter ...

  3. 如何快速使用Access实现一个登录验证界面?

    大三上学期期末总结,嗯,没错,上学期,写在新学期开始,hhhh. 上学期末的时候信管班的一个同学问我会不会Access,能不能它实现一个登录验证界面,说实话,之前对Access只是有所耳闻,随便敷衍了 ...

  4. advanced installer重新打包教程

    一.简介 本次利用Advanced Installer软件里的Repackager重封装工具进行测试制作MSI安装包,还开可以利用Advanced Installerr制作MSI安装包 原理为执行两次 ...

  5. 南大算法设计与分析课程复习笔记(2)L2 - Asymptotics

    一.几种比较复杂度的符号 数据结构有描述,相关严格数学定义也不想说了,就这么过了吧. 二.最大子数组的几种解决方法 从最复杂的暴力解法过渡到最简单的动态规划 解析和代码见这里:http://www.c ...

  6. javascript小实例,移动端页面中的拖拽

    上文说到,想将移动端的拖拽说一说,那现在趁有时间,就将这个福利文带来了,哈哈! 在我还不知道怎么做移动端的手势操作的时候,我觉得这TM实在是太难了,这是多么高深的学问啊,手势操作耶,上滑下滑左滑右滑的 ...

  7. 二叉树的Python实现

    树的定义与基本术语   树型结构是一类重要的非线性数据结构,其中以树和二叉树最为常用,是以分支关系定义的层次结构.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构:在计算机领域中也有广泛 ...

  8. ubuntu16.4系统和Gentos6.8系统查看开机自启动服务

    ubuntu16.4系统查看自启服务: 需要自行安装一个sysv-rc-conf的工具来查看: sudo apt-get install sysv-rc-conf 查看自启命令: sudo sysv- ...

  9. Codeforces Round #309 (Div. 2)

    A. Kyoya and Photobooks Kyoya Ootori is selling photobooks of the Ouran High School Host Club. He ha ...

  10. PS换脸操作

    1,使用套索工具抠出人的五官. 2,Ctrl+C复制黏贴到另一张头像中,调节透明度50%,与需要换脸的头像的眼睛,嘴巴,鼻子重合,透明度回归100%. 3,为了不该变原图,需要新建一张原图. 4,在抠 ...