知识大全 设计自己的MVC框架
Posted 控制器
篇首语:愿你一生努力,一生被爱。想要的都拥有,得不到的都释怀。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 设计自己的MVC框架相关的知识,希望对你有一定的参考价值。
设计模式:设计自己的MVC框架 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
源代码放在的邮箱的收件箱里 用户名:sharesource 密码:javafans希望保留给有用的人 谢谢 取这样一个标题太大 吸引眼球嘛@_@ 事实是最近读《J EE设计模式》讲述表达层模式的那几章 书中有一个前端控制器+mand模式的workflow例子 就琢磨著可以很简单地扩展成一个MVC框架 花了一个下午改写了下 对书中所述的理解更为深入 我想这也许对于学习和理解设计模式 以及初次接触struts等MVC框架的人可能有点帮助 因为整个模型类似于struts 我把它取名叫strutslet^_^ 学习性质 切勿认真 (一)完整的类图如下 前端控制器(FrontController):前端控制器提供了一个统一的位置来封装公共请求处理 它的任务相当简单 执行公共的任务 然后把请求转交给相应的控制器 在strutslet中 前端控制器主要作用也在于此 它初始化并解析配置文件 接受每个请求 并简单地把请求委托给调度器(Dispatcher) 由调度器执行相应的动作(Action) 调度器把action返回的url返回给FrontController FrontController负责转发 Action接口 mand模式很好的例子 它是一个命令接口 每一个实现了此接口的action都封装了某一个请求 新增一条数据记录并更新model 或者把某个文件写入磁盘 命令解耦了发送者和接受者之间联系 发送者调用一个操作 接受者接受请求执行相应的动作 因为使用Command模式解耦 发送者无需知道接受者任何接口 Dispatcher 调度器 负责流程的转发 负责调用action去执行业务逻辑 由调度器选择页面和action 它去除了应用行为和前端控制器间的耦合 调度器服务于前端控制器 它把model的更新委托给action 又提供页面选择给FrontController ActionForward 封装了转向操作所需要信息的一个模型 包括name和转向url ActionModel 解析配置文件后 将每一个Action封装成一个ActionModel对象 所有ActionModel构成一个map 并存储在ServletContext中 供整个框架使用 (二)源代码简单分析 Action接口 只有一个execute方法 任何一个action都只要实现此接口 并实现相应的业务逻辑 最后返回一个ActionForward 提供给Dispacher调用- public interface Action public ActionForward execute(HttpServletRequest request ServletContext context);
- public class LoginAction implements Action private String name= ; public ActionForward execute(HttpServletRequest request ServletContext context) String userName=request getParameter( userName ); String password=request getParameter( password ); if(userName equals( dennis )&&password equals( )) request setAttribute( name name); return ActionForward SUCCESS; //登陆成功 返回success else return ActionForward FAIL; //否则 返回fail
还是先来看下两个模型 ActionForward和ActionModel 没什么东西 属性以及相应的getter setter方法
- /** * 类说明:转向模型 * @author dennis * * */public class ActionForward private String name; //forward的name private String viewUrl; //forward的url public static final ActionForward SUCCESS= new ActionForward( success ); public static final ActionForward FAIL= new ActionForward( fail ); public ActionForward( String name) this name=name; public ActionForward( String name String viewUrl) super(); this name = name; this viewUrl = viewUrl; // name和viewUrl的getter和setter方法
- public class ActionModel private String path; // action的path private String className; // action的class private Map< String ActionForward> forwards; // action的forward public ActionModel() public ActionModel( String path String className Map< String ActionForward> forwards) super(); this path = path; this className = className; this forwards = forwards; // 相应的getter和setter方法
- <?xml version= encoding= UTF ?> <actions> <action path= /login class= strutslet demo LoginAction > <forward name= success url= hello jsp /> <forward name= fail url= fail jsp /> </action> </actions>
- public interface Dispatcher public void setServletContext(ServletContext context); public String getNextPage(HttpServletRequest request ServletContext context);
- public String getNextPage(HttpServletRequest request ServletContext context) setServletContext(context); Map< String ActionModel> actions = (Map< String ActionModel>) context getAttribute(Constant ACTIONS_ATTR); //从ServletContext得到所有action信息 String reqPath = ( String) request getAttribute(Constant REQUEST_ATTR); //发起请求的path ActionModel actionModel = actions get(reqPath); //根据path得到相应的action String forward_name = ; ActionForward actionForward; try Class c = Class forName(actionModel getClassName()); //每个请求对应一个action实例 Action action = (Action) c newInstance(); actionForward = action execute(request context); //执行action的execute方法 forward_name = actionForward getName(); catch ( Exception e) log error( can not find action +actionModel getClassName()); e printStackTrace(); actionForward = actionModel getForwards() get(forward_name); if (actionForward == null) log error( can not find page for forward +forward_name); return null; else return actionForward getViewUrl(); //返回ActionForward的viewUrl
前端控制器(FrontController) 它的任务我们已经很清楚 初始化配置文件 存储所有action到ServletContext供整个框架使用 得到发起请求的path 提供给Dispachter查找相应的action 调用Dispatcher 执行getNextPage方法得到下一个页面的url并转发
- public void init() throws ServletException //初始化配置文件 ServletContext context=getServletContext(); String config_file =getServletConfig() getInitParameter( config ); String dispatcher_name=getServletConfig() getInitParameter( dispatcher ); if (config_file == null || config_file equals( )) config_file = /WEB INF/strutslet config xml ; //默认是/WEB INF/下面的strutslet config if(dispatcher_name== null||dispatcher_name equals( )) dispatcher_name=Constant DEFAULT_DISPATCHER; try Map< String ActionModel> resources = ConfigUtil newInstance() //工具类解析配置文件 parse(config_file context); context setAttribute(Constant ACTIONS_ATTR resources); //存储在ServletContext中 ( 初始化strutslet配置文件成功 ); catch ( Exception e) log error( 初始化strutslet配置文件失败 ); e printStackTrace(); //实例化Dispacher try Class c = Class forName(dispatcher_name); Dispatcher dispatcher = (Dispatcher) c newInstance(); context setAttribute(Constant DISPATCHER_ATTR dispatcher); //放在ServletContext ( 初始化Dispatcher成功 ); catch( Exception e) log error( 初始化Dispatcher失败 ); e printStackTrace();
- protected void process(HttpServletRequest request HttpServletResponse response) throws ServletException IOException ServletContext context = getServletContext(); //获取action的path String reqURI = request getRequestURI(); int i=reqURI lastIndexOf( ); String contextPath=request getContextPath(); String path=reqURI substring(contextPath length() i); request setAttribute(Constant REQUEST_ATTR path); Dispatcher dispatcher = (Dispatcher) context getAttribute(Constant DISPATCHER_ATTR); // make sure we don t cache dynamic data response setHeader( Cache Control no cache ); response setHeader( Pragma no cache ); // use the dispatcher to find the next page String nextPage = dispatcher getNextPage(request context); //调用Dispatcher的getNextPage // forward control to the view RequestDispatcher forwarder = request getRequestDispatcher( / + nextPage); forwarder forward(request response); //转发页面
- <servlet> <servlet name>StrutsletController</servlet name> <servlet class>re FrontController</servlet class> <! <init param> <param name>config</param name> <param value>/WEB INFstrutslet config xml</param value> </init param> > <load on startup> </load on startup> </servlet> <servlet mapping> <servlet name>StrutsletController</servlet name> <url pattern>* action</url pattern> </servlet mapping>
相关参考
自己动手实现Asp.net的MVC框架 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 了解JAV
ASP.NETMVC2.0之MVC框架简介 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Web
.NETWeb开发震撼之变:.NETMVC框架 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 开源MVC框架 XX Framework 1.1 发布
开源MVC框架XXFramework1.1发布 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! X
逃脱Asp.NetMVC框架 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
浅谈Hibernate框架简述 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在基于MVC设计模
SpringMVC框架的高级配置(下) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 上文介绍S
浅谈对.NETMVC框架的理解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 近来我发现有很多关
ASP.NETMVC4框架揭秘 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 第章ASPNET+
知识大全 对于Struts和Spring两种MVC框架的比较[2]
对于Struts和Spring两种MVC框架的比较[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下