layout: post

title: 实训项目

date: 2020-12-6

author: XiaoJia849

categories:

- 开发部

tags:

- 后端

- springboot

- 文件处理

项目实训已经度过3周,三周内被迫学会了springboot 和mybatis的基本使用,以下是我的一点总结。以及对文件的操作记录。

Maven

Mybatis

Springboot

上传excel与解析

上传任意类型文件且保存

浏览器下载文件

java处理word模板

Maven

Maven是个好东西,如果在配置pom.xml时不经常爆红的话。

Maven在我的理解中是一个jar包管理库,使用Maven让我无需导入jar包,如果需要使用这个jar包时,只需要在pom.xml内写入依赖即可,非常方便。

Mybatis

Mybatis内写sql语句调用数据库的资源,把所有涉及与数据库交互的过程全部封装在mapper内的xml文件中,但是对于初次接触MyBatis的我而言不是很友好。当我需要写嵌套查询时,发现此时仅仅是更改sql语句只会引发一串报错,这也就意味着,当sql语句跳出了简简单单的一层插入,更新,查询时,难度大幅度上升了。其实只是我太菜了,要写嵌套查询还是很方便的。

例子

insert into pro (Pid,Pname,Pcontent,Pnum)

values (#{Pid},#{Pname},#{Pcontent},#{Pnum})

select MAX(Pid)

from pro;

select

Pid,Pname,Pcontent,Pnum,

from pro;

update stu_team_pro

set Pid=#{pid}

where GroupId=#{groupId};

和sql里面写嵌套查询没啥区别,我也不知道为什么我在网上搜到的那么复杂ㄟ( ▔, ▔ )ㄏ

总而言之,感谢队友 (_)

Update tea_ans

set Grade=#{Grade}

where Tid=#{Tid} and ReplyId in(

select ReplyId

from scen

where GroupId=#{GroupId}

);

Springboot

Springboot的亮点在于5层框架,把每层的功能分的十分细致。

model层描述对象的属性。

dao层与Mybatis打交道,里面写满各种与数据库相关的方法。

service层则可以将dao层的方法组合起来使用,当要处理的问题简单时,其实并不需要service层。

control层用于和前端进行交互,接收数据,调用dao层或者service层的方法进行处理,处理后将结果返回前端。

config层我只知道可以作为拦截器限制control层与前端的交互。

此外,springboot的优点还在于可以清晰的让每个函数只做一件事,比如说:

函数A要更改数据库,函数B要实现把数据库中的数据拿到前端展示的作用

可是我们要实现的功能是界面上更改数据库传出请求后马上返回到这个页面,要将AB两个函数的功能按顺序使用,那么可以在A函数结束后 return "redirect:/B" ,这样就OK了

之前采用MVC框架写过前后端的代码,那个时候并不知道springboot这么香的存在,哎

上传excel与解析

功能

前端上传excel文件,后端实现获取excel内容,并将对应的内容存入数据库内

要点

上传文件的 jsp要进行以下修改

在jsp的head内和form内都明确上传的数据类型是multipartFile,且限制上传的文件类型为excel

Maven导包使支持POI且2007之后的excel文件处理

在pom.xml内写入以下内容

org.apache.poi

poi-ooxml

3.15

org.apache.poi

poi-scratchpad

3.8

写入以上之后才能使用XSSF

control层内代码实现

@PostMapping("AdminEXC")

public String export(@RequestParam("exc") MultipartFile file,

HttpServletRequest request, HttpServletResponse response) {

try {

// @RequestParam("file") MultipartFile file 是用来接收前端传递过来的文件

// 1.读取文档file并且把数据流形式存放在inputStream内

InputStream inputStream = file.getInputStream();

//定义工作簿,把数据流以excel文件的形式组织起来,形成工作簿

XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);

//定义工作表,工作簿第0页也就是第一张sheet

XSSFSheet xssfSheet;

xssfSheet = xssfWorkbook.getSheetAt(0);

//已知excel第0列内容是专业

//要获取不重复的专业列我采用放入map的方式

Map map= new HashMap();

//定义标题行,第0行为标题行,index = 0

XSSFRow titleRow = xssfSheet.getRow(0);

//xssfSheet无法直接获得一列的元素,所以只能用行的for循环

//获取专业列也即map的key 列

for (int rowIndex = 1; rowIndex < xssfSheet.getPhysicalNumberOfRows(); rowIndex++) {

XSSFRow xssfRow = xssfSheet.getRow(rowIndex);

if (xssfRow.getCell(3) == null) {

continue;

}else{

map.put(xssfRow.getCell(3).getStringCellValue(),1);

}

}

//xssfSheet.getPhysicalNumberOfRows()代表这个工作表的行数,并不一定就等于有文字的部分的行数,所以在进行for循环时,判断对应的值是否为null时十分有必要的

//根据key的排列对value进行从上到下的标号

//标号后存入数据库内

int i=0;

//将专业相关信息插入dept表内

for (Map.Entry entry : map.entrySet()) {

i=i+1;

entry.setValue(i);

//一个数据库插入函数

//把key作为sdept i作为Sdid 插入

proDao.Insdid(i,entry.getKey());

}

//循环取每行的数据,完善学生相关信息

for (int rowIndex = 1; rowIndex < xssfSheet.getPhysicalNumberOfRows(); rowIndex++) {

XSSFRow xssfRow = xssfSheet.getRow(rowIndex);

if (xssfRow.getCell(3) == null) {

continue;

}else{

String sid=xssfRow.getCell(0).getStringCellValue();

String sname=xssfRow.getCell(1).getStringCellValue();

String spwd=sid.substring(0,3)+sid.substring(5,8);

Integer sdid=map.get(xssfRow.getCell(3).getStringCellValue());

proDao.Instu(sid,sname,spwd,sdid);

}

//以上部分为基操,不做描述

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return "Adminfunc";

}

上传任意类型文件且保存

上传文件的 jsp要进行以下修改

xx

hh

在jsp的head内和form内都明确上传的数据类型是multipartFile

@PostMapping("Proupload")

public String Upload(HttpServletRequest request,@RequestParam("xfile") MultipartFile file){

try{

//获取题目id

int pid=Integer.valueOf(request.getParameter("pid"));

//得到文件名

String filename = file.getOriginalFilename();

//得到文件类型

String extFileName = filename.substring(filename.lastIndexOf("." ) +1,filename.length());

//例如上传文件xx.txt

//filename="xx.txt"

//extFileName="txt"

//获取当前所在文件夹的绝对路径realPath

String realpath=request.getSession().getServletContext().getRealPath("/");

//略微修改一下,得到我将把上传的文件夹存入的路径 ——filePath

String filePath=realpath.substring(0,realpath.length()-7)+"resources\\file\\";

String path = filePath + filename;

//以上两者拼接得到一个完整的文件存入的路径

//在这个路径上创建文件

File dest = new File(path);

if (!dest.getParentFile().exists()){

//若此路径不存在则创建目录

dest.getParentFile().mkdir();

}

//将file文件完全复制存入到dest这个文件内

file.transferTo(dest);

//把对应的数据库信息存入

proDao.Inurl(pid,path);

}catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return "Teafunc";

}

浏览器下载文件

jsp内

pom.xml内补充依赖

org.junit.platform

junit-platform-engine

control层

@PostMapping("download")

public static void downFile(HttpServletRequest request, HttpServletResponse response) throws IOException {

//等待被下载的文件的绝对路径

String url="F:\\ne\\AC自动机&TireTree.docx";

//该文件的名字

String filename="AC自动机&TireTree.docx";

//找到该文件

File file=new File(url);

// 文件存在才下载

if (file.exists()) {

OutputStream out = null;

FileInputStream in = null;

try {

// 把文件转化为数据流存储在in内

in = new FileInputStream(file);

// 告诉浏览器下载的方式以及一些设置

// 解决文件名乱码问题,获取浏览器类型,转换对应文件名编码格式,IE要求文件名必须是utf-8, firefo要求是iso-8859-1编码

//获取浏览器信息

String agent = request.getHeader("user-agent");

if (agent.contains("FireFox")) {

//如果是火狐浏览器,则需要转编码

filename = new String(filename.getBytes("UTF-8"), "iso-8859-1");

} else {

//其他的全部设置为UTF-8形式

filename = URLEncoder.encode(filename, "UTF-8");

}

// 设置下载文件的mineType,告诉浏览器下载文件类型

String mineType = request.getServletContext().getMimeType(filename);

//设置相应类型与文件类型一致(因为要下载这个文件)

response.setContentType(mineType);

// 设置一个响应头,无论是否被浏览器解析,都下载

response.setHeader("Content-disposition", "attachment; filename=" + filename);

// 将要下载的文件内容通过输出流写到浏览器

out = response.getOutputStream();

//把输入流的内容全部复制到输出流

int len = 0;

byte[] buffer = new byte[1024];

while ((len = in.read(buffer)) > 0) {

out.write(buffer, 0, len);

}

//复制结束后实现了输出一个一模一样的文件

} catch (IOException e) {

e.printStackTrace();

} finally {

if (out != null) {

out.close();

}

if (in != null) {

in.close();

}

}

}

}

例子

java处理word模板

jsp内

pom.xml内

org.apache.poi

ooxml-schemas

1.4

control层

已知我的模板文件在resources/file/下 stugrade.docx

要在同目录下创建文件xx4.docx

stugrade.docx

@PostMapping("getGrade")

public static String getGrade(HttpServletRequest request, HttpServletResponse response) throws IOException {

// 获取当前项目的绝对地址

String realpath=request.getSession().getServletContext().getRealPath("/");

String filePath=realpath.substring(0,realpath.length()-7)+"resources\\file\\";

//模板文件地址,下面过程不会更改模板文件

String inputUrl = filePath + "stugrade.docx";

//新生产的文件

String outputUrl=filePath+"xx4.docx";

//在map内按照模板对应位置的英文key补充填写内容value

Map map=new HashMap<>();

map.put("Pname","hhh");

map.put("Tname","hhh");

map.put("student","hhh");

map.put("tea1","hhh");

map.put("grade1","hhh");

map.put("tea2","hhh");

map.put("grade2","hhh");

map.put("time","hhh");

map.put("place","hhh");

map.put("grade","hhh");

try {

//获取word文档解析对象

XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(inputUrl));

//获取文章

Iterator itPara = document.getParagraphsIterator();

while (itPara.hasNext()) {

//获取段落

XWPFParagraph paragraph = (XWPFParagraph) itPara.next();

//获取段落内的最小结构run

List runs = paragraph.getRuns();

for (XWPFRun run : runs) {

//获取文字

String text = run.getText(0);

if (text != null) {

boolean isSetText = false;

//遍历map寻找key

for (Map.Entry entry : map.entrySet()) {

String key = entry.getKey();

if (text.indexOf(key) != -1) {// 在配置文件中有这个关键字对应的键

isSetText = true;

Object value = entry.getValue();

if (value instanceof String) {

// 文本替换

if (text.contains(key)) {

text = text.replace(key, value.toString());

}

}

}

}

if (isSetText) {

run.setText(text, 0);

}

}

}

}

//创建输出文件

File file = new File(outputUrl);

FileOutputStream stream = new FileOutputStream(file);

//把document的内容写入到stream对应的文件file内

document.write(stream);

stream.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return "Adminfunc";

}

备注

参考

项目

这个是我们小组6个人的作品,如果允许的话,项目源码将在这个实训结束后上传github网址用于分享 不了,还是算了吧

java实训小项目6_实训项目相关推荐

  1. web前端小项目个人实例_Web前端:小程序界面与逻辑项目实训

    大家好,我来了!本期为大家带来的Web前端学习知识是"Web前端:小程序界面与逻辑项目实训",喜欢Web前端的小伙伴,一起看看吧! 主要内容 数据绑定 渲染 界面层数据渲染 事件处 ...

  2. 基于tutk方案的p2p源码_基于JAVA的局域网文件共享平台P2P实训项目源码(毕业设计 课程设计)...

    [实例简介] 基于JAVA的局域网文件共享平台P2P实训项目源码(毕业设计 课程设计). 可直接运行.做毕业设计.课程设计或者想研究下技术的可以下载学习.需要更多资源的可以关注我. [实例截图] [核 ...

  3. java计算机毕业设计任务进度监督的软件项目实训管理系统源程序+mysql+系统+lw文档+远程调试

    java计算机毕业设计任务进度监督的软件项目实训管理系统源程序+mysql+系统+lw文档+远程调试 java计算机毕业设计任务进度监督的软件项目实训管理系统源程序+mysql+系统+lw文档+远程调 ...

  4. java 实训项目_实训方案(JavaWeb项目实训)-

    实训方案(JavaWeb项目实训)- 2012-2013学年第一学期 <Java Web项目开发实训>课程实施方案 课程名称(英文):Training of Java Web Projec ...

  5. 头歌 软件测试项目综合实训 答案 有目录善用目录 持续更新

    头歌 软件测试项目综合实训 其他作业链接 非盈利文章,谢谢大家的分享和支持,如果大家有想要投稿的答案,也可以点击下面链接联系作者. 点击联系作者 作者博客 选择题加粗为正确答案 头歌java实训答案集 ...

  6. [附源码]java毕业设计基于JAVAWEB的高校实训管理系统

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  7. 基于javaweb的仓库管理系统(java+springboot+layui+html+thymeleaf+mysql+实训报告)

    基于javaweb的仓库管理系统(java+springboot+layui+html+thymeleaf+mysql+实训报告) 运行环境 Java≥8.MySQL≥5.7 开发工具 eclipse ...

  8. Android实训内容及过程,Android项目开发实训大纲.doc

    Android项目开发实训大纲Android项目开发实训大纲 黎明职业大学信息与电子工程学院 <Android项目开发> 实训指导书 2014年6月 <Android项目开发> ...

  9. java web开发实训心得,【JavaWeb实训心得体会材料】

    JavaWeb实训心得体会材料 <JavaWeb实训心得体会材料.doc>由会员分享,可免费在线阅读全文,更多与<JavaWeb实训心得体会材料>相关文档资源请在帮帮文库(ww ...

最新文章

  1. 在JSP页面中显示List集合·
  2. 美术师关于自己的报酬与工作的看法
  3. 使用反射处理protobuf数据结构
  4. Educational Codeforces Round 103 (Rated for Div. 2) D. Journey dp
  5. 电大c 语言程序设计程序,中央电大 C语言程序设计A
  6. .net垃圾回收学习[NET 2.0 Performance Guidelines - Garbage Collection][翻译加学习]
  7. 洛阳地铁一号线无人驾驶_洛阳地铁第一个过街通道建成,地铁时代离洛阳人还远吗?...
  8. WIN7的便签使用快捷键
  9. 简直太强,把任意图片设置为鼠标指针
  10. 20190105 东非大裂谷
  11. nlp情感分析经典书籍推荐_通过无监督学习对书籍进行情感分析
  12. 在linux下刷B站方法总结
  13. CRC16-ccitt-false 递归解析每一个号码段的值
  14. (六)Activiti之实现学生请假流程
  15. QOpenGLWidget显示视频流数据
  16. 关于-超融合架构(Hyper-converged)市场产品区别和决策标准
  17. export ‘Switch‘ (imported as ‘Switch‘) was not found in ‘react-rou ter-dom‘ (possible exports:
  18. kali操作系统+信息搜集工具
  19. 解决IBM Security AppScan扫描出现检测到RC4密码套件问题
  20. 什么是C语言数组地址

热门文章

  1. Parameter Attribute
  2. 基于Java的网络编程实践
  3. .c文件和.h文件之间的联系
  4. 标题使用java计算三维空间中两点的欧几里德距离
  5. 算法:分治策略和递归1 | 通过迭代来学习递归
  6. webpack 配置不同环境, 以及配置 baseUrl
  7. Docker容器回顾之运维篇
  8. checkpatch海思SDK代码遇见的常见错误《二》
  9. 中序遍历二叉树的非递归实现(利用栈)
  10. “烫烫烫烫烫烫烫烫烫烫烫烫烫...