Pragmatic Struts

本文介绍Struts框架的多种精简使用技巧,包括DispatchAction的高效应用、struts-config.xml配置简化、NoFormBean的三种实现方式及其它实用简化方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 本文来自SpringSide WIki,请留意Wiki上的最新版本

  初学struts, 抛块砖头出来,请各位常年与Struts作战的兄弟点评。

   Struts 1.2 其实已经大不同,只要大家有简约的态度,即使我们日常的Struts,同样可以写得非常精简,不一定要如传统观念认为的那么繁重,从而节省每天编码的时间。

    Struts与Spring结合的基本知识请阅读Struts使用要点

1.DispatchAction

     以一个Controller响应一组动作绝对是Controller界的真理,Struts的DispatchAction同样可以做到这点。

<action path="/admin/user" name="userForm" scope="request" parameter="method" validate="false">
    
<forward name="list" path="/admin/userList.jsp"/>
action>

    其中parameter="method" 设置了用来指定响应方法名的url参数名为method,即/admin/user.do?method=list 将调用UserAction的public ActionForward list(....) 函数。   

    public ActionForward unspecified(....) 函数可以指定不带method方法时的默认方法。

2. struts-config.xml使用通配符

     对一些CRUD的Action,可以使用通配符,如果这批action里某个action某个方法还存在特殊路径,可以在代码里直接new ActionForward("/foo.jsp");

<action path="/admin/*" name="{1}Form" parameter="method" scope="request" validate="false">
            
<forward name="list" path="/WEB-INF/pages/admin/{1}List.jsp"/>
            
<forward name="edit" path="/WEB-INF/pages/admin/{1}Form.jsp"/>
            
<forward name="success" path="/admin/{1}.do?method=list" redirect="true"/>
action>

3.No FormBean

    Struts 1.2.7 之后一共有三种方法,不需要定义FormBean Java类也不需要在struts-config.xml里详细定义formBean的每个属性。

    第一种是appfuse里使用的,定义DynaValidatorForm里,内嵌一个pojo属性.

<form-bean name="userForm" type="org.apache.struts.validator.DynaValidatorForm">
            
<form-property name="user" type="org.appfuse.model.User"/>
form-bean>

 

//取得form DynaActionForm userForm = (DynaActionForm) form;
User user = (User) userForm.get("user");
//设置form
userForm.set("user",user);

    第二种是用BeanValidatorForm,直接把Pojo作FormBean,无需继承于FormBean接口。

 <form-bean name="userForm" type="org.springside.helloworld.domain.User"/>

 

//取得form Bean
ValidatorForm userForm = (BeanValidatorForm) form;User user = (User) userForm.getInstance();
//设置form
BeanUtils.copyProperties(userForm, user);
    第3种是用LazyValidatorForm ,特别适合于FormBean中并不包含POJO商业对象所有属性的情况,因为通常项目里都属于这种情况,所以springside默认使用lazyValidatorForm.

    比如User对象 有 id,name,status三个属性,而form表单中只有id和name两个input框,如果使用方法1,2,直接把user 作为 form bean,  user对象的status因为没设值,将为null,  copy 到作为商业对象的user时,就会以null覆盖原值。而lazyBean就没有这个问题,如果form中没有status属性,它不会将它copy给商业对象。

    另外,apache commons-beantuils 1.7.0的lazybean仍有小bug,需要使用commons-1.7.1 snapshot版,而且它直接提供下载的snapshot版缺少了几个class,应使用springside提供的版本。

<form-bean name="bookForm" type="org.apache.struts.validator.LazyValidatorForm"/>
 
BeanUtils.copyProperties(user, form);
     
 注意User对象被自动绑定,默认Integer id 在空值时会被赋值为0,需要增加converter,让其默认为null,虽然也可以在web.xml里进行相关配置,但还是在基类里配置了比较安全。
static {
ConvertUtils.register(
new IntegerConverter(null), Integer.class);
}

  4. 一些不必受困于Struts机制的简化写法

    一些简便直接的方法,大家可不必太受困于Struts的机制:

  4.1 不在struts-config.xml配置jsp路径,直接在代码里跳转

return new ActionForward("/foo/bar.jsp");
or
return new ActionForward("/foo/bar.jsp",true);

 

   4.2 不走jsp,直接输出字符串

ActionForward execute(....){
    
try {
            response.setContentType(
"text/html;charset=UTF-8");
            response.getWriter().write(text);
    } 
catch (IOException e) {
            log.error(e);
    }
    
return null;
}

 

 4.3. 不依赖Struts Taglib,EL直接输出FormBean 属性

普通FormBean:${bookForm.image}

LazyValidatorForm:${bookForm.map.image} 

其中bookForm 是formBean名。另一种输出属性的方式是使用jodd-form, 设<jodd:form bean="bookForm"></jodd:form>

4.4 不用i18N地使用Message与Error

   Struts的ActionMessages很常用,但只接收i18N的key作为输入参数,老定义i18n很麻烦,偏方之一就是设一个message= {0},然后直接new ActionMessage("message", message);

5. 终极化简--StrutsEntityAction

 SpringSide封装的EnttiyCRUDAction,,每个包含了CRUD操作的Action仅需如下代码,详细请阅读SpringSide的Struts封装

public   class  UserAction  extends  StrutsEntityAction < User,UserManager >  {
     
private  UserManager userManager;
     
public   void  setUserManager(UserManager userManager) {
           
this .userManager  =  userManager;
     }
   }
<jodd:form bean="bookForm"></jodd:form>
数据集介绍:多类别动物目标检测数据集 一、基础信息 数据集名称:多类别动物目标检测数据集 图片数量: - 训练集:6,860张图片 - 验证集:1,960张图片 - 测试集:980张图片 总计:9,800张含动态场景的动物图像 分类类别: Alpaca(羊驼)、Camel(骆驼)、Fox(狐狸)、Lion(狮子)、Mouse(鼠类)、Ostrich(鸵鸟)、Pig(猪)、Rabbit(兔子)、Rhinoceros(犀牛)、Shark(鲨鱼)、Sheep(绵羊)、Snake(蛇)、Whale(鲸鱼) 标注格式: YOLO格式标注,包含目标检测所需的归一化坐标及类别索引,适用于YOLOv5/v7/v8等系列模型训练。 数据特性: 覆盖航拍、地面视角等多种拍摄角度,包含动态行为捕捉及群体/单体目标场景。 二、适用场景 野生动物监测系统: 支持构建无人机/红外相机AI识别系统,用于自然保护区动物种群追踪与生态研究。 智慧农业管理: 适用于畜牧养殖场动物行为分析、数量统计及健康监测等自动化管理场景。 生物多样性研究: 为陆地/海洋生物分布研究提供标注数据支撑,助力濒危物种保护项目。 教育科研应用: 可作为计算机视觉课程实践素材,支持目标检测、迁移学习等AI教学实验。 三、数据集优势 跨物种覆盖全面: 包含13类陆生/水生动物,涵盖家畜、野生动物及濒危物种,支持复杂场景下的模型泛化训练。 动态场景丰富: 捕捉动物运动、群体互动等真实行为模式,提升模型对非静态目标的检测鲁棒性。 标注体系规范: 严格遵循YOLO标注标准,提供精确的边界框定位,支持即插即用的模型训练流程。 多场景适配性: 数据来源涵盖航拍影像、地面监控等多维度视角,适用于农业、生态保护、科研等跨领域应用。 类别平衡优化: 通过分层抽样保证各类别数据分布合理性,避免长尾效应影响模型性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值