自定义框架配置解析 | 学习笔记

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 快速学习自定义框架配置解析,介绍了自定义框架配置解析系统机制, 以及在实际应用过程中如何使用。

开发者学堂课程【Java Web开发系列课程 - Struts2框架入门自定义框架配置解析】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/537/detail/7329


自定义框架配置解析

 

首先创建一个 new web project 名为 20myframework。

image.png

主要是模拟框架,学习一个框架主要是了解它、使用它、理解他的原理、查看他的源码,最后来实现它,是这样一个学习曲线。

至于掌握等级,如果掌握等级满级是5的话,这节课的掌握等级在1就可以了。

需要模拟的事情为:

req--->filterdo somethingaction

filter解析配置文件(映射用户请求---action 中)---将用户提交的数据设置到 action 中。

首先创建一个 java package 名为 cn.sxt.filter,在创建一个名为 cn.sxt.util,再创建一个 new XML 名为 framework.xml 。

image.png

先写好配置文件:

<framework>

<action name = "hello" class = "cn.sxt.action.HelloAction" method= "hello"></action

<result name="success" type= "redirect">/ index. jsp</result>

<result name="failed" type="redirect ">/index. jsp</result>

</action>

<framework>

首先要解析这样的配置文件,在配置文件中 action 是一个实体类。现在就再写一个实体类。

创建 java package 名为 cn.sxt.core,在里面写一个实体类又名为 action。

Action 中源码为:

public class ActionMapper {

private String name;

private String classes;

private String method ;

}

在这个 action 里面有很多个 result,现在要把这些 result 写出来:

public class Result {

private String name;

private String type;

private String location;

}

现在把他们全部生成一下。

image.png

再通过无参的构造方法和有参的构造方法去构造配置。在 result 里面 Name 和 type 都是可以省略的。

但是要省略必须做一些事情,比如设置 name 的默认值为 success,type 的默认值为 dispatcher,给它值就是可以省略,但是如果怕麻烦可以每次都配置好,配置好就不用省略了,解析她的时候就会更加简单。如果它有默认值就不需要再赋值了,但是有默认值解析时就会多一道工序。

回到 action 中,补完代码:

public class ActionMapper {

private String name;

private String classes;

private String method ;

private Map<String, Result> resultMap=new HashMap<String, Result>();

}

为什么在 result 里面放 map 进去,非常简单,在 action 执行完了之后反回了一个 result 回来,对于 action 来说,会直接根据 result 去跳转一个位置,对于 result 来说一个名称是唯一的,加入 map 进去查找会变得更加简单。

然后也生成一下他的构造方法,不要 resultmap,method 也可以让他设置一个默认值,查看 method 有没有这个属性,有没有默认值,如果没有也可以设置一个默认值为 execute,全都写好之后可以去解析配置文件 framework.xml。

创建一个 java 为 actionmapper,在 actionmapper 里面进行解析,得到解析出来的结果。把 dom4j 的 jar 包拷贝过来,查看文档。在 dom4j里面可以看到一系列的配制方法。

image.png

Actionmapper 代码为:

public class ActionMapper i

public static Map<String, Action> actionMap = new HashMap<String,Action>( );

public static void parser( ){

InputStream is=ActionMapper . class . getClassLoader() . getResourceAsStream( "framework. xml") ;

Document document = new SAXReader().read(is);

Element root = document . getRootElement();

System. out . println( root. getName());

}

}

Inputstream 是读取文件 src 里面的内容。写完之后测试一下,先写一个测试包 cn.sxt.test。

Test 代码:

public class Test {

public static void main(String[ ] args) throws DocumentException {

ActionMapper . parser();

}

}

执行一下可以看到取出的结果 framework。

image.png

然后还要取 action,要在 actionmapper 里处理 action 的节点。

//处理 action 节点

List<Element> actions=root. elements( );

for( Element element: actions ){

Action action = new Action( );

System. out . println( "name="+element . attributeValue( "name"));

System. out . println( "method= "+element . attributeValue( "method"));

}

在迭代里面创建 action 的对象,在里面获取对象的属性,最后结果得到了 name=hello,mathod=mull。

image.png

Method 假如不去处理它,得到的是空值 null,意思就是不为空的时候我们才去处理它。

//获取 action 的属性值

action. setName( element . attributeValue( "name") ) ;

action. setClasses( element. attributeValue("class"));

String method=element . attributeValue( "method");

if (method ! =null)

action. setMethod (method) ;

这里只是做一个其中的案例,具体的试验需要同学们自己去处理。

//处理 Action 中的结果集

List<Element> results = element. elements();

for( Element e: results){

Result result = new Result( ) ;

String resultName = e. attributeValue("name")

string resultType = e. attributeValue("type")

if(resultName !=null )

result . setName ( resultName );

if( resultType ! =null )

result. setType(resultType);

result. setLocation(e. getStringValue());

}

注意凡是有默认值的都应该像 name 和type 一样去处理。

//将 Result 对象添加到 Action 中

action. getResultMap() . put (result. getName(), result);

}

//将 Action 放入到 actionMap 中

actionMap. put (action. getName(), action);

}

相关文章
|
2月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
48 3
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
165 3
|
28天前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。
|
1月前
|
域名解析 存储 缓存
DNS是什么?内网电脑需要配置吗?
【10月更文挑战第22天】DNS是什么?内网电脑需要配置吗?
264 1
|
1月前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
33 0
|
2月前
|
机器学习/深度学习 调度
mmseg配置解析 Polynomial Decay 多项式衰减
Polynomial Decay(多项式衰减)是一种常用的学习率调度方法,通过多项式函数逐步减少学习率,帮助模型更好地收敛。公式为:\[ lr = (lr_{initial} - \eta_{min}) \times \left(1 - \frac{current\_iter}{max\_iters}\right)^{power} + \eta_{min} \]。参数包括初始学习率、最小学习率、当前迭代次数、总迭代次数和衰减指数。适用于需要平滑降低学习率的场景,特别在训练后期微调模型参数。
76 0
mmseg配置解析 Polynomial Decay 多项式衰减
|
2月前
|
分布式计算 Java 应用服务中间件
NettyIO框架的深度技术解析与实战
【10月更文挑战第13天】Netty是一个异步事件驱动的网络应用程序框架,由JBOSS提供,现已成为Github上的独立项目。
55 0
|
2月前
|
JSON JavaScript 前端开发
深入解析ESLint配置:从入门到精通的全方位指南,精细调优你的代码质量保障工具
深入解析ESLint配置:从入门到精通的全方位指南,精细调优你的代码质量保障工具
102 0
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
74 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
78 0

推荐镜像

更多