前言
开发工具: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 创建Servlet配置类
创建ServletContainersInitConfig.java类(用于替换web.xml)
java
package 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.xml)
java
package com.example.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringMvcConfig {
}
1.3 Spring配置类
创建SpringConfig.java(用于替换applicationContext.xml)
java
package com.example.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
}
2 过滤器
ServletContainersInitConfig.java
java
package 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(扫描support,interceptor包)
java
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.java
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.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("/"); // 参数用以来注入
}
}
创建拦截器类(PermissionInterceptor)
java
package 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;
}
}
创建拦截器类(LoginInterceptor)
java
package 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");
}
}
创建拦截器类(ApiInterceptor)
java
package 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包)
java
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 {
}
创建控制器类(LoginController)
java
package 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";
}
}
}
创建控制器类(LogoutController)
java
package 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
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>
<%
if(request.getAttribute("msg") != null){
%>
${msg}
<%
}
%>
<br/>
登录页面Spring3.2<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=UTF-8"
pageEncoding="UTF-8"%>
<!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配置类
java
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) 创建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 SpringConfig数据配置
(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) 配置数据源(JdbcConfig.java)
java
package 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.java)
java
package 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.java)
java
package 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 整合mybatis
MybatisConfig.java
java
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 SqlSessionFactoryBean sqlSessionFactory(DruidDataSource ds){
SqlSessionFactoryBean b = new SqlSessionFactoryBean();
b.setTypeAliasesPackage("com.example.pojo"); //用于自动类型转换
b.setDataSource(ds);
return b;
}
...
}
5.5 扫描Bean
java
package 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.java
java
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 {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver irvr = new InternalResourceViewResolver();
irvr.setPrefix("WEB-INF/jsp/");
irvr.setSuffix(".jsp");
return (ViewResolver)irvr;
}
}
6.2 视图控制器
SpringMvcSupport
java
package 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样式
html
<link rel="stylesheet" href="../css/style.css">
(2) 创建style.css文件(WEB-INF/css/style.css)
html
body {
color: blue;
}
(3) SpringMvcSupport.java添加静态资源配置
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
创建ServletAnnoInitConfig
java
package 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};
}
}