package action;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.digester.Digester;
import org.apache.commons.digester.xmlrules.DigesterLoader;
import org.xml.sax.SAXException;
import config.ActionConfig;
import config.ForwardConfig;
import config.ModuleConfig;
public class ActionServlet extends HttpServlet {
private ModuleConfig moduleConfig;
private Map<String,Object> actions=new HashMap<String ,Object>();
public void init() throws ServletException {
//创建digester,利用rule.xml进行解析
Digester digester=DigesterLoader.createDigester(ActionServlet.class.getClassLoader().getResource("config/rule.xml"));
//moduleConfig==action-mappings
moduleConfig=new ModuleConfig();
//单利模式
digester.push(moduleConfig);
try {
digester.parse(ActionServlet.class.getClassLoader().getResourceAsStream("struts.xml"));
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try{
String path=request.getServletPath();//例如/first.do
path=path.substring(0, path.lastIndexOf(".do"));//切割字符串成/first
//通过path找到ActionConfig
ActionConfig actionConfig=moduleConfig.findAction(path);
Object action=actions.get(actionConfig.getPath());
//单例
if(action==null){//如果action空的创建一个,通过反射type=action.MemberAction创建实例
String type=actionConfig.getType();
action=Class.forName(type).newInstance();
actions.put(path, action);//将action放入map中
}
//取得是方法名,例如regist
String method=actionConfig.getMethod();
//得到method方法,传进去的参数是httpservletrequest和httpservletresponse
Method m=action.getClass().getMethod(method, HttpServletRequest.class,HttpServletResponse.class);
//invoke是执行这个方法,返回个字符串
String name=(String) m.invoke(action, request,response);
//通过该字符串,例如‘success’进行转发,这里是取得forwardconfig
ForwardConfig forwardConfig=actionConfig.findForward(name);
//通过get方法取得path
String forward=forwardConfig.getPath();
//如果forwardconfig的redirect属性是true重定向
if(forwardConfig.isRedirect()==true){
response.sendRedirect(request.getContextPath()+forward);//例如/ognl+/show/member/login重定向
}else{
request.getRequestDispatcher(forward).forward(request, response);//否则直接请求转发
}
}catch(Exception e){
e.printStackTrace();
throw new ServletException();
}
}
}
这是struts1 中央控制器的核心代码