实验目的:
- 掌握Spring的IOC操作,能够实现MVC层次的基于IOC的调用
- 掌握Spring的IOC的注解使用
实验内容:
在计算机上实现模拟查询学生成绩的操作,要求如下:
(1)构建User类和Student类,模拟数据库中的两个表,类属性如下:
A.Student类,属性(sid,sname,sex,age)
B.User,属性(uid,username,password)
(2)假设User类所对应的方法是login(username,password)和registry(username,password)完成该类中的这个方法在dao层的接口和实现类,以及service层的接口和实现类,注意,dao的实现类中,该登录方法的实现直接使用集合查询数据,注册方法直接往集合里面加入新用户即可,不用查询数据库,在service层的实现类则是直接调用dao层的方法即可;
(3)假设Student类所对应的方法是查询所有学生信息(List<Student> findStudent())以及根据id查询学生信息(Student findStudentById(int id))以及根据名字模糊查找学生信(List<Student> findStudentByName(String name))这三个方法,完成这三个方法在dao和service层的构建以及调用关系,实际student数据不用查数据库,我们直接在dao里面构建一个student的集合并自己初始化数据即可;
(4)提供JUnit单元测试,使用Scanner类来完成控制台的输入指令:1.用户登录,2.用户注册,3.退出,当用户登录成功之后,开始有新指令:1.查找所有学生、2.根据id查找学生、3.根据学生姓名查找学生;完成以上5个功能;
实现思路:
项目结构图:
1、引入先关依赖到 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>com.spring</groupId>
<artifactId>spring</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--Spring必备的支持包-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!--Spring-->
<!--Spring的基础包Spring-core-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!--Spring的基础包Spring-beans-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!--Spring的基础包Spring-context-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!--Spring的基础包Spring-expression-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!--Spring的基础包Spring-aop-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-annotations-api</artifactId>
<version>9.0.8</version>
</dependency>
</dependencies>
</project>
2、Spring IOC 的配置和实现
2.1:配置Spring的IOC容器
创建Spring配置文件applicationContext.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
https://www.springframework.org/schema/context/spring-context.xsd">
<!--将指定类配置给spring,让Spring创建User对象实例-->
<context:component-scan base-package="com.spring"/>
</beans>
2.2:创建User类和Student类
创建User类,包含属性uid, username, password。
package com.spring.pojo;
import org.springframework.stereotype.Component;
@Component("user")
public class User {
private int uid;
private String username;
private String password;
public User(){
}
public User(int uid, String username, String password) {
this.uid = uid;
this.username = username;
this.password = password;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
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;
}
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
创建Student类,包含属性sid, sname, sex, age。
package com.spring.pojo;
public class Student{
private int sid;
private String sname;
private String sex;
private int age;
public Student(int sid,String sname,String sex,int age){
this.sid=sid;
this.sname=sname;
this.sex=sex;
this.age=age;
}
public Student() {
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
2.3:实现DAO层接口和实现类
创建UserDao接口,定义 login 和 registry 方法。
package com.spring.common.dao;
public interface UserDao {
void login();
void register();
}
创建UserDaoImpl实现类,实现 login 和 registry 方法,使用集合模拟数据库操作。
package com.spring.common.dao.Impl;
import com.spring.common.dao.UserDao;
import com.spring.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
@Repository("userDao")
public class UserDaoImpl implements UserDao {
User user;
static List<User>userList = new ArrayList<User>();
static User user1 = new User(1,"张三","123456");
static Scanner sc = new Scanner(System.in);
static int uid = 1;
static {
if(userList.isEmpty()){
userList.add(user1);
}
}
@Override
public void login() {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
for(User user:userList){
if(username.equals(user.getUsername()) && password.equals(user.getPassword())){
System.out.println("登录成功" + "\n");
return;
}
else {
System.out.println("用户名或密码错误" + "\n");
return;
}
}
}
@Override
public void register() {
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
uid += 1;
User newUser = new User(uid,username,password);
userList.add(newUser);
System.out.println("注册成功" + "\n");
for (User user:userList){
System.out.println(user);
}
}
}
创建StudentDao接口,定义findStudent, findStudentById, findStudentByName方法。
package com.spring.common.dao;
public interface StudentDao {
void FindStudent();
void FindStudentById();
void FindStudentByName();
}
创建StudentDaoImpl实现类,实现上述方法,使用集合模拟数据库操作并初始化数据。
package com.spring.common.dao.Impl;
import com.spring.common.dao.StudentDao;
import org.springframework.stereotype.Repository;
import com.spring.pojo.Student;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Repository("studentDao")
public class StudentDaoImpl implements StudentDao {
Student student;
static List<Student> studentList = new ArrayList<Student>();
static Student student1 = new Student(1,"萧炎","男",20);
static Student student2 = new Student(2,"林黛玉","女",18);
static Student student3 = new Student(3,"萧玄","男",22);
static Student student4 = new Student(4,"魂天帝","男",21);
static Student student5 = new Student(5,"林月如","女",20);
static Student student6 = new Student(6,"林青霞","女",25);
static Student student7 = new Student(7,"林长生","男",21);
static {
if (studentList.isEmpty()){
studentList.add(student1);
studentList.add(student2);
studentList.add(student3);
studentList.add(student4);
studentList.add(student5);
studentList.add(student6);
studentList.add(student7);
}
}
@Override
public void FindStudent(){
for(Student student:studentList) {
System.out.println(student);
}
}
@Override
public void FindStudentById(){
System.out.println("请输入您要查询的学生的id:");
Scanner sc = new Scanner(System.in);
int id = sc.nextInt();
boolean flag = true;
for(Student student:studentList) {
if(id == student.getSid()) {
System.out.println(student);
flag = false;
break;
}
}
if(flag) {
System.out.println("没有找到该学生");
}
}
@Override
public void FindStudentByName(){
System.out.println("请输入您要查询的学生的姓名:");
Scanner sc = new Scanner(System.in);
String name = sc.next();
Pattern pattern = Pattern.compile(name,Pattern.CASE_INSENSITIVE);
for(Student student:studentList) {
Matcher matcher = pattern.matcher(student.getSname());
if(matcher.find()) {
System.out.println(student);
}
}
}
}
2.4:实现Service层接口和实现类
创建UserService接口,定义用户相关操作的方法。
package com.spring.service;
public interface UserService {
void login();
void register();
}
创建UserServiceImpl实现类,注入UserDao,实现业务逻辑。
package com.spring.service.Impl;
import com.spring.common.dao.UserDao;
import com.spring.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserDao userDao;
@Override
public void login(){
this.userDao.login();
}
@Override
public void register(){
this.userDao.register();
}
}
创建StudentService接口,定义学生信息相关操作的方法。
package com.spring.service;
public interface StudentService {
void FindStudent();
void FindStudentById();
void FindStudentByName();
}
创建StudentServiceImpl实现类,注入StudentDao,实现业务逻辑。
package com.spring.service.Impl;
import com.spring.common.dao.StudentDao;
import com.spring.service.StudentService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service("studentService")
public class StudentServiceImpl implements StudentService {
@Resource
StudentDao studentDao;
public void FindStudent() {
this.studentDao.FindStudent();
}
@Override
public void FindStudentById() {
this.studentDao.FindStudentById();
}
@Override
public void FindStudentByName() {
this.studentDao.FindStudentByName();
}
}
3、JUnit单元测试和Scanner输入指令
3.1:编写JUnit单元测试
编写SpringTest测试类,使用Spring的Test框架进行单元测试。
import com.spring.service.StudentService;
import com.spring.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Scanner;
public class SpringTest {
// 测试类
public static void main(String[] args){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = ac.getBean("userServiceImpl", UserService.class);
StudentService studentService = ac.getBean("studentService", StudentService.class);
Scanner sc = new Scanner(System.in);
System.out.println("请选择功能:");
System.out.println("1.用户登录");
System.out.println("2.用户注册");
System.out.println("0.退出");
int choice = sc.nextInt();
switch (choice){
case 1:
System.out.println("************登录功能************");
userService.login();
Scanner sc1 = new Scanner(System.in);
System.out.println("请选择功能:");
System.out.println("1.查询所有学生信息");
System.out.println("2.根据id查询学生信息");
System.out.println("3.根据名字查找学生信息");
int choice1 = sc.nextInt();
switch (choice1){
case 1:
studentService.FindStudent();
break;
case 2:
studentService.FindStudentById();
break;
case 3:
studentService.FindStudentByName();
break;
default:
return;
}
break;
case 2:
System.out.println("************注册功能************");
userService.register();
break;
default:
System.out.println("************退出成功************");
return;
}
}
}
3.2:实现控制台输入指令
用户登录功能和查找所有学生信息功能:
用户注册功能:
退出功能:
根据 id 查找学生:
根据名字查找学生: