JavaEE期末项目-作业管理系统

基于MyBatis+springboot+jsp

一、MyBatis简介

MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

MyBatis优点

  1. 与JDBC相比,减少了50%以上的代码量。

2. MyBatis是最简单的持久化框架,小巧并且简单易学。

3. MyBatis灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,可重用。

4. 提供XML标签,支持编写动态SQL语句(XML中使用if, else)。

5. 提供映射标签,支持对象与数据库的ORM字段关系映射(在XML中配置映射关系,也可以使用注解)。

二、springboot简介

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。Spring Boot 使得基于 Spring 创建独立的、生产级别的应用程序变得非常简单。大多数的 Spring Boot 应用程序,只需要进行很少的 Spring 配置,一般你只需花费很少的时间就能基于Spring Boot进行程序开发。

springboot 优点

1> 创建独立的spring应用程序

2> Spring Boot 直接内嵌了Tomcat、Jetty和Undertow容器,不需要通过war文件进行部署

3> 通过提供 “starter” 依赖,来简化构建配置

4> 尽可能的自动配置spring和第三方类库

5> 提供production-ready特性,比如指标和运行状况检查以及外部化配置

6> 没有代码生成,也不需要通过XML进行配置

微服务

(转自博客链接

一:什么是微服务?为什么要用微服务?

什么是微服务?(熟悉的同学可以直接跳过)

简单举例:看军事新闻的同学应该都知道,一艘航空母舰作战能力虽然很强,但是弱点太明显,就是防御能力太差,单艘的航空母舰很少单独行动,通常航空母舰战斗群才是主要军事力量,你可以把单艘航母理解为的单体应用(防御差,机动性不好),把航母战斗群(调度复杂,维护费用高)理解为微服务。

大部分的开发者经历和开发过单体应用,无论是传统的 Servlet + JSP,还是 SSM,还是现在的 SpringBoot,它们都是单体应用,那么长期陪伴我们的单体应用有什么弊端?我们是面临了什么问题,导致我们要抛弃单体应用转向微服务架构?个人总结主要问题如下:

部署成本高(无论是修改1行代码,还是10行代码,都要全量替换)
改动影响大,风险高(不论代码改动多小,成本都相同)
因为成本高,风险高,所以导致部署频率低(无法快速交付客户需求)
当然还有例如无法满足快速扩容,弹性伸缩,无法适应云环境特性等问题,但我们不一一详谈了,以上的问题,都是微服务架构要解决的问题,至于具体是怎么解决的,我们先放到后面再聊

二:微服务解决什么问题,又引入了什么问题?

我们先看看微服务能带给我们什么?微服务架构的特点:

针对特定服务发布,影响小,风险小,成本低
频繁发布版本,快速交付需求
低成本扩容,弹性伸缩,适应云环境

我们知道一个朴素的理念,没有任何事物是完美的,任何东西都有两面性,有得必有失,那么在选择微服务在解决了快速响应和弹性伸缩的问题同时,它又给我们带来了什么问题?个人总结如下:

分布式系统的复杂性
部署,测试和监控的成本问题
分布式事务和CAP的相关问题

系统应用由原来的单体变成几十到几百个不同的工程,会所产生例如包括服务间的依赖,服务如何拆封,内部接口规范,数据传递等等问题,尤其是服务拆分,需要团队熟悉业务流程,懂得取舍,要保证拆分的粒度服务既符合“高内聚,低耦合”的基本原则,还要兼顾业务的发展以及公司的愿景,要还要说服团队成员为之努力,并且积极投入,在多方中间取得平衡。

对于分布式系统,部署,测试和监控都需要大量的中间件来支撑,而且中间件本身也要维护,原先单体应用很简单的事务问题 ,转到分布式环境就变得很复杂,分布式事务是采用简单的重试+补偿机制,还是采用二阶段提交协议等强一致性方法来解决,就要取决对业务场景的熟悉加上反复的权衡了,相同问题还包括对 CAP 模型的权衡,总之微服务对团队整体的技术栈水平整体要求更高
在这里插入图片描述

三:使用微服务应该遵循哪些原则?

古人云:兵马未动,粮草先行。建设微服务是需要建立长远规划,不是像写CMS那样建好数据库表,然后就开始干活,这样十有八九是会失败的。我们要进行微服务改造前,架构师要提前做好规划,我们把这里分为三步,前期阶段,设计阶段,技术阶段

前期阶段,大致要做好如下事情:

和多方充分沟通,确保能符合客户和组织的需求,并且得到认同
和团队沟通,让队友(开发/测试/运维)理解,并且积极投入
和业务部门沟通,指定版本计划和上线时间

设计阶段,参考 Sam Newman 的著作《微服务设计》,单微服务必须要满足以下的条件,才符合微服务的基本要求:

标准的 REST 风格接口(基于 HTTP 和 JSON 格式)
独立部署,避免共享数据库(避免因为数据库而影响整个分布式系统)
业务上的高内聚,减少依赖(从设计上要避免服务过大或者太小)

庞大的分布式系统,需要强大基础设施来支撑,微服务涉及哪些基础设施?

CI/CD和自动化(分布式系统几乎不可能通过人工手动发布)
虚拟化技术(要保证微服务运行环境隔离,目前行业主流的是使用 Docker 容器)
日志聚合,全链路监控(高度可观察和分析诊断问题)

针对小项目——作业管理系统

一、项目需求

在这里插入图片描述
对于学生和老师设计不同的功能,学生和老师都需要有注册和登录功能,对于学生来说更要能可以选择提交及更新作业,对于老师来说可以布置作业及查看作业,这次的项目需求对于我之前几次博客的需求有了一些改变,所以这次项目花费了更久的时间。

二、项目设计

虽然项目需求很简单,但是当我们实际做的时候要考虑到各种方面,比如对于界面,对于注册登录的数据库的添加,对于权限的赋予,对于更新等操作的实现。
这里我先展示一下项目的几个界面:

界面设计:

登录界面

在这里插入图片描述

注册界面

在这里插入图片描述

用户名密码为空的报错

在这里插入图片描述
在这里插入图片描述
教师端界面:
在这里插入图片描述
学生端界面:
在这里插入图片描述
其余UI皆于之前博客差不多,这里就不展示了。(比较简陋。。。)

数据库设计:

数据库相比之前的博客数据库的设计多了一个用户角色表,负责包含对于登录注册用户用户名及密码,身份的记录:
在这里插入图片描述
作业表:
在这里插入图片描述
用户角色表:
在这里插入图片描述
学生及作业表:
在这里插入图片描述
学生表这次没有用到。

三、相关代码展示

这里就展示几个jsp文件的有关代码:

登录界面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录界面</title>
    <link rel="stylesheet" type="text/css" href="css/css.css"/>
</head>
<body>
<form name="form1" action="LoginServlet" method="post">
    <h1>作业管理系统</h1>
    <input class=input_1 id=username size=15  name="username"  placeholder=用户名><br />
    <input class=input_1 id=password type=text size=15 name="password" placeholder=密码><br />

    <span class="radio_box">
               <input type="radio" id="radio_1" name="gettype" value="teacher" checked>
               <label for="radio_1"></label>
              老师
        	</span>
    <span class="radio_box">
               <input type="radio" id="radio_2" name="gettype" value="student">
               <label for="radio_2"></label>
               学生
       		</span><br/>

    <input class=input_3 type="button" onclick="login()" value="登录" />
    <input class=input_3 type="button" onclick="window.location.href='Register.jsp'" value="去注册" />
</form>
<script type="text/javascript" >
    function login(){
    if(form1.username.value==''){
        alert('用户名不能为空!');
        return false;
    }
    if(form1.password.value==''){
        alert('密码不能为空!');
        return false;
    }
    form1.submit();
        if(form1.gettype.value=='teacher'){
            window.location.href = 'teacher.jsp';
        }
        if(form1.gettype.value=='student'){
            window.location.href = 'student.jsp';
        }


}</script>
</body>
</html>


注册界面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册界面</title>
    <link rel="stylesheet" type="text/css" href="css/css2.css"/>
</head>
<body>
<form name="form2" action="RegisterServlet" method="post">
    <h1>作业管理系统</h1>
    <input class=input_1 id=username size=15  name="username"  placeholder=用户名><br />
    <input class=input_1 id=password type=text size=15 name="password" placeholder=密码><br />

    <span class="radio_box">
               <input type="radio" id="radio_1" name="gettype" value="teacher" checked>
               <label for="radio_1"></label>
              老师
        	</span>
    <span class="radio_box">
               <input type="radio" id="radio_2" name="gettype" value="student">
               <label for="radio_2"></label>
               学生
       		</span><br/>

    <input class=input_3 type="button" onclick="Register()" value="注册" />
</form>
<script type="text/javascript" >
    /**
     * @return {boolean}
     */
    function Register(){
        if(form2.username.value==''){
            alert('用户名不能为空!');
            return false;
        }
        if(form2.password.value==''){
            alert('密码不能为空!');
            return false;
        }
        form2.submit();
        //window.location.href = 'index.jsp';



    }</script>
</body>
</html>


学生选择作业界面:

<%@ page import="org.example.spring.model.Homework" %>
<%@ page import="org.example.spring.jdbc.HomeworkJdbc" %>
<%@ page import="java.util.List" %>
<%--
  Created by IntelliJ IDEA.
  User: win7
  Date: 2020/3/9
  Time: 11:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>StudentHomework</title>
</head>
<body>
<table align="center" width="960" border="1"
       bgcolor="black" cellpadding="1" cellspacing="1">
    <tr align="center" bgcolor="#7fffd4" height="60">
        <td>作业编号</td>
        <td>作业标题</td>
    </tr>
    <%
        List<Homework> list = HomeworkJdbc.selectAllh();
        if(null == list || ((List) list).size() <= 0){
            out.print("None data.");
        }else {
            for (Homework sh : list){
    %>
    <tr align="center" bgcolor="white" height="60">
        <td><%=sh.getHno()%></td>
        <td><%=sh.getHtitle()%></td>
        <td><input type = "button" value = "选择该作业" style="width:180px;height: 60px;font-size:16px" onclick = "window.location.href = 'handin.jsp?hno=<%=sh.getHno()%>&htitle=<%=sh.getHtitle()%>'"></td>
    </tr>
<%--    <script type="text/javascript">--%>
<%--        $(function(){--%>
<%--            $("#tab").on("click", ":button", function(event){--%>
<%--                $("#text").val($(this).closest("tr").find("td").eq(0).text());--%>
<%--            });--%>
<%--        });--%>
<%--    </script>--%>
    <%
            }
        }
    %>
</table>
</body>
</html>

提交界面:

<%--
  Created by IntelliJ IDEA.
  User: win7
  Date: 2020/3/12
  Time: 21:52
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>提交作业</title>
</head>
<% String hno=request.getParameter("hno");System.out.println(hno);%>
<% String htitle=request.getParameter("htitle");System.out.println(htitle);%>
<body align="center">
<h1>提 交 作 业</h1>
<form action="handin" method="post">
    学生学号:<label>
    <input type="text" name="studentno">
</label><br>
    作业序号:<label>
    <input type="text" name="homeworkno" value="<%=hno%>">
</label><br>
    作业题目:<label>
    <input type="text" name="homeworktitle" value="<%=htitle%>">
</label><br>
    作业内容:<label>
    <input type="text" name="homeworkcontent">
</label><br>
    <input type="submit" id="submit" value="上交作业">

</form>
</body>
</html>

四、开发过程中遇到的问题

1.界面之间传参

HTTP是无状态的协议。Web页面本身无法向下一个页面传递信息,如果需要让下一个页面得知该页面中的值,除非通过服务器。因此,Web页面保持状态并传递给其它页面,是一个重要的技术。
Web页面之间传递数据,是Web程序的重要功能
在这里插入图片描述
参考此博客,这里我采用了URL传参的方法,但是仍具有风险
这种方法有着以下优缺点:
优点:
简单性和平台支持的多样性(没有浏览器不支持URL)。
缺点:
1)传输的数据只能是字符串,对数据类型具有一定的限制;
2)传输数据的值会在浏览器地址栏里面被看到,从保密的角度讲,这是不安全的。特别是秘密性要求比较严格的数据,比如说密码。

2.学生作业的更新操作

这个问题一开始困扰我好久,有想过设置触发器,或者另写一个函数去判断是否有同一个同学对于同一份作业的判断,后来我采取了较为简单的一种方法,

String sqlString = "insert into student_homework(no, hno, sno, htitle, hcontent) values (?,?,?,?,?)ON DUPLICATE KEY UPDATE hcontent=? ";

这里我使用了INSERT ON DUPLICATE KEY UPDATE这种更新方式,在数据库设置主键之后,就可以实现对于同一个同学同一份作业的更新操作了。

3.jsp中css和js文件无法加载

这个问题开始也困扰了我,我按照网上的方式在web.xml里配置好了拦截:

<!-- 配置对静态资源的处理 -->
  <servlet-mapping>
    <servlet-name>default </servlet-name>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.css</url-pattern>
    <url-pattern>*.map</url-pattern>
    <url-pattern>*.jpg</url-pattern>
    <url-pattern>*.png</url-pattern>
    <url-pattern>*.eot</url-pattern>
    <url-pattern>*.svg</url-pattern>
    <url-pattern>*.ttf</url-pattern>
    <url-pattern>*.woff</url-pattern>
    <url-pattern>*.otf</url-pattern>
    <url-pattern>*.woff2</url-pattern>
    <url-pattern>*.gif</url-pattern>
  </servlet-mapping>

但是最后一直都无法产出图片以及我设置的样式,最后我终于找到了问题所在:
这是我更改之后的目录结构
在这里插入图片描述
css和js文件夹应该位于webapp文件夹下,我一开始放到了WEB-INF文件下,一直无法加载,希望大家借鉴,下次避免犯错。

猜你喜欢

转载自blog.csdn.net/weixin_44004667/article/details/106833843