- 浏览: 27136 次
- 性别:
- 来自: 北京
最新评论
-
bxf12315:
晕了,怎么能吧这篇文章转到论坛里啊!
如何借助“策略模式”才能避免程序中的if else -
bxf12315:
哦 ror我还没搞过。这个只是想用来带着我负责项目组的成员学学 ...
基于URL的契约式简易MVC框架 -
linhong_1001:
怎么都像是ROR,Grails就是这样做的
基于URL的契约式简易MVC框架 -
fmjasper:
你确定这个程序能通过? 不会跑出access exceptio ...
可更新的注册式的单实例模式 -
chian_xxp:
能否请楼主简要介绍下RegSingleton 类中static ...
可更新的注册式的单实例模式
一直以来对0配置的mvc框架很感兴趣。
最近,突发奇想,想试验一下如何利用url来实现契约式的mvc零配置框架。
首先,我们以一个普通的url为例。
"http://ipaddress:prot/project_name/business_name/moudle_name/action_name/"
我们假定从business_name开始我们对应的是java中的类包,moudle_name我们对应成 相应业务的对象名称。
而action_name则是 这个对象中的方法名称。
上面是我们假定的规则。
然后我们可以通过reflect可以找到这个请求相关的方法。这样就可以不同过配置文件来配置相关信息。
同事,我们在定义相对应的annotation来为操作成功失败后做跳转。
以上就是一个大概的思路。现在给大家看看相应的代码。
首先是我们的web。xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.4"
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
- <servlet>
- <servlet-name>action</servlet-name>
- <servlet-class>com.pig.hub.dev.frameWork.action.ActionServlet</servlet-class>
- <init-param>
- <param-name>filename</param-name>
- <param-value>pig.web</param-value>
- </init-param>
- <load-on-startup>0</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>action</servlet-name>
- <url-pattern>*.pig</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>action</servlet-name> <servlet-class>com.pig.hub.dev.frameWork.action.ActionServlet</servlet-class> <init-param> <param-name>filename</param-name> <param-value>pig.web</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.pig</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
其中定义了com.pig.hub.dev.frameWork.action.ActionServlet来去拦截所有的请求(。pig)。filename这个属性是为了给出系统中相应的完成的包名。
下面是ActionServlet相应的java代码
- import com.pig.hub.dev.frameWork.action.exception.MakeUriException;
- /**
- * @author
- */
- public abstract class AbActionServlet extends HttpServlet implements
- BasicActionServlet {
- /**
- *
- */
- private static final long serialVersionUID = 7911661010594064823L;
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- try {
- doWork(request, response);
- } catch (MakeUriException e) {
- }
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- try {
- doWork(request, response);
- } catch (MakeUriException e) {
- }
- }
- /**
- * @param request
- * @param response
- * @throws ServletException
- * @throws IOException
- * @see com.pig.hub.dev.frameWork.action.BasicActionServlet#doWork(javax.servlet.http.HttpServletRequest,
- * javax.servlet.http.HttpServletResponse)
- */
- public abstract void doWork(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException,
- MakeUriException;
- }
- ---------------------------------------------------------
import com.pig.hub.dev.frameWork.action.exception.MakeUriException; /** * @author */ public abstract class AbActionServlet extends HttpServlet implements BasicActionServlet { /** * */ private static final long serialVersionUID = 7911661010594064823L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { doWork(request, response); } catch (MakeUriException e) { } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { doWork(request, response); } catch (MakeUriException e) { } } /** * @param request * @param response * @throws ServletException * @throws IOException * @see com.pig.hub.dev.frameWork.action.BasicActionServlet#doWork(javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse) */ public abstract void doWork(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, MakeUriException; } ---------------------------------------------------------
- package com.pig.hub.dev.frameWork.action;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.pig.hub.dev.frameWork.action.exception.MakeUriException;
- /**
- *
- */
- public interface BasicActionServlet {
- /**
- * @param request
- * @param response
- * @throws ServletException
- * @throws IOException
- * @throws MakeUriException
- */
- public void doWork(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException,MakeUriException;
- }
- -------------------------------------------------------
package com.pig.hub.dev.frameWork.action; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.pig.hub.dev.frameWork.action.exception.MakeUriException; /** * */ public interface BasicActionServlet { /** * @param request * @param response * @throws ServletException * @throws IOException * @throws MakeUriException */ public void doWork(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException,MakeUriException; } -------------------------------------------------------
- package com.pig.hub.dev.frameWork.action;
- import java.io.IOException;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.HashMap;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.pig.hub.dev.frameWork.action.config.MethodBean;
- import com.pig.hub.dev.frameWork.action.exception.MakeUriException;
- import com.pig.hub.dev.frameWork.action.exception.MappingException;
- import com.pig.hub.dev.frameWork.action.exception.MethodException;
- public class ActionServlet extends AbActionServlet implements
- BasicActionServlet {
- /**
- *
- */
- private static final long serialVersionUID = 2848825411739564234L;
- private String fileName;
- public void init() throws ServletException {
- fileName = this.getInitParameter("filename");
- }
- @SuppressWarnings("unchecked")
- public void doWork(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException, MakeUriException {
- String s[] = BusinessConfig.makeUri(request);
- String errorMessage="";
- HashMap map = new HashMap();
- if (s.length > 2)
- throw new MakeUriException();
- try {
- MethodBean mBean = BusinessConfig.makeConfig(s, fileName);
- Method m = mBean.getM();
- Class c = mBean.getC();
- m.invoke(c.newInstance(), request, response);
- map = MappingUtil.makeHashMap(m);
- request.getRequestDispatcher((String) map.get("success")).forward(
- request, response);
- } catch (SecurityException e) {
- errorMessage = "someting";
- } catch (ClassNotFoundException e1) {
- errorMessage = "someting";
- } catch (MethodException e2) {
- errorMessage = "someting";
- } catch (NoSuchMethodException e3) {
- errorMessage = "someting";
- } catch (IllegalArgumentException e4) {
- errorMessage = "someting";
- } catch (IllegalAccessException e5) {
- errorMessage = "someting";
- } catch (InvocationTargetException e6) {
- errorMessage = "someting";
- } catch (InstantiationException e) {
- errorMessage = "someting";
- } catch (MappingException e) {
- errorMessage = "someting";
- } finally {
- if (!errorMessage.equals(""))
- request.getRequestDispatcher((String) map.get("fail")).forward(
- request, response);
- }
- }
- }
package com.pig.hub.dev.frameWork.action; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.pig.hub.dev.frameWork.action.config.MethodBean; import com.pig.hub.dev.frameWork.action.exception.MakeUriException; import com.pig.hub.dev.frameWork.action.exception.MappingException; import com.pig.hub.dev.frameWork.action.exception.MethodException; public class ActionServlet extends AbActionServlet implements BasicActionServlet { /** * */ private static final long serialVersionUID = 2848825411739564234L; private String fileName; public void init() throws ServletException { fileName = this.getInitParameter("filename"); } @SuppressWarnings("unchecked") public void doWork(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, MakeUriException { String s[] = BusinessConfig.makeUri(request); String errorMessage=""; HashMap map = new HashMap(); if (s.length > 2) throw new MakeUriException(); try { MethodBean mBean = BusinessConfig.makeConfig(s, fileName); Method m = mBean.getM(); Class c = mBean.getC(); m.invoke(c.newInstance(), request, response); map = MappingUtil.makeHashMap(m); request.getRequestDispatcher((String) map.get("success")).forward( request, response); } catch (SecurityException e) { errorMessage = "someting"; } catch (ClassNotFoundException e1) { errorMessage = "someting"; } catch (MethodException e2) { errorMessage = "someting"; } catch (NoSuchMethodException e3) { errorMessage = "someting"; } catch (IllegalArgumentException e4) { errorMessage = "someting"; } catch (IllegalAccessException e5) { errorMessage = "someting"; } catch (InvocationTargetException e6) { errorMessage = "someting"; } catch (InstantiationException e) { errorMessage = "someting"; } catch (MappingException e) { errorMessage = "someting"; } finally { if (!errorMessage.equals("")) request.getRequestDispatcher((String) map.get("fail")).forward( request, response); } } }
以上基本有一个抽象类一个接口一个实现构成,其实只是用到了简单的模板方法。
其中,String s[] = BusinessConfig.makeUri(request);是为了得到url中相应的业务名对象名以及方法名称。
然后通过MethodBean mBean = BusinessConfig.makeConfig(s, fileName)来构建一个自定义的方法对象。
- package com.pig.hub.dev.frameWork.action.config;
- import java.lang.reflect.Method;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.pig.hub.dev.frameWork.action.exception.MethodException;
- public class MethodBean implements java.io.Serializable {
- /**
- *
- */
- private static final long serialVersionUID = -5753278542873561978L;
- private Class c;
- private Method m;
- private String name;
- public Class getC() {
- return c;
- }
- public void setC(Class c) {
- this.c = c;
- }
- public Method getM() {
- return m;
- }
- public void setM() throws MethodException, ClassNotFoundException,
- SecurityException, NoSuchMethodException {
- if (name == null || name.equals(""))
- throw new MethodException();
- if (c == null)
- throw new ClassNotFoundException();
- m = c.getDeclaredMethod(name, HttpServletRequest.class,
- HttpServletResponse.class);
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
package com.pig.hub.dev.frameWork.action.config; import java.lang.reflect.Method; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.pig.hub.dev.frameWork.action.exception.MethodException; public class MethodBean implements java.io.Serializable { /** * */ private static final long serialVersionUID = -5753278542873561978L; private Class c; private Method m; private String name; public Class getC() { return c; } public void setC(Class c) { this.c = c; } public Method getM() { return m; } public void setM() throws MethodException, ClassNotFoundException, SecurityException, NoSuchMethodException { if (name == null || name.equals("")) throw new MethodException(); if (c == null) throw new ClassNotFoundException(); m = c.getDeclaredMethod(name, HttpServletRequest.class, HttpServletResponse.class); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
通过 m = c.getDeclaredMethod(name, HttpServletRequest.class, HttpServletResponse.class);得到url对应的方法对象。
下面就简单了
m.invoke(c.newInstance(), request, response);
执行而已。
现在通过契约式的url可以访问到相应的对象了。那么还差一个如何跳转。
首先我们自定义一个annotation
- package com.pig.hub.dev.frameWork.annotation;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- /**
- *
- */
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- public @interface MappingConfig {
- String success();
- String fail();
- String exception();
- }
package com.pig.hub.dev.frameWork.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MappingConfig { String success(); String fail(); String exception(); }
其中有三个属性,success fail exception分别指在成功后跳转的地方或者失败后跳转的。。。
下面是在实际对象中如何使用这三个对象。
- public class aa {
- @MappingConfig(success="../index.jsp",fail="",exception="")
- public void bb(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- System.out.print("test------------");
- request.setAttribute("123", "成功了");
- }
- }
public class aa { @MappingConfig(success="../index.jsp",fail="",exception="") public void bb(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.print("test------------"); request.setAttribute("123", "成功了"); } }
然后通过
- package com.pig.hub.dev.frameWork.action;
- import java.lang.reflect.Method;
- import java.util.HashMap;
- import com.pig.hub.dev.frameWork.action.exception.MappingException;
- import com.pig.hub.dev.frameWork.annotation.MappingConfig;
- public class MappingUtil {
- @SuppressWarnings("unchecked")
- public static HashMap makeHashMap(Method m) throws MappingException {
- MappingConfig an = m.getAnnotation(MappingConfig.class);
- if (an == null)
- throw new MappingException();
- HashMap map = new HashMap();
- map.put("success", an.success());
- map.put("fail", an.fail());
- map.put("exception", an.exception());
- return map;
- }
- }
package com.pig.hub.dev.frameWork.action; import java.lang.reflect.Method; import java.util.HashMap; import com.pig.hub.dev.frameWork.action.exception.MappingException; import com.pig.hub.dev.frameWork.annotation.MappingConfig; public class MappingUtil { @SuppressWarnings("unchecked") public static HashMap makeHashMap(Method m) throws MappingException { MappingConfig an = m.getAnnotation(MappingConfig.class); if (an == null) throw new MappingException(); HashMap map = new HashMap(); map.put("success", an.success()); map.put("fail", an.fail()); map.put("exception", an.exception()); return map; } }
得到要执行的方法上的annotation然后将他属性放入一个hashmap中。
下面就是跳转了(成功的)
request.getRequestDispatcher((String) map.get("success")).forward(
request, response);
这样就完成了一个基于url契约的零配置mvc的实现。
呵呵,实在有点简单,问题也很多。
写这个东西的目的其实在于学习一下java的基本知识。现在大家没事干就说这样那样的框架,我想不如自己来试着如何实现。通过自己来实现,可以明白好多东西,然后在去用那写框架我想会更加得心应手。
以上纯属功能上的实现,问题很多很多,例如在actionservlet中有一大堆的异常,这样写出来很别扭,其中还有自己定义的异常。
欢迎大家给我提出建议。
评论
呵呵
发表评论
-
jbpm6.2(BPMS 6.1)技术前瞻(1)
2015-01-27 15:29 996开始使用jBPM的工作有一年多的时间了,其中参与社区开发也有 ... -
基于URL的契约式简易MVC框架
2009-08-05 09:37 0一直以来对0配置的mvc框 ... -
可更新的注册式的单实例模式
2008-12-11 14:29 1432最近,遇到这样一个应用。在系统中需要大量的配置信 ... -
通用数据推送 (4)-castor的使用
2007-04-18 16:39 2386这个通用的推送做了很久了,来早就想把它的思路整理一下。终于, ... -
通用数据推送 (5)-线程池
2007-04-18 18:05 1348继续写,写的有点乱了,望大家不要介意,我会慢慢该过来的。 这是 ... -
通用数据推送 (3)
2007-04-17 13:48 1427以上介绍是我对业务描述的xml的介绍,下面该介绍我们是怎么来运 ... -
通用数据推送(2)
2007-04-16 17:44 1794首先,介绍一下我通过xml对推送业务的定义。由于,我们的数据 ... -
通用数据推送(1)
2007-04-16 17:41 2679目前,在公司的一个重要工作内容就是做sprider和b2b数据 ...
相关推荐
《采用非MVC框架的书店管理系统》 在IT行业中,软件架构的设计对于系统的稳定性和可扩展性至关重要。本文将深入探讨一个特殊的书店管理系统,它并未采用传统的MVC(Model-View-Controller)框架,而是利用了其他...
基于语义契约模型的微服务接口自动化测试技术,便是为了解决这一问题而提出的。 语义契约模型是一种定义服务间交互规则的方法,它不仅关注接口的数据格式,还关注数据的业务含义。契约模型通常由生产者(提供服务的...
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发...
抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和PHP 6 的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准PHP 库SPL 方面的知识以及PHP 开发人员最有可能用到的MVC 模式,...
契约式编程是一种软件开发方法,它借鉴了形式化方法的理念,通过引入不变式、前置条件(precondition)和后置条件(postcondition)等概念,确保程序模块的语义清晰和正确性。这种方法有助于提高软件的可靠性和可...
**ASP.NET MVC(Model-View-Controller)**是一种用于构建Web应用程序的模式,它是ASP.NET框架的一部分。MVC模式将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。模型处理业务逻辑...
.NET4.0契约式设计,MSDN官方推荐学习视频,很好的资料。
这篇文档将深入探讨一个毕业设计项目,该项目是一个基于Java语言,使用SSM框架,并通过微信小程序实现的小契约——一个交友互动平台。这个设计涵盖了多个关键的技术领域,包括后端开发、前端开发以及移动应用开发,...
基于心理契约的员工忠诚度提升策略.pdf
在"基于WSDL契约优先的Web Services"开发中,我们首先定义服务的WSDL契约,然后根据这个契约生成服务器端和客户端的代码。 1. **WSDL契约优先**: WSDL契约优先的方法意味着首先编写服务的接口描述(WSDL文件),...
综上所述,基于语义契约模型的微服务接口自动化测试技术研究,不仅关注了微服务接口契约的构建与维护,还探索了数据语义描述和数据约束的构建方法,并提出了基于多约束组合的测试生成策略,从而在保证测试全面覆盖的...
【基于心理契约理论的高职院校师资队伍管理】探讨了如何运用心理契约理论来优化高职院校师资队伍的管理,以适应互联网时代下员工与组织关系的变化。心理契约是员工与组织间无形的默契,体现在双方的期望上,包括交易...
基于返利契约的电动汽车供应链协调策略研究.pdf
文章中提出的基于JBI规范的面向服务的应用集成框架,是一个利用企业服务总线(ESB)无缝集成应用与数据资源、支持流程服务编排并能进行组合服务应用开发的框架。该框架在异构数据集成中的应用示例表明,它可以有效地...
综上所述,这个话题涉及到使用ASP.NET MVC框架构建Web服务,通过静态类实现公共工具和服务,以及数据契约在数据交换中的作用。理解这些概念对于开发可扩展、可维护的Web应用程序至关重要。在实际项目中,应合理利用...
QYBot是一款基于契约理念设计的机器人框架,它旨在为开发者提供一个高效、灵活的平台,用于构建自动化处理任务的智能机器人。这个框架的核心特性在于其契约设计理念,允许开发者定义机器人的行为规范,确保机器人在...