基于tomcat的在线教学网站的开发 - -完成学生成绩的录入

实验目的

帮助学生理解MVC开发模式,增强上机动手的能力。

实验内容

  • 在实验一、实验二的基础上,在线教学网站系统增加学生成绩模块,实现如下功能:按照MVC模式的一般步骤,在jsp页面中录入学生信息(学号,姓名,考试成绩),由servlet将该信息存放在JavaBeans对象中,最后再由jsp页面显示录入的学生信息。
  • 使用数据库将录入的成绩保存,另外通过数据库展示已经录入成绩的同学的信息

使用JavaBean的方法录入

Constructor.java

package demo;

import javax.persistence.Column;

public class Constructor {
    private String name;
    private String number;
    private String score;

    public Constructor() {
    }

    public Constructor(String name, String number, String score) {
        this.name = name;
        this.number = number;
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getScore() {
        return score;
    }

    public void setScore(String score) {
        this.score = score;
    }
}
  • 构造器是配合录入成绩的逻辑文件使用的

InformationServlet.java

package demo;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

@WebServlet({"/informationServlet"})
public class InformationServlet extends HttpServlet{
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");
        String name=req.getParameter("name");
        String number=req.getParameter("number");
        String score=req.getParameter("score");
        Constructor constructor=new Constructor(name,number,score);
        HttpSession session=req.getSession();
        synchronized (session)
        {
            session.setAttribute("constructor",constructor);
        }
        RequestDispatcher rd=req.getRequestDispatcher("/display.jsp");
        rd.forward(req,resp);

此文件需要注意的细节以及相关重要函数

  • 需要首先设置编码格式,避免名字的输入为中文的时候出现的乱码
  • synchronized是Java的一个关键字,是一个同步锁,因为HttpSession对象不是线程安全的,其他Servlet和JSP页面可能在多个线程中同时访问或修改这些对象

Information.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>录入成绩</title>
</head>
<style>

</style>
<body>
<h4>请输入你的姓名、学号、考试成绩</h4>
<form action="informationServlet" method="post">
    <br>请输入你的姓名: <input type="text" name="name"></br>
    <br>请输入你的学号:<input type="text" name="number"></br>
    <br>请录入你的考试成绩:<input type="text" name="score" ></br>
    <br><input type="submit" value="录入">
</form>
</body>
</html>

运行效果展示
在这里插入图片描述

display.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:useBean id="constructor" class="demo.Constructor" scope="session"/>
<html>
<head>
    <title>成绩显示页面</title>
</head>
<body>
<h4>你的成绩信息如下</h4>
<table border="1">
    <tr>
        <td>学生姓名:</td>
        <td><jsp:getProperty name="constructor" property="name"/></td>
    </tr>
    <tr>
        <td>学生学号:</td>
        <td><jsp:getProperty name="constructor" property="number"/></td>
    </tr>
    <tr>
        <td>你的成绩:</td>
        <td>
            <jsp:getProperty name="constructor" property="score"/>
        </td>
    </tr>
</table>
</body>
</html>

相关重要函数

  • <jsp:useBean id=“constructor” class=“demo.Constructor” scope=“session”/>使用了jsp:useBean动作,这是用来在指定的作用域中查找或创建一个bean实例
  • id属性是用来唯一表示一个bean实例。在JSP页面实现类中,id的值被作为Java语言的变量
  • scope属性指令bean实例的作用域,该属性取值有应用作用域、会话作用域、请求作用域和页面作用域,这里使用的是会话作用域
  • class属性指定构建bean实例的Java类,这里只想的是Constructor类
  • jsp:getProperty动作检索并向输出流打印bean的值,语法如下
<jsp:getProperty name="beanName" 
property="propertyName"/>

我们这里是容器打印constructor的name、number、score的值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hGSnteeQ-1637313064888)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/757cdc3e-66e4-4d34-b27c-a0c6837735bb/Untitled.png)]

在这里插入图片描述

使用数据库并且能保存每一次录入的成绩以及最后展示所有人的成绩

分析

这里只需要在原理基础上进行添加相关代码即可

informationServlet.java新增的

//在前面的informationServlet.java的后面加入这部分即可
try {
            Class.forName("com.mysql.jdbc.Driver");
            String url="jdbc:mysql://localhost:3306/实验2";
            Connection conn= DriverManager.getConnection(url,"root","huo0326");
            String sql="insert into information values(?,?,?)";
            PreparedStatement pstmt=conn.prepareStatement(sql);
            pstmt.setString(1,name);//第一行插入名字
            pstmt.setString(2,number);//第二行插入学号
            pstmt.setString(3,score);//第三行插入成绩这个和数据库建立的表的顺序是有关系的

            int res=pstmt.executeUpdate();
            if(res>0)
            {
                System.out.println("数据插入成功,差不多得了");//用来在控制台看
            }
            pstmt.close();
            conn.close();
        }
        catch (SQLException | ClassNotFoundException e)
        {
            e.printStackTrace();
        }
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b2jyATRp-1637313064891)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/3ed08841-d762-4e77-a319-8cf872f17081/Untitled.png)]

相关分析

  • 首先我们要在Navicat Premium新建对应名字的数据库实验2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u1aZ44P3-1637313064893)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/cc998af2-f0fe-442f-ac69-856b2ef30c82/Untitled.png)]

  • Class.Forname用于加载数据库驱动
  • 进行数据库的连接时要进行相应jar包的导入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-07wNmSqg-1637313064894)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/df0a4921-c33e-487f-a296-77a6d1a8a98b/Untitled.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Cup7BHY-1637313064895)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1ce76525-e22b-4d6f-9d84-2c975c4e618f/Untitled.png)]

  • 上图是来连接我们的数据库,user是用来填写数据库的用户名,password用来填写你建立数据库的时候的密码
  • PreparedStatement pstmt=conn.prepareStatement(sql);用来处理插入语句

效果如下(这是插入了小虎和cryin的数据之后控制台显示的)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WurOZPXI-1637313064896)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/61319e24-222c-4dee-b625-a5b9194d8a97/Untitled.png)]

查看我们的数据库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-beKV35Ah-1637313064897)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4d395d38-4358-43b1-a30f-464c1191a3dc/Untitled.png)]
(部分信息涉及到班上同学的隐私故不作显示)

imformationDataServlet.java

package demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import java.io.*;
import java.sql.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/InformationDataServlet")
//一定要加/否则会报错
//这部分的代码是用于查询的
public class InformationDataServlet extends HttpServlet {
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";

    public static void main(String[] args) {
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);//报错遇到过不支持Get方法添加了就可以了
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            Connection connection = null;
            Statement stmt = null;
            resp.setHeader("Content-type", "text/html;charset=UTF-8");//告知浏览器编码方式;
            resp.setCharacterEncoding("UTF-8");
            Class.forName("com.mysql.jdbc.Driver");
            connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/实验2?useSSL=false&allowPublicKeyRetrieval=true","root","huo0326");
            stmt=connection.createStatement();
            String sql;
            sql="select * from information";
            ResultSet rs=stmt.executeQuery(sql);
            PrintWriter out= resp.getWriter();
            out.print("<html><body>");
            out.print("<table>");
            out.print("<table border='1'>");
            while (rs.next())
            {
                String Sname= rs.getString("Sname");
                String Sno= rs.getString("Sno");
                String Sscore=rs.getString("Sscore");
                out.print("<tr><td>学生姓名</td><td>"+Sname+"</td>"+"<td>学生学号</td><td>"+Sno+"</td>"+"<td>学生成绩</td><td>"+Sscore+"</td></tr>");
            }
            out.print("</table>");
            out.print("</body></html>");

        } catch (Exception e) {

        }

    }
}
  • 此代码用于最后显示查询录入的成绩

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gCqndU2x-1637313064898)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/11d41280-ae53-4978-a1b8-f99de87b8084/Untitled.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-66MABAjx-1637313064899)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/b8cb46dd-7d4e-44e1-a5d5-9e9ceac4b555/Untitled.png)]

总结

  • 虽然这是最后一次javaweb的实验,但是还是会继续自己根据自己的想法做下去的
  • 利用数据库部分是这次完成的最久的期间遇到过许多问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TsyZI0Td-1637313064899)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/b8298951-c5fa-48b1-b658-d70d8ad54e04/Untitled.png)]

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VvkSOf3L-1637313064901)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ef33a1bd-6d26-4a56-ba9c-6158b8d634ab/Untitled.png)]

  • 原本的想法是想通过一个链接通过jsp页面去展示,但是经常报错自己也没弄懂后来选择使用Servlet通过映射模式去显示显得更为简单
  • 第二个图向数据库插入语句语法不对导致一直没有成绩显示出来,跳转后的页面一直为空
  • 第三个图的错误是原先在while循环下输出,但是一直报错,没有想懂为什么,但是同学这样做就可以。

这是注释掉的那部分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wTtD37QT-1637313064902)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/03adc46d-24e1-48d0-b980-767a5cbc537c/Untitled.png)]

  • 遇到问题多去检索便可以找到解决办法
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值