前言开发工具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 配置web.xmlWEB-INF/web.xml?xml version1.0 encodingUTF-8? web-app xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlnshttp://java.sun.com/xml/ns/javaee xsi:schemaLocationhttp://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd idWebApp_ID version3.0 listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener context-param param-namecontextConfigLocation/param-name param-value/WEB-INF/applicationContext.xml/param-value /context-param servlet servlet-namespringmvc/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namecontextConfigLocation/param-name param-value/WEB-INF/springmvc-servlet.xml/param-value !-- param-valueclassPath:springmvc-config.xml/param-value -- /init-param load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namespringmvc/servlet-name !-- url-pattern*.do/url-pattern -- url-pattern//url-pattern /servlet-mapping /web-app1.2 配置springmvc-servlet.xmlWEB-INF/springmvc-servlet.xml?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xmlns:mvchttp://www.springframework.org/schema/mvc xsi:schemaLocation http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd /beans1.3 配置applicationContext.xmlWEB-INF/applicationContext.xml?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xmlns:txhttp://www.springframework.org/schema/tx xmlns:aophttp://www.springframework.org/schema/aop xsi:schemaLocation http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd /beans2 过滤器WEB-INF/web.xml?xml version1.0 encodingUTF-8? web-app xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlnshttp://java.sun.com/xml/ns/javaee xsi:schemaLocationhttp://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd idWebApp_ID version3.0 ... filter filter-nameencodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filter filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping /web-app3 拦截器WEB-INF/springmvc-servlet.xml?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans ... mvc:interceptors !-- 方式一直接配置一个 Bean 类型的拦截器拦截所有请求 -- bean classcom.example.interceptor.PermissionInterceptor/ !-- 方式二配置多个拦截器并指定拦截路径 -- mvc:interceptor !-- 需要拦截的路径 -- mvc:mapping path/**/ !-- 需要排除的路径不拦截 -- mvc:exclude-mapping path// mvc:exclude-mapping path/login/ !-- 拦截器类 -- bean classcom.example.interceptor.LoginInterceptor/ /mvc:interceptor !-- 方式三配置带参数的拦截器 -- mvc:interceptor mvc:mapping path/api/**/ bean classcom.example.interceptor.ApiInterceptor property nameallowedIp value127.0.0.1/ /bean /mvc:interceptor /mvc:interceptors /beans创建类PermissionInterceptorpackage com.example.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 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.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; 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.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class ApiInterceptor implements HandlerInterceptor { private String allowedIp; public void setAllowedIp(String allowedIp) { this.allowedIp allowedIp; } Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String clientIp request.getRemoteAddr(); if (!allowedIp.equals(clientIp)) { response.setStatus(400); response.getWriter().write(无法访问); 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 控制器WEB-INF/springmvc-servlet.xml?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans ... bean name/ classcom.example.controller.IndexController / bean name/login classcom.example.controller.LoginController / bean name/logout classcom.example.controller.LogoutController / /beans创建类LoginControllerpackage com.example.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class LoginController implements Controller{ Override public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception { ModelAndView v new ModelAndView(); if (username null || username.isEmpty()) { v.setViewName(/WEB-INF/jsp/Login.jsp); } else { v.addObject(msg, 登录成功); v.setViewName(/WEB-INF/jsp/Home.jsp); } return v; } }创建类IndexControllerpackage com.example.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class IndexController implements Controller{ Override public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception { ModelAndView v new ModelAndView(); v.addObject(msg, 请登录); v.setViewName(/WEB-INF/jsp/Login.jsp); return v; } }创建类LogoutControllerpackage com.example.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class LogoutController implements Controller{ Override public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception { req.getSession().invalidate(); ModelAndView v new ModelAndView(); v.addObject(msg, 登出成功); v.setViewName(/WEB-INF/jsp/Login.jsp); return v; } }创建登录页面Login.jsp% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8% !DOCTYPE html html head meta charsetUTF-8 titleInsert title here/title /head body % request.getAttribute(msg) % br/ 登录页面br/ 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 charsetUTF-8 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配置文件src/mybatis-config.xml?xml version1.0 encodingUTF-8? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd configuration mappers !-- 必须使用类路径格式 -- mapper resourcecom/example/mapper/LoginMapper.xml/ /mappers /configuration5.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 配置applicationContext.xml(1) 创建数据库连接信息src/jdbc.propertiesjdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/spring2 jdbc.usernameroot jdbc.passwordroot(2) 配置数据源WEB-INF/applicationContext.xml?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans ... context:property-placeholder locationclasspath:jdbc.properties/ bean iddataSource classcom.alibaba.druid.pool.DruidDataSource property namedriverClassName value${jdbc.driver}/ property nameurl value${jdbc.url}/ property nameusername value${jdbc.username}/ property namepassword value${jdbc.password}/ /bean /beans(3) 配置事务控制WEB-INF/applicationContext.xml?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans ... bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManager property namedataSource refdataSource/ /bean /beans(4) 配置注解驱动WEB-INF/applicationContext.xml?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans ... tx:annotation-driven transaction-managertransactionManager / /beans5.4 整合mybatisWEB-INF/applicationContext.xml?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans ... bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property namedataSource refdataSource/ property nameconfigLocation valueclasspath:mybatis-config.xml/ /bean bean idmapperScanner classorg.mybatis.spring.mapper.MapperScannerConfigurer property namebasePackage valuecom.example.mapper/ /bean /beans5.5 扫描BeanWEB-INF/applicationContext.xml?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans ... context:component-scan base-packagecom.example.service / /beans5.6 访问数据LoginControllerpackage com.example.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.context.support.FileSystemXmlApplicationContext; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import com.example.pojo.User; import com.example.service.LoginService; public class LoginController implements Controller{ Override public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception { String username req.getParameter(user); ModelAndView v new ModelAndView(); if (username null || username.isEmpty()) { v.addObject(msg, 登录失败); v.setViewName(/WEB-INF/jsp/Login.jsp); return v; } String webRoot req.getServletContext().getRealPath(/); // 获取 Web 根目录 FileSystemXmlApplicationContext ctx new FileSystemXmlApplicationContext(webRoot WEB-INF/applicationContext.xml); LoginService service (LoginService)ctx.getBean(loginService); ctx.close(); User user service.getUser(username); if (user null) { v.addObject(msg, 不存在用户); v.setViewName(/WEB-INF/jsp/Login.jsp); } else { req.getSession().setAttribute(user, username); v.addObject(msg, 登录成功); v.setViewName(/WEB-INF/jsp/Home.jsp); } return v; } }6 效果演示(1) 首页访问(2) 未输入用户名登录(3) 输入错误用户名登录(4) 输入正确用户名登录(5) 退出登录(6) 未登录访问自动退出