一个简单的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)的缩写,一种软件设计典范,用一种 ...
随机推荐
- MySQL show status 参数详解
状态名 作用域 详细解释 Aborted_clients Global 由于客户端没有正确关闭连接导致客户端终止而中断的连接数 Aborted_connects Global 试图连接到MySQL服务 ...
- 五年.net程序员转型Java之路
大学毕业后笔者进入一家外企,做企业CRM系统开发,那时候开发效率最高的高级程序语言,毫无疑问是C#.恰逢公司也在扩张,招聘了不少.net程序员,笔者作为应届生,也乐呵呵的加入到.net程序员行列中. ...
- NOIP2014_day2:无线网络发射器选址
#include<stdio.h>//NOIP2014 day2 :无线网络发射器选址 ,max=; ][]; void wifi(int a,int b,int c) { int i,j ...
- 在CentOS 7 上安装docker
Docker CE Install yum-utils, which provides the yum-config-manager utility: $ sudo yum install -y yu ...
- java web 项目 图书管理系统的设计与实现
java web 项目 图书管理系统的设计与实现
- var let const 的区别
Var let const 的区别 1.Var 定义的变量存在变量提升,而了let和const不存在变量提升.即在定义的变量代码上使用该变量,var的会输出undefined,而let的会报错. 2. ...
- hiveQL求差集
hive sql求差集的方法 1.什么是差集 set1 - set2,即去掉set1中存在于set2中的数据. 2.hive中计算差集的方法,基本是使用左外链接. 直接上代码 select * fro ...
- UITextView实现限制100字
placeHoderLable = [[UILabel alloc]initWithFrame:CGRectMake(3, 3, DeviceWidth-6, 40)]; //根据情况调节位置 pla ...
- JavaScript设计模式--门面模式
外部与一个子系统的通信必须通过一个系统的一个门面对象进行,这就是门面模式. 门面模式具备如下两个角色: 1. 门面角色 客户端可以调用这个角色方法,此角色中有子系统的应用(知晓相关的(一个或多个)子系 ...
- MVC.NET 发布后,部署到iis ,网站中的Bootstrap的字体图标不能正常显示
时隔多日没有在博客中记录自己遇到的问题及解决方案了 ,今天给大家分享一个可能会遇到的一个鸡肋bug ! 如果你的项目是MVC并且在项目中引用了 Boostrap 框架,你在编辑发布后部署到iis的时候 ...