创建SpringWeb项目(Spring3.2+)
前言开发工具Eclipse, JDK1.8引入JAR包spring-aop-4.3.6.RELEASE.jarcommons-logging-1.2.jarspring-beans-4.3.6.RELEASE.jardruid-1.2.9.jarspring-context-4.3.6.RELEASE.jarlombok-1.18.42.jarspring-core-4.3.6.RELEASE.jarmybatis-3.5.11.jarspring-expression-4.3.6.RELEASE.jarmybatis-spring-1.3.1.jarspring-jdbc-4.3.6.RELEASE.jarmysql-connector-j-8.0.32.jarspring-tx-4.3.6.RELEASE.jarspring-web-4.3.6.RELEASE.jarspring-webmvc-4.3.6.RELEASE.jar1 创建项目Eclipse File new web Dynamic Web Project 项目名1.1 创建Servlet配置类创建ServletContainersInitConfig.java类用于替换web.xmlpackage com.example.config; import javax.servlet.Filter; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer; public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { // 加载Springmvc容器 Override protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext ctx new AnnotationConfigWebApplicationContext(); ctx.register(SpringMvcConfig.class); return ctx; } // 配置拦截请求 Override protected String[] getServletMappings() { return new String[]{/}; } // 加载Spring容器 Override protected WebApplicationContext createRootApplicationContext() { AnnotationConfigWebApplicationContext ctx new AnnotationConfigWebApplicationContext(); ctx.register(SpringConfig.class); return ctx; } }1.2 SpringMvc配置类创建SpringMvcConfig.java用于替换springmvc-servlet.xmlpackage com.example.config; import org.springframework.context.annotation.Configuration; Configuration public class SpringMvcConfig { }1.3 Spring配置类创建SpringConfig.java用于替换applicationContext.xmlpackage com.example.config; import org.springframework.context.annotation.Configuration; Configuration public class SpringConfig { }2 过滤器ServletContainersInitConfig.javapackage com.example.config; import javax.servlet.Filter; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer; public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { ... // 过滤器 Override protected Filter[] getServletFilters() { CharacterEncodingFilter filter new CharacterEncodingFilter(); filter.setEncoding(UTF-8); return new Filter[] {filter}; } }3 拦截器SpringMvcConfig.java扫描supportinterceptor包package com.example.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; Configuration ComponentScan({com.example.config.support, com.example.interceptor}) public class SpringMvcConfig { }创建拦截器配置类SpringMvcSupport.javapackage com.example.config.support; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import com.example.interceptor.ApiInterceptor; import com.example.interceptor.LoginInterceptor; import com.example.interceptor.PermissionInterceptor; Configuration public class SpringMvcSupport extends WebMvcConfigurationSupport { Autowired private ApiInterceptor apiInterceptor; Autowired private LoginInterceptor loginInterceptor; Autowired private PermissionInterceptor permissionInterceptor; Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor).addPathPatterns(/); .excludePathPatterns(/,/login); //不拦截路径; registry.addInterceptor(permissionInterceptor) .addPathPatterns(/admin/**, /user/**) // 拦截路径 .excludePathPatterns(/user/login, /user/register); //不拦截路径 registry.addInterceptor(apiInterceptor).addPathPatterns(/); // 参数用以来注入 } }创建拦截器类PermissionInterceptorpackage com.example.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; Component public class PermissionInterceptor extends HandlerInterceptorAdapter { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { response.getWriter().write(PermissionInterceptor Run); return true; } }创建拦截器类LoginInterceptorpackage com.example.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; Component public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(preHandle执行了); request.setAttribute(startTime, System.currentTimeMillis()); Object user request.getSession().getAttribute(user); if (user null) { response.sendRedirect(request.getContextPath() /); return false; // 终止 } return true; // 继续 } Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println(postHandle执行了); if (modelAndView ! null) { modelAndView.addObject(globalMsg, 请求成功); } } Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(afterCompletion执行了); long startTime (Long) request.getAttribute(startTime); long endTime System.currentTimeMillis(); System.out.println(运行时间 (endTime - startTime) ms); } }创建拦截器类ApiInterceptorpackage com.example.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; Component public class ApiInterceptor implements HandlerInterceptor { Value(0:0:0:0:0:0:0:1) private String allowedIp; Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String clientIp request.getRemoteAddr(); if (!allowedIp.equals(clientIp)) { response.setStatus(403); response.getWriter().write(Forbidden: IP not allowed); return false; } return true; } Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } }4 控制器SpringMvcConfig.java扫描controller包package com.example.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.view.InternalResourceViewResolver; Configuration ComponentScan({com.example.config.support, com.example.interceptor, com.example.controller}) public class SpringMvcConfig { }创建控制器类LoginControllerpackage com.example.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.example.pojo.User; import com.example.service.LoginService; Controller public class LoginController{ Autowired private LoginService service; RequestMapping(/login) public String login(HttpServletRequest req, HttpServletResponse res) throws Exception { String username req.getParameter(user); if (username null || username.isEmpty()) { req.setAttribute(msg, 登录失败); return Login; } User user service.getUser(username); if (user null) { req.setAttribute(msg, 不存在用户); return Login; } else { req.getSession().setAttribute(user, username); req.setAttribute(msg, 登录成功); return Home; } } }创建控制器类LogoutControllerpackage com.example.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; Controller public class LogoutController { RequestMapping(/logout) public String logout(HttpServletRequest req, HttpServletResponse res) { req.getSession().invalidate(); req.setAttribute(msg, 登出成功); return Login; } }创建登录页面Login.jsp% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8% !DOCTYPE html html head meta charsetUTF-8 titleInsert title here/title /head body % if(request.getAttribute(msg) ! null){ % ${msg} % } % br/ 登录页面Spring3.2br/ form nameform1 action/login methodpost input typetext nameuser / input typepassword namepassword / button登录/button /form /body /html创建首页Home.jsp% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8% !DOCTYPE html html head meta charsetISO-8859-1 titleInsert title here/title /head body ${msg} br/ form action/logout methodpost buttonlogout/button /form /body /html5 数据访问创建表: create table user(username varchar(20) primary key, password varchar(20) not null);登录数据insert user values(zhangsan, 123456);5.1 创建Mybatis配置类package com.example.config; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.mapper.MapperScannerConfigurer; import org.springframework.context.annotation.Bean; import com.alibaba.druid.pool.DruidDataSource; public class MybatisConfig { Bean public MapperScannerConfigurer mapperScannerConfigurer(){ MapperScannerConfigurer m new MapperScannerConfigurer (); m.setBasePackage(com.example.mapper); //扫描mapper包 return m; } }5.2 配置业务代码(1) 创建Modelsrc/com/example/pojo/User.javapackage com.example.pojo; import lombok.Data; Data public class User { private String username; private String password; }(2) 创建Daosrc/com/example/mapper/LoginMapper.javapackage com.example.mapper; import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import com.example.pojo.User; Mapper public interface LoginMapper { public User selectUserById(Param(username) String username); public ListUser selectAllUsers(); public int insertUser(User user); public int updateUser(User user); public int deleteUser(Param(username) String username); }(3) 创建Mapper.xmlsrc/com/example/mapper/LoginMapper.xml?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.example.mapper.LoginMapper !-- 查询用户ById -- select idselectUserById parameterTypeString resultTypecom.example.pojo.User SELECT username, password FROM user WHERE username #{username} /select !-- 查询所有用户 -- select idselectAllUsers resultTypelist SELECT username, password FROM user ORDER BY username ASC /select !-- 插入新用户 -- insert idinsertUser parameterTypecom.example.pojo.User INSERT INTO user (username, password) VALUES (#{username}, #{password}) /insert !-- 更新用户信息 -- update idupdateUser parameterTypecom.example.pojo.User UPDATE user SET username #{username}, password #{password} WHERE username #{username} /update !-- 删除用户 -- delete iddeleteUser parameterTypelong DELETE FROM user WHERE username #{username} /delete /mapper(4) 创建Servicesrc/com/example/service/LoginServicepackage com.example.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.example.mapper.LoginMapper; import com.example.pojo.User; Service Transactional public class LoginService { Autowired private LoginMapper dao; public User getUser(String username) { return dao.selectUserById(username); } }5.3 SpringConfig数据配置(1) 创建数据库连接信息src/jdbc.propertiesjdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/spring2 jdbc.usernameroot jdbc.passwordroot(2) 配置数据源JdbcConfig.javapackage com.example.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import com.alibaba.druid.pool.DruidDataSource; public class JdbcConfig { Value(${jdbc.driver}) private String driver; Value(${jdbc.url}) private String url; Value(${jdbc.username}) private String username; Value(${jdbc.password}) private String password; Bean public DruidDataSource druidDataSource() { DruidDataSource d new DruidDataSource(); d.setDriverClassName(driver); d.setUrl(url); d.setUsername(username); d.setPassword(password); return d; } }(3) 配置事务控制JdbcConfig.javapackage com.example.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import com.alibaba.druid.pool.DruidDataSource; public class JdbcConfig { ... Bean public PlatformTransactionManager transactionManager(DruidDataSource datasource) { DataSourceTransactionManager ds new DataSourceTransactionManager(); ds.setDataSource(datasource); return ds; } }(4) 配置事务扫描SpringConfig.javapackage com.example.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.PropertySource; import org.springframework.transaction.annotation.EnableTransactionManagement; Configuration PropertySource(classpath:jdbc.properties) // 加载properties文件 Import({JdbcConfig.class}) // 导入数据源实现类 EnableTransactionManagement // 启动事务管理注解 public class SpringConfig { }5.4 整合mybatisMybatisConfig.javapackage com.example.config; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.mapper.MapperScannerConfigurer; import org.springframework.context.annotation.Bean; import com.alibaba.druid.pool.DruidDataSource; public class MybatisConfig { Bean public SqlSessionFactoryBean sqlSessionFactory(DruidDataSource ds){ SqlSessionFactoryBean b new SqlSessionFactoryBean(); b.setTypeAliasesPackage(com.example.pojo); //用于自动类型转换 b.setDataSource(ds); return b; } ... }5.5 扫描Beanpackage com.example.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.PropertySource; import org.springframework.transaction.annotation.EnableTransactionManagement; Configuration ComponentScan({com.example.service}) Import({JdbcConfig.class, MybatisConfig.class}) ... public class SpringConfig { }6 视图6.1 视图解析器SpringMvcConfig.javapackage com.example.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.view.InternalResourceViewResolver; Configuration ComponentScan({com.example.config.support, com.example.interceptor, com.example.controller}) public class SpringMvcConfig { Bean public ViewResolver viewResolver() { InternalResourceViewResolver irvr new InternalResourceViewResolver(); irvr.setPrefix(WEB-INF/jsp/); irvr.setSuffix(.jsp); return (ViewResolver)irvr; } }6.2 视图控制器SpringMvcSupportpackage com.example.config.support; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; Configuration public class SpringMvcSupport extends WebMvcConfigurationSupport { ... Override protected void addViewControllers(ViewControllerRegistry registry) { registry.addViewController(/).setViewName(Login); } }7 其它功能7.1 静态资源访问(1) Login.jsp添加css样式link relstylesheet href../css/style.css(2) 创建style.css文件WEB-INF/css/style.cssbody { color: blue; }(3) SpringMvcSupport.java添加静态资源配置package com.example.config.support; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import com.example.interceptor.ApiInterceptor; import com.example.interceptor.LoginInterceptor; import com.example.interceptor.PermissionInterceptor; Configuration public class SpringMvcSupport extends WebMvcConfigurationSupport { ... Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/css/**) // 满足条件请求不走拦截器 .addResourceLocations(/WEB-INF/css/); //走指定的资源访问 } }7.2 ServletConfig简化删除ServletContainersInitConfig创建ServletAnnoInitConfigpackage com.example.config; import javax.servlet.Filter; import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class ServletAnnoInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{ Override protected Class?[] getRootConfigClasses() { return new Class[] {SpringConfig.class}; } Override protected Class?[] getServletConfigClasses() { return new Class[] {SpringMvcConfig.class}; } Override protected String[] getServletMappings() { return new String[]{/}; } Override protected Filter[] getServletFilters() { CharacterEncodingFilter filter new CharacterEncodingFilter(); filter.setEncoding(UTF-8); return new Filter[] {filter}; } }