创建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) 未登录访问(自动退出)

相关推荐
直奔標竿3 小时前
Java开发者AI转型第二十六课!Spring AI 个人知识库实战(五)——联网搜索增强实战
java·开发语言·人工智能·spring boot·后端·spring
xiaogg36786 小时前
spring oauth2 单点登录
java·vue.js·spring
工作log6 小时前
Spring Boot 3.5 + MyBatis Plus + RabbitMQ:打造 AI 驱动的慢 SQL 监控与优化系统
spring boot·mybatis·java-rabbitmq
河阿里6 小时前
MyBatis-Plus:MyBatis的进阶开发
数据库·mybatis
橙子圆1237 小时前
Mybatis之动态sql
sql·tomcat·mybatis
直奔標竿7 小时前
Java开发者AI转型第二十课!Spring AI MCP 双向实战:客户端与服务端手把手落地
java·开发语言·人工智能·spring boot·后端·spring
java1234_小锋8 小时前
Spring AI 2.0 开发Java Agent智能体 - 新建 HelloWorld 项目
java·人工智能·spring·spring ai
yue2004038 小时前
Spring IoC 与 DI 核心概念与原理笔记
java·笔记·spring
用户860821135658 小时前
ClassLoader体系概述
spring
Cyan_RA98 小时前
SpringMVC REST 详解
java·spring·mvc·springmvc·restful·jquery·jsp