struts1 ActionServlet核心代码

来源:互联网 发布:买电动车上淘宝 编辑:程序博客网 时间:2024/05/18 12:29
 
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-mappingsmoduleConfig=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.dopath=path.substring(0, path.lastIndexOf(".do"));//切割字符串成/first//通过path找到ActionConfigActionConfig 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中}//取得是方法名,例如registString method=actionConfig.getMethod();//得到method方法,传进去的参数是httpservletrequest和httpservletresponseMethod m=action.getClass().getMethod(method, HttpServletRequest.class,HttpServletResponse.class);//invoke是执行这个方法,返回个字符串String name=(String) m.invoke(action, request,response);//通过该字符串,例如‘success’进行转发,这里是取得forwardconfigForwardConfig forwardConfig=actionConfig.findForward(name);//通过get方法取得pathString 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 中央控制器的核心代码
原创粉丝点击