一、SSM框架
(一)SSM为何物
- SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容),常作为数据源较简单的Web项目的框架。
(二)Spring框架
- Spring就像是整个项目中装配
Bean
的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。也可以称之为项目中的粘合剂。Spring的核心思想是IoC
(控制反转),即不再需要程序员去显式地new
一个对象,而是让Spring框架帮你来完成这一切。
(三)Spring MVC框架
Spring MVC
在项目中拦截用户请求,它的核心Servlet
即DispatcherServlet
承担中介或是前台这样的职责,将用户请求通过HandlerMapping
去匹配Controller
,Controller
就是具体对应请求所执行的操作。Spring MVC
相当于SSH
框架中Struts
。- M:模型层、V:视图层、C:控制层
- MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
- 模型-视图-控制器(MVC)是Xerox PARC在二十世纪八十年代为编程语言Smalltalk-80发明的一种软件设计模式,已被广泛使用。后来被推荐为Oracle旗下Sun公司Java EE平台的设计模式,并且受到越来越多的使用ColdFusion和PHP的开发者的欢迎。模型-视图-控制器模式是一个有用的工具箱,它有很多好处,但也有一些缺点。
(四)MyBatis框架
MyBatis
是对JDBC (Java DataBase Connectivity)
的封装,它让数据库底层操作变得透明。MyBatis
的操作都是围绕一个sqlSessionFactory
实例展开的。MyBatis
通过配置文件关联到各实体类的Mapper
文件,Mapper
文件中配置了每个类对数据库所需进行的SQL语句映射
。在每次与数据库交互时,通过sqlSessionFactory
拿到一个sqlSession
,再执行SQL
命令。页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。
二、用户登录运行效果
- 客户端有非空校验
- 登录成功,跳转到主页面
- 登录失败,再次跳转到登录页面
三、利用SSM框架实现用户登录
(一)创建数据库与表
1.创建数据库
-
执行命令:
CREATE DATABASE ssmdb CHARSET='utf8mb4';
-
查看创建的数据库
2.创建用户表
- 执行SQL命令生成用户表
t_user
CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(20) NOT NULL, `password` varchar(20) DEFAULT NULL, `telephone` varchar(11) DEFAULT NULL, `register_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, `popedom` int(11) DEFAULT NULL COMMENT '0:管理员;1:普通用户', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
3.用户表添加记录
- 执行SQL命令添加4条记录
INSERT INTO `t_user` VALUES ('1', 'admin', '12345', '15734345678', '2021-09-02 08:40:35', '0'); INSERT INTO `t_user` VALUES ('2', 'alice', '11111', '13956567889', '2021-10-20 09:51:43', '1'); INSERT INTO `t_user` VALUES ('3', 'brown', '22222', '13956678907', '2022-03-21 09:52:36', '1'); INSERT INTO `t_user` VALUES ('4', 'linda', '33333', '15890905678', '2022-05-25 09:52:56', '1');
(二)创建Maven项目
-
创建Maven项目 -
SSMLogin
-
设置项目命令、项目位置、组ID和项目ID
-
单击【Finish】按钮
(三)添加相关依赖
-
在
pom.xml
文件里添加相关依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>net.qzj.ssm</groupId> <artifactId>SSMLogin</artifactId> <version>1.0-SNAPSHOT</version> <properties> <!-- spring.version --> <spring.version>5.3.20</spring.version> </properties> <dependencies> <!--Spring核心--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <!--Spring Bean--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <!--Spring容器--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!--Spring测试--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!--Spring数据库支持--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!--数据库驱动工具包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency> <!--数据库连接池框架--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.10</version> </dependency> <!--持久层框架--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <!--提供MyBatis与Spring整合的支持--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.7</version> </dependency> <!--日志框架--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <!--Spring Web--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <!--Spring MVC--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!--JSP标准标签库--> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!--Servlet--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies> </project>
-
打开Maven窗口,单击刷新按钮,下载依赖
-
依赖下载成功
(四)创建日志属性文件
- 在
resources
目录里创建log4j.properties
文件
log4j.rootLogger=WARN, stdout, logfile log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n log4j.appender.logfile=org.apache.log4j.FileAppender log4j.appender.logfile.File=target/ssm.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
(五)创建数据库配置属性文件
-
在
resources
目录里创建jdbc.properties
jdbc.driverClassName = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/ssmdb?useSSL=false jdbc.username = root jdbc.password = 123456
-
说明:jdbc.url有时可能还需设置编码和时区,数据库密码要改成自己电脑数据库密码
(六)给项目添加Web功能
-
单击工具栏上【Project Structure】按钮
-
如果没有【Project Structure】按钮,点击File
-
查看【Modules】内容
-
单击【SSMLogin】左上角的+ ++按钮
-
单击【Create Artifact】按钮
-
将默认的
SSMLogin:Web exploded
改名为SSMLogin
-
WEB-INF
目录里classes
子目录里放的是用户编写的源程序编译之后的字节码文件,但是项目依赖的jar
包需要创建一个lib
目录
-
把右边的
Available Elements
全部选中,单击右键,弹出快捷菜单
-
单击
Put into /WEB-INF/lib
菜单项,把选中的jar
包添加到左边的/WEB-INF/lib
目录
-
单击【OK】按钮
(七)配置Tomcat服务器
1.安装Tomcat服务器
-
下载tomcat-8.5.58.rar,解压到E盘IDE目录
-
进入可执行目录
bin
-
配置Tomcat环境变量
2.启动Tomcat服务
- 在命令窗口执行:
startup.bat
,启动Tomcat服务(当然可以在资源管理器窗口里直接双击startup.bat
图标)
3.访问Tomcat主页
-
主页在
E:\IDE\tomcat-8.5.58\webapps\ROOT
目录里
-
在浏览器里访问
http://localhost:8080
(或http://localhost:8080/index.jsp
)
4.访问服务器上的静态资源
-
在
webapps
目录里创建qzj
子目录,在里面放点静态资源
-
查看本机在局域网里的IP地址
-
本地或远程都可以访问
http://10.225.92.49:8080/qzj/welcome.txt
-
本地或远程都可以访问
http://10.225.92.49:8080/qzj/bear.png
5.项目配置Tomcat服务器
- 单击工具栏上的【Add Configuration…】
(八)创建用户实体类
- 创建
net.qzj.ssm.bean
包,在包里创建User
类
package net.qzj.ssm.bean; import java.util.Date; /** * 功能:用户实体类 */ public class User { private int id; private String username; private String password; private String telephone; private Date registerTime; private int popedom; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this.telephone = telephone; } public Date getRegisterTime() { return registerTime; } public void setRegisterTime(Date registerTime) { this.registerTime = registerTime; } public int getPopedom() { return popedom; } public void setPopedom(int popedom) { this.popedom = popedom; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", telephone='" + telephone + '\'' + ", registerTime=" + registerTime + ", popedom=" + popedom + '}'; } }
(九)创建用户映射器接口
- 创建
net.qzj.ssm.mapper
包,在包里创建UserMapper
接口
package net.qzj.ssm.mapper; import net.qzj.ssm.bean.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * 功能:用户映射器接口 */ @Mapper // 交给Spring容器管理 public interface UserMapper { User login(@Param("username") String username, @Param("password") String password); }
(十)创建用户服务类
- 在
net.qzj.ssm
包里创建service
子包,然后在子包里创建UserService
类
package net.qzj.ssm.service;
import net.qzj.ssm.bean.User;
import net.qzj.ssm.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 功能:用户服务类
*/
@Service // 交给Spring容器管理
public class UserService {
@Autowired // 自动装配
private UserMapper userMapper;
public User login(String username, String password) {
return userMapper.login(username, password);
}
}
(十一)创建用户控制器
- 在
net.qzj.ssm
包里创建controller子包,然后在子包里创建UserController
类
package net.qzj.ssm.controller; import net.qzj.ssm.bean.User; import net.qzj.ssm.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import javax.servlet.http.HttpSession; /** * 功能:用户控制器 */ @Controller // 交给Spring容器管理 @RequestMapping("/user") // 总路由 public class UserController { @Autowired private UserService userService; @RequestMapping("/login") // 子路由 public String login(@RequestParam("username") String username, @RequestParam("password") String password, HttpSession session) { // 调用用户服务对象的登录方法 User user = userService.login(username, password); // 判断用户是否登录成功 if (user != null) { // 将登录用户名写入会话 session.setAttribute("username", username); // 删除会话里可能存在的登录错误提示信息 if (session.getAttribute("loginMsg") != null) { session.removeAttribute("loginMsg"); } System.out.println(user); // 判断用户角色,跳转到不同页面 if (user.getPopedom() == 0) { // 管理员 // 跳转到后台管理页面、 return "backend/management"; // 逻辑视图名 } else { // 普通用户 // 跳转到前台首页 return "frontend/index"; // 逻辑视图名 } } else { // 将登录错误信息写入会话 session.setAttribute("loginMsg", "用户名或密码错误!"); // 跳转到前台登录页面 return "frontend/login"; // 逻辑视图名 } } @RequestMapping("/logout") public String logout(HttpSession session) { // 删除会话里保存的用户名信息 session.removeAttribute("username"); // 结束会话 session.invalidate(); // 跳转到前台登录页面 return "frontend/login"; // 逻辑视图名 } }
(十二)创建用户映射器配置文件
- 在
resources
里创建mapper
子目录,然后在子目录里创建UserMapper.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="net.qzj.ssm.mapper.UserMapper"> <!--定义结果映射,因为表字段名与实体属性名不尽一致--> <resultMap id="userMap" type="net.qzj.ssm.bean.User"> <result property="id" column="id"/> <result property="username" column="username"/> <result property="password" column="password"/> <result property="telephone" column="telephone"/> <result property="registerTime" javaType="java.util.Date" column="register_time" jdbcType="TIMESTAMP"/> <result property="popedom" column="popedom"/> </resultMap> <!--定义登录映射语句--> <select id="login" resultMap="userMap"> SELECT * FROM t_user WHERE username = #{username} AND password = #{password}; </select> </mapper>
- jdbctype类型有:REAL 、VARCHAR 、BINARY 、BIT、FLOAT、CHAR 、
TIMESTAMP
、 OTHER 、UNDEFINEDTINYINT 、BLOB NVARCHAR、SMALLINT 、DOUBLE 、DECIMAL 、TIME 、NULL、CURSOR、LONGVARCHAR 、VARBINARY 、CLOB、NCHAR、INTEGER、 NUMERIC、DATE 、LONGVARBINARY 、BOOLEAN 、NCLOB、BIGINT
(十三)准备静态资源
1.准备图片资源
- 在
WEB-INF
里创建images
目录,用来存放图片资源 -bear.png
2.创建样式文件
- 在
WEB-INF
里创建css
子目录,然后在子目录里创建login.css
/* 样式 */ body { margin: 0px; text-align: center; background: #cccccc; }
3.创建脚本文件
- 在
WEB-INF
里创建js
子目录,然后在子目录里创建check.js
/** * 检验登录表单 * @returns {Boolean} */ function checkLoginForm() { // 获取用户名文本框 var username = document.getElementById("username"); // 获取密码文本框 var password = document.getElementById("password"); // 非空校验 if (username.value == "") { alert("用户名不能为空!"); // 让用户名文本框获得焦点 username.focus(); return false; } if (password.value == "") { alert("密码不能为空!"); // 让密码文本框获得焦点 password.focus(); return false; } return true; // 表明可以提交数据到服务器端 }
(十四)创建页面
1.创建目录结构
- 在
WEB-INF
里创建views
子目录,在views
里创建frontend
和backend
两个子目录
2.创建登录页面
-
在
views/frontend
里创建login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="path" value="${pageContext.request.contextPath}"/> <c:set var="basePath" value="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${path}/"/> <html> <head> <title>用户登录</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" > <base href="${basePath}"> <script src="js/check.js"></script> <link href="css/login.css" rel="stylesheet" type="text/css"/> </head> <body> <h3 style="text-align: center">用户登录</h3> <form id="frmLogin" action="user/login" method="post"> <table class="tb" border="1" cellpadding="10" style="margin: 0px auto"> <tr> <td align="center">账号</td> <td><input id="username" type="text" name="username"/></td> </tr> <tr> <td align="center">密码</td> <td><input id="password" type="password" name="password"/></td> </tr> <tr align="center"> <td colspan="2"> <input type="submit" value="登录" onclick="return checkLoginForm()"/> <input type="reset" value="重置"/> </td> </tr> </table> </form> <c:if test="${loginMsg!=null}"> <script type="text/javascript">alert("${loginMsg}")</script> <c:remove var="loginMsg"/> </c:if> </body> </html>
-
客户端请求,服务得到登录表单提交的数据,调用服务类的登录方法进行业务处理,根据业务处理结果再跳转到不同页面
3.创建网站首页
- 在
views/frontend
里创建index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="path" value="${pageContext.request.contextPath}"/> <c:set var="basePath" value="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${path}/"/> <html> <head> <title>首页</title> <base href="${basePath}"> </head> <body> <h3>欢迎访问西蒙购物网</h3> 登录用户:${username} —— <a href="user/logout">注销</a><br/> <img src="images/bear.png" width="300" height="250"> </body> </html>
4.创建后台管理页面
- 在
views/backend
里创建management.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="path" value="${pageContext.request.contextPath}"/> <c:set var="basePath" value="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${path}/"/> <html> <head> <title>后台管理</title> <base href="${basePath}"> </head> <body> <h3>西蒙购物网后台管理</h3> 管理员:${username} —— <a href="user/logout">注销</a><br/> <img src="images/bear.png" width="300" height="250"> </body> </html>
(十五)创建Spring配置文件
-
在
resources
里创建config
子目录,然后在子目录里创建spring-config.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--组件扫描--> <context:component-scan base-package="net.qzj.ssm"/> <!--读取jdbc属性文件,供创建数据源使用--> <context:property-placeholder location="classpath:jdbc.properties"/> <!--配置数据源Bean,采用阿里的Druid数据库连接池--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!--配置数据源基本属性--> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!--定义持久层框架MyBatis的SQL会话工厂--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!--配置数据源,负责操作对象--> <property name="dataSource" ref="dataSource"/> <!--配置映射器位置,负责操作方法--> <property name="mapperLocations" value="classpath:mapper/*Mapper.xml"/> </bean> <!--配置MyB映射器扫描--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--绑定SQL会话工厂--> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <!--配置映射器扫描的根包--> <property name="basePackage" value="net.qzj.ssm.mapper"/> </bean> </beans>
-
说明:本案例没有对数据库进行更新操作,因此没有引入事务管理
-
如果项目里对数据库有更新操作,那么
UserService
应该添加@Transactional
注解,而且Spring配置文件里还要添加事务管理。<!-- 事务注解驱动,标注@Transactional的类和方法将具有事务性 --> <tx:annotation-driven transaction-manager="txManager" /> <!--定义事务管理通知--> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="find*" read-only="true"/> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!--声明式事务通知器,需要在pom.xml里添加基于AspectJ的AOP支持--> <aop:config> <aop:pointcut id="mypt" expression="execution(public * net.hw.shop.service..*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="mypt"/> </aop:config>
(十六)创建Spring MVC配置文件
- 在
resources/config
目录里创建spring-mvc-config.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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!--处理对静态资源的请求--> <mvc:resources mapping="/css/**" location="/WEB-INF/css/"/> <mvc:resources mapping="/images/**" location="/WEB-INF/images/"/> <mvc:resources mapping="/js/**" location="/WEB-INF/js/"/> <!--采用注解驱动--> <mvc:annotation-driven /> <!--扫描控制器(添加了@Controller注解的类)--> <context:component-scan base-package="net.qzj.ssm.controller"/> <!--不扫描服务类(添加了@Service注解的类),留在spring-config.xml里扫描,防止事务失效--> <context:component-scan base-package="net.qzj.ssm"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/> </context:component-scan> <!--定义内部资源视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> <!--定义视图控制器(负责页面跳转)--> <mvc:view-controller path="user/login" view-name="frontend/login"/> </beans>
(十七)编辑Web部署描述文件
- 在
WEB-INF
目录里面编写web.xml
文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <display-name>simonshop</display-name> <welcome-file-list> <welcome-file>/WEB-INF/views/frontend/login.jsp</welcome-file> </welcome-file-list> <!--Spring监听器,让Spring随Web项目启动而初始化--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 指定Spring配置文件位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/spring-config.xml</param-value> </context-param> <!--配置Spring前端控制器,通过初始化参数设置读取控制器配置文件--> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/spring-mvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!--Spring MVC的派发器负责一切客户端请求--> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--设置字符编码过滤器--> <filter> <filter-name>Character Encoding</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> </filter> <filter-mapping> <filter-name>Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
(十八)启动服务器,查看效果
-
启动服务器
-
因为在
web.xml
文件里设置<welcome-file>/WEB-INF/views/frontend/login.jsp</welcome-file>
元素,所以会首先显示登录页面
-
非空校验
-
登录失败
-
输入正确的用户名与密码
-
单击【注销】链接,返回登录页面