JavaWeb之搭建自己的MVC框架(三)
1. 前言
在前两节的内容中,我们完成了一个基本的框架搭建。但是如果我们在前端请求中增加参数,我们要怎么传递到后台方法呢?接下来我们就来研讨这部分内容。
2. 实现
(1)首先我们增加一个新的注解ParamMapping,用来给方法的参数标注其对应的前端参数名称。
package com.mvc.annotation; 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(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ParamMapping {
public String param() default "";
}
(2)我们在SayController中增加一个方法SayAnything,内容如下:
package com.mvc.controller; import com.mvc.annotation.ParamMapping;
import com.mvc.annotation.URLMapping; @URLMapping(url="/Say")
public class SayController{ @URLMapping(url="/Hello")
public String SayHello(){
System.out.println("Hello");
return "Hello";
} @URLMapping(url="/Hi")
public String SayHi(){
System.out.println("Hi");
return "Hi";
} @URLMapping(url="/Anything")
public String SayAnything(@ParamMapping(param="word") String word){
System.out.println(word);
return word;
}
}
在SayAnything的参数中,我们对String word参数进行了注解@ParamMapping(param="word"),表示将来前端传参数名word,我们的框架会将其对应到SayAnything的String word参数中。
(3)我们在SayController中增加一个方法SayAnything,内容如下:
package com.mvc.controller; import com.mvc.annotation.ParamMapping;
import com.mvc.annotation.URLMapping; @URLMapping(url="/Eat")
public class EatController { @URLMapping(url="/Apple")
public String EatApple(){
System.out.println("I'm eating apples");
return "Apple";
} @URLMapping(url="/Banana")
public String EatBanana(){
System.out.println("I'm eating Banana");
return "Banana";
} @URLMapping(url="/Anything")
public String EatAnything(@ParamMapping(param="fruit") String fruit,
@ParamMapping(param="cnt") Integer cnt) {
System.out.println("I'm eating "+fruit+", "+cnt);
return fruit;
}
}
EatAnything的参数的注解和SayAnything是同一个道理。
(4)调整ServletCenter,使其完成前端参数到JAVA后台参数的传递过程。
package com.mvc.servlet; import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mvc.annotation.ParamMapping;
import com.mvc.base.MVCBase;
import com.mvc.listener.UrlMappingCollection; public class ServletCenter extends HttpServlet {
private static final long serialVersionUID = -1163369749078348562L; private void doTransfer(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException, ClassNotFoundException,
SecurityException, NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException,
InstantiationException {
for (MVCBase mvcBase : UrlMappingCollection.getMvcBases()) {
if (req.getRequestURI().equals(
req.getServletContext().getContextPath()+mvcBase.getUrl())) {
Class<?> clazz = Class.forName(mvcBase.getController());
Method[] methods = clazz.getMethods();
for (Method method : methods) {
if (method.getName().equals(mvcBase.getMethod())) {
//拿到参数类型列表
Class<?>[] paramTypes = method.getParameterTypes();
//拿到参数的注解列表
Annotation[][] paramAnno = method.getParameterAnnotations();
//new一个参数值数组吗,将来调用方法的时候要用
Object[] paramValues = new Object[paramTypes.length];
//每个参数会形成paramAnno的第一维,每个参数的每个注解会行程paramAnno的第二维
//所以paramAnno.length和paramTypes.length是相等的。
for (int i=0; i<paramAnno.length; i++) {
for (int j=0; j<paramAnno[i].length; j++) {
if (paramAnno[i][j] instanceof ParamMapping) {
String paramName = ((ParamMapping) paramAnno[i][j]).param();
if (req.getParameter(paramName) != null) {
if (paramTypes[i].equals(String.class)) {
paramValues[i] = req.getParameter(paramName);
} else if (paramTypes[i].equals(Integer.class)) {
paramValues[i] = Integer.valueOf(
req.getParameter(paramName));
} else {
//其他类型待后续扩展
}
}
}
}
}
method.invoke(clazz.newInstance(), paramValues);
}
}
}
}
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
try {
doTransfer(req, resp);
} catch (Exception e) {
System.out.println(e.toString());
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
try {
doTransfer(req, resp);
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
3. 测试效果:
启动tomcat,在浏览器中输入:
可以看到控制台打印出:
- 12345678
- I'm eating 1234, 2
JavaWeb之搭建自己的MVC框架(三)的更多相关文章
- JavaWeb之搭建自己的MVC框架(二)
1. 前言 在 JavaWeb之搭建自己的MVC框架(一) 中我们完成了URL到JAVA后台方法的最基本跳转.但是实际操作中会发现有一个不方便的地方,现在在com.mvc.controller包中只有 ...
- JavaWeb之搭建自己的MVC框架
https://blog.csdn.net/anita9999/article/details/83378111 自己写一个mvc框架吧(一) https://www.cnblogs.com/heba ...
- JavaWeb之搭建自己的MVC框架(一)
1. 介绍 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的 ...
- 从零开始实现一个简易的Java MVC框架(三)--实现IOC
Spring中的IOC IoC全称是Inversion of Control,就是控制反转,他其实不是spring独有的特性或者说也不是java的特性,他是一种设计思想.而DI(Dependency ...
- 使用PHP搭建自己的MVC框架
一.什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...
- IceMx.Mvc 我的js MVC 框架 三、动手来写一个评论模块儿
介绍 本人菜鸟,一些自己的浅薄见解,望各位大神指正. 本框架有以下优点 1.简单(调用简单.实现简单.不过度设计) 2.视图.控制器.模型分离(分离对于维护十分有必要) 3.组件化(每一个mvc模块儿 ...
- Spring MVC 框架的架包分析,功能作用,优点
由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关j ...
- Java Servlet开发的轻量级MVC框架最佳实践
在Servlet开发的工程实践中,为了减少过多的业务Servlet编写,会采用构建公共Servlet的方式,通过反射来搭建轻量级的MVC框架,从而加快应用开发. 关于Servlet开发的基础知识,请看 ...
- spring mvc 框架搭建及详解
现 在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不 ...
随机推荐
- P1074 宇宙无敌加法器
P1074 宇宙无敌加法器 转跳点:
- Gym 101158D(暴力)
题意:给定两个长度为N的字符串,1<=N<=4000,求满足字符串1中的某个区间所有的字母种类和个数都与字符串2中的某个区间相同最长的区间长度. 分析: 1.预处理每个串字母个数的前缀和. ...
- NOIP2016天天爱跑步解题思路
算法:LCA,树上差分+(乱搞) 如果有写错的地方请大佬更正 对于100%数据: u表示起点,v表示终点 对于一条u到v的路径,先讨论LCA!=u&&LCA!=v的情况: 分为u到LC ...
- Spring-ResolvableType可解决的数据类型
ResolvableType,可解决的数据类型.它为java语言中的所有类型提供了相同的数据结构,其内部封装了一个java.lang.reflect.Type类型的对象. 在讲解这个数据结构之前,首先 ...
- kafka 相关命令 偏移重置
kafka官方文档 https://kafka.apache.org/documentation.html#quickstart kafka 安装文档 https://www.jianshu.com/ ...
- elasticsearch下载与安装
目录 安装之前 下载 安装 测试 安装之前 必须注意的是:安装路径不允许有中文及空格和非法字符,尤其是中文 下载 打开elasticsearch官网.选择免费试用. 选择对应产品与版本(选择6.5.4 ...
- POJ1833 & POJ3187 & POJ3785
要是没有next_permutation这个函数,这些题觉得还不算特别水,不过也不一定,那样可能就会有相应的模板了.反正正是因为next_permutation这个函数,这些题包括之前的POJ1226 ...
- vnpy交易学习接口(2)
#来源于github下载vnpy版本 20180413 11.多投资标的情况下,该如何修改? 10.stop和limit报单有什么区别呢? 在交易时用得最多的是二类定单,第一类是市价单(Market ...
- 用AD 输出BOM时提示failed to open excel template
解决办法: 去掉这个√!
- 数据结构顺序表中Sqlist *L,&L,Sqlist *&L
//定义顺序表L的结构体 typedef struct { Elemtype data[MaxSize]: int length; }SqList; //建立顺序表 void CreateList(S ...