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

简介: 快速学习自定义框架配置解析,介绍了自定义框架配置解析系统机制, 以及在实际应用过程中如何使用。

开发者学堂课程【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);

}

相关文章
|
9月前
|
存储 缓存 网络协议
阿里云特惠云服务器99元与199元配置与性能和适用场景解析:高性价比之选
2025年,阿里云长效特惠活动继续推出两款极具吸引力的特惠云服务器套餐:99元1年的经济型e实例2核2G云服务器和199元1年的通用算力型u1实例2核4G云服务器。这两款云服务器不仅价格亲民,而且性能稳定可靠,为入门级用户和普通企业级用户提供了理想的选择。本文将对这两款云服务器进行深度剖析,包括配置介绍、实例规格、使用场景、性能表现以及购买策略等方面,帮助用户更好地了解这两款云服务器,以供参考和选择。
|
7月前
|
域名解析 应用服务中间件 Shell
使用nps配置内网穿透加域名解析
使用nps配置内网穿透加域名解析
890 76
|
9月前
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
596 27
|
9月前
|
人工智能 自然语言处理 搜索推荐
ViDoRAG:开源多模态文档检索框架,多智能体推理+图文理解精准解析文档
ViDoRAG 是阿里巴巴通义实验室联合中国科学技术大学和上海交通大学推出的视觉文档检索增强生成框架,基于多智能体协作和动态迭代推理,显著提升复杂视觉文档的检索和生成效率。
652 8
ViDoRAG:开源多模态文档检索框架,多智能体推理+图文理解精准解析文档
|
9月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
9月前
|
Web App开发 移动开发 前端开发
React音频播放器样式自定义全解析:从入门到避坑指南
在React中使用HTML5原生&lt;audio&gt;标签时,开发者常面临视觉一致性缺失、样式定制局限和交互体验割裂等问题。通过隐藏原生控件并构建自定义UI层,可以实现完全可控的播放器视觉风格,避免状态不同步等典型问题。结合事件监听、进度条拖拽、浏览器兼容性处理及性能优化技巧,可构建高性能、可维护的音频组件,满足跨平台需求。建议优先使用成熟音频库(如react-player),仅在深度定制需求时采用原生方案。
409 12
|
10月前
|
域名解析 网络协议 Ubuntu
DHCP与DNS的配置
通过这些步骤,您可以在Linux环境下成功配置和验证DHCP和DNS服务。希望这些内容对您的学习和工作有所帮助。
928 27
|
9月前
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
573 3
|
10月前
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
1271 12
|
9月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
920 29

热门文章

最新文章

推荐镜像

更多
  • DNS