Javaee CURDの最適化

前回のブログでは、オペレーションごとにサーブレットを作成しましたが、実際には、これらすべてのオペレーションを 1 つのサーブレットに記述することができます。
しかし、この書き方では多くの Switchcase が必要です。渡されたメソッド名に従って、対応するメソッドを自動的に呼び出す方法はありますか? はい、これにはリフレクションの使用が必要です。リフレクションは javaee フレームワーク設計の魂です。次のセクションでは、リフレクションについて説明します。

Studentサーブレット

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>

おすすめ

転載: blog.csdn.net/Rockandrollman/article/details/131370591