struts2 零配置.docx

上传人:b****5 文档编号:6609827 上传时间:2023-01-08 格式:DOCX 页数:14 大小:21.13KB
下载 相关 举报
struts2 零配置.docx_第1页
第1页 / 共14页
struts2 零配置.docx_第2页
第2页 / 共14页
struts2 零配置.docx_第3页
第3页 / 共14页
struts2 零配置.docx_第4页
第4页 / 共14页
struts2 零配置.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

struts2 零配置.docx

《struts2 零配置.docx》由会员分享,可在线阅读,更多相关《struts2 零配置.docx(14页珍藏版)》请在冰豆网上搜索。

struts2 零配置.docx

struts2零配置

Struts2已经日益成为Web层比较主流的开发框架,它来源于Webwork2,是一个非常优秀的MVC框架。

在Webwork2设计之处,Annotation和RubyonRails还没有像现在那么火,所以整个框架在配置方面还是沿用了Web框架惯用的XML作为主要的配置方式。

随着时代的发展,对于Web程序员来说,如何简化配置成了一个很重要的课题。

在这方面,Struts2也有一些探索。

在Struts2的官方网站上,我们可以找到一些优秀的plugin来做这些工作:

http:

//cwiki.apache.org/S2PLUGINS/codebehind-plugin.html

http:

//cwiki.apache.org/S2PLUGINS/smarturls-plugin.html

LightURL的目的是为了吸取这些优秀的plugin的优点,并支持更方便的配置方式。

安装

1.将struts2-lighturl-plugin.jar加入到classpath下

2.配置你的web.xml

Java代码

1.      

2.    

-- Struts Filter -->  

3.  

4.    struts  

5.    com.demo2do.lighturl.LightURLFilter  

6.  

7.  

8.

-- Struts URL Definition -->  

9.  

10.    struts  

11.    /*  

12.      

--StrutsFilter-->

struts

com.demo2do.lighturl.LightURLFilter

--StrutsURLDefinition-->

struts

/*

3.需要指定你的actionpackage所在位置和一些基本配置

这一步一般在struts.properties中完成。

你可以建一个struts.properties的配置文件,并放到classpath下,并指定如下配置

Java代码

1.## action package config  

2.lighturl.action.packages=com.demo2do.lighturl.action  

3.  

4.## action mapping implementation class  

5.struts.mapper.class=com.demo2do.lighturl.LightURLActionMapper  

6.  

7.## default parent package  

8.lighturl.action.default.parent.package=struts-config  

9.  

10.## define your entity package (optional)  

11.# lighturl.entity.package=com.demo2do.lighturl.entity  

##actionpackageconfig

lighturl.action.packages=com.demo2do.lighturl.action

##actionmappingimplementationclass

struts.mapper.class=com.demo2do.lighturl.LightURLActionMapper

##defaultparentpackage

lighturl.action.default.parent.package=struts-config

##defineyourentitypackage(optional)

#lighturl.entity.package=com.demo2do.lighturl.entity

在完成以上的步骤后,lighturl的所有配置即告完成,现在你已经可以使用所有lighturl所提供的特性。

Namespace,ActionName和URL映射

lighturl所提供的最基本的特性是根据你的Action所在的package,确定namespace和actionName,并进行对应的URL映射。

举例说明,你在上面所讲述的struts.properties中,已经指定了你的actionpackage

Java代码

1.lighturl.action.packages=com.demo2do.lighturl.action  

lighturl.action.packages=com.demo2do.lighturl.action

那么,如果你有以下的Action类,那么lighturl将根据如下的规则来确定每个Action类所对应的namespace,actionName和url映射关系

1.根据lighturl.action.packages的配置的package到你的Action类的相对package来确定namespace,如果其中有驼峰法命名,那么转化成"-"连接的单词

∙com.demo2do.lighturl.action.Index ---->/

∙com.demo2do.lighturl.action.user.Search---->/user

∙com.demo2do.lighturl.action.blog.category.Index---->/blog/category

∙com.demo2do.lighturl.action.accoutDetail.View---->/account-detail

2.将Action类的类名转化成actionName。

如果碰到的Action类以"Action"结尾,则去掉末尾的"Action",如果其中有驼峰法命名,那么转化成"-"连接的单词

∙com.demo2do.lighturl.action.Index---->index

∙com.demo2do.lighturl.action.user.SearchAction---->search

∙com.demo2do.lighturl.action.blog.CategoryBlog---->category-blog

3.将namespace与actionName拼起来,就成构成映射到具体Action类的url

∙http:

//host:

port/app/user/index--->com.demo2do.lighturl.action.user.Index

∙http:

//host:

port/app/blog/category-blog--->com.demo2do.lighturl.action.blog.CategoryBlog

上面的这种URL匹配方式,我称之为:

package匹配

特殊形式的URL

应该说根据package来进行Action映射,可以解决绝大多数从url到action的映射配置问题。

不过有的时候,我们可能需要支持一些特殊形式的url。

LightURL在默认情况下,支持下列2种特殊形式的URL

1.支持将名为Index的Action直接映射到package上

这种匹配我称之为:

Namespace匹配。

这一个特性很直观。

如果你在某个Action的package下面有一个名为Index的Action类,那么如果你直接访问这个package,那么你可以访问到这个类:

∙com.demo2do.lighturl.action.Index--->http:

//host:

port/app/

∙com.demo2do.lighturl.action.user.Index--->http:

//host:

port/app/user

∙com.demo2do.lighturl.action.blog.category.Index--->http:

//host:

port/app/blog/category

2.支持类似:

/entity/${id}形式的URL

这种匹配我通常称之为:

entity匹配。

这个特性也比较简单,如果你有某个entity,并且在你的Actionpackage下有一个与entity同名的package。

同时在这个package下有一个叫View的Action,那么上述形式的URL会被映射到该Action。

∙com.demo2do.lighturl.action.user.View--->http:

//host:

port/app/user/3456

∙com.demo2do.lighturl.action.blog.View--->http:

//host:

port/app/user/1113

你可以通过在struts.properties中指定你entity所在的package来对哪些url可以具备这些特性,如果你输入的url不在你所指定的package中含有entity,那么这个url将无法被识别。

针对有些情况,数据库的主键可能不是数字。

此时,你可以通过自己实现com.demo2do.lighturl.config.EntityPrimaryKeyIdentifier的接口来指定你的url中id具备什么特点。

默认的实现是将主键识别为数字。

使用Annotation来指定映射

除了上述这些基本特性以外,还可以通过Annotaion来指定URL映射。

目前情况下,LightURL所支持的Annotation有两种类型:

1.URL完整匹配

URL完整匹配是指如果某个url完整匹配于Annotation中所指定的内容,那么这个URL将被映射到Annotation所在的Action类的method

Java代码

1.package com.demo2do.lighturl.action.user;  

2.  

3.import com.demo2do.lighturl.annotation.Action;  

4.import com.opensymphony.xwork2.ActionSupport;  

5.  

6./** 

7. * @author Downpour 

8. * 

9. */  

10.public class Search extends ActionSupport {  

11.      

12.    private static final long serialVersionUID = -1728616675239859226L;  

13.  

14.    /* (non-Javadoc) 

15.     * @see com.opensymphony.xwork2.ActionSupport#execute() 

16.     */  

17.    @Override  

18.    @Action("/all/search-user")  

19.    public String execute() throws Exception {  

20.        return super.execute();  

21.    }  

22.  

23.}  

packagecom.demo2do.lighturl.action.user;

importcom.demo2do.lighturl.annotation.Action;

importcom.opensymphony.xwork2.ActionSupport;

/**

*@authorDownpour

*

*/

publicclassSearchextendsActionSupport{

privatestaticfinallongserialVersionUID=-1728616675239859226L;

/*(non-Javadoc)

*@seecom.opensymphony.xwork2.ActionSupport#execute()

*/

@Override

@Action("/all/search-user")

publicStringexecute()throwsException{

returnsuper.execute();

}

}

例如,上述的Action类有一个Annotation,那么这个Action和method将被映射到对应的URL:

http:

//host:

port/app/all/search-user。

注意,此时,虽然从url上来看,这是一个没有什么规则的url,但是其所对应的namespace和actionName还是根据com.demo2do.lighturl.action.user.Search来进行计算的。

2.URLTemplate

URLTemplate是指,url可以匹配Annotaion中指定的某种URLTemplate,并将其中的可变部分作为参数映射到Action中。

Java代码

1.package com.demo2do.lighturl.action.blog;  

2.  

3.import com.demo2do.lighturl.annotation.Action;  

4.import com.opensymphony.xwork2.ActionSupport;  

5.  

6./** 

7. * @author Downpour 

8. * 

9. */  

10.public class Category extends ActionSupport {  

11.  

12.    private static final long serialVersionUID = -1535992103374733252L;  

13.  

14.        private Long id;  

15.      

16.    private int year;  

17.      

18.    private int month;  

19.      

20.    private int day;  

21.  

22.    /* (non-Javadoc) 

23.     * @see com.opensymphony.xwork2.ActionSupport#execute() 

24.     */  

25.    @Override  

26.    @Action("/blogs/${year}/${month}/${day}")  

27.    public String execute() throws Exception {  

28.        return super.execute();  

29.    }  

30.          

31.        @Action("/blog/${id}/edit")  

32.    public String edit() throws Exception {  

33.        return super.execute();  

34.    }  

35.        // setters and getters  

36.      

37.}  

packagecom.demo2do.lighturl.action.blog;

importcom.demo2do.lighturl.annotation.Action;

importcom.opensymphony.xwork2.ActionSupport;

/**

*@authorDownpour

*

*/

publicclassCategoryextendsActionSupport{

privatestaticfinallongserialVersionUID=-1535992103374733252L;

privateLongid;

privateintyear;

privateintmonth;

privateintday;

/*(non-Javadoc)

*@seecom.opensymphony.xwork2.ActionSupport#execute()

*/

@Override

@Action("/blogs/${year}/${month}/${day}")

publicStringexecute()throwsException{

returnsuper.execute();

}

@Action("/blog/${id}/edit")

publicStringedit()throwsException{

returnsuper.execute();

}

//settersandgetters

}

在上述的例子中,可以发现,在Annotation中所指定的内容是一个URLTemplate,如果你有一个url,可以匹配上面的URLTemplate,那么url将匹配到这个Action的method,并且将对应位置的值注入到Action中的同名参数中。

针对上面的例子:

http:

//host:

port/app/blogs/2008/08/07将被映射到这个Action的execute,并且2008,08和07分别映射到year,month和day中。

http:

//host:

port/app/blog/2345/edit将被映射到Action的edit方法,并且2345映射到id中作为参数

URL的匹配顺序与重复配置的校验

在上面的例子中,介绍了那么多的url映射到Action中的方式。

他们之间可能会出现冲突,有些冲突,LightURL会在系统启动时为你检查出来,并强制要求你纠正它,而有些冲突,则通过优先级匹配的方式进行。

下列冲突将被认为是你必须在系统启动前就进行纠正的:

1.Annotation中定义的URLTemplate互相之间冲突

例如:

/blogs/${year}/${month}/${day}和/blogs/${category}/${id}/edit就是冲突的。

2.Annotation中定义的URLTemplate与其他Annotation中定义的完全匹配URL冲突

例如:

/blogs/${year}/${month}和/blogs/category/index就是冲突的。

3.Annotation中定义的URLTemplate与形如/entity/${id}的url定义冲突

例如:

/user/${id}形式的Annotation定义可能会与系统默认支持的冲突。

在其他情况下,如果你定义的URL映射互相直接有冲突,那么LightURL将根据某个顺序进行URL匹配,并找到第一个匹配的映射方式,然后放弃查找。

这个顺序为:

1.首先进行Namespace匹配,如果url恰好能匹配某个namespace,并且其对应的package下有Index作为Action,那么直接进行匹配。

2.其次查看所有的Annotation定义中,是否存在完整的URL匹配,如果找到,那么进行直接匹配。

3.接着进行package匹配,将url分解成相应的namespace和actionName,与已有的配置进行匹配,如果找到,那么直接匹配。

4.然后进行entity匹配,看看url是否形如:

/entity/${id},如果是,那么直接匹配。

5.最后进行Annotation定义的UrlTemplate匹配。

如果所有的五种情况都无法进行匹配,那么这个URL将无法被LightURL识别,继续交由Struts2进行后续处理。

上面所描述的内容都是Url到Action的映射。

下面的部分,描述的是如何在Action执行完毕之后,转到相应的结果view。

Codebehind

LightURL支持codebehind。

有关codebehind的相关知识,可以参考struts2的相关文档:

http:

//struts.apache.org/2.x/docs/codebehind-plugin.html

有了codebehind的支持,那么从Action转到类似jsp,ftl或者vm的view层组件就不需要任何配置,只要符合一定的命名规范,就可以直接进行转向。

ResultCode的识别

但是在很多情况下,我们需要的是全方位的Result类型的支持。

例如,有的时候我们需要返回JSONResult,有的时候,我们可能需要Redirect到一个新的Action。

此时,我们不得不为此增加一些配置,或者借助Annotation来完成。

为此,LightURL提供了一种根据ResultCode进行识别的命名方式来匹配你所指定的Result。

以JSONResult为例,你可以这么写:

Java代码

1.package com.demo2do.lighturl.action.user;  

2.  

3.import com.demo2do.lighturl.entity.User;  

4.import com.opensymphony.xwork2.ActionSupport;  

5.  

6./** 

7. * @author Downpour 

8. * 

9. */  

10.p

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1