目录
一、观察者模式
1、开发环境
2、Model模型
3、View视图
4、Controller控制
5、过程演示
二、简单工厂模式
1、开发环境
2、产品类
3、工厂类
4、模式结构
5、用户操作界面与运行结果
总体使用的是SSM(Spring+SpringMVC+MyBatis)框架结构,MVC模式体现在SpringMVC 使用了适配器模式,前端控制器使用 HandlerAdapter 来调用不同的 Controller,然后才是 Controller 调用 Model 产生数据模型; 产生的数据模型将会再次返回到前端控制器,并由前端控制器决定使用不同的模板引擎将页面进行渲染。
在这个实验中,我们需要完成学籍的查询与录入,model自然是学籍类(StudentDocument.class),该类的属性如下:
该类的方法包括各个属性的get和set方法,来实现对属性的获取和修改。
根据model来建立数据库的student_document表,具体内容如下:
student_document表这里的用户操作界面(index.jsp)提供查询所有学籍的超链接和一个录入学籍的表单,供用户进行查询和录入的功能,其界面如下:
用户操作界面index.jsp<%--
Created by IntelliJ IDEA.
User: xiachengyue
Date: 2021/10/23
Time: 8:36 下午
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
保存某一学生的学籍,点击保存返回所有学生学籍
查询所有学籍信息
在用户点击查询所有学籍的超链接或在录入后点击保存后,会返回一个list.jsp界面,其包含数据库中所有的学籍信息,其界面如下:
返回所有学籍界面list.jsp<%--
Created by IntelliJ IDEA.
User: xiachengyue
Date: 2021/10/23
Time: 8:39 下午
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Title
查询所有
姓名:${document.name}
身份证号:${document.idNum}
性别:${document.gender}
学号:${document.studentNum}
学历层次:${document.education}
学院:${document.college}
专业:${document.major}
班级:${document.studentClass}
入学时间:${document.addmission}
政治面貌:${document.politicalStatus}
民族:${document.folk}
籍贯:${document.address}
学制:${document.schoolSystem}
这里的控制层包括一个StudentDocumentController类,实现查询并返回所有学籍信息、录入学籍信息并返回所有信息的功能。
这里的查询功能通过Spring MVC整合Spring后,调用了studentDoucmentService接口,然后再通过Spring整合Mybatis,调用StudentDocumentDao接口,实现数据库查询,具体实现如下:
SpringMVC:StudentDocumentController中查询所有内容
@Controller
@RequestMapping("/studentDocument")
public class StudentDocumentController {
@Autowired
private StudentDocumentService studentDocumentService;
/**
* 查询所有学籍信息
* @param model
* @return
*/
@RequestMapping("/findAll")
public String findAll(Model model){
System.out.println("表现层:查询所有。。");
List list = studentDocumentService.findAll();
model.addAttribute("list",list);
return "list";
}
Spring:StudentDocumentServiceImpl调用dao层查询所有内容
@Service("studentDocumentService")
public class StudentDocumentServiceImpl implements StudentDocumentService {
@Autowired
private StudentDocumentDao documentDao;
@Override
public List findAll() {
System.out.println("业务层:查询所有。。");
return documentDao.findAll();
}
Mybatis:StudentDocumentDao实现数据库查询
@Repository
public interface StudentDocumentDao {
//查询所有学籍信息
@Select("select * from student_document")
public List findAll();
在录入学籍信息时,首先通过 StudentDocumentController获取表单中输入的数据,整合成一个StudentDocument类,最后返回list.jsp页面。在调用关系中,通过Spring MVC整合Spring后,调用了studentDoucmentService接口,然后再通过Spring整合Mybatis,调用StudentDocumentDao接口,实现插入数据库。
SpringMVC:StudentDocumentController中保存录入信息并返回list.jsp界面
/**
* 保存
* @param
* @return
*/
@RequestMapping("/save")
public void save(StudentDocument document, HttpServletRequest request,HttpServletResponse response) throws IOException {
studentDocumentService.saveDocument(document);
response.sendRedirect(request.getContextPath()+"/studentDocument/findAll");
return ;
}
Spring:StudentDocumentServiceImpl调用dao层实现插入录入信息
@Override
public void saveDocument(StudentDocument document) {
System.out.println("业务层:保存。。");
documentDao.saveDocument(document);
}
Mybatis:StudentDocumentDao实现数据库的插入
//保存学籍信息
@Insert("insert into student_document (name,idNum,gender,studentNum,education,college,major,studentClass,addmission,politicalStatus,folk,address,schoolSystem) values (#{name},#{idNum},#{gender},#{studentNum},#{education},#{college},#{major},#{studentClass},#{addmission},#{politicalStatus},#{folk},#{address},#{schoolSystem})")
public void saveDocument(StudentDocument document);
测试录入功能:
启动服务器,进入http://localhost:8080/certificate_war_exploded/index.jsp ,在表单中输入张三同学的学籍信息
录入张三同学的信息点击保存后,系统会返回所有的学籍信息。
返回所有信息查看数据库,确实存在张三同学的信息。
student_document表中内容测试查询功能:
先在数据库中插入多条学籍信息,内容如下:
student_document表中内容点击index.jsp中查询所有学籍信息的超链接,在list.jsp中确实返回了所有的信息。
list.jsp返回所有学籍信息IDE使用Visual Studio 2019,使用C++编程实现。
在本实验中,需实现学籍的查询与录入,定义抽象产品类StudentDocument,其中声明产品类公共事务方法,方法均为虚方法,在具体产品类中实现。定义具体产品类undergraduate(本科生类),继承自StudentDocument类,实现父类声明的虚方法。定义具体产品类postgraduate(研究生类),继承自StudentDocument类,实现父类声明的虚方法。 其中,在StudentDocument类声明以下方法和属性,其中属性为各种学籍信息,方法包括设置学籍信息的方法及对学籍信息实现增删改查的方法。
#pragma once
using namespace std;
#include
class StudentDocument
{public:
//方法
virtual void setname(string name1) = 0;
virtual void setstudentNum(string studentNum1) = 0;
virtual void setgender(string a) = 0;
virtual void seteducation(string a) = 0;
virtual void setcollege(string a) = 0;
virtual void setmajor(string a) = 0;
virtual void setclass1(string a) = 0;
virtual void setaddmissionYear(string a) = 0;
virtual void setpoliticalStatus(string a) = 0;
virtual void setfolk(string a) = 0;
virtual void setaddress(string a) = 0;
virtual void setschoolSystem(string a) = 0;
virtual void setidNum(string a) = 0;
virtual string getDocument() = 0;
virtual void postDocument() = 0;
virtual void modifyDocument() = 0;
virtual void deleteDocument() = 0;
//属性
string name;
string studentNum;
string gender;
string education;
string college;
string major;
string class1;
string addmissionYear;
string politicalStatus;
string folk;
string address;
string schoolSystem;
string idNum;
};
定义DocumentFactory类,封装getStudentDocument方法,根据传入的参数不同创建、返回不同的具体产品类的对象,当参数为1,创建并返回undergraduate类对象,当参数为2,创建并返回postgraduate类对象。工厂类定义代码如下:
#include "DocumentFactory.h"
StudentDocument* DocumentFactory::getStudentDocument(int type) {
StudentDocument* s1 = NULL;
switch (type)
{
case 1: s1 = new undergraduate(); return s1; break;
case 2:s1 = new postgraduate(); return s1; break;
default:
break;
}
}
main.cpp代码如下,其中根据用户输入的数字创建具体产品类的对象,然后调用产品类的方法对学籍信息进行设置。
#include "StudentDocument.h"
using namespace std;
#include
#include "undergraduate.h"
#include"DocumentFactory.h"
#include
int main()
{
StudentDocument* pstudentdocument = NULL;
int type;
cout << "请输入要创建的学籍信息,1代表本科生学籍信息,2代表研究生学籍信息\n";
cin >> type;
pstudentdocument = DocumentFactory::getStudentDocument(type);
string ans;
if (type == 1) {
ans = "本科生";
}
if (type == 2) {
ans = "研究生";
}
cout << "已创建"+ans+"的学籍,请按以下要求上传学籍信息\n";
cout << "请输入姓名:";
string name;
cin >> name;
string studentNum1;
cout << "请输入学号:";
cin >> studentNum1;
string gender;
cout << "请输入性别:";
cin >> gender;
string education;
cout << "请输入年级:";
cin >> education;
string college;
string major;
if (type == 1) {
cout << "请输入学院:";
cin >> college;
cout << "专业:";
cin >> major;
pstudentdocument->setcollege(college);
pstudentdocument->setmajor(major);
}
if (type == 2) {
cout << "请输入方向:";
cin >> college;
cout << "导师:";
cin >> major;
pstudentdocument->setcollege(college);
pstudentdocument->setmajor(major);
}
pstudentdocument->setname(name);
pstudentdocument->setstudentNum(studentNum1);
pstudentdocument->setgender(gender);
pstudentdocument->seteducation(education);
cout << ans<<"学籍信息创建完毕:\n" << pstudentdocument->getDocument();
}