系列链接:
✨JavaWeb项目实战亲自动手手敲上线小项目的第一天✨
✨JavaWeb项目实战亲自动手手敲上线小项目的第二天✨
✨JavaWeb项目实战亲自动手手敲上线小项目的第三天✨
✨JavaWeb项目:实战亲自动手手敲上线小项目部分功能的第四天优化✨
JavaWeb项目实战第三天进展
今天是第三天了,我有一个思考,如果真的有人能跟着我一起去跟进,哪怕是跟我一起出错,之后再去解决错误,一步步的往下进行,事无巨细啊,我想他一定会有所收获的。
实现流程与思想与过程1
那今天又是新的一天,今天计划完成后续的所有实现,那我们直接进入主题,说一说接下来要完成的实现功能。
1.新增学生的实现流程
1.1首先实现我们年级的动态获取
- 当我们在页面中点击[新增学生]这一选择时,就跳转到新增学生的页面,那其实有一个点要注意,那就是我们的班级(学生是有班级的,但是班级这个不是学生表中的数据,是外键),所以是根据数据库去动态获取的。那我们就可以去发送一个请求到
/Educational/student/getGradeList
,那我们就去新建一个处理类GradeListServlet
去接收一下。 - 那在
GradeListServlet
中我们首先实现://查询年级列表的方法。那我们在service层和dao层都添加上getList方法,最后在GradeDaoImpl
中编写查询sql语句,之后返回查询结果集,然后while循环遍历数据,之后将数据添加到List集合中,那最后就是关闭资源,返回list的数据。 - 之后我们回到GradeListServlet
那我们是首先调用service对象,让它去调用getList方法,那返回的是一个Grade集合,那我们之后就要把数据显示在页面中,那就要去存储这个数据,之后我们就进行跳转到add.jsp(新增学生页面),那我们跳转到add.jsp
把我们的1班2班3班转换成动态数据就可以使用<c:forEach></c:forEach>去循环,那这就和list.jsp一样了。我们导入jstl标签库,之后循环把数据进行展示。
新增学生功能实现1
按照流程一步一步走,首先去新建一个GradeListServlet
处理类,
@WebServlet("/Educational/student/getGradeList")
public class GradeListServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//查询年级列表的方法
}
}
那这里是还没有内容的,那我们就去service和dao层依次添加,
首先是GradeService
:
public interface GradeService {
/**
* 查询年级列表的方法
*/
public List<Grade> getList();
}
还有GradeDao
public interface GradeDao {
/**
* 查询年级列表的方法
*/
public List<Grade> getList();
}
那还有GradeServiceImpl
public class GradeServiceImpl implements GradeService {
private GradeDao dao = new GradeDaoImpl();
@Override
public List<Grade> getList() {
return dao.getList();
}
}
这里返回dao层方法,去向上查询,到dao层实现类GradeDaoImpl
:
public class GradeDaoImpl extends DBUtils implements GradeDao {
@Override
public List<Grade> getList() {
List gs = new ArrayList();
try {
String sql="select * from grade";
resultSet = query(sql, null);
while(resultSet.next()){
Grade grade = new Grade();
grade.setGradeId(resultSet.getInt("gradeid"));
grade.setGradeName(resultSet.getString("gradename"));
gs.add(grade);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
closeAll();
}
return gs;
}
}
这里我们首先写一个全查sql语句,将结果给resultSet,让其遍历获取数据,之后定义一个List集合对象,将前面的数据添加到List中,那之后closeAll关闭资源,最后返回list集合。
之后我们回到GradeListServlet
去调取。
@WebServlet("/Educational/student/getGradeList")
public class GradeListServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//查询年级列表的方法
GradeService service = new GradeServiceImpl();
List<Grade> list = service.getList();
req.setAttribute("glist",list);
req.getRequestDispatcher("add.jsp").forward(req,resp);
}
}
调用service对象,让它去调用getList方法,那返回的是一个Grade集合,那我们之后就要把数据显示在页面中,那就要去存储这个数据,存完之后我们就进行跳转到add.jsp。
<tr>
<td>班级<span style="color:red">*</span>:</td>
<td>
<select name="gid">
<c:forEach items="${glist}" var="g">
<option value="${g.gradeId}">${g.gradeName}</option>
</c:forEach>
</select>
</td>
</tr>
那我们跳转到add.jsp
把我们的1班2班3班转换成动态数据就可以使用<c:forEach></c:forEach>去循环,那这就和list.jsp一样了。我们导入jstl标签库,之后循环把数据进行展示。
好,我们去看一下效果:
那我们可以看到这是一个可选择的年级,那其实呢,这是第二次的展示,第一次只有三个年级,我是直接去数据库又添加了两个年级,之后更新数据,之后刷新页面重新打开就是五个年级,那这就说明我们已经成功的从数据库动态获取年级了。
那当我们点击左下角新增呢是可以回到我们的学生列表数据的,然后可以查看我们新增的学生信息,就会出现错误:
那这是我写的一个路径,那现在是没有内容的额,那我们就去把它填充一下。完善整个新增功能的实现。
实现流程与思想与过程2
2.新增学生的实现流程
2.1实现添加数据到数据库的过程
- 当我点击[添加]时,我们在表单提交我们的信息,那这个是以post的方式去提交数据,之后就按照之前那个addStu的路径请求,我们新建一个处理类
AddStuServlet
去实现功能。 - 在
AddStuServlet
中我们还是三步走
1 接收参数;
2 调取service方法,封装为Student对象,之后会传递给insertStudent的方法,那方法执行完成后会返回一个受影响行数i
3 之后我们根据受影响的行数去判断去跳转哪一个页面。
新增学生功能实现2
那我们话不多说,直接就是上代码:
我们的第一步接收参数:
req.setCharacterEncoding("utf-8");//防止乱码
//1. 接收参数
String stuNo = req.getParameter("stuNo");
String stuname = req.getParameter("stuName");
String gid = req.getParameter("gid");
String sex = req.getParameter("sex");
String email = req.getParameter("email");
String phone = req.getParameter("phone");
String registered = req.getParameter("registered");
String address = req.getParameter("address");
String politics = req.getParameter("politics");
String idnumber = req.getParameter("idNumber");
String profession = req.getParameter("profession");
String introdction = req.getParameter("introdction");
那在第二步调取service之前,要注意的是,我们这次要调取的是StudentService
接口:
所以要在StudentService
接口中新增一个方法:
/**
* 新增学生
*/
public int insertStu(Student student);
那由于我们上面的参数过多啊,总不能一个一个添加,那样太麻烦了,所以我们可以去封装成一个Student对象。
那之后就是同样的,在StudentDao
中也去添加一个这样的方法:
那迭代后:
public interface StudentDao {
/**
* 获取学员的信息列表
*/
public List<Student> getStudents(String name,String stuno,int sex,int pageIndex,int pageSize);
/**
* 获得总条数(基于模糊查询)
*/
public int total(String name,String stuno,int sex);
/**
* 新增学生
*/
public int insertStu(Student student);
}
之后在相应的StudentServiceImpl
中添加:
@Override
public int insertStu(Student student) {
return dao.insertStu(student);
}
那我们的StudentDaoImpl
会比较麻烦一些,但过程与其他方法类似,
首先编写插入sql语句,之后将对应的数据添加到集合中,之后定义变量i为受影响的行数,之后进行try/catch,然后关闭资源,返回i。
@Override
public int insertStu(Student student) {
int i = 0;
//注意对应数据库表的列名,除了stuid不用设置,其他都用占位符,一定要与数据库表的列名一一对应
try {
String sql="insert into student values(null,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
List params = new ArrayList();
params.add(student.getStuName());
params.add(student.getStuNo());
params.add(student.getSex());
params.add(student.getPhone());
params.add(student.getEmail());
params.add(student.getRegistered());
params.add(student.getAddress());
params.add(student.getProfession());
params.add(student.getIdNumber());
params.add(student.getPolitics());
params.add(new Date()