学生信息管理系统
1. 系统需求分析
用户实现注册、登录功能,登录成功后可以进入主页进行查看学生信息,对学生信息进行增删改查。
2. 技术
jsp、mysql、MVC模式。
3. 问题及解决方法:
(1)空指针异常问题
在运行主界面实现增删改查功能时遇到了报java.lang.NullPointerException的错误,根据前辈的总结,我依次排查了字符串是否初始化了、接口类型的对象是否使用了具体的类初始化,比如(List It;会产生报错,而List It=new ArrayList();却不会报错)、当然还有一种情况,就是如果一个对象的值为空时,我未能判断为空的情况,
比如:
If(rb!=null);
String 类型的对象可做如下的判断
If(rb!==null&&!””.equals(rb))
还有可做判断其是否不为空字符
If(rb!==null&&!””.equals(rb.trim()))
最后,我依次排查发现自己的字符串中有未初始化的部分,修改后成功解决空指针问题,也学会了排查空指针的基本流程和解决方案。
(2)关于使用preparestatement对象中遇到的索引值问题
一开始我将索引值设为0,导致了索引不到第一个变量name的值,后来查询了preparestatement对象的使用规范,PreparedStatement可以写参数化查询,比Statement能获得更好的性能。数据库可以使用已经编译过及定义好的执行计划,这种预处理语句查询比普通的查询运行速度更快。PreparedStatement可以阻止常见的SQL注入式攻击。“?” 叫做占位符,但是占位符的索引位置从1开始而不是0,代码示例如下:
String sql=“insert into user values(0,?,?,?,?,?,?)”;
PreparedStatement ps=connection.prepareStatement(sql);
ps.setString(1,name);
ps.setString(2,sex);
ps.setString(3,age);
ps.setString(4,major);
ps.setString(5,score)
ps.setString(6,height);
(3)关于数据库mysql主键问题
唯一性原则:主键值必须唯一标识表中的每一行,且不能为null,即表中不可能存在两行数据有相同的主键值;一个列名在复合主键中只能出现一次; 即使是复合主键,主键所有列值不能为NULL;主键约束即在表中定义一个主键来唯一确定表中每一行数据的标识符。
成功连接数据库实现注册登入的功能,主要实现细节如下(以注册后端为例,登入后端大同小异):
package servlet;
import java.sql.*;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
- Servlet implementation class RegisterServlet
/
@WebServlet("/RegisterServlet")
public class RegisterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(“text/html;charset=gb2312”);
response.setCharacterEncoding(“gb2312”);
request.setCharacterEncoding(“UTF-8”);
String user = request.getParameter(“username”); //从表单获取用户名
String pass = request.getParameter(“password”); //从表单获取密码
response.getWriter().println(user+pass); //测试
connectsql(user,pass);
response.getWriter().println(“注册成功”);
response.getWriter().println(“
返回登陆页面”);
}
/*- @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
protected int connectsql(String username, String password){
Connection con = null;
PreparedStatement pstm = null;
try {
// 加载数据库驱动
Class.forName(“com.mysql.cj.jdbc.Driver”);
// 通过驱动管理类获取数据库链接
con= DriverManager.getConnection(“jdbc:mysql://localhost:3306/bb?”+ “user=root&password=331319&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8”);
//.getConnection(“jdbc:mysql://localhost:3306/user?serverTimezone=UTC&characterEncoding=utf-8”,“root”, “123456”);
String sql = “insert into users(username,password) value(?,?)”;
pstm = con.prepareStatement(sql);
pstm.setString(1, username);
pstm.setString(2, password);
int row = pstm.executeUpdate();
System.out.println(“新增数据为:” + row + “条”);
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
finally{
if(con != null){
try {
con.close();
}
catch (SQLException e) {
e.printStackTrace();
}
}
if(pstm != null){
try {
pstm.close();
}
catch (SQLException e) {
e.printStackTrace();
}
}
}
return 0;
}
}
查看jsp页面:
<%@ page import="java.sql." language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
- @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
<% ResultSet rs=null; Statement statement=null; try{ Class.forName("com.mysql.jdbc.Driver"); Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/bb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC","root","331319"); String sql="select * from user order by ID asc"; statement=connection.createStatement(); rs=statement.executeQuery(sql); int pagesize,count,pageCount,intpage; //一页显示的记录数,总记录,总页数,当前页 String strPage; //当前页的字符串形式 int i; pagesize=3; strPage=request.getParameter("page"); if(strPage==null){ intpage=1; }else{ //将strPage转换成int类型,因为通过request获取到的都是string类型 intpage=Integer.parseInt(strPage); } if(intpage<1){ intpage=1; } rs.last(); //将光标移到ResultSet结果集最后一行 count=rs.getRow(); pageCount=(count+pagesize-1)/pagesize; //计算总页数 if(intpage>count){ //如果当前页大于总记录数,设置当前页的值等于总记录数 intpage=count; } if(count>0){ rs.absolute((intpage-1)*pagesize+1); } i=0; while(i
ID | 姓名 | 性别 | 年龄 | 专业 | 高考分数 | 身高 | 操作 |
删除jsp:
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8” import=“java.sql.*”%>
删除用户
<% String id=request.getParameter("id"); //获取query页面的参数id int userid=Integer.parseInt(id); try{ Class.forName("com.mysql.jdbc.Driver"); //加载驱动 Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/bb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC","root","331319"); //连接数据库 String sql="delete from user where id="+userid; PreparedStatement ps=connection.prepareStatement(sql);
int result=ps.executeUpdate();
if(result==1){
response.sendRedirect("query.jsp");
}
else{
out.print("删除失败");
}
}catch(Exception e){
out.print("there is something wrong");
}
%>
增加jsp(体现preparestation对象对数据库数据预处理):
String sql="insert into user values(0,?,?,?,?,?,?)";
PreparedStatement ps=connection.prepareStatement(sql);
ps.setString(1,name);
ps.setString(2,sex);
ps.setString(3,age);
ps.setString(4,major);
ps.setString(5,score);
ps.setString(6,height);
int result=ps.executeUpdate();
if(result==1){
//添加成功后跳回查看界面
response.sendRedirect("query.jsp");
}
EL表达式在修改jsp中的应用:
修改用户信息
姓名:
性别:
年龄:
专业:
高考分数:
身高: