创建SpringWeb项目(Spring3.2+)

前言

开发工具: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};
	}
}
相关推荐
Flittly4 小时前
【SpringAIAlibaba新手村系列】(16)调用百度 MCP 服务
java·笔记·spring·ai·springboot
希望永不加班5 小时前
SpringBoot 事件机制:ApplicationEvent 与监听器
java·开发语言·spring boot·后端·spring
gelald6 小时前
SpringBoot - 配置加载
spring boot·后端·spring
Java面试题总结6 小时前
2026年Java面试题最新整理,附白话答案
java·开发语言·jvm·笔记·spring·intellij-idea
计算机学姐8 小时前
基于SpringBoot的房屋交易系统
java·vue.js·spring boot·后端·spring·intellij-idea·mybatis
java1234_小锋8 小时前
SpringBoot 4 + Spring Security 7 + Vue3 前后端分离项目设计最佳实践
spring boot·后端·spring
今夕资源网8 小时前
indextts API 阅读 API 重磅升级!低延迟 + 音色管理 + 缓存全拉满 支持开源阅读小说软件,其他软件应该也通用
java·后端·spring
我登哥MVP8 小时前
【Spring6笔记】 - 12 - 代理模式
java·spring boot·笔记·spring·代理模式·aop
Rick19938 小时前
Spring Cloud 原理是什么?
后端·spring·spring cloud