Servlet连接数据库查询班级及相应班级学生

Posted gikin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet连接数据库查询班级及相应班级学生相关的知识,希望对你有一定的参考价值。

简介:访问Servlet跳转到jsp显示班级,点击不同班级调取数据库相应的学员信息,以表格形式显示。

服务器:Tomcat

JDBC使用之前的随笔的方法

访问班级显示的Servlet:

package cn.hrh.clazzList;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ShowClazz extends HttpServlet 
    private static final long serialVersionUID = 3989966239821421177L;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        doPost(request, response);
    

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");
        request = new SelectDB().selectClazz(request);
        //携带着班级集合信息请求转发到jsp
        request.getRequestDispatcher("classlist.jsp").forward(request, response);
    


    public HttpServletRequest selectClazz(HttpServletRequest request) 
        String SQL = "select * from t_clazz;";
        Connection conn = DB_Conn.openDB();
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<Clazz> clazzList = new ArrayList<Clazz>();
        Clazz clazz = null;
        try 
            ps = conn.prepareStatement(SQL);
            rs = ps.executeQuery();
            while (rs.next()) 
                //利用反射每次查询到一条数据便构建一个实体
                clazz = new Clazz();
                //依次绑定查询到的结果集中包含班级编号,班级名,归属地
                clazz.setId(rs.getInt(1));
                clazz.setClazzName(rs.getString(2));
                clazz.setClazzLocation(rs.getString(3));
                //把每次得到的实体存储到集合中
                clazzList.add(clazz);
            
            //将集合绑定到request中
            request.setAttribute("clazzList", clazzList);
         catch (SQLException e) 
            e.printStackTrace();
         finally 
            DB_Conn.closeDB(conn, ps, rs);
        

        return request;
    

 

班级显示JSP

<%@page import="cn.hrh.clazzList.Clazz"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <base href="<%=basePath%>">
  <title>班级列表</title>
</head>
<body>
  <ul>
      <!-- 提取request作用域中存储的班级集合,遍历 -->
    <c:forEach items="$requestScope.clazzList" var="clazz">
      <!-- 按照不同的班级给url中绑定对应的班级编号,用于后续查询数据库中对应班级学生,同时提取集合中的班级名显示在页面中 -->
      <li><a href="showstudent?clazzno=$clazz.id ">$clazz.clazzName </a></li>
    </c:forEach>
  </ul>
</body>
</html>

效果:技术图片

点击对应的班级便会跳转到学生显示的Servlet

学生表格Servlet:

public class ShowStudent extends HttpServlet 
    private static final long serialVersionUID = 4296651983747427811L;
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        doPost(request, response);
    
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");
        String clazzno = request.getParameter("clazzno");
        request = new SelectDB().selectStudent(request, clazzno);
        //携带需要的数据请求转发
        request.getRequestDispatcher("studentlist.jsp").forward(request, response);
    

public HttpServletRequest selectStudent(HttpServletRequest request,String clazzno) 
        String SQL = "select distinct * from t_student where clazz_id = ?;";
        Connection conn = DB_Conn.openDB();
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<Student> studentList = new ArrayList<Student>();
        try 
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, Integer.parseInt(clazzno));
            rs = ps.executeQuery();
            while (rs.next()) 
                //反射获得实体
                Class<? extends Student> clazz = Student.class;
                //获得实例
                Object clazzInstanc = clazz.newInstance();
                ResultSetMetaData rsmd = rs.getMetaData();
                for (int i = 0; i < rsmd.getColumnCount(); i++) 
                    //获得字段名
                    String colName = rsmd.getColumnName(i + 1);
                    //获得结果集中的对应行数据
                    Object colValue = rs.getObject(i + 1);
                    //反射获得对应字段名的属性对象
                    Field stuField = clazz.getDeclaredField(colName.toLowerCase());
                    //获得对应属性的set方法
                    Method stuMethod = clazz.getDeclaredMethod(creatSetter(colName), stuField.getType());
                    //传递对象和参数调用对应方法赋值
                    stuMethod.invoke(clazzInstanc, colValue);
                
                //将每次获得的对象添加到集合
                studentList.add((Student) clazzInstanc);
            
            //对象集合绑定到request中
            request.setAttribute("studentList", studentList);
         catch (Exception e) 
            e.printStackTrace();
        
        return request;
    

    public String creatSetter(String colName) 
        String setMethod = "set" + colName.substring(0, 1).toUpperCase() + colName.substring(1);
        return setMethod;
    

学生表格JSP:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="cn.hrh.clazzList.Student"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>学生列表</title>

  </head>
  
  <body>
    <table border=1>
        <tr>
            <td>ID</td><td>StudentName</td><td>StudentAge</td><td>StudentGender</td><td>StudentPhone</td><td>Clazz_ID</td>
        </tr>
            <!-- 遍历学生集合 -->
            <c:forEach items="$requestScope.studentList " var="item">
            <tr>
                <!-- 利用EL取得对应的值 -->
                <td>$item.id </td><td>$item.studentname </td><td>$item.studentage </td><td>$item.studentgender </td><td>$item.studentphone </td><td>$item.clazz_id </td>
            </tr>
            </c:forEach>
    </table>
    <button type="button" onclick="javascript:window.location.href=‘studentadd.jsp‘">学员添加</button>
  </body>
</html>

效果图(假设查询java班):技术图片

添加学员Servlet:

public class StudentAdd extends HttpServlet 
    private static final long serialVersionUID = 1529395767721242677L;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        doPost(request, response);
    

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");
        int isSuccess = new InsertStudent().insertDB(new InsertStudent().insertStudent(request));
        if (isSuccess == 1) 
            //若成功添加再请求转发
            request.getRequestDispatcher("showclazz").forward(request, response);
         else 
            PrintWriter out = response.getWriter();
            out.write("<script>window.location.href=studentadd.jsp;window.confirm(‘添加失败‘);</script>");
        
    


public class InsertStudent 
    public Object setField(Object obj,Field field) 
        String name = field.getName();
        String methodName = "get" + name.substring(0,1).toUpperCase() + name.substring(1);
        Object setValue = null;
        try 
            Method method = obj.getClass().getMethod(methodName);
            setValue = method.invoke(obj);
         catch (Exception e) 
            e.printStackTrace();
        
        return setValue;
    
    public Object insertStudent(HttpServletRequest request)
        //获取添加的学生的数据的Map
        Map<String, String[]> paraMap = request.getParameterMap();
        //获得Key
        Set<String> paraKey = paraMap.keySet();
        Class<Student> stuClazz = Student.class;
        Student stuInstance = null;;
        try 
            stuInstance = stuClazz.newInstance();
         catch (InstantiationException e1) 
            e1.printStackTrace();
         catch (IllegalAccessException e1) 
            e1.printStackTrace();
        
        for (String key : paraKey) 
            //通过Key获得对应的值
            String[] values = request.getParameterValues(key);
            try 
                Field field = stuClazz.getDeclaredField(key);
                Method stuMethod = stuClazz.getDeclaredMethod(creatSetter(key), field.getType());
                //由于mysql中的int类型对应Java的Integer,所以需要一步转换
                if (field.getType().getName().equals("int") || field.getType().getName().equals("java.lang.Integer")) 
                    //每个Key均只有一个值,所以只需要取String[]第一个值便可
                    stuMethod.invoke(stuInstance, Integer.parseInt(values[0]));
                 else 
                    stuMethod.invoke(stuInstance, values[0]);
                
             catch (Exception e) 
                e.printStackTrace();
            
        
        return stuInstance;
    
    public String creatSetter(String colName) 
        String setMethod = "set" + colName.substring(0, 1).toUpperCase() + colName.substring(1);
        return setMethod;
    
    
    public int insertDB(Object stuInstance)
        int isSuccess = 0;
        //数据库中的id为主键且自增,所以不需要绑定
        String sql = "insert into t_student(studentname,studentage,studentgender,studentphone,clazz_id) values(?,?,?,?,?);";
        Connection conn = DB_Conn.openDB();
        PreparedStatement ps = null;
        try 
            ps = conn.prepareStatement(sql);
            Field[] stuFields = stuInstance.getClass().getDeclaredFields();
            for (int i = 0; i < stuFields.length-1; i++) 
                ps.setObject(i+1, setField(stuInstance, stuFields[i+1]));

            
            isSuccess = ps.executeUpdate();
            conn.commit();
         catch (Exception e) 
            e.printStackTrace();
         finally
            DB_Conn.closeDB(conn, ps);
        
        return isSuccess;
    
    

新学员信息表单:

<form action="studentadd" method="GET">
    学生姓名:<input type="text" name="studentname"><br>
    学生年龄:<input type="text" name="studentage"><br>
    学生性别:<input type="text" name="studentgender"><br>
    学生手机:<input type="text" name="studentphone"><br>
    学生班级:<input type="text" name="clazz_id"><br>
    <input type="submit" value="确认添加">
  </form>

效果:技术图片

以上是关于Servlet连接数据库查询班级及相应班级学生的主要内容,如果未能解决你的问题,请参考以下文章

MySql内连接查询

连接查询和数据库设计

查询学生信息表班级的平均成绩

mysql连接查询

sql多表连接 班级号 是一个单独的表! 当要查询全部班级时候却显示不出来。。!! 困惑- -

Hibernate 映射及查询