📄 dispatchservlet.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 + -