更新时间:2021-09-28 11:57:54 来源:动力节点 浏览1117次
步骤一:新建动态web项目
步骤二:导入jar包
步骤三:添加配置文件
后台搭建是比较基础的部分,就不详细介绍了。
前端部分我们现在不可能一次性全部做完,我们遵从模块开发的原则,一个模块一个模块的来,现在我们先来搭建基础的前端结构,在WebContent目录下新建js,css,jsp,img:
img
首先把所有要用的图片放到img目录下。关于本项目需要用的图片在这里:
login.jsp
首先实现的第一个页面当然是用户登录了。在jsp目录下新建login.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<!-- <html lang="en">向搜索引擎表示该页面是html语言,并且语言为英文网站
其"lang"的意思就是“language”,语言的意思,而“en”即表示“english”-->
<head lang="en">
<meta charset="utf-8">
<title>系统登录-超市账单管理系统</title>
<!-- 这里待引入css-->
<link rel="stylesheet" href="css/login.css" />
</head>
<body class="login_bg">
<!-- <section> 标签定义文档中的节(section、区段)。比如章节、页眉、页脚或文档中的其他部分。 -->
<section class="loginBox">
<header class="loginHeader">
<h1>超市账单管理系统</h1>
</header>
<section class="loginCont">
<!-- action表示表单提交的对象,login是到时候处理登录表单的controller的映射路径-->
<form class="loginForm" action="../user/login">
<div class="inputbox">
<!-- <label> 标签为 input 元素定义标注(标记)。
label 元素不会向用户呈现任何特殊效果。
不过,它为鼠标用户改进了可用性。
如果您在 label 元素内点击文本,就会触发此控件。
就是说,当用户选择该标签时,浏览器就会自动将焦点转到和标签相 关的表单控件上。
<label> 标签的 for 属性应当与相关元素的 id 属性相同。 -->
<label for="user">账号:</label> <input id="user" type="text"
name="username" placeholder="请输入账号" required />
</div>
<div class="inputbox">
<label for="mima">密码:</label> <input id="mima" type="text"
name="password" placeholder="请输入密码" required />
</div>
<div class="subBtn">
<input type="submit" value="登录" /> <input type="reset" value="重置" />
</div>
</form>
</section>
</section>
</body>
</html>
login.css
* {
/* 外边距 */
margin: 0;
/* 内边距 */
padding: 0;
}
/* login页面 */
/* 页面背景 */
.login_bg {
/* 位置:(0,0),允许左右重复 */
background: url("../img/loginBg.jpg") 0 0 repeat-x;
}
/* 登录页面主体 */
.loginBox {
width: 1000px;
/* 上下外边距为0,左右外边距默认 */
margin: 0 auto;
background: url("../img/login_bg.jpg") 0 0 no-repeat;
}
/* 登录页面标题 */
.loginHeader {
/* 四个边的内页边距 */
padding: 102px;
/* 居中 */
text-align: center;
/* 底边页边距 */
padding-bottom: 30px;
}
/* 标题字体颜色为白色,阴影为黑色 */
.loginHeader h1 {
color: #fff;
text-shadow: 2px 2px #000;
}
/* 登录框部分 */
.loginCont {
width: 388px;
height: 284px;
/* border: 1px solid red; */
margin: 0 auto;
}
/* .formBox {
position: relative;
} */
/*输入框里默认输入字体*/
::-webkit-input-placeholder {
color: rgb(190, 188, 188);
/*font-style: italic;*/
}
input:-moz-placeholder, textarea:-moz-placeholder {
color: rgb(190, 188, 188);
font-style: italic;
}
input {
outline: none;
}
/* 登录表单 */
.loginForm {
background: url("../img/formBg.png") 0 0 no-repeat;
width: 320px;
height: 140px;
border-radius: 8px;
padding: 90px 38px 48px 30px;
/* border: 1px solid green; */
}
.loginForm label {
width: 20%;
display: inline-block;
}
/* div输入框 */
.inputbox {
height: 60px;
}
/* 输入框 */
.inputbox input {
/* 占div66% */
width: 66%;
padding: 10px 5px 10px 20px;
/* 线条,rgb是颜色 */
border: 1px soild rgb(178, 178, 178);
/* 线条圆角 */
border-radius: 3px;
/* -webkit 是在Chrome浏览器中用的 一般是指 浏览器是webkit核心 */
/* 水平阴影位置x0,y1,模糊距离4px,阴影尺寸0px,颜色,内部阴影 */
-webkit-box-shadow: 0px 1px 4px 0px rgba(168, 168, 168, 0.6) inset;
/* 火狐 */
-moz-box-shadow: 0px 1px 4px 0px rgba(168, 168, 168, 0.6) inset;
box-shadow: 0px 1px 4px 0px rgba(168, 168, 168, 0.6) inset;
}
/*输入框得到焦点的效果*/
.inputbox input:active, .inputbox input:focus {
border: 1px solid rgba(91, 90, 90, 0.7);
background: rgba(238, 236, 240, 0.2);
-webkit-box-shadow: 0px 1px 4px 0px rgba(168, 168, 168, 0.9) inset;
-moz-box-shadow: 0px 1px 4px 0px rgba(168, 168, 168, 0.9) inset;
box-shadow: 0px 1px 4px 0px rgba(168, 168, 168, 0.9) inset;
}
/* 提交按钮 */
.subBtn {
margin-left: 70px;
}
/*/!*登录页登录和重置按钮*!/.providerView a是供应商管理页面下信息查看也得返回按钮的样式*/
input[type='submit'], input[type='reset'] {
width: 30%;
/* cursor属性设置光标类型 */
cursor: pointer;
background: #54a4d7;
padding: 6px 18px;
font-family: 'BebasNeueRegular', 'Arial Narrow', Arial, sans-serif;
color: #fff;
font-size: 18px;
border: 1px solid #4682be;
margin-bottom: 10px;
margin-right: 22px;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5);
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
-webkit-box-shadow: 0px 1px 4px 4px rgba(0, 0, 0, 0.07) inset, 0px 0px
0px 3px rgb(254, 254, 254), 0px 5px 3px 3px rgb(210, 210, 210);
-moz-box-shadow: 0px 1px 4px 4px rgba(0, 0, 0, 0.07) inset, 0px 0px 0px
3px rgb(254, 254, 254), 0px 5px 3px 3px rgb(210, 210, 210);
box-shadow: 0px 1px 4px 4px rgba(0, 0, 0, 0.07) inset, 0px 0px 0px 3px
rgb(254, 254, 254), 0px 5px 3px 3px rgb(210, 210, 210);
}
/* 鼠标悬停颜色 */
input[type='submit']:hover, input[type='reset']:hover {
background: rgb(74, 179, 198);
}
/* 鼠标点击释放瞬间 */
input[type='submit']:active, input[type='submit']:focus, input[type='reset']:active,
input[type='reset']:focus {
background: #2a5989;
border: 1px solid rgb(12, 76, 87);
-webkit-box-shadow: 0px 1px 6px 4px rgba(0, 0, 0, 0.2) inset;
-moz-box-shadow: 0px 1px 6px 4px rgba(0, 0, 0, 0.2) inset;
box-shadow: 0px 1px 6px 4px rgba(0, 0, 0, 0.2) inset;
}
为了完善第一个功能——用户的增删改查,我们需要到数据库中建一张User表,这张表用来存储所有的系统用户,属性有:
id(主键,自增)
code(编号,唯一)
name(姓名)
password(密码)
sex(性别)
userType(用户类型,1为管理员,0为普通用户)
telephone(电话)
creatTime(用户创建时期)
在数据库中建库SBMS(和jdbc.properties保持一致),建表user,同时插入一条管理员数据:
CREATE TABLE `user` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`code` VARCHAR(32) UNIQUE NOT NULL,
`name` VARCHAR(32) NOT NULL,
`password` VARCHAR(32) NOT NULL,
`sex` ENUM('男','女'),
`userType` INT NOT NULL,
`telephone` VARCHAR(32),
`creatTime` TIMESTAMP
);
INSERT INTO `user` VALUES(NULL,'10001','张某某','zmm123456','男',1,'15208089999',NULL);
user表:
id code name password sex userType telephone creatTime
------ ------ --------- --------- ------ -------- ----------- ---------------------
1 10001 张某某 zmm123456 男 1 15208089999 2019-04-29 19:56:27
使用逆向工程需要两个jar包和一个配置文件,一个java驱动程序。
两个jar包分别是数据库驱动jar包,一个是mybatis-generator-core.jar包,它是逆向工程的jar包,配置文件用来配置一些必须的信息,java驱动程序用来驱动逆向工程。
为什么要使用逆向工程?
使用MyBatis逆向工程可以帮我们根据数据库中指定的表自动的生成entity和mapper接口和其配置文件。极大的减少了工作量。
添加jar包
数据库驱动jar包我们已经添加过,所以现在使用逆向工程要加入这个jar包:

添加并更改配置文件
然后添加其配置文件generatorConfig.xml到src目录下,然后去更改配置文件,注意xml文件中的注释,你最好从头到尾过一遍,确保所有信息都正确。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--mysql数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/sbms" userId="root"
password="123456">
</jdbcConnection>
<!--这是oracle数据库配置信息-->
<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@localhost:1521:xe"
userId="hr"
password="hr">
</jdbcConnection> -->
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成entity类的位置 -->
<javaModelGenerator targetPackage="com.xx.entity"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.xx.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.xx.mapper"
targetProject=".\src">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表 -->
<table schema="" tableName="user"></table>
<!-- 有些表的字段需要指定java类型
<table schema="" tableName="user">
将数据库中的字段重命名为实体类的属性
<columnOverride column="id" javaType="Long" />
</table> -->
</context>
</generatorConfiguration>
添加java程序驱动逆向工程,我们单独建一个包com.xx.utils用来放置它(复制粘贴即可,不用自己写,注意复制后更改配置文件的路径):
package com.xx.utils;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
public class Gerator {
public static void main(String[] args)
throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException {
// 这个java程序用来运行MaBatis逆向工程,你不需要做过多的改动
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
// 确保配置文件可以被正确找到就可以,其他的不用更改
File configFile = new File("../SSM_001/src/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
// 如果成功的话会在控制台打印success
System.out.println("bulid succes");
}
}
运行该程序,没有问题的话控制台会打印success。这个时候去检查com.xx.entity和com.xx.mapper两个包,自动生成的类就放在这里面。
先说一下思路,我们在登录页面写好账号和密码,请求交给UserServiceController下的login方法处理,在这里进行参数绑定,拿到账号和密码,去校验是否正确,正确则跳转到index.jsp页面,否则保存错误信息,返回登录页面继续登录。
在这之前我们需要测试一下之前搭建好的环境是否可行,先来做一个小小的测试:
package com.xx.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.xx.entity.User;
@Controller
@RequestMapping("/user")
public class UserServiceController {
@RequestMapping("/login")
public String login(String username,String password){
System.out.println(username);
System.out.println(password);
// 注意路径
return "forward:../index.jsp";
}
}
测试时确保login.jsp里面表单的action路径是正确的,比如这里的路径必须是../user/login才能访问到正确的controller。
确保你表单里面的input标签name值和login方法里面的形参名相匹配(可以用@RequestParam处理),总之要确保参数能成功绑定。
测试步骤:
启动tomcat服务器(把项目部署到服务器上再启动)
打开浏览器,访问login.jsp。比如这里要输入http://localhost/SSM_001/jsp/login.jsp(其实这样不合理,你也可以去web.xml里面去更改首页)

输入账号和密码,点击登录(如果跳转到index.jsp页面并且控制台打印出你输入的值则说明环境搭建没有问题)。

成功跳转到登录页面(其实把参数值拼在url地址中并不合理,至少登录和密码不能这么干,我们后面再处理)。

控制台也成功的打印出了参数值(做到这一步,其实SSM框架整合已经成功了一半了)!
下面来看具体的登录功能的实现,我们借此测试mybatis和spring的整合效果。
要实现登录功能,我们就需要用到之前用逆向工程建好的mapper了。
在登录逻辑之前,我们要对之前写好的login.jsp进行更改:
1.更改表单的提交方式为post(不要把用户信息暴露在url中):
<form class="loginForm" action="../user/login" method="post">
2.更改表单中账号的input标签的name值为code(因为登录时我们规定是按照code登录而不是用户名,code唯一,username不唯一):
<input id="user" type="text" name="code" placeholder="请输入账号" required />
3.现在按照service-serviceImpl-controller的思路来写:
userService
package com.xx.service;
import com.xx.entity.User;
public interface UserService {
// 在这个接口中定义第一个功能:根据code来查询用户信息,返回用户对象
public User selectUserByCode(String code);
}
userServiceImpl
package com.xx.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.xx.entity.User;
import com.xx.mapper.UserMapper;
import com.xx.service.UserService;
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User selectUserByCode(String code) {
// TODO Auto-generated method stub
return userMapper.selectUserByCode(code);
}
}
注意,MyBatis逆向工程生成的UserMapper中并没有selectUserByCode()这个方法,我们要自己写。而且我们要给它加上@Repository注解,并在Mapper.xml中写SQL语句:
UserMapper
package com.xx.mapper;
import com.xx.entity.User;
import com.xx.entity.UserExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper {
// 中间是其他方法,省略,重点在注解和下面这个方法
User selectUserByCode(String code);
}
UserMapper.xml
<select id="selectUserByCode" parameterType="String" resultType="com.xx.entity.User">
select * from user where code = #{code}
</select>
接下来就是最关键的部分:
UserServiceController:
package com.xx.controller;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.xx.entity.User;
import com.xx.service.UserService;
@Controller
@RequestMapping("/user")
public class UserServiceController {
@Autowired
private UserService userService;
@RequestMapping("/login")
public String login(String code, String password, Model model, HttpSession session) {
// 调用userSercice中的selectUserByCode方法返回user对象。
User user = userService.selectUserByCode(code);
// 判断user是否为空
if (user != null) {
// code正确则校验密码
if (user.getPassword().equals(password)) {
// 密码正确,保存用户信息到session
session.setAttribute("user", user);
// 请求重定向到index.jsp
return "redirect:../index.jsp";
} else {
// 密码不正确,保存错误信息
model.addAttribute("error", "密码不正确");
// 请求转发到login.jsp
// 不能重定向!重定向之后再jsp页面是取不到model里面的值的
return "forward:../jsp/login.jsp";
}
} else {
// 账号不存在,保存错误信息
model.addAttribute("error", "用户不存在");
// 请求转发到login.jsp
return "forward:../jsp/login.jsp";
}
}
}
我们在login.jsp页面显示一下错误信息,写在header里面:
<h2 id="error_msg" style="color: red;">${error}</h2>
登录成功后的index.jsp页面(省略了,打印一句话测试一下):
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
index.jsp……
</body>
</html>
大工告成!测试一下!
1.启动Tomcat服务器,打开浏览器,输入:http://localost/SSM_001/jsp/login.jsp

2.测试登录成功,输入正确的账号和密码,点击登录:

成功跳转到index.jsp:

3.测试登录失败,回到登录页面,输入错误的用户名和信息:

登录失败,继续登录,错误信息也显示出来了:

登录功能测试完成。
想了解更多相关内容,不妨关注一下动力节点计算机毕业设计页面,里面的内容更加丰富,相信会对大家的学习有所帮助。
Java实验班
0基础 0学费 15天面授
Java就业班
有基础 直达就业
Java夜校直播班
业余时间 高薪转行
Java在职加薪班
工作1~3年,加薪神器
Java架构师班
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习