前言
开发工具:Eclipse, JDK:1.8
引入JAR包:
|-------------------------------------|------------------------------|
| spring-aop-4.3.6.RELEASE.jar | commons-logging-1.2.jar |
| spring-beans-4.3.6.RELEASE.jar | druid-1.2.9.jar |
| spring-context-4.3.6.RELEASE.jar | lombok-1.18.42.jar |
| spring-core-4.3.6.RELEASE.jar | mybatis-3.5.11.jar |
| spring-expression-4.3.6.RELEASE.jar | mybatis-spring-1.3.1.jar |
| spring-jdbc-4.3.6.RELEASE.jar | mysql-connector-j-8.0.32.jar |
| spring-tx-4.3.6.RELEASE.jar ||
| spring-web-4.3.6.RELEASE.jar ||
| spring-webmvc-4.3.6.RELEASE.jar ||
1 创建项目
Eclipse > File > new > web > Dynamic Web Project > 项目名


1.1 配置web.xml
WEB-INF/web.xml
XML
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-servlet.xml</param-value>
<!-- <param-value>classPath:springmvc-config.xml</param-value> -->
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- <url-pattern>*.do</url-pattern> -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
1.2 配置springmvc-servlet.xml
WEB-INF/springmvc-servlet.xml
XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://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">
</beans>
1.3 配置applicationContext.xml
WEB-INF/applicationContext.xml
XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://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">
</beans>
2 过滤器
WEB-INF/web.xml
XML
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
...
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
3 拦截器
WEB-INF/springmvc-servlet.xml
XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
...>
<mvc:interceptors>
<!-- 方式一:直接配置一个 Bean 类型的拦截器(拦截所有请求) -->
<bean class="com.example.interceptor.PermissionInterceptor"/>
<!-- 方式二:配置多个拦截器,并指定拦截路径 -->
<mvc:interceptor>
<!-- 需要拦截的路径 -->
<mvc:mapping path="/**"/>
<!-- 需要排除的路径(不拦截) -->
<mvc:exclude-mapping path="/"/>
<mvc:exclude-mapping path="/login"/>
<!-- 拦截器类 -->
<bean class="com.example.interceptor.LoginInterceptor"/>
</mvc:interceptor>
<!-- 方式三:配置带参数的拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/api/**"/>
<bean class="com.example.interceptor.ApiInterceptor">
<property name="allowedIp" value="127.0.0.1"/>
</bean>
</mvc:interceptor>
</mvc:interceptors>
</beans>
创建类PermissionInterceptor
java
package 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;
}
}
创建类LoginInterceptor
java
package 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");
}
}
创建类ApiInterceptor
java
package 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
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
...>
<bean name="/" class="com.example.controller.IndexController" />
<bean name="/login" class="com.example.controller.LoginController" />
<bean name="/logout" class="com.example.controller.LogoutController" />
</beans>
创建类LoginController
java
package 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;
}
}
创建类IndexController
java
package 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;
}
}
创建类LogoutController
java
package 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
html
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=
request.getAttribute("msg")
%>
<br/>
登录页面<br/>
<form name="form1" action="/login" method="post">
<input type="text" name="user" />
<input type="password" name="password" />
<button>登录</button>
</form>
</body>
</html>
创建首页Home.jsp
html
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
${msg}
<br/>
<form action="/logout" method="post">
<button>logout</button>
</form>
</body>
</html>
5 数据访问
创建表: 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
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<mappers>
<!-- 必须使用类路径格式,相对于 WEB-INF/classes -->
<mapper resource="com/example/mapper/LoginMapper.xml"/>
</mappers>
</configuration>
5.2 配置业务代码
(1) 创建Model(src/com/example/pojo/User.java)
java
package com.example.pojo;
import lombok.Data;
@Data
public class User {
private String username;
private String password;
}
(2) 创建Dao(src/com/example/mapper/LoginMapper.java)
java
package 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 List<User> selectAllUsers();
public int insertUser(User user);
public int updateUser(User user);
public int deleteUser(@Param("username") String username);
}
(3) 创建Mapper.xml(src/com/example/mapper/LoginMapper.xml)
XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.LoginMapper">
<!-- 查询用户ById -->
<select id="selectUserById" parameterType="String" resultType="com.example.pojo.User">
SELECT username, password
FROM user
WHERE username = #{username}
</select>
<!-- 查询所有用户 -->
<select id="selectAllUsers" resultType="list">
SELECT username, password
FROM user
ORDER BY username ASC
</select>
<!-- 插入新用户 -->
<insert id="insertUser" parameterType="com.example.pojo.User" >
INSERT INTO user (username, password)
VALUES (#{username}, #{password})
</insert>
<!-- 更新用户信息 -->
<update id="updateUser" parameterType="com.example.pojo.User">
UPDATE user
SET username = #{username},
password = #{password}
WHERE username = #{username}
</update>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="long">
DELETE FROM user WHERE username = #{username}
</delete>
</mapper>
(4) 创建Service(src/com/example/service/LoginService)
java
package 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.properties)
XML
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring2
jdbc.username=root
jdbc.password=root
(2) 配置数据源(WEB-INF/applicationContext.xml)
XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
...>
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
</beans>
(3) 配置事务控制(WEB-INF/applicationContext.xml)
XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
...>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
(4) 配置注解驱动(WEB-INF/applicationContext.xml)
XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
...>
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
5.4 整合mybatis
WEB-INF/applicationContext.xml
XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
...>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
</beans>
5.5 扫描Bean
WEB-INF/applicationContext.xml
XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
...>
<context:component-scan base-package="com.example.service" />
</beans>
5.6 访问数据
LoginController
java
package 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) 未登录访问(自动退出)
