一个简单的MVC框架的实现-基于注解的实现
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框架的实现-基于注解的实现的更多相关文章
- 自己动手写一个简单的MVC框架(第一版)
一.MVC概念回顾 路由(Route).控制器(Controller).行为(Action).模型(Model).视图(View) 用一句简单地话来描述以上关键点: 路由(Route)就相当于一个公司 ...
- AsMVC:一个简单的MVC框架的Java实现
当初看了<从零开始写一个Java Web框架>,也跟着写了一遍,但当时学艺不精,真正进脑子里的并不是很多,作者将依赖注入框架和MVC框架写在一起也给我造成了不小的困扰.最近刚好看了一遍sp ...
- 自己动手写一个简单的MVC框架(第二版)
一.ASP.NET MVC核心机制回顾 在ASP.NET MVC中,最核心的当属“路由系统”,而路由系统的核心则源于一个强大的System.Web.Routing.dll组件. 在这个System.W ...
- 一个简单的MVC框架的实现
1.Action接口 package com.togogo.webtoservice; import javax.servlet.http.HttpServletRequest; import jav ...
- MVC框架浅析(基于PHP)
MVC框架浅析(基于PHP) MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数 ...
- [.NET] 一步步打造一个简单的 MVC 网站 - BooksStore(一)
一步步打造一个简单的 MVC 网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 简介 主 ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一)
一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一) (转)
http://www.cnblogs.com/liqingwen/p/6640861.html 一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:ht ...
- PHP之简单实现MVC框架
PHP之简单实现MVC框架 1.概述 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种 ...
随机推荐
- http://codeforces.com/contest/349
A. Cinema Line time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- OOP编程特性综合项目
package SourceFile; //创建动物类(父类). public abstract class CAnimal { public boolean mammal; //是不是哺乳动物 ...
- SAP 图标查找及方法
1. 图标查找 方法一:通过TCODE查找图标对应的图标名称 执行TCODE:ICON 查找图标对应的图标名称 方法二:通过方法一查出图标名称查找对应的图标ID SE11类型池根据方法一查找的ICON ...
- canvas图表详解系列(1):柱状图
本章建议学习时间4小时 学习方式:详细阅读,并手动实现相关代码(如果没有canvas基础,需要先学习前面的canvas基础笔记) 学习目标:此教程将教会大家如何使用canvas绘制各种图表,详细分解步 ...
- SerialPort如何读取串口数据并显示在TextBox上,多线程委托
namespace SerialPort { public partial class Form3 : Form { delegate void UpdateTextEventHandler(stri ...
- 小白学Maven第一篇配置
在百度上搜Maven进入官网,然后在进Download里面把apache-maven-3.5.0-bin.zip(记得不要下错)下载下来 然后进行安装 (前提你配置了Java如下图) Java配置: ...
- WiFi万能钥匙4.1.32接口
做Key4WiFi时提取的接口 部分代码来自于 http://zke1ev3n.me/2016/04/06/WiFi%E4%B8%87%E8%83%BD%E9%92%A5%E5%8C%99%E6%8E ...
- UWP win10 app 新关键字x:Bing
原本使用MVVM开发,我们使用数据绑定是x:Binging 新的关键字x:Bing使用和原来x:Binging区别不大. <TextBox x:Name="textBox" ...
- configparser模块(拷贝)
该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值). 创建文件 来看一个好多软件的常见文档格式如下: [DEFAULT] ...
- 如何才能通俗易懂的解释javascript里面的"闭包"?
看了知乎上的话题 如何才能通俗易懂的解释javascript里面的‘闭包’?,受到一些启发,因此结合实例将回答中几个精要的答案做一个简单的分析以便加深理解. 1. "闭包就是跨作用域访问变量 ...