Pragmatic 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.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 BeanValidatorForm userForm = (BeanValidatorForm) form;
User user = (User) userForm.getInstance();//设置formBeanUtils.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);
}
3. 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>
4. 一些不必受困于Struts机制的简化写法
一些简便直接的方法,大家可不必太受困于Struts的机制:
4.1 不在struts-config.xml配置jsp路径,直接在代码里跳转
用于某些需要在代码里动态拼装的路径:
return
new
ActionForward("/foo/bar.jsp"
);
or
return
new
ActionForward("/foo/bar.jsp"
,true
);//redirect
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">
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;
}
}
来源: http://wiki.springside.org.cn/display/springside/PragmaticStruts
Pragmatic Struts相关推荐
- ssh(Struts+spring+Hibernate)三大框架整合-简述
ssh(Struts+spring+Hibernate)三大框架配合使用来开发项目,是目前javaee最流行的开发方式,必须掌握: 注意: 为了稳健起见,每加入一个框架,我们就需要测试一下,必须通过才 ...
- Struts 2(八):文件上传
第一节 基于Struts 2完成文件上传 Struts 2框架中没有提供文件上传,而是通过Common-FileUpload框架或COS框架来实现的,Struts 2在原有上传框架的基础上进行了进一步 ...
- web11 Struts处理表单数据
电影网站:www.aikan66.com 项目网站:www.aikan66.com 游戏网站:www.aikan66.com 图片网站:www.aikan66.com 书籍网站:www.aika ...
- struts学习笔记三-国际化
在程序设计领域,人们把能够在无需改写有关代码的前提下,让开发出来的应用程序能够支持多种语言和数据格式的技术称为国际化技术. 国际化简称为 i18n,根据internationalization简化而来 ...
- struts 2 结合json
struts 2 结合json 在struts 2中,要结合json的话,其实是不错的选择,最近做一个登陆系统时,可以考虑选择用 struts 2结合json,下面是要点 register页面 < ...
- struts配置文件没有标签提示
2019独角兽企业重金招聘Python工程师标准>>> struts配置文件没有标签提示 原因:" http://struts.apache.org/dtds/struts ...
- 浅析Struts 体系结构与工作原理(图)
Struts 体系结构是目前基于java的 web系统设计中广泛使用的mvc构架. 基本概念 Struts是Apache 基金会Jakarta 项目组的一个Open Source 项目,它采用模 ...
- Struts 为什么使用插件
注:对Struts进行扩展有三种方法(1.修改ActionServlet,2.继承RequestProcessor.3.做一插件继承PlugIn) 问题:有时候你需要在应用程序启动时装载一些数据到程序 ...
- struts.xml配置详解
2019独角兽企业重金招聘Python工程师标准>>> 1. 在struts2中配置常量的方式有三种: 在struts.xml文件中配置 在web.xml文件中配置 ...
最新文章
- CentOS 7 添加系统开机服务
- rmp (RPM软件包管理器)
- C++的4种类型转换关键字及其特点
- nyoj187 快速查找素数
- Java 输出指定目录下的所有文件
- 如何利用bat在同一个IE用多个选项卡的方式打开多个网址? 如何利用bat在同一个IE用多个选项卡的方式打开多个网址? 我的网址是这样的http://www.xags.gov.cn:8003/gga
- sublime text插件emmet自定义模板
- MySQL数据库面试题(2022年最新版45题)
- Java数字图像处理基础-------图像二值化处理
- Learning Git Branching 题解(基础、高级、Git远程仓库)
- ES6 isFinite()
- windows插耳机没声音?
- 重命名Active Directory域名
- LeetCode算法题解 38-报数
- vue2和vue3区别
- 2020山东计算机大赛裴鹏飞,裴鹏飞个人事迹加工作照(7页)-原创力文档
- 视锥体与AABB和OBB包围盒相交判断
- Vue引入Echart初始化错误
- 计算机视觉小白的心声
- xml解析 java_Java的XML解析
热门文章
- python编写递归函数、求斐波那契数列_利用Python实现斐波那契数列的方法实例
- 用java代码计算BMI指数
- JDBC实现数据库的增删改查
- python教程 网易公开课_如何用Python抓取网易公开课的视频?
- linux运维转行程序员
- [20190320]测试相同语句遇到导致cursor pin S的情况.txt
- 新入门的游戏建模师,你不知道的zbrush软件细节
- 康乐linux登录后台,解决LuManager自己的路zijidelu忘记后台登录密码详细过程
- 锈才学设计模式之 —— 观察者模式(Observer Pattern)
- 中国石油大学(北京)-《软件工程》-答案