⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dispatchservlet.java

📁 一个学习Java反射的例子
💻 JAVA
字号:
package com.struts.servlet;

import java.lang.reflect.Method;

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

/**
 * 用于分发命令到其它Servlet的总控Servlet
 * 
 * @author Administrator
 * 
 */
public class DispatchServlet extends HttpServlet {

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

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, java.io.IOException {
		request.setCharacterEncoding("UTF-8");
		// 通过ServletContext取得工程的绝对物理路径
		ServletContext ctx = getServletContext();
		String realPath = ctx.getRealPath("/"); // 输出的是C:\Tomcat 5.0\webapps\MyWeb\;其中MyWeb是工程名字

		// 通过ServletConfig实例取得初始化参数configFile
		ServletConfig config = this.getServletConfig();
		String mockStrutsCfgFile = config.getInitParameter("configFile");
		// 组合配置文件全物理路径
		mockStrutsCfgFile = realPath + mockStrutsCfgFile; // 输出的是C:\Tomcat 5.0\webapps\MyWeb\WEB-INF\config.xml;其中WEB-INF\config.xml是配置文件里配置了的

		// 取得请求的URI
		String reqUri = request.getRequestURI(); // 输出的是/MyWeb/login.go
		
		//对reqUri进行分解,获取其path和method
		int last = reqUri.indexOf(".");
		int begin = reqUri.lastIndexOf("/");
		String methodName = request.getParameter("method");

//		// 其实StringUtil的作用就是取 请求URI的后缀,比如*.do的do,这里是*.go的go
//		//String patternStr;
//		//if (reqUri.contains("?")) {
//			//patternStr = StringUtil.getMatchedString("([.])(.*)?", reqUri);
//		//} else {
//			//patternStr = StringUtil.getMatchedString("([.])(.*)$", reqUri);
//		//}
//
//		// 取得处理请求的Servlet名,如login.go就取其中的login,若是check.go就取其中的check。
//		//String servletName = StringUtil.getMatchedString("/(.*)/(.*)[.]" + patternStr, reqUri);
		
		String servletName = reqUri.substring(begin, last);
		// 其实ServletFinder类的作用是分析xml配置文件
		ServletFinder finder = new ServletFinder(mockStrutsCfgFile, servletName);
		String servletClass = finder.getServletClass();
		try {
			ActionMapping mapping = new ActionMapping();
			mapping.setRequest(request);
			mapping.setResponse(response);
			mapping.setForwards(finder.getForwards());
			
			// 通过反射调用真正的Servlet类进行处理
			Class cls = Class.forName(servletClass);
			Object servlet = (Object) cls.newInstance();
			//利用反射机制来调用运行类的某个方法
			Object[] args = new Object[3];
			args[0] = mapping;
			args[1] = request;
			args[2] = response;
			Class[] argsClass = new Class[3];
			argsClass[0] = ActionMapping.class;
			argsClass[1] = HttpServletRequest.class;//注意:需要这样声明
			argsClass[2] = HttpServletResponse.class;
			Method method = cls.getMethod(methodName, argsClass);
			method.invoke(servlet, args);
			//调用doPost方法
			//servlet.service(request, response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, java.io.IOException {
		doPost(request, response);
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -