小菜鸟

java菜鸟号正在起航

XML 中的转义字符与 CDATA 区块

在 XML 文档中,某些字符具有特殊含义(如<>用于标记元素边界),直接使用会导致解析错误。为了正确表示这些特殊字符,XML 提供了两种解决方案:转义字符CDATA 区块

XML 转义字符

XML 预定义了 5 个转义字符(实体引用),用于表示在 XML 中有特殊含义的字符:

转义字符 对应原字符 说明
&amp; & 表示和号(AND 符号)
&lt; < 表示小于号
&gt; > 表示大于号
&quot; " 表示双引号
&apos; ' 表示单引号(撇号)

转义字符的使用场景

当文本中包含上述特殊字符时,必须使用转义字符替代,否则 XML 解析器会将其误认为 XML 语法的一部分,导致解析错误。

示例

<?xml version="1.0"?>
<note>
  <description>
    比较结果:3 &lt; 5 &amp; 10 &gt; 7  <!-- 正确:使用转义字符表示<、&、> -->
  </description>
  <quote>
    他说:&quot;Hello World!&quot;    <!-- 正确:使用转义字符表示双引号 -->
  </quote>
</note>
阅读全文 »

Struts2 中的 OGNL 与值栈(ValueStack)详解

OGNL(Object-Graph Navigation Language,对象图导航语言)是 Struts2 框架默认使用的表达式语言,主要用于在视图(如 JSP)中访问 Action 中的数据,而值栈(ValueStack)则是 OGNL 的核心操作对象,贯穿整个 Action 的生命周期。下面详细解析两者的工作机制与关联。

OGNL 概述

基本概念

OGNL 是一种功能强大的表达式语言,支持:

  • 访问对象的属性(如user.name);
  • 调用对象的方法(如list.size());
  • 操作集合(如list[0]);
  • 实现类型转换(如字符串转日期);
  • 访问静态方法和属性(需通过@类全名@方法名语法)。

在 Struts2 中,OGNL 主要应用于:

  • JSP 页面中通过<s:property value="表达式"/>获取数据;
  • struts.xml中配置动态参数(如<param name="id">${userId}</param>);
  • 输入校验的表达式配置。

OGNL 的上下文环境

OGNL 的求值依赖于上下文(Context),在 Struts2 中,上下文由ActionContext维护,包含以下核心对象:

阅读全文 »

Struts2 Result Types 详解:结果类型与应用场景

在 Struts2 中,result元素用于定义 Action 执行后的跳转逻辑,而type属性则决定了跳转的方式(如转发、重定向等)。Struts2 内置了多种结果类型,适配不同的业务场景。本文基于struts-default.xml中的配置,详细介绍常用的 Result Type 及其使用方法。

Result Type 的核心概念

  • 定义:Result Type 是 Struts2 中用于处理 Action 返回结果的组件,负责将请求转发或重定向到目标资源(页面、Action、文件等)。
  • 配置位置:所有内置 Result Type 定义在struts-default.xml<result-types>节点中,通过继承struts-default包即可使用。
  • 核心属性:
    • name:结果标识(如"success""error"),与 Action 方法返回的字符串匹配;
    • type:结果类型(如dispatcherredirect),决定跳转方式;
    • location:目标资源路径(可省略,直接写在<result>标签体中)。

常用 Result Type 详解

阅读全文 »

MapReduce 作业慢?别乱调参数,先找到瓶颈在哪

MapReduce 作业跑得慢,原因可能出在任何地方——CPU、内存、磁盘、网络、数据倾斜、小文件、参数配置……每个环节都可能拖后腿。

最忌讳的是盲调——看着参数列表挨个改,改完跑一遍,慢就再改。这样不但效率低,还可能越调越慢。

正确的做法是:先定位瓶颈,再针对性调优。

先定位:作业慢,卡在哪个阶段?

YARN UI 是定位瓶颈的第一站。看一个作业的进度:

  • Map 阶段慢 → 问题在数据读取或 Map 逻辑
  • Shuffle 阶段慢 → 问题在网络传输或数据量
  • Reduce 阶段慢 → 问题在数据倾斜或聚合逻辑

再看具体指标:

现象 可能的原因 排查方向
Map 任务进度不均 分片大小不均、数据倾斜 检查 InputSplit 分布
Reduce 任务有一个特别慢 热点 Key 数据倾斜 看同一个 Key 的数据量
磁盘 I/O 满(>80%) 溢写太频繁 调大 io.sort.mb
网络流量大 Shuffle 数据量大 开启压缩、启用 Combiner
CPU 高但作业慢 计算逻辑复杂 优化代码、减少不必要的序列化

定位清楚再动手,比盲目调参数有效十倍。

从投入产出比看:哪些优化最值得做

不是所有优化都值得花时间。按”投入小、收益大”排序:

优先级 优化手段 收益 成本
开启 Map 输出压缩(Snappy) Shuffle 数据量减少 50%+ 改一行配置
启用 Combiner Map 输出数据量大幅减少 一行代码
解决数据倾斜 作业时间从几小时降到几十分钟 改分区逻辑或加随机后缀
调大 io.sort.mb 溢写次数减少 50%+ 改一个参数
合并小文件(CombineTextInputFormat) Map 任务数从几千降到几十 改一行代码
调大 Reduce 拉取并行度 拉取阶段提速 改一个参数
调整 Map/Reduce 数量 提升并行度 改一个参数
有钱就干 增加硬件资源(内存、CPU) 立竿见影 加机器/内存

实际经验:先做前三个(压缩 + Combiner + 数据倾斜),能解决 80% 的性能问题。

各阶段的针对性优化

输入阶段:减少 Map 任务数

Map 任务太多,调度开销大。任务数 = 数据量 / 分片大小。

  • 小文件多 → 用 CombineTextInputFormat 合并分片
  • 分片太小 → 调大 split.maxsize,让每个 Map 处理更多数据
  • 推荐分片大小:128MB-256MB,一个 Map 任务处理 1-2 分钟的数据量最合适
job.setInputFormatClass(CombineTextInputFormat.class);  
CombineTextInputFormat.setMaxInputSplitSize(job, 128 * 1024 * 1024); // 分片最大128MB  
阅读全文 »

Struts2 工作流程详解:从请求到响应的完整生命周期

Struts2 作为基于 MVC 模式的 Web 框架,其核心工作流程围绕拦截器链Action 处理展开,通过分层设计实现请求的接收、处理与响应。以下是对其工作流程的详细拆解:

Struts2 工作流程总览

Struts2 的工作流程可概括为 “拦截器预处理→Action 业务处理→拦截器后处理→结果响应”,具体步骤如下:

  1. 客户端发送请求(如http://localhost:8080/struts/userAction/test.action);
  2. 请求被核心过滤器StrutsPrepareAndExecuteFilter拦截;
  3. 框架解析请求,匹配struts.xml中对应的 Action 配置;
  4. 请求经过拦截器链的预处理(如参数封装、校验、日志记录等);
  5. 创建 Action 实例,调用指定方法(如test())执行业务逻辑;
  6. Action 返回结果标识(如"success");
  7. 框架根据结果标识匹配struts.xml中的<result>,生成响应视图;
  8. 请求再次经过拦截器链的后处理(如资源清理、事务提交等);
  9. 响应结果返回给客户端。

核心步骤详解

1. 请求拦截与初始化(StrutsPrepareAndExecuteFilter

阅读全文 »
0%