- 处理前端兼容性的重要工具:Browserslist
AvskBug
前端
在前端开发中,处理CSS和JavaScript兼容性问题是一个常见的挑战。不同的浏览器对于CSS和JavaScript的解析和支持程度各不相同,因此开发人员需要采取一些措施来确保他们的网站在各种浏览器中都能正确地显示和运行。在这方面,一个非常重要的工具是Browserslist。Browserslist是一个用于配置目标浏览器的工具,它使用一种简单的查询语言来指定要支持的浏览器范围。通过在项目中使
- java.util包之java.util.Collection介绍
沪cares
JAVAjavawindows服务器
java.util.Collection接口介绍java.util.Collection是Java集合框架(JavaCollectionsFramework,JCF)的根接口,定义了所有集合类(如List、Set、Queue)的基本操作。它代表一组对象(元素),并提供了一系列方法来操作这些元素。1.Collection的主要特点存储一组对象(可以是任意类型,但通常使用泛型指定元素类型)。不直接实现
- 王道数据结构--带头结点的单链表实现(可直接运行)
池鱼爱吃鱼
王道数据结构数据结构
#include#includetypedefstructLNode{intdata;structLNode*next;}LNode,*LinkList;//初始化boolInitList(LinkList&L){L=(LNode*)malloc(sizeof(LNode));L->next=NULL;returntrue;}//求表长intLength(LinkListL){intlen=0;L
- Chapter 24: Typelists_《C++ Templates》notes
郭涤生
c/c++c++笔记开发语言
Typelists1.AnatomyofaTypelist2.AccessingElements3.AppendingTypes4.ReversingaTypelist5.LengthofTypelist6.Compile-TimeTestingwith`main`Multiple-ChoiceQuestionsDetailedDesignQuestionsAnswers&Explanations
- Amazon(亚马逊)产品关键词上首页需要注意什么?
众创五舟-南哥
大数据
产品权重=转化率+预期转化率+退货率+Review评级一个产品不是单单有流量就可以的,转化率也很重要,如果我们产品的转化率高,平台会认为我们的listing在各个方面都做的比较不错,流量的效果会最大化的体现出来,因为平台的流量也不是白捡来的,他们也是通过各种付费的站外推广,从而获得的这些流量,所以说,流量都是需要成本的,那么自然而然,转化率就成了平台对我们listing的一个重要考量标准之一什么叫
- ros2学习【5】:话题以及通信实例(C++和python示例)
宋隽颢
ROS2c++python开发语言
节点与节点之间的交流方式有四种,话题,服务,参数,动作。服务,参数,动作是在话题的基础上组合实现的。所以话题是很基本,很重要的。节点与节目之间话题交流的媒介是消息接口。目录一、C++话题示例:1.发布消息1.2工作空间+构建功能包+新建节点文件1.2:CMakeList的处理1.3:构建+测试2.订阅消息:2.1新建文件turtle_control.cpp2.2:CMakeList的处理2.3:构
- LC17. 电话号码的字母组合
996冲冲冲
LC回溯Python回溯算法电话号码字母组合字符串操作
classSolution(object):defletterCombinations(self,digits):""":typedigits:str:rtype:List[str]"""res=[]s=""map=["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]iflen(digits)==0:return[]defbacktra
- Java集合基础知识
星星不打輰
Javajava
Java的集合有关知识:Java集合框架提供了一套性能优良,使用方便的接口和类,主要包括两种类型的容器:集合(Collection)和图(Map)。集合存储一个元素集合,图存储键/值对映射。Collection接口有三种子类型:List、Set和Queue,而Map接口下包含了如HashMap和TreeMap等具体实现类。集合和数组的区别集合与数组都可以存储引用数据类型的对象,但集合提供了更多的数
- 阿里云CentOS部署Java项目全流程
学编程的MX
服务器springspringbootjavacentos阿里云
阿里云CentOS部署Java项目全流程服务器需要具备的东西:安全组开放相应的端口关闭防火墙Mysql数据库jdk1.8springboot项目的jar包1.服务器安装jdk1.8yumlistjava*yuminstall-yjava-1.8.0-openjdk-devel.x86_64java-version#设置环境变量.bashrc#自动通过whereisjavac。whichjavac。
- 代码随想录算法训练营第二十五日| LC216.组合总和III LC17.电话号码的字母组合
EdisonW8
算法leetcode数据结构
LC216.组合总和III:classSolution:def__init__(self):self.res=[]self.sum=0self.path=[]defcombinationSum3(self,k:int,n:int)->List[List[int]]:self.backtracking(k,n,1)returnself.resdefbacktracking(self,k:int,n:
- 股票数据接口API实例代码python、JAVA等多种语言演示免费获取实时数据、历史数据、CDMA、KDJ等指标数据配有API说明文档
蝶澈乐乐
pythonjava开发语言股票数据接口API
本文中所有接口均可直接在浏览器打开获取数据,为了便于大家验证有效性,已经做好了超链接,直接点击即可!沪深两市股票列表API接口链接(可点击验证):https://api.mairui.club/hslt/list/LICENCE-66D8-9F96-0C7F0FBCD073【实时数据接口】沪深两市实时交易数据接口API接口链接(可点击验证):https://api.mairui.club/hsrl
- 力扣刷题Day 3 | 203.移除链表元素,707.设计链表,206.反转链表
Present*
算法刷题算法leetcodepython
203.移除链表元素题目链接力扣(LeetCode)官网-全球极客挚爱的技术成长平台视频讲解手把手带你学会操作链表|LeetCode:203.移除链表元素_哔哩哔哩_bilibili笔记移除链表元素要分两种情况,一是要移除的元素为头节点,二是要移除的元素为非头节点。为了简化代码,定义一个虚拟头节点dummy_head=ListNode(next=head)遍历从dummy_head开始,由于最后要
- Centos下安装中文字体
linux
由于java中使用了Graphics2D来绘图,图片中有中文文字,需要系统自带中文字体,而linux下默认没有中文字体,遂自行安装:1、安装fc命令yuminstallfontconfig2、查看当前已安装的字体fc-list3、创建目录存放字体cd/usr/share/fonts/mkdirchinesechmod-R755/usr/share/fonts/chinese4、拷贝字体到linux
- C#之基础3---③(集合,数组与集合的区别,哈希表,哈希函数,C#中的静态方法与非静态方法)
Elsa~
【C#】
一、概念类①、什么是数组,什么是集合,为什么要有集合?数组int[]:最适用于创建和使用固定数量的强类型化对象,创建数组时要明确所创建数组的类型(int[],string[],bool[]...)及数组数量。集合ArrayList():把各种类型的数据集合在一起,通过下标来遍历显示。集合是一个类,因此必须在向该集合添加元素之前,声明类的实例,需usingSystem.Collections。集合的
- 论文阅读:2024 arxiv Imitate Before Detect: Aligning Machine Stylistic Preference for Machine-Revised Tex
CSPhD-winston-杨帆
论文阅读论文阅读
总目录大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328ImitateBeforeDetect:AligningMachineStylisticPreferenceforMachine-RevisedTextDetectionhttps://arxiv.org/pdf/2412.10432博客:https://dev
- 优化 Java 数据结构选择与使用,提升程序性能与可维护性
java开发小黄
java数据结构开发语言
引言在软件开发中,数据结构的选择是影响程序性能、内存使用以及代码可维护性的关键因素之一。Java作为一门广泛使用的编程语言,提供了丰富的内置数据结构,如数组、链表、栈、队列、树、图以及集合框架中的各种接口实现(如List,Set,Map等)。然而,面对不同的应用场景,如何合理地选择和优化数据结构,成为了一个值得深入探讨的话题。本文将介绍几种常见的Java数据结构,并探讨如何根据实际需求进行优化选择
- Spring Boot启动流程及源码实现深度解析
程序媛mylove
springboot后端java
SpringBoot启动流程及源码实现深度解析一、启动流程概述SpringBoot的启动流程围绕SpringApplication类展开,核心流程可分为以下几个阶段:初始化阶段:推断应用类型,加载ApplicationContextInitializer和ApplicationListener环境准备:加载配置文件和命令行参数上下文创建:实例化ApplicationContext上下文刷新:执行r
- python 二维列表去重_Python编码常用套路
weixin_39929793
python二维列表去重
1.循环遍历if__name__=='__main__':whileTrue:2.录入数据str1=raw_input()#通过split()将数据分割,并用map(int,list)将其存储n,k=map(int,str1.split())str2=raw_input()#分割后利用map将全部数据进行转换listA=map(int,str2.split())3.list的去重#因为set是去重
- windows7关闭占用端口
Johnny_Cheung
运维
1、找到端口名(3004)netstat-aon|findstr"3004"2、找到pidtasklist|findstr"6412"3、关闭端口taskkill/pid7576-t-f
- java 去除List集合中实体类、属性的重复
x1321362731
javaList去重实体类的属性java集合去重
1.//实体类中重写equals与hashCode方法packagetest;publicclassStudent{privateStringname;privateStringage;privateStringsex;//......省略getset方法@Overridepublicbooleanequals(Objectobj){Students=(Student)obj;returnname
- list实体类类型的String转List集合
weixin_43242740
json字符串java
最近做了一个功能,需要将String类型的实体类list集合(我也不知道怎么表述,数据长成下面这个样子)[{“name”:“jack”,“age”:15},{“name”:“tom”,“age”,30}]//放到代码中是这样子的,右斜杠是字符转义?我是新手,不太懂Strings3="[{\"name\":\"jack\",\"age\":15},{\"name\":\"tom\",\"age\":
- JAVA list实体类转换通用_json <--->List集合,实体类 之间的相互转换
张鹤臣
JAVAlist实体类转换通用
packagecom.hp.svse;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;importnet.sf.json.JSONArray;importnet.sf.json.JSONObject;importnet.sf.json.JsonConfig;publicclassJsonTest{publics
- string类型转list实体类集合,解决:String cannot be cast to java.util.List
aline215
springbootjavajava
string类型转list实体类集合springboot框架controller层用@RequestParamMapparams接收前端传值,例如/***批量更新*/@RequestMapping("/updateBatch")publicListupdateBatch(@RequestParamMapparams){ListmesDectPropertiesEntities=(List)para
- java string 类型转list实体类且忽略实体类中没有的字段
北极的企鹅88
javalistwindows
一、javastring类型转list实体类且忽略实体类中没有的字段1、xml添加依赖com.google.code.gsongson2.8.82、java代码importcom.google.gson.Gson;importcom.google.gson.reflect.TypeToken;importjava.lang.reflect.Type;importjava.util.List;pub
- Lisp语言的系统运维
南雪瑶
包罗万象golang开发语言后端
Lisp语言在系统运维中的应用引言在当今信息技术飞速发展的时代,系统运维作为信息系统中的重要一环,越来越受到关注。系统运维不仅需要保证系统的稳定性和可靠性,还需要在面对复杂多变的环境时,快速响应和处理问题。Lisp语言因其强大的表达能力和灵活性,逐渐被一些运维工程师所青睐。本文将探讨Lisp语言在系统运维中的应用,包括其优势、实际案例以及未来发展方向。一、Lisp语言概述Lisp(LIStProc
- Spring Boot 项目Swagger 注解@Schema转换为word文档
liangblog
拿来就用系列springbootword后端
publicstaticListparseModel(Classclazz){List<
- 高性能 Android 自定义 View:数据渲染与事件分发的双重优化
每次的天空
android
在移动应用开发中,处理大量数据的自定义View(如长列表、图表)常面临性能与交互的双重挑战。本文将结合高效数据渲染与精准事件分发两大核心技术,为您提供一套完整的优化方案,实现1万条数据流畅滑动与灵敏交互的完美平衡。一、数据渲染优化:从1万条到丝滑体验1.视图复用机制//复用池管理privatefinalLinkedListviewPool=newLinkedListcacheMap=newWeak
- 疯狂安卓入门,crayandroid
耶耶耶耶耶~
其它androidjava
系列文章目录文章目录系列文章目录第一组ViewGroup为基类帧布局约束布局第二组TextView及其子类button时钟AnalogClock和TextClock计时器第三组ImageView及其子类第四组AdapterView及其子类AutoCompleteTextView的功能和用法ExapndaleListViewAdapterViewFlipperRecyclerView组件第五组UIP
- 链表使用基础——如何创建链表
榛果咖啡有点苦
链表
链表使用基础——如何创建链表前言leetcode题2两数相加已知两个非空链表,表示两个非负整数,每位数字都是按照逆序方式存储,每个节点存储一位数字将这两个数相加,并以相同形式返回一个表示和的链表假设:除了数字0以外,这两个数不会以0开头示例:建立结果链表structListNode*addTwoNumbers(structListNode*l1,structListNode*l2){intadd=
- 实验任务 N个人围成一圈,从第1个人开始顺序报数,1,2。凡报到2者,退出圈子,找出最后留在圈子中的人原来的序号。要求用链表实现。 输入描述 输入的数据有多组,每组第一个数为N,接下来N个数为一圈人
海宁不掉头发
链表算法数据结构
任务描述任务讲解查看答案实验任务N个人围成一圈,从第1个人开始顺序报数,1,2。凡报到2者,退出圈子,找出最后留在圈子中的人原来的序号。要求用链表实现。输入描述输入的数据有多组,每组第一个数为N,接下来N个数为一圈人的序号(N#includetypedefstructNode{intdata;structNode*next;}Node;Node*createList(intarr[],intn){
- html
周华华
html
js
1,数组的排列
var arr=[1,4,234,43,52,];
for(var x=0;x<arr.length;x++){
for(var y=x-1;y<arr.length;y++){
if(arr[x]<arr[y]){
&
- 【Struts2 四】Struts2拦截器
bit1129
struts2拦截器
Struts2框架是基于拦截器实现的,可以对某个Action进行拦截,然后某些逻辑处理,拦截器相当于AOP里面的环绕通知,即在Action方法的执行之前和之后根据需要添加相应的逻辑。事实上,即使struts.xml没有任何关于拦截器的配置,Struts2也会为我们添加一组默认的拦截器,最常见的是,请求参数自动绑定到Action对应的字段上。
Struts2中自定义拦截器的步骤是:
- make:cc 命令未找到解决方法
daizj
linux命令未知make cc
安装rz sz程序时,报下面错误:
[root@slave2 src]# make posix
cc -O -DPOSIX -DMD=2 rz.c -o rz
make: cc:命令未找到
make: *** [posix] 错误 127
系统:centos 6.6
环境:虚拟机
错误原因:系统未安装gcc,这个是由于在安
- Oracle之Job应用
周凡杨
oracle job
最近写服务,服务上线后,需要写一个定时执行的SQL脚本,清理并更新数据库表里的数据,应用到了Oracle 的 Job的相关知识。在此总结一下。
一:查看相关job信息
1、相关视图
dba_jobs
all_jobs
user_jobs
dba_jobs_running 包含正在运行
- 多线程机制
朱辉辉33
多线程
转至http://blog.csdn.net/lj70024/archive/2010/04/06/5455790.aspx
程序、进程和线程:
程序是一段静态的代码,它是应用程序执行的蓝本。进程是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。线程是比进程更小的单位,一个进程执行过程中可以产生多个线程,每个线程有自身的
- web报表工具FineReport使用中遇到的常见报错及解决办法(一)
老A不折腾
web报表finereportjava报表报表工具
FineReport使用中遇到的常见报错及解决办法(一)
这里写点抛砖引玉,希望大家能把自己整理的问题及解决方法晾出来,Mark一下,利人利己。
出现问题先搜一下文档上有没有,再看看度娘有没有,再看看论坛有没有。有报错要看日志。下面简单罗列下常见的问题,大多文档上都有提到的。
1、address pool is full:
含义:地址池满,连接数超过并发数上
- mysql rpm安装后没有my.cnf
林鹤霄
没有my.cnf
Linux下用rpm包安装的MySQL是不会安装/etc/my.cnf文件的,
至于为什么没有这个文件而MySQL却也能正常启动和作用,在这儿有两个说法,
第一种说法,my.cnf只是MySQL启动时的一个参数文件,可以没有它,这时MySQL会用内置的默认参数启动,
第二种说法,MySQL在启动时自动使用/usr/share/mysql目录下的my-medium.cnf文件,这种说法仅限于r
- Kindle Fire HDX root并安装谷歌服务框架之后仍无法登陆谷歌账号的问题
aigo
root
原文:http://kindlefireforkid.com/how-to-setup-a-google-account-on-amazon-fire-tablet/
Step 4: Run ADB command from your PC
On the PC, you need install Amazon Fire ADB driver and instal
- javascript 中var提升的典型实例
alxw4616
JavaScript
// 刚刚在书上看到的一个小问题,很有意思.大家一起思考下吧
myname = 'global';
var fn = function () {
console.log(myname); // undefined
var myname = 'local';
console.log(myname); // local
};
fn()
// 上述代码实际上等同于以下代码
m
- 定时器和获取时间的使用
百合不是茶
时间的转换定时器
定时器:定时创建任务在游戏设计的时候用的比较多
Timer();定时器
TImerTask();Timer的子类 由 Timer 安排为一次执行或重复执行的任务。
定时器类Timer在java.util包中。使用时,先实例化,然后使用实例的schedule(TimerTask task, long delay)方法,设定
- JDK1.5 Queue
bijian1013
javathreadjava多线程Queue
JDK1.5 Queue
LinkedList:
LinkedList不是同步的。如果多个线程同时访问列表,而其中至少一个线程从结构上修改了该列表,则它必须 保持外部同步。(结构修改指添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方
- http认证原理和https
bijian1013
httphttps
一.基础介绍
在URL前加https://前缀表明是用SSL加密的。 你的电脑与服务器之间收发的信息传输将更加安全。
Web服务器启用SSL需要获得一个服务器证书并将该证书与要使用SSL的服务器绑定。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后
- 【Java范型五】范型继承
bit1129
java
定义如下一个抽象的范型类,其中定义了两个范型参数,T1,T2
package com.tom.lang.generics;
public abstract class SuperGenerics<T1, T2> {
private T1 t1;
private T2 t2;
public abstract void doIt(T
- 【Nginx六】nginx.conf常用指令(Directive)
bit1129
Directive
1. worker_processes 8;
表示Nginx将启动8个工作者进程,通过ps -ef|grep nginx,会发现有8个Nginx Worker Process在运行
nobody 53879 118449 0 Apr22 ? 00:26:15 nginx: worker process
- lua 遍历Header头部
ronin47
lua header 遍历
local headers = ngx.req.get_headers()
ngx.say("headers begin", "<br/>")
ngx.say("Host : ", he
- java-32.通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小(两数组的差最小)。
bylijinnan
java
import java.util.Arrays;
public class MinSumASumB {
/**
* Q32.有两个序列a,b,大小都为n,序列元素的值任意整数,无序.
*
* 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
* 例如:
* int[] a = {100,99,98,1,2,3
- redis
开窍的石头
redis
在redis的redis.conf配置文件中找到# requirepass foobared
把它替换成requirepass 12356789 后边的12356789就是你的密码
打开redis客户端输入config get requirepass
返回
redis 127.0.0.1:6379> config get requirepass
1) "require
- [JAVA图像与图形]现有的GPU架构支持JAVA语言吗?
comsci
java语言
无论是opengl还是cuda,都是建立在C语言体系架构基础上的,在未来,图像图形处理业务快速发展,相关领域市场不断扩大的情况下,我们JAVA语言系统怎么从这么庞大,且还在不断扩大的市场上分到一块蛋糕,是值得每个JAVAER认真思考和行动的事情
- 安装ubuntu14.04登录后花屏了怎么办
cuiyadll
ubuntu
这个情况,一般属于显卡驱动问题。
可以先尝试安装显卡的官方闭源驱动。
按键盘三个键:CTRL + ALT + F1
进入终端,输入用户名和密码登录终端:
安装amd的显卡驱动
sudo
apt-get
install
fglrx
安装nvidia显卡驱动
sudo
ap
- SSL 与 数字证书 的基本概念和工作原理
darrenzhu
加密ssl证书密钥签名
SSL 与 数字证书 的基本概念和工作原理
http://www.linuxde.net/2012/03/8301.html
SSL握手协议的目的是或最终结果是让客户端和服务器拥有一个共同的密钥,握手协议本身是基于非对称加密机制的,之后就使用共同的密钥基于对称加密机制进行信息交换。
http://www.ibm.com/developerworks/cn/webspher
- Ubuntu设置ip的步骤
dcj3sjt126com
ubuntu
在单位的一台机器完全装了Ubuntu Server,但回家只能在XP上VM一个,装的时候网卡是DHCP的,用ifconfig查了一下ip是192.168.92.128,可以ping通。
转载不是错:
Ubuntu命令行修改网络配置方法
/etc/network/interfaces打开后里面可设置DHCP或手动设置静态ip。前面auto eth0,让网卡开机自动挂载.
1. 以D
- php包管理工具推荐
dcj3sjt126com
PHPComposer
http://www.phpcomposer.com/
Composer是 PHP 用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件。
中文文档
入门指南
下载
安装包列表
Composer 中国镜像
- Gson使用四(TypeAdapter)
eksliang
jsongsonGson自定义转换器gsonTypeAdapter
转载请出自出处:http://eksliang.iteye.com/blog/2175595 一.概述
Gson的TypeAapter可以理解成自定义序列化和返序列化 二、应用场景举例
例如我们通常去注册时(那些外国网站),会让我们输入firstName,lastName,但是转到我们都
- JQM控件之Navbar和Tabs
gundumw100
htmlxmlcss
在JQM中使用导航栏Navbar是简单的。
只需要将data-role="navbar"赋给div即可:
<div data-role="navbar">
<ul>
<li><a href="#" class="ui-btn-active&qu
- 利用归并排序算法对大文件进行排序
iwindyforest
java归并排序大文件分治法Merge sort
归并排序算法介绍,请参照Wikipeida
zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F
基本思想:
大文件分割成行数相等的两个子文件,递归(归并排序)两个子文件,直到递归到分割成的子文件低于限制行数
低于限制行数的子文件直接排序
两个排序好的子文件归并到父文件
直到最后所有排序好的父文件归并到输入
- iOS UIWebView URL拦截
啸笑天
UIWebView
本文译者:candeladiao,原文:URL filtering for UIWebView on the iPhone说明:译者在做app开发时,因为页面的javascript文件比较大导致加载速度很慢,所以想把javascript文件打包在app里,当UIWebView需要加载该脚本时就从app本地读取,但UIWebView并不支持加载本地资源。最后从下文中找到了解决方法,第一次翻译,难免有
- 索引的碎片整理SQL语句
macroli
sql
SET NOCOUNT ON
DECLARE @tablename VARCHAR (128)
DECLARE @execstr VARCHAR (255)
DECLARE @objectid INT
DECLARE @indexid INT
DECLARE @frag DECIMAL
DECLARE @maxfrag DECIMAL
--设置最大允许的碎片数量,超过则对索引进行碎片
- Angularjs同步操作http请求with $promise
qiaolevip
每天进步一点点学习永无止境AngularJS纵观千象
// Define a factory
app.factory('profilePromise', ['$q', 'AccountService', function($q, AccountService) {
var deferred = $q.defer();
AccountService.getProfile().then(function(res) {
- hibernate联合查询问题
sxj19881213
sqlHibernateHQL联合查询
最近在用hibernate做项目,遇到了联合查询的问题,以及联合查询中的N+1问题。
针对无外键关联的联合查询,我做了HQL和SQL的实验,希望能帮助到大家。(我使用的版本是hibernate3.3.2)
1 几个常识:
(1)hql中的几种join查询,只有在外键关联、并且作了相应配置时才能使用。
(2)hql的默认查询策略,在进行联合查询时,会产
- struts2.xml
wuai
struts
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache