Servlet搬砖笔记—反射机制的妙用

最近弄点小东西,由于客户需求,必须用servlet+jsp,知道这个消息我是拒绝的,但砖还要搬


逻辑理好后,如果按一般的servlet的写法,代码会显得异常的臃肿,百度了一下,单Servlet的写法(不怎么玩Servlet,这方式早就有了)


实在是经典!!! 近一年的工作中越来越喜欢 泛型和反射。


下面简单的说一下我项目中如何运用的,以登陆为例


首先是 login.jsp,这里话只截取了部分代码

    

我传递了一个参数  method=userLogin


接下来看Servlet

这里我定义了一个 BaseHttpServlet 作为基类

BaseHttpServlet.java

package com.slv.controller;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

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

public class BaseHttpServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		execute(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		execute(req, resp);
	}

	
	/**利用反射查找方法
	 * */
	public void execute(HttpServletRequest req, HttpServletResponse resp) {
		//userLogin
		String methodName = req.getParameter("method");
		try {
			Method method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class,
					HttpServletResponse.class);
			method.invoke(this, req, resp);
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (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 goTo(String url,HttpServletRequest req,HttpServletResponse resp){
		try {
			req.getRequestDispatcher(url+".jsp").forward(req, resp);
		} catch (ServletException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 重定向
	 * */
	protected void redirect(String url,HttpServletRequest req,HttpServletResponse resp){
		try {
			resp.sendRedirect(req.getContextPath()+url+".jsp");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	


}

可以看到不管是Get 或者Post方法,最终我都会执行 exeute方法

Method method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class,
					HttpServletResponse.class);
method.invoke(this, req, resp);

反射的妙用  通过方法名和参数直接获取到 Method 对象 然后  调用  invoke 方法 运行,关于反射机制的学习,我是在慕课网看的,感兴趣的同学自行学习

好了接下来在我的 LoginServlet.java(继承了BaseHttpServlet.java)中定义了登陆的方法

/**
	 * 用户登陆
	 * @throws IOException 
	 * */
	public void userLogin(HttpServletRequest req, HttpServletResponse resp) throws IOException{//.......细节就不展开了}

这样的话我们只用在对应的Servlet中取添加方法就行,不用创建多个Servlet,有种Spring MVC controller的感觉(还是框架好)


以上为本次Servlet的搬砖总结


你可能感兴趣的:(Java,Web)