- 浏览: 78784 次
- 性别:
- 来自: 北京
-
最新评论
-
wteqiao:
[color=orange][/color]
annotation(@Retention) -
hanwesley:
谢谢,我在你的基础之上学习的。感觉还不错。
我理解的lucene原理(初级) -
DepthJava:
一直没找到,能完全解析EMial的方法。包括MIME解析
乱 ...
MIME协议分析(转) -
hardPass:
能看看你的mvc-config.xml 啊?
自制MVC框架:TonyMVC -
geek87:
非常好的资料..支持一下
spring2.5 注解技术
MVC框架已经使用的非常广泛了,现在我也自制一个MVC框架来加深我对MVC框架的理解。
首先MVC共分三个内容,M(MODEL)V(VIEW)C(controller)。
M:主要就是一些Action,用来处理业务内容和数据库的操作。
V:视图,用于向用户显示内容。
C:所有的请求由这里来管理,进行分配。分发业务请求。
1 在web.xml文件中加入一个servlet,去拦截所有的满足条件请求,这些请求由控制键(C)来进行分发管理。
<servlet> <description>DispatchServlet</description> <display-name>DispatchServlet</display-name> <servlet-name>DispatchServlet</servlet-name> <servlet-class>com.hrbust.mvc.controller.DispatchServlet</servlet-class> <init-param> <description>Configuration File</description> <param-name>configFile</param-name> <param-value>WEB-INF/mvc-config.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DispatchServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
其中具有自制MVC框架的配置文件:mvc-config.xml,当做参数设置在servlet中。
2 controller文件:
初始化:读取配置文件,把相应的Action信息加入到ActionMap中。
并获取ActionMap。此时ActionMap为缓存。
doGet方法: 取得请求URL,把它进行拆分。
Controller中使用了ConfigHelper类来加载缓存。
package com.hrbust.mvc.controller; import java.io.IOException; import java.lang.reflect.Method; import java.util.Map; 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; import com.hrbust.mvc.action.ActionPackager; import com.hrbust.mvc.config.ConfigHelper; import com.hrbust.mvc.util.RegexUtil; /** * Action分发类<br> * 将请求分派给指定Action处理 * * @author Welkin * */ public class DispatchServlet extends HttpServlet { private static final long serialVersionUID = 1131523345611250389L; private static final String CONTENT_TYPE="text/html;charset=UTF-8"; private Map<String,ActionPackager> actionsMap; /*public static String DataURL=null; public static String MarkURL=null; public static String PastePicsURL=null;*/ /** * Constructor of the object. */ public DispatchServlet() { super(); } /** * Initialization of the servlet. <br> * * @throws ServletException if an error occurs */ public void init() throws ServletException { //read config values from the web.xml // 通过ServletContext取得工程的绝对物理路径 ServletContext sct = getServletContext(); String realPath = sct.getRealPath("/"); // 通过ServletConfig实例取得初始化参数configFile ServletConfig config=this.getServletConfig(); String CfgFile=config.getInitParameter("configFile"); // 组合配置文件全物理路径 CfgFile=realPath+CfgFile; //创建ConfigHelper对象,初始化actionsMap ConfigHelper configHelper=new ConfigHelper(CfgFile,config); actionsMap=configHelper.getActionsMap(); } /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log actionsMap=null; } /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE); // 取得请求的URL String reqURL=request.getServletPath(); // 取得模式匹配字符串,取得请求后缀 String patternStr; if(reqURL.contains("?")){ patternStr=RegexUtil.getMatchedString("([.])(.*)?",reqURL); } else{ patternStr=RegexUtil.getMatchedString("([.])(.*)$",reqURL); } // 取得请求的Action名称 String actionName=RegexUtil.getMatchedString("/(.*)[.]"+patternStr,reqURL); ActionPackager actionPackager=actionsMap.get(actionName); //如果请求的Action为空,则返回404错误 if(actionPackager==null) response.sendError(HttpServletResponse.SC_NOT_FOUND); else{ String methodName=request.getParameter(actionPackager.getMethodName()); //执行Action中的方法 Class<?> actionClass=actionPackager.getActionClass(); Object actionObj=actionPackager.getActionObj(); try { Method method = actionClass.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class); method.invoke(actionObj, request,response); } catch (NoSuchMethodException e) { //如果请求方法不存在,抛出404错误 response.sendError(HttpServletResponse.SC_NOT_FOUND); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * The doPost method of the servlet. <br> * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
3 ConfigHelper文件:
用来加载配置文件。
创建Action的包装类ActionPackager和Action的工厂类ActionFactory。
package com.hrbust.mvc.config; import java.io.File; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.ServletConfig; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import com.hrbust.mvc.ActionFactory; import com.hrbust.mvc.action.Action; import com.hrbust.mvc.action.ActionPackager; /** * 配置文件Helper类<br> * 用于获取配置文件相关 * * @author Welkin * */ public class ConfigHelper { public static Log log=LogFactory.getLog(ConfigHelper.class); private ActionFactory actionFactory; private Document document; /** * 构造函数,加载配置文件,初始化document * @param configFile */ public ConfigHelper(String configFile,ServletConfig servletConfig){ log.info("加载mvc配置文件..."); try { File file = new File(configFile); SAXReader reader = new SAXReader(); document = reader.read(file); } catch (DocumentException e) { log.error("配置文件不存在或格式不正确"); e.printStackTrace(); } log.info("初始化ActionFactory..."); if(servletConfig==null){ try { throw new Exception(); } catch (Exception e) { log.error("ServletConfig参数为Null,ActionFactory初始化失败"); e.printStackTrace(); } }else{ actionFactory=new ActionFactory(servletConfig); } } public Map<String,ActionPackager> getActionsMap(){ log.info("读取mvc配置文件,装载至缓存中..."); Map<String,ActionPackager> actionsMap=new HashMap<String,ActionPackager>(); Element root = document.getRootElement(); List<?> actionElms=root.elements("action"); //遍历所有action元素 for(int i=0;i<actionElms.size();i++){ Element actionElm = (Element)actionElms.get(i); ActionPackager action=new ActionPackager(); String actionClassPath=actionElm.attributeValue("class"); Action actionObj=actionFactory.getActionInstance(actionClassPath); action.setName(actionElm.attributeValue("name")); action.setClassPath(actionClassPath); action.setMethodName(actionElm.attributeValue("method")); action.setActionClass(actionObj.getClass()); action.setActionObj(actionObj); actionsMap.put(action.getName(), action); } log.info("装载完成"); return actionsMap; } }
4 ActionFactory
ActionFactory的工厂类。用来创建Action。
package com.hrbust.mvc.action; import javax.servlet.ServletConfig; /** * SuperAction<br> * 所有Action的父类 * * @author Welkin */ public abstract class Action{ private static ServletConfig config; /** * 注入servletConfig * * @param servletConfig */ public static void setServletConfig(ServletConfig servletConfig){ config=servletConfig; } /** * 得到ServletConfig * * @return */ protected ServletConfig getServletConfig(){ return config; } }
5 ActionPackager
Action相关信息的包装类。
package com.hrbust.mvc; import javax.servlet.ServletConfig; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.hrbust.mvc.action.Action; /** * Action 工厂 * * @author Welkin * */ public class ActionFactory { public static Log log=LogFactory.getLog(ActionFactory.class); private ServletConfig servletConfig; public ActionFactory(ServletConfig servletConfig){ this.servletConfig=servletConfig; } /** * 得到Action实例 * @return */ public Action getActionInstance(String actionClassPath){ Class<?> actionClass=null; Action actionObj=null; try { //向Action中注入servletConfig Action.setServletConfig(servletConfig); //实例化Action子类 actionClass=Class.forName(actionClassPath); actionObj= (Action)actionClass.newInstance(); log.debug("创建"+actionClassPath+"实例"); }catch (ClassNotFoundException e) { log.error("Action相关类没有找到"); e.printStackTrace(); }catch (Exception e) { e.printStackTrace(); } return actionObj; } }
- tonyMVC.zip (642.9 KB)
- 下载次数: 34
发表评论
-
spring MVC
2009-08-14 20:15 1188第一步:在web.xml文件中加入<listener&g ... -
hibernate中hbm详解
2009-03-31 17:32 12561. 主键( id ) Hibernate的 ... -
spring2.5 注解技术
2009-03-30 17:58 4484注释配置和 XML 配置的适用场合 是否有了这些 IOC ... -
jpa的了解
2009-03-29 19:44 11671 jpa对hibernate编程所需要引入的包: h ... -
hbm2dll的使用
2009-03-29 13:04 1316在开发过程中,我们可以先设计数据库,然后由MyEclipse自 ... -
spirng aop(非注释方式)
2009-03-04 18:40 985在某些时候,我们工程中使用的JDK 不一定就是1.5 以 ... -
dao时测试getHiberanteTemple()为null
2009-02-14 18:56 784在对写的一个DAO进行junit测试时,发现getHibera ... -
spring中读取applicationgContext.xml
2009-02-14 18:35 1073当我把spring的配置文件转移到WEB-INF目录下以后,再 ... -
struts1异常的处理分析
2009-02-13 16:40 22301 异常链 当不需要用户来处理和关心原始的异常时,常见的做 ... -
Xdoclet 介绍
2009-02-11 16:25 1518Xdoclet 基本概念 我们可以在 java 代码中使用类 ... -
org.apache.commons.dbcp.BasicDataSource找不到?
2009-02-10 16:04 3204在spring的配置文件中org.apache.commons ... -
ssh整合开发
2009-02-06 11:05 13321 加入j2ee的jar包。放入lib中来 (注意,最好把ja ... -
createProxy(AbstractEntityTuplizer.java:372)异常的解决方
2009-02-06 11:00 817http://hi.baidu.com/ligong_haer ... -
Spring控制的Hibernate中代理异常
2008-12-27 19:06 899阅读全文 类别:默认分类?查看评论 -
Struts2.0学习笔记
2009-01-19 14:48 704阅读全文 类别:默认分类?查看评论 -
struts2.0学习笔记2
2009-01-20 16:36 674阅读全文 类别:默认分类?查看评论
相关推荐
嵌入式八股文面试题库资料知识宝典-华为的面试试题.zip
训练导控系统设计.pdf
嵌入式八股文面试题库资料知识宝典-网络编程.zip
人脸转正GAN模型的高效压缩.pdf
少儿编程scratch项目源代码文件案例素材-几何冲刺 转瞬即逝.zip
少儿编程scratch项目源代码文件案例素材-鸡蛋.zip
嵌入式系统_USB设备枚举与HID通信_CH559单片机USB主机键盘鼠标复合设备控制_基于CH559单片机的USB主机模式设备枚举与键盘鼠标数据收发系统支持复合设备识别与HID
嵌入式八股文面试题库资料知识宝典-linux常见面试题.zip
面向智慧工地的压力机在线数据的预警应用开发.pdf
基于Unity3D的鱼类运动行为可视化研究.pdf
少儿编程scratch项目源代码文件案例素材-霍格沃茨魔法学校.zip
少儿编程scratch项目源代码文件案例素材-金币冲刺.zip
内容概要:本文深入探讨了HarmonyOS编译构建子系统的作用及其技术细节。作为鸿蒙操作系统背后的关键技术之一,编译构建子系统通过GN和Ninja工具实现了高效的源代码到机器代码的转换,确保了系统的稳定性和性能优化。该系统不仅支持多系统版本构建、芯片厂商定制,还具备强大的调试与维护能力。其高效编译速度、灵活性和可扩展性使其在华为设备和其他智能终端中发挥了重要作用。文章还比较了HarmonyOS编译构建子系统与安卓和iOS编译系统的异同,并展望了其未来的发展趋势和技术演进方向。; 适合人群:对操作系统底层技术感兴趣的开发者、工程师和技术爱好者。; 使用场景及目标:①了解HarmonyOS编译构建子系统的基本概念和工作原理;②掌握其在不同设备上的应用和优化策略;③对比HarmonyOS与安卓、iOS编译系统的差异;④探索其未来发展方向和技术演进路径。; 其他说明:本文详细介绍了HarmonyOS编译构建子系统的架构设计、核心功能和实际应用案例,强调了其在万物互联时代的重要性和潜力。阅读时建议重点关注编译构建子系统的独特优势及其对鸿蒙生态系统的深远影响。
嵌入式八股文面试题库资料知识宝典-奇虎360 2015校园招聘C++研发工程师笔试题.zip
嵌入式八股文面试题库资料知识宝典-腾讯2014校园招聘C语言笔试题(附答案).zip
双种群变异策略改进RWCE算法优化换热网络.pdf
内容概要:本文详细介绍了基于瞬时无功功率理论的三电平有源电力滤波器(APF)仿真研究。主要内容涵盖并联型APF的工作原理、三相三电平NPC结构、谐波检测方法(ipiq)、双闭环控制策略(电压外环+电流内环PI控制)以及SVPWM矢量调制技术。仿真结果显示,在APF投入前后,电网电流THD从21.9%降至3.77%,显著提高了电能质量。 适用人群:从事电力系统研究、电力电子技术开发的专业人士,尤其是对有源电力滤波器及其仿真感兴趣的工程师和技术人员。 使用场景及目标:适用于需要解决电力系统中谐波污染和无功补偿问题的研究项目。目标是通过仿真验证APF的有效性和可行性,优化电力系统的电能质量。 其他说明:文中提到的仿真模型涉及多个关键模块,如三相交流电压模块、非线性负载、信号采集模块、LC滤波器模块等,这些模块的设计和协同工作对于实现良好的谐波抑制和无功补偿至关重要。
内容概要:本文探讨了在工业自动化和物联网交汇背景下,构建OPC DA转MQTT网关软件的需求及其具体实现方法。文中详细介绍了如何利用Python编程语言及相关库(如OpenOPC用于读取OPC DA数据,paho-mqtt用于MQTT消息传递),完成从OPC DA数据解析、格式转换到最终通过MQTT协议发布数据的关键步骤。此外,还讨论了针对不良网络环境下数据传输优化措施以及后续测试验证过程。 适合人群:从事工业自动化系统集成、物联网项目开发的技术人员,特别是那些希望提升跨协议数据交换能力的专业人士。 使用场景及目标:适用于需要在不同通信协议间建立高效稳定的数据通道的应用场合,比如制造业生产线监控、远程设备管理等。主要目的是克服传统有线网络限制,实现在不稳定无线网络条件下仍能保持良好性能的数据传输。 其他说明:文中提供了具体的代码片段帮助理解整个流程,并强调了实际部署过程中可能遇到的问题及解决方案。
基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于C#实现的检测小说章节的重复、缺失、广告等功能+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档