实验目的
帮助学生理解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的值
使用数据库并且能保存每一次录入的成绩以及最后展示所有人的成绩
分析
这里只需要在原理基础上进行添加相关代码即可
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();
}
}
}
相关分析
- 首先我们要在Navicat Premium新建对应名字的数据库实验2
- Class.Forname用于加载数据库驱动
- 进行数据库的连接时要进行相应jar包的导入
- 上图是来连接我们的数据库,user是用来填写数据库的用户名,password用来填写你建立数据库的时候的密码
PreparedStatement pstmt=conn.prepareStatement(sql);
用来处理插入语句
效果如下(这是插入了小虎和cryin的数据之后控制台显示的)
查看我们的数据库
(部分信息涉及到班上同学的隐私故不作显示)
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) {
}
}
}
- 此代码用于最后显示查询录入的成绩
总结
- 虽然这是最后一次javaweb的实验,但是还是会继续自己根据自己的想法做下去的
- 利用数据库部分是这次完成的最久的期间遇到过许多问题
- 原本的想法是想通过一个链接通过jsp页面去展示,但是经常报错自己也没弄懂后来选择使用Servlet通过映射模式去显示显得更为简单
- 第二个图向数据库插入语句语法不对导致一直没有成绩显示出来,跳转后的页面一直为空
- 第三个图的错误是原先在while循环下输出,但是一直报错,没有想懂为什么,但是同学这样做就可以。
这是注释掉的那部分
- 遇到问题多去检索便可以找到解决办法