struts1 ActionServlet核心代码

 
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 中央控制器的核心代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值