在之前的博客中,我们每个操作都创建了一个servlet,其实可以把这些操作都写到一个servlet里面。
但是这种写法,需要很多Switchcase,有没有办法,传过来的方法名是什么就自动调用对应的方法呢,可以的,这就需要用到反射了,反射是javaee框架设计的灵魂,下节我们开始讲反射。
StudentServlet
package com.test.servlet;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.test.pojo.Student;
import com.test.util.DbHelper;
/**
* Servlet implementation class StudentServlet
*/
@WebServlet("/StudentServlet")
public class StudentServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public StudentServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//默认调用的方式为showStudents
String method="showStudents";
//如果有method(方法名) 传递过来 说明要调用不同的方法 获得该方法名
if(request.getParameter("method")!=null)
{
method=request.getParameter("method");
}
//根据传递过来的方法名来调用不同的方法
/*
switch(method)
{
case "showStudents": showStudents(request, response);break;
case "addStudent": addStudent(request, response);break;
case "editStudent":editStudent(request, response);break;
case "updateStudent":updateStudent(request, response);break;
case "deleteStudent":deleteStudent(request, response);break;
}*/
//优化后:
//通过反射的方式找到指定的方法
Class clazz= StudentServlet.class;
try {
Method methodObj= clazz.getDeclaredMethod(method, HttpServletRequest.class,HttpServletResponse.class);
methodObj.invoke(this, request,response);
} catch (NoSuchMethodException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void showStudents(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//查询出所有的学生列表
String sql="select * from student";
DbHelper dbHelper=new DbHelper();
// map(sid=>2001001 sname=>"李向明"....)
List<Map<String, Object>> studentList= dbHelper.executeQuery(sql, null);
List<Student> list=new ArrayList<Student>();
//将list中的map组装成student对象
for(Map<String, Object> map:studentList)
{
Student student=new Student();
student.setSid(Integer.parseInt(map.get("sid").toString()));
student.setSname(map.get("sname").toString());
student.setMajor(map.get("major").toString());
student.setStu_class(map.get("class").toString());
list.add(student);
}
//传到jsp页面展示
request.setAttribute("list", list);
//转发到jsp页面
request.getRequestDispatcher("showStudentList.jsp").forward(request, response);
}
protected void addStudent(HttpServletRequest request, HttpServletResponse response) throws IOException
{
//获得表单数据
String sname=request.getParameter("sname");
String major=request.getParameter("major");
String stu_class=request.getParameter("stu_class");
//存入数据库
String sql="insert into student values(null,?,?,?)";
List<Object> paramList=new ArrayList<Object>();
paramList.add(sname);
paramList.add(major);
paramList.add(stu_class);
DbHelper dbHelper=new DbHelper();
if(dbHelper.executeUpdate(sql, paramList)>0)
{
//跳转到学生列表页面
response.sendRedirect("StudentServlet?method=showStudents");
}
else
response.getWriter().println("添加失败");
}
protected void editStudent(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//获得sid
int sid=Integer.parseInt(request.getParameter("sid"));
//查询当前学生的信息
String sql="select * from student where sid=?";
List<Object> paramList=new ArrayList<Object>();
paramList.add(sid);
DbHelper dbHelper=new DbHelper();
List<Map<String, Object>> list= dbHelper.executeQuery(sql, paramList);
//传到jsp页面
if(list!=null && list.size()>0)
{
Student student=new Student();
student.setSid(sid);
student.setSname(list.get(0).get("sname").toString());
student.setMajor(list.get(0).get("major").toString());
student.setStu_class(list.get(0).get("class").toString());
request.setAttribute("student",student);
request.getRequestDispatcher("editStudent.jsp").forward(request, response);
}
}
protected void updateStudent(HttpServletRequest request, HttpServletResponse response) throws IOException
{
//1.获得表单的数据
int sid=Integer.parseInt(request.getParameter("sid"));
String sname=request.getParameter("sname");
String major=request.getParameter("major");
String stu_class=request.getParameter("stu_class");
//2.更新数据库信息
String sql="update student set sname=?,major=?,class=? where sid=?";
List<Object> paramList=new ArrayList<Object>();
paramList.add(sname);
paramList.add(major);
paramList.add(stu_class);
paramList.add(sid);
DbHelper dbHelper=new DbHelper();
if(dbHelper.executeUpdate(sql, paramList)>0)
{
//3.跳转到显示学生列表页面
response.sendRedirect("StudentServlet?method=showStudents");
}
else
response.getWriter().println("修改失败");
}
protected void deleteStudent(HttpServletRequest request, HttpServletResponse response) throws IOException
{
//获得sid
int sid=Integer.parseInt(request.getParameter("sid"));
//删除当前sid对应的学生
String sql="delete from student where sid=?";
List<Object> paramList=new ArrayList<Object>();
paramList.add(sid);
DbHelper dbHelper=new DbHelper();
if(dbHelper.executeUpdate(sql, paramList)>0)
{
//跳转到显示学生列表
response.sendRedirect("StudentServlet?method=showStudents");
}
}
/**
* @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);
}
}
showStudent.jsp
<%@page import="java.util.List,com.test.pojo.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="1" width=500>
<c:forEach var="student" items="${list}">
<tr>
<td>${student.sid}</td>
<td>${student.sname}</td>
<td>${student.major}</td>
<td>${student.stu_class}</td>
<td><a href="StudentServlet?method=editStudent&sid=${student.sid}">修改</a></td>
<td><a href="javascript:if(confirm('确定要删除吗')) location.href='StudentServlet?method=deleteStudent&sid=${student.sid}'">删除</a></td>
</tr>
</c:forEach>
</table>
<a href="addStudent.jsp">添加</a>
</body>
</html>