java conterller_JAVA语言WEB框架的Controller层优化实例讲解

本文主要向大家介绍了JAVA语言WEB框架的Controller层优化实例讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本篇

前几篇的优化都没有涉及到Controller层。本篇开始将开始实现对Controller层的优化。由于上篇的IOC,创建了类容器。基于这个类容器,就可以很轻松地完成对Controller的优化了。

为了Controller解耦,还是决定使用请求容器(存放请求路径与处理方法映射关系),建立一个转换器。根据获取HttpRequest中的请求路径和参数,从请求容器里面去获取到相对应的方法。达到一个解耦的目的。

本篇主要实现功能:

- 封装请求信息

- 封装类和方法信息

- 将请求信息和方法信息形成K-V映射关系存到Map容器中

Controller 层实现目的:

根据Action注解实现请求路径和方法的绑定。

@Controller

public class CustomerServlet {

//    获取所有用户信息

@Action("get:/customer_show/getList")

public String getList() {

//TODO

return null;

}

//    根据id获取用户信息

@Action("get:/customer_show/getCustomer")

public String getList(Integer id) {

//TODO

return null;

}

}

功能实现

Request类 封装请求信息

/*

*

*   封装请求信息

*

*   思路:

*   1. 封装请求的信息, 正常的请求信息是: get:/customer_show

*      需要拆分成 requestMethod = get

*               requestPath  = /customer_show

*

*   2. 因为需要将请求信息放在Map中,以Request的对象为key,因为是对象作为key,

*       所以重写hashcode()和equals()方法,主要改变Map判断key的时候发挥作用。

* */

public class Request {

/*

*  请求方法

* */

private String requestMethod;

/*

*  请求路径

* */

private String requestPath;

public Request(String requestMethod, String requestPath) {

this.requestMethod = requestMethod;

this.requestPath = requestPath;

}

public String getRequestMethod() {

return requestMethod;

}

public String getRequestPath() {

return requestPath;

}

@Override

public boolean equals(Object o) {

if (o instanceof Request) {

Request r = (Request) o;

//进行判断

if (r.getRequestMethod().equals(this.requestMethod) &&

r.getRequestPath().equals(this.requestPath)) {

return true;

}

}

return false;

}

// 主要思路就是利用两个变量的hashCode,而不是对象的hashCode。

@Override

public int hashCode() {

return Objects.hash(this.requestPath, this.requestMethod);

}

}

Handler 类 封装Action注解的类和方法

/*

*  封装Action信息

*  封装类 和方法

* */

public class Handler {

/*

*  Controller注解 类

* */

private Class controllerClass;

/*

*  Action注解的 方法

* */

private Method actionMethod;

public Handler(Class controllerClass, Method actionMethod) {

this.controllerClass = controllerClass;

this.actionMethod = actionMethod;

}

public Class getControllerClass() {

return controllerClass;

}

public Method getActionMethod() {

return actionMethod;

}

}

ControllerHelper 类 建立有个Map容器用来存放request和handler的映射关系

/*

*  控制类助手类

* */

public class ControllerHelper {

/*

*  思路:

*  1、遍历所有Controller 注解的类

*  2、遍历每个类中的方法,找出有Action注解的方法

*  3、从Action 注解中获取URL映射

*  4、将URL映射存到Request对象,将该类和方法存到Handler对象

*  5、存到Map集合中。 key---Request  value---Handler

* */

/*

*  定义一个Map容器,存放Request和Handler的映射关系

* */

private final static Map ACTION_MAP =

new HashMap<>();

static{

//获取所有具有Controoler注解的类

Set> controllerClassSet = ClassHelper.getControllerClassSet();

if (CollectionUtils.isNotEmpty(controllerClassSet)) {

//遍历类

for (Class c : controllerClassSet) {

//获取该类下的所有方法

Method[] declaredMethods = c.getDeclaredMethods();

if (declaredMethods != null) {

//遍历方法

for (Method m : declaredMethods) {

if (m.isAnnotationPresent(Action.class)) {

Action action = m.getAnnotation(Action.class);

&n

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值