struts2 项目开发经验
2009-02-23 02:21
477 查看
Struts2的开发也要控制好项目,一旦失控,可能比较JSP+servlet更坏。
1).Action类及Action
Name的命名规范
Action类的后缀统一加上"Action",
Action的Name与类的名称保持一致,但不要"Action"的后缀。
这样是为了通过Action的调用url,
很方便的找到Action类。
1
action name="searchKnowledge"
2
class="com.demo.search.action.SearchKnowledgeAction">
3
result name="search">/demo/search.jspresult>
4
action>
如上,看到/searchKnowledge.action,就可以很清楚的知道类是SearchKnowledgeAction了。很多人不注重这一点,开发调试中,每次都要笨拙的看struts.xml文件。
2).每个项目都必须至少有一个公用的Action类,GenericAction
完成的功能如下:
1.获取、注入request
2.获取、注入Session
3.错误页面跳转
4.获取在线用户和会员的信息(个人信息、权限、角色等)
5.注入类型转换的格式转换类,如日期类型转换:ConvertUtils.register(new
DateConverter(),
Date.class);
6.获取系统配置信息,如公用变量(如配置路径等)
7.对于request参数的处理等
8.其他可扩展的操作
3).擅长使用Dispatch的模式
有人说Action,不就是Dispatch的延伸吗,其实还可以做的更好。
这个典型的模式如下:
1.页面表单的Hidden参数中,就是一个ID,如queryID="queryKnowledges".
Action="/paginate.action"
2.PaginateAction的模板如下
1
private String queryID;
2
public String execute()
{
3
//获得Service的接口
4
//根据queryID调用Ibatis分页查询方法
5
return queryID;
//这一点,就是动态跳转,在Action不明确注明"success"之类的跳转名称。
6
}
3.在struts.xml中进行配置与queryID想对应:
1
action name="paginate"
2
class="com.gehc.util.pagination.PaginateAction">
3
result name="queryKnowledges">
4
/demo/knowledgeList.jsp
5
result>
6
7
result name="queryIssue">
8
/pm/issue/allIssue.jsp
9
result>
10
11
action>
实战代码如下:
4).配置文件的目录结构
5).不断的提炼公用的Action,并放在一个package中:
如上传、下载、异常处理、excel数据录入、过滤器(filter)、截取器(inteceptor)等等
6).将一个模块中的Action放置在一起
7).擅与使用redirect来保持request参数.
使用redirect一样可以将request参数传递到下一页面中,不需要使用session.
viewPost?postid=${postid}
public String
execute() throws Exception
{
//一些处理……
name=xiaowang ; //给要传递的参数赋值
return SUCCESS; //默认页面
//return "redirect_1"
; //重定向(不带参数) showInfo.do
//return "redirect_2"
; //重定向(带固定参数yangzi) showInfo.do?name=yangzi
//重定向(带动态参数,根据struts.xml的配置将${name}赋值为xiaowang)最后为
showInfo.do?name=xiaowang
// return "redirect_3" ;
//return "redirect_4"
; //这个是重定向到 一个action
}
action name="login"
class="LoginAction">
result name="success"
type="velocity">/pages/logok.vmresult>
result name="redirect_1"
type="redirect">showInfo.doresult>
result name="redirect_2"
type="redirect">showInfo.do?name=yangziresult>
result name="redirect_3"
type="redirect">showInfo.do?name=${name}result>
result name="redirect_4"
type= "redirect">
param name="actionName">showInfoparam>
param name="name">${name}param>
result>
action>
8)灵活使用chain模式,来编写简短而高度重用的Action,把相关的几个action连接起来,共同完成一个功能。
同一个Chain的多个action间数据的传递非常方便,由于处于chain中的action属于同一个http请求,共享一个ActionContext,故可以在上下文中获取,在页面上可以直接使用,上一个Action的成员变量。
1
<action name="step1"
class="test.Step1Action">
2
<result
name="success"
type="chain">step2.action</result>
3
</action>
4
5
<action
name="step2"
class="test.Step2Action">
6
<result
name="success">finish.jsp</result>
7
</action>
9)
编写简洁而高度重用的Action的另一个方法,就是将页面的渲染,格式转换的逻辑,抽取出来,自定义成Result。
官方的Result
Chain Result -
用于 Action Chaining
Dispatcher Result -
用于 JSP
整合
FreeMarker Result -
用于 FreeMarker
整合
HttpHeader Result -
用于控制特殊的HTTP行为
JasperReports Result -
用于 JasperReports
整合
Redirect Result -
用于直接跳转到例外的URL
Redirect Action Result -
用于直接跳转到另外的action
Stream Result -
用于向浏览器返回一个InputStream (一般用于文件下载)
Velocity Result -
用于 Velocity
整合
XSL Result -
用于 XML/XSLT 整合
PlainText Result -
用于显示某个页面的原始的文本 (例如 jsp, html 等)
Json Result
JFreechart Result
10)
明确Action类不要超长,如不要超过500行代码。
很多人为了偷懒,喜欢在一个Action中,不断的添加方法,而不管这些方法与Action的语义是否符合,到底是多个Action,还是多个方法,在开发过程中,还是要注重这些方法是否与创建Action类的目的、语义保持一致。
1).Action类及Action
Name的命名规范
Action类的后缀统一加上"Action",
Action的Name与类的名称保持一致,但不要"Action"的后缀。
这样是为了通过Action的调用url,
很方便的找到Action类。
1
action name="searchKnowledge"
2
class="com.demo.search.action.SearchKnowledgeAction">
3
result name="search">/demo/search.jspresult>
4
action>
如上,看到/searchKnowledge.action,就可以很清楚的知道类是SearchKnowledgeAction了。很多人不注重这一点,开发调试中,每次都要笨拙的看struts.xml文件。
2).每个项目都必须至少有一个公用的Action类,GenericAction
完成的功能如下:
1.获取、注入request
2.获取、注入Session
3.错误页面跳转
4.获取在线用户和会员的信息(个人信息、权限、角色等)
5.注入类型转换的格式转换类,如日期类型转换:ConvertUtils.register(new
DateConverter(),
Date.class);
6.获取系统配置信息,如公用变量(如配置路径等)
7.对于request参数的处理等
8.其他可扩展的操作
3).擅长使用Dispatch的模式
有人说Action,不就是Dispatch的延伸吗,其实还可以做的更好。
这个典型的模式如下:
1.页面表单的Hidden参数中,就是一个ID,如queryID="queryKnowledges".
Action="/paginate.action"
2.PaginateAction的模板如下
1
private String queryID;
2
public String execute()
{
3
//获得Service的接口
4
//根据queryID调用Ibatis分页查询方法
5
return queryID;
//这一点,就是动态跳转,在Action不明确注明"success"之类的跳转名称。
6
}
3.在struts.xml中进行配置与queryID想对应:
1
action name="paginate"
2
class="com.gehc.util.pagination.PaginateAction">
3
result name="queryKnowledges">
4
/demo/knowledgeList.jsp
5
result>
6
7
result name="queryIssue">
8
/pm/issue/allIssue.jsp
9
result>
10
11
action>
实战代码如下:
4).配置文件的目录结构
5).不断的提炼公用的Action,并放在一个package中:
如上传、下载、异常处理、excel数据录入、过滤器(filter)、截取器(inteceptor)等等
6).将一个模块中的Action放置在一起
7).擅与使用redirect来保持request参数.
使用redirect一样可以将request参数传递到下一页面中,不需要使用session.
viewPost?postid=${postid}
public String
execute() throws Exception
{
//一些处理……
name=xiaowang ; //给要传递的参数赋值
return SUCCESS; //默认页面
//return "redirect_1"
; //重定向(不带参数) showInfo.do
//return "redirect_2"
; //重定向(带固定参数yangzi) showInfo.do?name=yangzi
//重定向(带动态参数,根据struts.xml的配置将${name}赋值为xiaowang)最后为
showInfo.do?name=xiaowang
// return "redirect_3" ;
//return "redirect_4"
; //这个是重定向到 一个action
}
action name="login"
class="LoginAction">
result name="success"
type="velocity">/pages/logok.vmresult>
result name="redirect_1"
type="redirect">showInfo.doresult>
result name="redirect_2"
type="redirect">showInfo.do?name=yangziresult>
result name="redirect_3"
type="redirect">showInfo.do?name=${name}result>
result name="redirect_4"
type= "redirect">
param name="actionName">showInfoparam>
param name="name">${name}param>
result>
action>
8)灵活使用chain模式,来编写简短而高度重用的Action,把相关的几个action连接起来,共同完成一个功能。
同一个Chain的多个action间数据的传递非常方便,由于处于chain中的action属于同一个http请求,共享一个ActionContext,故可以在上下文中获取,在页面上可以直接使用,上一个Action的成员变量。
1
<action name="step1"
class="test.Step1Action">
2
<result
name="success"
type="chain">step2.action</result>
3
</action>
4
5
<action
name="step2"
class="test.Step2Action">
6
<result
name="success">finish.jsp</result>
7
</action>
9)
编写简洁而高度重用的Action的另一个方法,就是将页面的渲染,格式转换的逻辑,抽取出来,自定义成Result。
官方的Result
Chain Result -
用于 Action Chaining
Dispatcher Result -
用于 JSP
整合
FreeMarker Result -
用于 FreeMarker
整合
HttpHeader Result -
用于控制特殊的HTTP行为
JasperReports Result -
用于 JasperReports
整合
Redirect Result -
用于直接跳转到例外的URL
Redirect Action Result -
用于直接跳转到另外的action
Stream Result -
用于向浏览器返回一个InputStream (一般用于文件下载)
Velocity Result -
用于 Velocity
整合
XSL Result -
用于 XML/XSLT 整合
PlainText Result -
用于显示某个页面的原始的文本 (例如 jsp, html 等)
Json Result
JFreechart Result
10)
明确Action类不要超长,如不要超过500行代码。
很多人为了偷懒,喜欢在一个Action中,不断的添加方法,而不管这些方法与Action的语义是否符合,到底是多个Action,还是多个方法,在开发过程中,还是要注重这些方法是否与创建Action类的目的、语义保持一致。
相关文章推荐
- 也说项目开发经验
- 移动(c/s)项目开发经验
- 团队开发经验:如何带领一个项目团队并做好项目总结 !!
- 近期.NET学习及项目开发整理-总结开发的经验
- 【开发经验】Struts常见错误及原因分析
- 一篇不错的文章--项目开发经验谈之:设计失败的挫败感
- iOS 项目的目录结构能看出你的开发经验
- 项目开发经验总结
- Android开发经验02:Android 项目开发流程
- 持续两年的大项目开发经验总结
- 团队开发经验:如何带领一个项目团队并做好项目总结
- web项目开发流程经验总结
- java项目开发经验总结,值得收藏!绝对有用
- 在项目中开发中的一些经验
- JBuilder7和WebLogic7集成开发Struts一点经验
- 项目开发经验谈(二)
- Struts原理、开发及项目实施
- 【项目经验】如何用TexturePacker & Physicseditor开发游戏
- 项目经理离职前的软件开发经验
- Django实际站点项目开发经验谈