1. 程式人生 > >利用 JSP 中的反射機制封裝一個 Servlet ,就不用每張表的每個方法都寫一個 Servlet

利用 JSP 中的反射機制封裝一個 Servlet ,就不用每張表的每個方法都寫一個 Servlet

基類 Servlet 程式碼如下:

package com.yibin.cn.servlet;

import java.awt.print.Printable;
import java.io.IOException;
import java.lang.reflect.Method;

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

public class BaseServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// post中文亂碼處理
		request.setCharacterEncoding("utf-8");
		// 響應到客戶端的亂碼處理
		response.setCharacterEncoding("utf-8");
		// 響應到客戶端的頭部亂碼處理
		response.setContentType("text/html;charset=UTF-8");

		//獲取動作引數
		String action = request.getParameter("action");
		System.out.println(action);
		if(action==null||"".equals(action.trim())){//引數為空或空字串.
			response.getWriter().print("你提交的是非法引數");
		    return;
		}
		//反射機制:反射可以做未來不確定的事情。用反射機制得到該物件的方法物件。
		Method method;
		try {
			//獲取本類方法,傳遞引數:動作、引數型別。
			method = this.getClass().getMethod(action, HttpServletRequest.class,HttpServletResponse.class);
			//通過method方法物件呼叫方法
			//User user = new User();
			//user.getName();
			method.invoke(this, request,response);//this呼叫method,傳遞引數request和response。
		} catch (Exception e) {
            System.out.println("你提交的是非法引數");
			e.printStackTrace();
		} 
	}
}
使用者表的Servlet程式碼如下(可以直接實現本表需要的各個操作,繼承自基類(實現了反射機制以及亂碼處理)):
package com.yibin.cn.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import utils.Page;

import com.yibin.cn.dao.entity.User;
import com.yibin.cn.service.IUserService;
import com.yibin.cn.service.impl.UserServiceImpl;

public class UserServlet extends BaseServlet {
	// 登入
	public void login(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("login方法被呼叫");
		// 1、獲取資料
		// 2、封裝資料
		// 3、呼叫API
		// 4、控制跳轉
	}

	// 增
	public void add(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("add方法被呼叫");
		// 獲取資料
		// 2、封裝資料
		// 3、呼叫API
		// 4、控制跳轉		
}// 刪public void delete(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("delete方法被呼叫");
		// 獲取資料
		// 2、封裝資料
		// 3、呼叫API
		// 4、控制跳轉
}// 改public void update(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("update方法被呼叫");
		// 獲取資料
		// 2、封裝資料
		// 3、呼叫API
		// 4、控制跳轉
}// 查public void listAll(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("listAll方法被呼叫");
		// 獲取資料
		// 2、封裝資料
		// 3、呼叫API
		// 4、控制跳轉
}// 分頁public void getPage(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("getPage方法被呼叫");
		// 獲取資料
		// 2、封裝資料
		// 3、呼叫API
		// 4、控制跳轉
}}
如上,原來一個方法需要寫一個 servlet,現在都封裝到一個表名命名的servlet了,既方便,結構又清晰,呼叫如下所示:
			request.getRequestDispatcher("UserServlet?action=delete").forward(request, response);

通過跳轉到指定方法來呼叫,主要要傳遞動作引數 "action" ,然後 BaseServlet 利用反射機制就會幫你呼叫對應的方法,是不是很方便呢。

對了,servlet還需要配置,在工程目錄:工程名/WebContent/WEB-INF/web.xml 加上以下程式碼:

   <!-- 基類Servlet -->
  <servlet>
    <servlet-name>BaseServlet</servlet-name>
    <servlet-class>com.yibin.cn.servlet.BaseServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>BaseServlet</servlet-name>
    <url-pattern>/BaseServlet</url-pattern>
  </servlet-mapping>
  
     <!-- 通用UserServlet -->
  <servlet>
    <servlet-name>UserServlet</servlet-name>
    <servlet-class>com.yibin.cn.servlet.UserServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>UserServlet</servlet-name>
    <url-pattern>/UserServlet</url-pattern>
  </servlet-mapping> 

至此大功告成!