`
downpour
  • 浏览: 717142 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
00a07ae5-264f-3774-8903-8ad88ce08cb0
Struts2技术内幕
浏览量:117847
4d8508f2-c0dd-3df8-9483-04cc612afbbc
SpringMVC深度探险...
浏览量:230599
社区版块
存档分类
最新评论

LightURL——打造零配置的Struts2开发方式

    博客分类:
  • Java
阅读更多
背景
Struts2已经日益成为Web层比较主流的开发框架,它来源于Webwork2,是一个非常优秀的MVC框架。在Webwork2设计之处,Annotation和Ruby on Rails还没有像现在那么火,所以整个框架在配置方面还是沿用了Web框架惯用的XML作为主要的配置方式。

随着时代的发展,对于Web程序员来说,如何简化配置成了一个很重要的课题。在这方面,Struts2也有一些探索。在Struts2的官方网站上,我们可以找到一些优秀的plugin来做这些工作:

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

http://cwiki.apache.org/S2PLUGINS/smarturls-plugin.html
LightURL的目的是为了吸取这些优秀的plugin的优点,并支持更方便的配置方式。

版本提示

目前LightURL是基于struts2.0.X的版本写出来的。由于struts2.1.X尚属于beta版本,而且与之对应的XWork在IoC这块做了重大的修改,所以,我也暂不打算支持到struts2.1.X。如果使用struts2.1.X结合lighturl发生问题的朋友,请退回到struts的稳定版本。

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

2. 配置你的web.xml
        
        <!-- Struts Filter -->
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>com.demo2do.lighturl.LightURLFilter</filter-class>
    </filter>

    <!-- Struts URL Definition -->
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>    

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

这一步一般在struts.properties中完成。你可以建一个struts.properties的配置文件,并放到classpath下,并指定如下配置

## action package config
lighturl.action.packages=com.demo2do.lighturl.action

## action mapping implementation class
struts.mapper.class=com.demo2do.lighturl.LightURLActionMapper

## default parent package
lighturl.action.default.parent.package=lighturl

## define your entity package (optional)
# lighturl.entity.package=com.demo2do.lighturl.entity


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

Namespace, ActionName和URL映射

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

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

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,并且在你的Action package下有一个与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/blog/1113

你可以通过在struts.properties中指定你entity所在的package来对哪些url可以具备这些特性,如果你输入的url不在你所指定的package中含有entity,那么这个url将无法被识别。
针对有些情况,数据库的主键可能不是数字。此时,你可以通过自己实现com.demo2do.lighturl.config.EntityPrimaryKeyIdentifier的接口来指定你的url中id具备什么特点。默认的实现是将主键识别为数字。

不过一般而言,典型的entity匹配是无法满足我们的要求的。因为我们往往不会针对某个entity直接为action建立package,而是会对某个entity,对应到某个Action,它位于某个具体的package。所以针对这样的需求,我对entity匹配做了一定的扩展:

  • com.demo2do.lighturl.action.user.admin.View ---> http://host:port/app/user/user/3456
  • com.demo2do.lighturl.action.blog.category.View ---> http://host:port/app/blog/category/1113

也就是说,某个具体的package中,名字为View的Action,会对应到类似相同package下增加${id}的url。

使用Annotation来指定映射
除了上述这些基本特性以外,还可以通过Annotaion来指定URL映射。目前情况下,LightURL所支持的Annotation有两种类型:

1. URL完整匹配

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

package com.demo2do.lighturl.action.user;

import com.demo2do.lighturl.annotation.Action;
import com.opensymphony.xwork2.ActionSupport;

/**
 * @author Downpour
 *
 */
public class Search extends ActionSupport {
	
	private static final long serialVersionUID = -1728616675239859226L;
	/* (non-Javadoc)
	 * @see com.opensymphony.xwork2.ActionSupport#execute()
	 */
	@Override
	@Action("/all/search-user")
	public String execute() throws Exception {
		return super.execute();
	}
}


例如,上述的Action类有一个Annotation,那么这个Action和method将被映射到对应的URL:http://host:port/app/all/search-user。
注意,此时,虽然从url上来看,这是一个没有什么规则的url,但是其所对应的namespace和actionName还是根据com.demo2do.lighturl.action.user.Search来进行计算的。

2. URL Template

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

package com.demo2do.lighturl.action.blog;

import com.demo2do.lighturl.annotation.Action;
import com.opensymphony.xwork2.ActionSupport;

/**
 * @author Downpour
 *
 */
public class Category extends ActionSupport {

	private static final long serialVersionUID = -1535992103374733252L;

        private Long id;	
	private int year;	
	private int month;	
	private int day;

	/* (non-Javadoc)
	 * @see com.opensymphony.xwork2.ActionSupport#execute()
	 */
	@Override
	@Action("/blogs/${year}/${month}/${day}")
	public String execute() throws Exception {
		return super.execute();
	}
        
        @Action("/blog/${id}/edit")
	public String edit() throws Exception {
		return super.execute();
	}

        @Action("/blogs/common/*")
	public String common() throws Exception {
		return super.execute();
	}
        // setters and getters
	
}


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

不仅如此,LightURL还能够支持AntPath的URL匹配。这样可以通过书写/blogs/common/*或者/blogs/**来匹配多个不同的URL映射。

针对上面的例子:
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中作为参数
http://host:port/app/blogs/common/abcd将被映射到Action的common方法。


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

在上面的例子中,介绍了那么多的url映射到Action中的方式。他们之间可能会出现冲突,有些冲突,LightURL会在系统启动时为你检查出来,并强制要求你纠正它,而有些冲突,则通过优先级匹配的方式进行。

下列冲突将被认为是你必须在系统启动前就进行纠正的:
1. Annotation中定义的URL Template互相之间冲突

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

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

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

3. Annotation中定义的URL Template与形如/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定义的Url Template匹配

如果所有的五种情况都无法进行匹配,那么这个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层组件就不需要任何配置,只要符合一定的命名规范,就可以直接进行转向。

在这里,LightURL不仅实现了Codebehind的所有功能。而且,LightURL还对Codebehind的规则做出了扩展。

Codebehind在寻址JSP等资源时,顺序按照以下的规则进行:

1. /namespace/actionName-<resultCode>.<ext>

2. /namespace/actionName.<ext>


而LightURL在寻址JSP等资源时,增加了一定的规则,并且按照如下顺序进行:

1. /namespace/actionName-<resultCode>.<ext>

2. /namespace/<resultCode>.<ext>

3. /namespace/actionName.<ext>

4. /namespace/namespace-actionName-<resultCode>.<ext>

5. /namespace/namespace-<resultCode>.<ext>

6. /namespace/namespace-actionName.<ext>

这样一来,大家就有更加宽广的选择范围,进行默认资源的寻址匹配了。

ResultCode的识别

但是在很多情况下,我们需要的是全方位的Result类型的支持。例如,有的时候我们需要返回JSON Result,有的时候,我们可能需要Redirect到一个新的Action。此时,我们不得不为此增加一些配置,或者借助Annotation来完成。

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

以JSON Result为例,你可以这么写:

package com.demo2do.lighturl.action.user;

import com.demo2do.lighturl.entity.User;
import com.opensymphony.xwork2.ActionSupport;

/**
 * @author Downpour
 *
 */
public class Index extends ActionSupport {

	private static final long serialVersionUID = -5017825114664788765L;

	private User user;
	
	/* (non-Javadoc)
	 * @see com.opensymphony.xwork2.ActionSupport#execute()
	 */
	@Override
	public String execute() throws Exception {
		return "j:user";
	}

        // setters and getters
}


在这里,你可以发现,resultCode变成了j:user。那么此时,LightURL会将这个resultCode识别成:请返回JSON Result,并且JSON的Result的root为user对象。

再例如:

package com.demo2do.lighturl.action.user;

import com.demo2do.lighturl.entity.User;
import com.opensymphony.xwork2.ActionSupport;

/**
 * @author Downpour
 *
 */
public class Index extends ActionSupport {

	private static final long serialVersionUID = -5017825114664788765L;

	private User user;
	
	/* (non-Javadoc)
	 * @see com.opensymphony.xwork2.ActionSupport#execute()
	 */
	@Override
	public String execute() throws Exception {
		return "r:/user/add-user";
	}

        // setters and getters
}


在这里,"r:/user/add-user"会被识别成:请返回Redirect Result。Redirect的URL为/user/add-user。

LightURL默认情况下,实现了对Redirect Result和JSON Result的ResultCode识别,并将他们的前缀分别定制为:"r:"("redirect:")或者"j:"("json:")。

当然,你可以根据你自己的情况,实现你自己的ResultCode的识别程序,你只需要实现com.demo2do.lighturl.result.ResultCodeConfig接口即可。并在struts.properties中指定你希望LightURL进行ResultCode匹配的顺序。

lighturl.result.code.config=yourpackage.ResultCodeConfigImpl1,yourpackage.ResultCodeConfigImpl2


这样,LightURL会根据你所指定的顺序,依次进行ResultCode的匹配,直到找到第一个匹配的Result Type为之。

当然,默认情况下,LightURL的匹配顺序为:

codebehind -> 你自定义的ResultCode识别实现 -> json -> redirect
分享到:
评论
56 楼 downpour 2009-01-19  
楼上的朋友:不好意思,我前两天对LightURL做了一些bug fix。没有更新Javaeye这边上传的JAR包。

我已经重新上传了最新的jar包,你可以再试试。
55 楼 talangniao 2009-01-19  
按照你的配置:
## action package config 
lighturl.action.packages=com.demo2do.lighturl.action
 
## action mapping implementation class 
struts.mapper.class=com.demo2do.lighturl.LightURLActionMapper 
 
## default parent package 
lighturl.action.default.parent.package=lighturl 
 
## define your entity package (optional) 
# lighturl.entity.package=com.demo2do.lighturl.entity

建立om.demo2do.lighturl.action包
Index.java 类:
public class Index extends ActionSupport {

private static final long serialVersionUID = -2083335726534827269L;

/* (non-Javadoc)
* @see com.opensymphony.xwork2.ActionSupport#execute()
*/
@Override
public String execute() throws Exception {
return super.execute();
}

}

没有加index.java之前,启动tomcat什么问题都没有

启动tomcat,报错:
2009-1-19 14:39:18 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring root WebApplicationContext
2009-1-19 14:39:25 org.apache.catalina.core.StandardContext filterStart
严重: Exception starting filter struts2
java.lang.AbstractMethodError: com.demo2do.lighturl.config.impl.DefaultActionConfigBuilder$1.doesMatchResource()Z
at com.opensymphony.xwork2.util.ResolverUtil.isTestApplicable(ResolverUtil.java:391)
at com.opensymphony.xwork2.util.ResolverUtil.loadImplementationsInDirectory(ResolverUtil.java:384)
at com.opensymphony.xwork2.util.ResolverUtil.findInPackage(ResolverUtil.java:347)
at com.opensymphony.xwork2.util.ResolverUtil.find(ResolverUtil.java:302)
at com.demo2do.lighturl.config.impl.DefaultActionConfigBuilder.getPackageBasedActionMapper(DefaultActionConfigBuilder.java:255)
at com.demo2do.lighturl.config.impl.DefaultActionConfigBuilder.buildActionConfigs(DefaultActionConfigBuilder.java:115)
at com.demo2do.lighturl.LightURLConfigurationProvider.loadPackages(LightURLConfigurationProvider.java:80)
at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:179)
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:55)
at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:371)
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:424)
at org.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:213)
at com.demo2do.lighturl.LightURLFilter.init(LightURLFilter.java:40)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3696)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4343)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:516)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2009-1-19 14:39:25 org.apache.catalina.core.ApplicationContext log
信息: Closing Spring root WebApplicationContext
2009-1-19 14:39:25 org.apache.catalina.core.ApplicationContext log
信息: ContextListener: contextInitialized()
2009-1-19 14:39:25 org.apache.catalina.core.ApplicationContext log
信息: SessionListener: contextInitialized()




54 楼 downpour 2009-01-16  
显然是jar包冲突所致,你肯定还有其他的struts2的plugin实现了UnknownHandler接口。
53 楼 talangniao 2009-01-16  
查看tomcat日志:
Caused by: Unable to load bean: type:com.opensymphony.xwork2.UnknownHandler class:com.demo2do.lighturl.LightURLUnknownHandler - bean - jar:file:/E:/MyTestProject/newmini_web/WebRoot/WEB-INF/lib/struts2-lighturl-plugin-0.9.jar!/struts-plugin.xml:8:108
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.register(XmlConfigurationProvider.java:239)
at org.apache.struts2.config.StrutsXmlConfigurationProvider.register(StrutsXmlConfigurationProvider.java:100)
at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:156)
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:55)
... 22 more
Caused by: Bean type interface com.opensymphony.xwork2.UnknownHandler with the name default has already been loaded by bean - file:/E:/MyTestProject/newmini_web/WebRoot/WEB-INF/classes/struts-plugin.xml:8:108 - bean - jar:file:/E:/MyTestProject/newmini_web/WebRoot/WEB-INF/lib/struts2-lighturl-plugin-0.9.jar!/struts-plugin.xml:8:108
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.register(XmlConfigurationProvider.java:223)
... 25 more
52 楼 talangniao 2009-01-16  
jsonplugin-0.25.jar 这个包已经放进来
难道各个框架整合版本有关?
51 楼 talangniao 2009-01-16  
使用springside3 弄,替换掉springside3 的codebehind,按照你的配置,可是报下面错误

2009-01-16 14:33:25,863 [main] WARN  com.opensymphony.xwork2.config.providers.Xm
lConfigurationProvider - Result class [com.googlecode.jsonplugin.JSONResult] doe
sn't exist (ClassNotFoundException) at result-type - jar:file:/E:/MyTestProject/
newmini_web/WebRoot/WEB-INF/lib/struts2-lighturl-plugin-0.9.jar!/struts-plugin.x
ml:43:76, ignoring
java.lang.ClassNotFoundException: com.googlecode.jsonplugin.JSONResult
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoa
der.java:1358) [catalina.jar:na]
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoa
der.java:1204) [catalina.jar:na]
        at com.opensymphony.xwork2.util.ClassLoaderUtil.loadClass(ClassLoaderUti
l.java:147) [xwork-2.1.1.jar:na]
        at com.opensymphony.xwork2.ObjectFactory.getClassInstance(ObjectFactory.
java:94) [xwork-2.1.1.jar:na]
        at com.opensymphony.xwork2.spring.SpringObjectFactory.getClassInstance(S
pringObjectFactory.java:193) [xwork-2.1.1.jar:na]
50 楼 downpour 2009-01-10  
增加了Annotation定义中的不确定URL支持。

目前在@Action中可以写类似这样的配置:@Action("/hello/javaeye/*/gogo")。

更新了文档和附件。
49 楼 kjj 2009-01-05  
downpour 写道
kjj 写道
以前用xml的时候,需要在spring和xwork【struts.xml】配置文件里同时配置action 已达到能让spring创建对象 使用spring的ioc 功能,现在好了,action的配置文件都不要了,那么spring怎么去知道和管理action实例呢,难道在acion上继续使用spring的annotation 如果这样的花,action上的 annotation 数目可就可观了


你在这里猜测是无用的,不妨去试试看啊。

我已经提示你了,Struts2和Spring的整合与零配置是无关的,而是由struts-spring-plugin来完成的,为什么不去尝试一下呢?这是struts官方文档的链接:http://struts.apache.org/2.0.14/docs/spring-plugin.html

事实上,这两个框架之间的整合已经早已不需要在配置文件中指定action和spring的bean之间的调用关系。现在基本上都是用autowire的方式,你可以在各种autowire的方式中选择一种你喜欢的方式进行整合。



呵呵,不好意思啊,我的确有点猜测
48 楼 downpour 2009-01-05  
RyanPoy 写道
downpour 写道
linux.sir 写道
SVN怎么要用户名与密码呢?


checkout不需要,我刚刚试过


确实需要用户名和密码.


我改成了Http访问,你可以再试试:http://svn.demo2do.com/svn/sandbox/trunk/SourceCode/Lighturl
47 楼 RyanPoy 2009-01-05  
downpour 写道
linux.sir 写道
SVN怎么要用户名与密码呢?


checkout不需要,我刚刚试过


确实需要用户名和密码.
46 楼 downpour 2009-01-04  
kjj 写道
以前用xml的时候,需要在spring和xwork【struts.xml】配置文件里同时配置action 已达到能让spring创建对象 使用spring的ioc 功能,现在好了,action的配置文件都不要了,那么spring怎么去知道和管理action实例呢,难道在acion上继续使用spring的annotation 如果这样的花,action上的 annotation 数目可就可观了


你在这里猜测是无用的,不妨去试试看啊。

我已经提示你了,Struts2和Spring的整合与零配置是无关的,而是由struts-spring-plugin来完成的,为什么不去尝试一下呢?这是struts官方文档的链接:http://struts.apache.org/2.0.14/docs/spring-plugin.html

事实上,这两个框架之间的整合已经早已不需要在配置文件中指定action和spring的bean之间的调用关系。现在基本上都是用autowire的方式,你可以在各种autowire的方式中选择一种你喜欢的方式进行整合。


45 楼 kjj 2009-01-04  
以前用xml的时候,需要在spring和xwork【struts.xml】配置文件里同时配置action 已达到能让spring创建对象 使用spring的ioc 功能,现在好了,action的配置文件都不要了,那么spring怎么去知道和管理action实例呢,难道在acion上继续使用spring的annotation 如果这样的花,action上的 annotation 数目可就可观了
44 楼 downpour 2009-01-03  
kjj 写道
楼主,怎么和spring 集成呢,例如,注入很多Service


和spring集成不归我管。请参考Struts2的另外一个插件,struts2-spring-plugin
43 楼 kjj 2009-01-03  
楼主,怎么和spring 集成呢,例如,注入很多Service
42 楼 downpour 2009-01-01  
新年献礼。

增加了一些扩展,修复了一些bug,修改了文档,更新了jar包。
41 楼 downpour 2008-12-26  
linux.sir 写道
SVN怎么要用户名与密码呢?


checkout不需要,我刚刚试过
40 楼 linux.sir 2008-12-26  
SVN怎么要用户名与密码呢?
39 楼 downpour 2008-12-25  
这个是我的项目的svn地址:svn://www.demo2do.com/sandbox/trunk/SourceCode/Lighturl
38 楼 375721064 2008-12-25  
能把例子打包放上来吗?我的启动的时候总报错,tomcat启动不起来
37 楼 downpour 2008-12-24  
最近更新了一下LightURL,所以更新了一下jar包和source包。

主要的更新在于增加了对codebehind的扩展,文档稍后会补上。

相关推荐

    Struts2+技术内幕——深入解析Struts2架构设计与实现原理

    总之,《Struts2技术内幕——深入解析Struts2架构设计与实现原理》配合《struts2基础.chm》,将帮助读者全面掌握Struts2的架构设计、核心组件、配置方式、插件使用以及源码解读,对于想要在Java Web领域深入发展的...

    Struts2 技术内幕——深入解析Struts2架构设计与实现原理

    要深入学习和掌握Struts2,建议阅读官方文档,参与实际项目实践,也可以参考相关的技术书籍和教程,例如《Struts2技术内幕——深入解析Struts2架构设计与实现原理》等资源,来提升对Struts2框架的全面理解。

    配置Struts2开发环境

    Struts2通过约定优于配置的方式,可以根据Action类名自动映射URL。 9. **创建视图页面**:编写JSP页面作为视图,使用Struts2的标签库(struts2-jsp-plugin)来展示数据和处理用户交互。 10. **部署和测试**:将...

    struts2 技术内幕——深入解析struts2架构设计

    然后厘清了Web开发中极易混淆的一些重要概念,以及Struts2的核心技术、宏观视图、微观元素、配置元素等,提纲挈领地对Struts2进行了多角度的讲解。核心技术篇首先分析了Struts2中多种具有代表性的设计模式,然后对...

    Struts2 技术内幕——深入解析Struts2架构设计.pdf.zip

    总的来说,"Struts2 技术内幕——深入解析Struts2架构设计"这本书将带你深入理解Struts2的工作原理,包括其架构设计、核心组件、配置方式、数据绑定、异常处理以及安全性等方面。通过对这些知识点的掌握,开发者能够...

    Struts2零配置

    Struts2零配置是Struts2框架的一种简化配置方式,旨在减少XML配置文件的使用,提高开发效率。在传统的Struts2应用中,开发者需要在多个XML文件中配置Action、结果页面、拦截器等,而“零配置”则是对这种繁琐配置的...

    Struts2 chm文档

    6.Struts2中的零配置与CoC(Convention over Configration).doc 7.Struts2介绍之使用链接标签.doc 8.Struts2入门.doc 9.Struts2学习进阶(基础篇1-7) 10.Struts2学习进阶(实例篇1)——struts2-blank-2.0.8实例...

    <<项目架构那点儿事>>——浅析web层struts2的构建

    《项目架构那点儿事》——浅析Web层Struts2的构建 在Web开发领域,Struts2作为一款流行的MVC框架,为开发者提供了高效、灵活的架构支持。本篇文章将深入探讨Struts2在Web层的构建过程,通过分析提供的文件名,我们...

    JavaEE高级工程师I培训——框架核心技术Struts.Hibernate.Spring

    2. 创建和配置Struts2应用,包括Action、Result和Interceptor的使用 3. Hibernate的配置,实体类和映射文件的编写,以及数据操作方法 4. HQL和Criteria API的使用,以及Hibernate的缓存机制 5. Spring框架的核心概念...

    STRUTS2:零配置插件CodeBehind

    本文将详细介绍Struts2中的两个插件——Zero Config(零配置)与CodeBehind,以及它们如何共同工作以减少配置文件的复杂度。 #### 二、Zero Config插件介绍 Zero Config插件的主要目的是减少甚至消除`struts.xml`...

    eclipse 配置struts2

    在Java Web开发中,Struts2是一个非常流行的MVC(模型-视图-控制器)框架,它提供了一种结构化的方式来组织应用程序,提高了开发效率。Eclipse作为Java开发的主要IDE,配置Struts2可以让开发者在其中便捷地进行...

    简述STRUTS2_Convention零配置

    总的来说,STRUTS2 Convention零配置大大减少了XML配置文件的需求,提高了开发效率。通过合理的包结构和类命名,开发者可以快速构建出符合MVC模式的应用,同时享受到自动化的便利。然而,需要注意的是,过度依赖约定...

    Struts2.1权威指南——基于WebWork核心的MVC开发.zip

    书中通过大量的示范性实例(全书范例近百个),逐一、详细地讲解了Struts2各知识点的用法,并细致地讲解每个用法的各种参数、选项,可以帮助读者入门到精通。 3.配合案例,快速提高 《Struts 2.1权威指南》最后配备...

    struts2 零配置

    综上所述,Struts2的零配置特性大大简化了Java Web应用的开发,通过注解和插件机制,开发者可以快速构建应用而无需过多关注XML配置。不过,理解如何恰当地使用这些工具以及它们对性能的影响仍然是至关重要的。在实际...

    Struts2 技术内幕——深入解析Struts2架构设计与实现原理.zip

    首先,Struts2的出现是为了解决Struts1在MVC模式中的局限性,它通过提供更灵活的配置、更强大的拦截器(Interceptor)体系以及与Spring等其他框架的无缝集成,提升了开发效率和应用性能。框架的核心组件包括Action、...

    旺旺教师————Struts2

    **Struts2** 是一款开源的Java Web应用框架,用于简化Web应用程序的开发过程。它基于MVC(Model-View-Controller)设计模式,提供了一套标准的方式来构建应用程序。相比于Struts1,Struts2在架构上更加灵活,并且支持...

Global site tag (gtag.js) - Google Analytics