创建SpringWeb项目(Spring2.0)

前言

开发工具: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) 未登录访问(自动退出)

相关推荐
凯尔萨厮7 小时前
Spring学习笔记(基于配置文件)
spring
bobasyu7 小时前
Claude Code 源码笔记 -- queryLoop
java·笔记·spring
计算机学姐7 小时前
基于SpringBoot的高校竞赛管理系统
java·spring boot·后端·spring·信息可视化·tomcat·mybatis
砍材农夫8 小时前
spring-ai 第七模型介绍-向量模型
java·人工智能·spring
小糊涂灬8 小时前
Mybatis+mysql 一对多查询问题
mysql·mybatis
一定要AK8 小时前
MyBatis 从入门到精通
mybatis
我叫张土豆9 小时前
Spring AI 集成 MCP 服务踩坑实录:SSE 与 Streamable HTTP 协议的兼容性深度剖析
人工智能·spring·http
rrrjqy10 小时前
深入浅出 RAG:基于 Spring AI 的文档分块 (Chunking) 策略详解与实战
java·人工智能·后端·spring
967710 小时前
mybatis的作用+sql怎么写
java·开发语言·mybatis