1、@Action注解声明

package com.togogo.webtoservice.annotations;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(value=ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Action {
// String namespace() default "";
}

2、@Path注解声明

package com.togogo.webtoservice.annotations;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* 如果放在类上面,表示名命空间
* 如果放在方法上面,表示路径
* @author Administrator
*
*/
@Target(value={ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Path { String value(); }
3、ActionExecute类
package com.togogo.webtoservice;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.togogo.webtoservice.annotations.Action;
import com.togogo.webtoservice.annotations.Path; /**
* 必须的问题 1、判断传进来的类的对象是不是一个Action 2、通过url,直接调用于Action的方法 3、返回转路径
*
* @author Administrator
*
*/
public class ActionExecute {
private Object action;
private Class<? extends Object> actionClass;
private HttpServletRequest request;
private HttpServletResponse response; ActionExecute(Object o, HttpServletRequest request,
HttpServletResponse response) {
this.action = o;
this.actionClass = this.action.getClass();
this.request = request;
this.response = response;
} /**
* 获得命名空间
*
* @return
*/
private String getNamespace() {
Path pathAnnotation = actionClass.getAnnotation(Path.class);
if (pathAnnotation != null) {
return pathAnnotation.value();
} else {
return null;
}
} /**
* 判断是否是一个Action
*
* @return
*/
private boolean isAction() {
Action actionAnnotation = actionClass.getAnnotation(Action.class);
if (actionAnnotation == null) {
return false;
} else {
return true;
}
} /**
* 获得方法
*
* @return
*/
private Method getMethod() {
String uri = request.getRequestURI(); Method[] methods = actionClass.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
Method m = methods[i];
Path path = m.getAnnotation(Path.class);
if (this.getNamespace() != null) {
if (uri.contains(this.getNamespace())) {
if (path != null) {
if (uri.contains(path.value())) {
return m;
}
}
}else{
System.out.println("--命名空间不匹配--");
return null;
} } else {
if (path != null) {
if (uri.contains(path.value())) {
return m;
}
}
}
}
return null;
} String execute() throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException {
if (isAction()) {
Method method = this.getMethod();
String rePath = (String) method.invoke(action, request, response);
return rePath;
} else {
System.out.println("--这不是一个Action--");
return null;
}
} }

4、核心控制器

package com.togogo.webtoservice;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class DispacherServlet extends HttpServlet {
private static String config=null;
private static String enconding="UTF-8"; @Override
public void init(ServletConfig config) throws ServletException {
String initConfig=config.getInitParameter("config");
String initEnconding=config.getInitParameter("enconding");
if(initConfig!=null){
DispacherServlet.config=initConfig;
}
//通过web描述符文件web.xml配置
if(initEnconding!=null){
DispacherServlet.enconding=initEnconding;
} super.init(config);
} /**
* 接收任何请求,
*/
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
request.setCharacterEncoding(enconding);
response.setCharacterEncoding(enconding);
String uri = request.getRequestURI();
StringBuilder sb = new StringBuilder(uri);
String path = sb.substring(uri.lastIndexOf("/") + 1,
uri.lastIndexOf("!"));
System.out.println(path);
String className = Config.getClassName(path,config);
Object action = ActionFactory.create(className);
ActionExecute actionExecute =new ActionExecute(action,request, response);
String result = actionExecute.execute(); if (result.contains(":")) {
StringBuilder resultStr = new StringBuilder(result);
String rePath=resultStr.substring(result.indexOf(":")+1, result.length());
if(result.contains("redirect:")){
response.sendRedirect(rePath);
}else if(result.contains("forward:")){
request.getRequestDispatcher(rePath).forward(request, response);
} } else {
request.getRequestDispatcher(result).forward(request, response);
}
} catch (Exception e) {
e.printStackTrace();
} } }

5、Action对象工厂

package com.togogo.webtoservice;

/**
* 一个创建Action的工厂
* @author Administrator
*
*/
public class ActionFactory { public static Object create(String className){
Object action=null;
try {
action = (Object)Class.forName(className).newInstance();
} catch (InstantiationException e) { e.printStackTrace();
} catch (IllegalAccessException e) { e.printStackTrace();
} catch (ClassNotFoundException e) { e.printStackTrace();
}
return action;
} }

6、配置文件类

package com.togogo.webtoservice;

import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle; /**
* 路径与类名映身
*
* @author Administrator
*
*/
public class Config {
// private static Map<String, String> classNames = new HashMap<String,
// String>(); /**
* 通过key
*
* @param key
* @return
*/
public static String getClassName(String key, String config) {
ResourceBundle bundle = null;
if (config == null||"".equals(config)) {
bundle = ResourceBundle.getBundle("Action");
} else {
bundle = ResourceBundle.getBundle(config);
}
return bundle.getString(key);
} }

--------------------------------------------------------测试框架------------------------------------------------

7、UserAction类

package com.togogo.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.togogo.webtoservice.annotations.Action;
import com.togogo.webtoservice.annotations.Path; @Action
public class UserAction { /**
* 用户登录
*
* @param request
* @param response
* @return
*/
@Path(value="login.do")
public String login(HttpServletRequest request, HttpServletResponse response) {
System.out.println("我在登录");
System.out.println("我在登录.");
System.out.println("我在登录..");
System.out.println("我在登录.");
System.out.println("我在登录..");
System.out.println("我在登录.");
System.out.println("我在登录..");
System.out.println("我在------登录..");
System.out.println("我在------登录..");
System.out.println("我在------登录..");
System.out.println("我在------登录..");
return "main.jsp";
} /**
* 用户注册
*
* @param request
* @param response
* @return
*/
@Path(value="register.do")
public String register(HttpServletRequest request,
HttpServletResponse response) {
System.out.println("我在注册");
return "forward:main.jsp";
} /**
* 用户注册
*
* @param request
* @param response
* @return
*/
public String undo(HttpServletRequest request,
HttpServletResponse response) {
System.out.println("我在撤消");
return "redirect:main.jsp";
} }

8、映射配置文件Action.properties

user=com.togogo.action.UserAction

9、web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>web_mvc_webtoservice</display-name>
<!-- 这是一个核心控制器 -->
<servlet>
<servlet-name>dispacherServlet</servlet-name>
<servlet-class>com.togogo.webtoservice.DispacherServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>resources.Action</param-value>
</init-param>
</servlet> <servlet-mapping>
<servlet-name>dispacherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping> <welcome-file-list>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>

10、测试页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a></a>
<form action="${pageContext.request.contextPath }/user!login.do" method="post">
<!-- <input name="clasName" value="com.togogo.action.UserAction"> -->
<input type="submit"> </form>
</body>
</html>

  

源码下载:

http://files.cnblogs.com/files/zhuyuejiu/web_mvc_webtoservice_annotation.zip

  

一个简单的MVC框架的实现-基于注解的实现的更多相关文章

  1. 自己动手写一个简单的MVC框架(第一版)

    一.MVC概念回顾 路由(Route).控制器(Controller).行为(Action).模型(Model).视图(View) 用一句简单地话来描述以上关键点: 路由(Route)就相当于一个公司 ...

  2. AsMVC:一个简单的MVC框架的Java实现

    当初看了<从零开始写一个Java Web框架>,也跟着写了一遍,但当时学艺不精,真正进脑子里的并不是很多,作者将依赖注入框架和MVC框架写在一起也给我造成了不小的困扰.最近刚好看了一遍sp ...

  3. 自己动手写一个简单的MVC框架(第二版)

    一.ASP.NET MVC核心机制回顾 在ASP.NET MVC中,最核心的当属“路由系统”,而路由系统的核心则源于一个强大的System.Web.Routing.dll组件. 在这个System.W ...

  4. 一个简单的MVC框架的实现

    1.Action接口 package com.togogo.webtoservice; import javax.servlet.http.HttpServletRequest; import jav ...

  5. MVC框架浅析(基于PHP)

    MVC框架浅析(基于PHP) MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数 ...

  6. [.NET] 一步步打造一个简单的 MVC 网站 - BooksStore(一)

    一步步打造一个简单的 MVC 网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 简介 主 ...

  7. [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一)

    一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...

  8. [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一) (转)

    http://www.cnblogs.com/liqingwen/p/6640861.html 一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:ht ...

  9. PHP之简单实现MVC框架

    PHP之简单实现MVC框架   1.概述 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种 ...

随机推荐

  1. 分享基于分布式Http长连接框架--代码模型

    好的代码应该是方便客户端使用,代码能够自描述,规范化,大众标准化. 而且我相信代码也是有生命的,需要不断的维护它,你以什么样的态度对待它,它就会以同样的态度回敬你,所以在写代码前,先摆好自己的态度(一 ...

  2. ExtJS配置与入门项目创建

    Sencha Cmd下载:http://cdn.sencha.com/cmd/6.5.2/jre/SenchaCmd-6.5.2-windows-64bit.zip ExtJS-6.2.0下载:htt ...

  3. Python使用Scrapy爬虫框架全站爬取图片并保存本地(妹子图)

    大家可以在Github上clone全部源码. Github:https://github.com/williamzxl/Scrapy_CrawlMeiziTu Scrapy官方文档:http://sc ...

  4. ZOJ2334 Monkey King 并查集 STL

    题意:两家原始人(猴)打交道后成为一家猴,打交道时两家分别派出最帅的两位猴子,颜值各自减半,问每次打交道后新家族最帅的猴子的颜值.当然,已经是一家子就没有必要打交道了,因为没有猴希望颜值降低,毕竟还得 ...

  5. JAVA提高三:反射总结

    为前期学习过反射,再这里再次复习总结下:[转载请说明来源:http://www.cnblogs.com/pony1223/p/7659210.html ] 一.透彻分析反射的基础_Class类 Cla ...

  6. Another app is currently holding the yum lock; waiting for it to exit 解决方法

    Another app is currently holding the yum lock; waiting for it to exit... The other application is: P ...

  7. Akka 的Actor

    从第一篇Akka笔记的介绍中,我们是从很高的高度去观察Akka工具箱中的Actors.在这篇笔记的第二篇,我们会看一下Actors中的消息部分.而且延续上一次的例子,我们还会使用同样的学生与老师的例子 ...

  8. GooglePlay - 排行榜及支付接入

    前言 Google Play应用商店在国外Android市场中地位基本与AppStore在IOS中的地位一致,为此考虑国外的应用时,Android首要考虑的是接入GooglePlay的排行榜等支持. ...

  9. iOS 将视频流(h264)和音频流封装成PS流

    调用方法: static  CPSPackager * testObjc = NULL; static char *pszBuffer; testObjc = new CPSPackager(); p ...

  10. win10 uwp 判断文件存在

    本文主要翻译http://stackoverflow.com/questions/37119464/uwp-check-if-file-exists/37152526#37152526 我们有多种方法 ...