`

from Struts 2.0.x to 2.1.x

阅读更多

Troubleshooting guide migrating from Struts 2.0.x to 2.1.x

About the Migration guide

This guide describes how to migrate an existing Struts 2.0.x application to Struts 2.1.x. It is intended to be read from top to bottom but you may skip-ahead to known problems and common exceptions. Please edit this page or provide comments if you encounter additional issues.

 

Update Dependencies

Update your project dependences to use struts2-core-2.1.x and the plugins struts2-core-2.1.x.

There have been significant changes to the Configuration API between 2.0 and 2.1. Third-party plugins for 2.0 may not be compatible with 2.1.x.

Maven users can update their project's pom.xml to reference the new core and plugin versions. Ensure no dependencies in the freemarker groupId are used as the latest version used by Struts is now under the org.freeemarker groupId and will cause classpath conflicts.

If you need releases not considered General Availability you can use a staging repository where they are usually available:

<repositories>
    <repository>
      <id>struts2.1.2-staging</id>
      <name>Struts 2.1.2 staging repository</name>
      <layout>default</layout>
      <url>http://people.apache.org/builds/struts/2.1.2/m2-staging-repository/</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

Non-Maven users can can download the jars and dependencies in a Distribution 2.1.2<!-- [if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" alt="" href="http://people.apache.org/builds/struts/2.1.2/" mce_href="http://people.apache.org/builds/struts/2.1.2/" title="&quot;Visit page outside Confluence&quot;" style='width:5.25pt;height:5.25pt' o:button="t"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image002.gif" mce_src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image002.gif" o:href="http://cwiki.apache.org/confluence/images/icons/linkext7.gif" /> </v:shape><![endif]--><!-- [if !vml]--> <!-- [endif]-->

DELETE OLD VERSIONS NOW : It's essential that old versions of the jars are removed from your project as well as the deployment directories . Don't trust your IDE to delete unused versions.
eg. Your application is now be dependent on xwork-2.1.x, not xwork-2.0.x. Ensure xwork-2.0.x is completely removed or you will encounter compile-time and run-time exceptions.

Update Custom Type Converters

If your project implements custom type converters you may need to change the imports statements to use the com.opensymphony.xwork2.conversion package. Failing to do so will cause a compile-time error.

Before:

import com.opensymphony.xwork2.util.TypeConversionException;

After:

import com.opensymphony.xwork2.conversion.TypeConversionException;

Update struts.xml Configuration

Results and Interceptors have been renamed to use camelCase instead of hyphenated names (eg. now redirectAction instead of redirect-action).
Review all custom interceptor stacks, interceptor refs and results in struts.xml and remove the hyphen.

Interceptors:

From

To

external-ref

externalRef

model-driven

modelDriven

static-params

staticParams

scoped-model-driven

scopedModelDriven

servlet-config

servletConfig

token-session

tokenSession

Results:

From

To

redirect-action

redirectAction

plaintext

plainText

 

Forgetting to rename an interceptor or result reference will prevent your WebApp from starting. The following is a typical stacktrace for an invalid result type.

SEVERE: Exception starting filter struts2
Unable to load configuration. - action - file:/home/giaz/code/.metadata/.plugins/
            com.genuitec.eclipse.easie.tomcat.myeclipse/tomcat/webapps/webui/WEB-INF/classes/struts.xml:39:98
        at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:58)
        at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:370)
...
Caused by: Error building results for action ScheduleJob in namespace  - action - file:/home/giaz/code/.metadata/.plugins/
             com.genuitec.eclipse.easie.tomcat.myeclipse/tomcat/webapps/webui/WEB-INF/classes/struts.xml:39:98
        at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:372)
        ... 30 more
Caused by: There is no result type defined for type 'redirect-action' mapped with name 'success' - result -

<!-- [if !supportLineBreakNewLine]-->
<!-- [endif]-->

 

 

 

Migrate plugin configuration

Tiles 2

If you use the Tiles 2 plugin, check your tiles.xml file(s) to ensure they contain a DOCTYPE.

<!DOCTYPE tiles-definitions PUBLIC "-

//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"



       

"http:

//tiles.apache.org/dtds/tiles-config_2_0.dtd"
>



<tiles-definitions>

...

A missing DOCTYPE in your Tiles configuration will prevent your WebApp from starting. The following is a typical stacktrace for a missing Tiles DOCTYPE.

INFO: Initializing Tiles2 container. . .

Nov 22, 2007 11:38:11 AM org.apache.commons.digester.Digester error

SEVERE: Parse Error at line 2 column 19: Document is invalid: no grammar found.

org.xml.sax.SAXParseException: Document is invalid: no grammar found.

Ajax Theme / Dojo

If your WebApp uses the ajax theme bundled with Struts 2.0 (ajax tags), you need to update every pageas the Dojo support has been moved into a separate plugin and tag library.

1. Add the Dojo plugin as a new dependency for your project

<dependency>

        

<groupId>org.apache.struts</groupId>

        

<artifactId>struts2-dojo-plugin</artifactId>

        

<version>2.1.1</version>

    

</dependency>

2. Modify ALL pages that use the ajax theme to use the Dojo tag library.

For each page there are three tasks to complete:

  1. reference the new Dojo tag library
  2. update the head tag
  3. update all ajax themed tags
  4. check inline scripts
  5. check inline widgets

If this is a major undertaking for your application, it's recommended to modify, test and validate each page one at a time.

Reference the new Dojo Tag Library

Reference the new taglib in your JSP or FTL pages.
Before

<%@ page contentType=



"text/html; charset=UTF-8"



 %>



<%@ taglib prefix=

"s"
 
 uri=

"/struts-tags"
 
%>



After

<%@ page contentType=

"text/html; charset=UTF-8"
 
%>



<%@ taglib prefix=

"s"
 
uri=

"/struts-tags"
 
%>



<%@ taglib prefix=

"sx"

 uri=

"/struts-dojo-tags"

%>



Many pages will require both the core and dojo tags. The sx: prefix is preferred for the Dojo tags.

Update the head tag

Review the new attributes of the new head tag. You need to decide which values for the cache, compressed, parseContent and extraLocales attributes are appropriate for your application. These settings have major performance implications.

Before:

<s:head theme=

"ajax"
 
/>



After:

<sx:head parseContent=

"true"
 
/>



Update all ajax themed tags

Some tags are available only in the Dojo plugin taglib. It will be immediately obvious from your IDE that these tags need to change to the sx: prefix.
Some tags are available in both the core and Dojo plugin taglibs. Any tag that uses the ajax theme needs to be changed to the sx: prefix.

Before:

<s:url id=

"jobStatus"
 
 includeParams=

"get"
 
 value=

"/RefreshOptimizationJobStatus.action"

/>



<s:div id=

"jobStatus"
 
 theme=

"ajax"
 
href=

"%{jobStatus}"
 
updateFreq=

"5000"

 indicator=

"indicator"


>

</s:div>



<img id=

"indicator"

 src=

"img/indicator.gif"

 alt=

"Loading..."
 
 style=

"display:none"

/>



After:

<s:url var=

"jobStatus"

 includeParams=

"get"
 
value=

"/RefreshOptimizationJobStatus.action"

 />



<sx:div id=

"jobStatus"
 
 href=

"%{#jobStatus}"
  
updateFreq=

"5000"
 
 autoStart=

"true"
 
 indicator=


"indicator"

> 

</sx:div>



<img id=

"indicator"
  
src=

"img/indicator.gif"
  
alt=

"Loading..."

 style=

"display:none"

/>



If you forget to migrate a tag reference from the core to the dojo plugin you will receive an exception similar to the one below:

2008-04-19 14:32:30,475 ERROR [http-8443-Processor23] [[jsp]] Servlet.service() for servlet jsp threw exception

org.apache.jasper.JasperException: No tag "datetimepicker" defined in tag library imported with prefix "s"

Check inline javascript

If your ajax html results contain inline javascript that needs to be executed after updating the DOM, ensure your ajax tags set executeScripts="true" and separateScripts="true". These attributes instruct the widget to search for javascript in the result,
extract it, update the DOM with the result and then execute the javascript.

eg. The following bind will execute scripts within the result when the Submit button is pressed

<s:submit value="Submit"
  id="submit3"
/>

<sx:bind targets="div1"
  highlightColor="#ffffcc“  
 highlightDuration="500” 
 sources="submit3"

events="onclick"
  href="%{#fragment3Url}"
  errorNotifyTopics="/error"
  executeScripts="
true
"

 separateScripts="
true
"
/>

Check inline widgets

If your ajax html results include dojo widgets, ensure the head tag's parseContent attribute is true. This instructs dojo to parse the ajax responses for widgets. Note that Struts2.0 always enabled this feature and it could not be turned off. Struts2.1 disables this feature and allows it to be turned on as there is a significant performance impact.

Convert EL expressions to OGNL

Struts2.1 tags do not allow evaluation of JSP EL within their attributes. Instead, Struts2 tags evaluate attribute values as OGNL. Allowing both expression languages within the same attribute opens major security vulnerabilities.

todo: how to convert

Forgetting to convert attributes to OGNL expressions will produce exceptions similar to the one below:

org.apache.jasper.JasperException: /example.jsp(8,6) According to TLD or attribute directive in tag

file, attribute value does not accept any expression

Reduce verbose logging

Struts 2.1 introduces more verbose logging than Struts 2.0. While extremely valuable, some users may find these annoying.

Missing Properties

This message states that the framework searched for a property in the value stack and failed to find it.

2008-04-19 14:21:08,177 WARN  

[http-8443-Processor25] [OgnlValueStack] Could not find property [templateDir]

2008-04-19 14:21:08,177 WARN  

[http-8443-Processor25] [OgnlValueStack] Could not find property [templateDir]

2008-04-19 14:21:08,177 WARN  

[http-8443-Processor25] [OgnlValueStack] Could not find property [templateDir]

2008-04-19 14:21:08,178 WARN  

[http-8443-Processor25] [OgnlValueStack] Could not find property [org.apache.catalina.jsp_file]

To hide these messages, turn off the WARN level logging for OgnlValueStack.

eg. Include a new limit category in your log4j.xml file (only log errors or worse):

<category name=

"com.opensymphony.xwork2.ognl.OgnlValueStack"

>


   <priority value=
"error"
/>

</category>


TextProvider missing keys

These messages state that the framework searched for text in a resource bundle and failed to find it.

2008-04-19 14:32:30,106 WARN  

[http-8443-Processor23] [TextProviderHelper] The first TextProvider in the ValueStack

(package.Action) could not locate the message resource with key 'companyDetails.addressId'

2008-04-19 14:32:30,107 WARN  

[http-8443-Processor23] [TextProviderHelper] The default value expression

'companyDetails.addressId' evaluated to '10'

To hide those messages, turn off the WARN level logging for TextProviderHelper.

eg. Include a new limit category in your log4j.xml file (only log errors or worse):

<category name=

"org.apache.struts2.util.TextProviderHelper"

>


   <priority value=
"error"
/>

</category>


 

 

Update Unit Tests

There are two known major migration issues affecting user's unit tests.

  • The Configuration API now uses a Builder pattern
  • The ActionContext.getContext() method does not create a context on demand.

Review the Unit Tests included with Struts2 for recommended practices to setup the Configuration and context.

A quick fix for ActionContext.getContext() returning null :

ConfigurationManager configurationManager = new
 ConfigurationManager();

configurationManager.addContainerProvider(new
 XWorkConfigurationProvider());

 
Configuration config = configurationManager.getConfiguration();

Container container = config.getContainer();

ValueStack stack = container.getInstance(ValueStackFactory.class).createValueStack();

stack.getContext().put(ActionContext.CONTAINER, container);

        

ActionContext.setContext(new

ActionContext(stack.getContext()));

assertNotNull(ActionContext.getContext());

Trouble-shooting

The issues are listed in the same order as encountered after changing jars over from 2.0.x to 2.1.x. Noteworthy, the migration was done under the following setup: Fedora core 6, JDK 1.6.0_2 and Tomcat 6.0.10 running from MyEclipse plugin.

Result type "redirect-action" was renamed to "redirectAction":

SEVERE: Exception starting filter struts2

Unable to load configuration. - action - file:/home/giaz/code/.metadata/.plugins/

            

com.genuitec.eclipse.easie.tomcat.myeclipse/tomcat/webapps/webui/WEB-INF/classes/struts.xml:39:98

        

at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:58)

        

at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:370)

...

Caused by: Error building results for

 action ScheduleJob in namespace  

- action - file:/home/giaz/code/.metadata/.plugins/

             

com.genuitec.eclipse.easie.tomcat.myeclipse/tomcat/webapps/webui/WEB-INF/classes/struts.xml:39:98

        

at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:372)

        

... 30 more

Caused by: There is no result type defined for

 type 'redirect-action' mapped with name 'success' - result -

              

file:/home/giaz/code/.metadata/.plugins/com.genuitec.eclipse.easie.tomcat.myeclipse/tomcat/webapps/webui/

              

WEB-INF/classes/struts.xml:40:50

        

at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.buildResults(XmlConfigurationProvider.java:616)

        

... 35 more

The struts.xml before:

<action name="ScheduleJob"

 class="com.sag.optimizer.ui.web.action.scheduler.ScheduleJobAction"
>

    <result name="success"
  type="redirect-action"
>

          <param name="actionName"
>ListDisplayOptimizationJobStatus</param>

    </result>

    <result name="error"
  type="tiles"
>webui.requestFailed</result>

</action>

To resolve this issue modify the struts.xml action definition to:

<action name="ScheduleJob"

 class="com.sag.optimizer.ui.web.action.scheduler.ScheduleJobAction"
>

 
  <result name="success"
  type="redirectAction"
>

          
<param name="actionName"
>ListDisplayOptimizationJobStatus</param>

   </result>

   <result name="error"
 type="tiles"
>webui.requestFailed</result>

</action>

or to:

<action name="ScheduleJob"
 class="com.sag.optimizer.ui.web.action.scheduler.ScheduleJobAction"
>

    
<result name="success"
  type="redirect"
>ListDisplayOptimizationJobStatus.action</result>

    
<result name="error"
  type="tiles"
>webui.requestFailed</result>

</action>

<!-- [if !supportLineBreakNewLine]-->

<!-- [endif]-->

Tiles 2.1.x plugin tiles.xml now requires DOCTYPE:

Problem Symptom:

Nov 22, 2007 11:38:11 AM org.apache.tiles.impl.BasicTilesContainer init

INFO: Initializing Tiles2 container. . .

Nov 22, 2007 11:38:11 AM org.apache.commons.digester.Digester error

SEVERE: Parse Error at line 2 column 19: Document is invalid: no grammar found.

org.xml.sax.SAXParseException: Document is invalid: no grammar found.

        

at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)

        

at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)

Reason for this

This is due to the fact that Tiles 2.0.5 now turns validation on as default.

The tiles.xml page before:

<?xml version="1.0"
  encoding="ISO-8859-1"
 ?>

<tiles-definitions/>

To resolve the issue simply add:

<?xml version="1.0"
  encoding="ISO-8859-1"
 ?>

<!DOCTYPE tiles-definitions PUBLIC

"-

//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"

 "http:

//struts.apache.org/dtds/tiles-config_2_0.dtd"
>



<tiles-definitions/>

<s:head theme="ajax"/> is obsolete, use a different theme:

Problem Symptom: Accessing any page that includes <s:head theme="ajax"/> produces the following error:

Nov 22, 2007 1:54:51 PM freemarker.log.JDK14LoggerFactory$JDK14Logger error

SEVERE:

Expression parameters.parseContent is undefined on line 45, column 28 in template/ajax/head.ftl.

The problematic instruction:

----------

==> ${parameters.parseContent?string} [on line 45, column 26 in template/ajax/head.ftl]

----------

Java backtrace for

 programmers:

----------

freemarker.core.InvalidReferenceException: Expression parameters.parseContent is undefined on line 45,

column 28 in template/ajax/head.ftl.

at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:124)

at freemarker.core.TemplateObject.invalidTypeException(TemplateObject.java:134)

Resolution is to either remove the "<s:head theme="ajax"/>" or use a different theme e.g. <s:head theme="xhtml" />

Ajax UI tags were moved to the new dojo plugin, use /struts-dojo-tags taglib instead of (or in addition to) /struts-tags:

Problem Symptom: Accessing a page containing ajax UI tags through using the struts 2 taglib will produce the following error:

SEVERE: Servlet.service() for

 servlet jsp threw exception

org.apache.jasper.JasperException: /jsp/list/listOptimizationJobStatus.jsp(6,0) Attribute href invalid for

 tag div according to TLD

at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)

at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)

JSP before migration:

<%@ page contentType="text/html; charset=UTF-8"
 %>

<%@ taglib prefix="display"
 uri="http:
//displaytag.sf.net"
 %>


<%@ taglib prefix="s"
 uri="/struts-tags"
%>

<s:url id="jobStatus"
 includeParams="get"
 value="/RefreshOptimizationJobStatus.action"
 />

<s:div id="jobStatus"
 theme="ajax"
 href="%{jobStatus}"
 updateFreq="5000"
 indicator="indicator"
>
</s:div>

<img id="indicator"
 src="img/indicator.gif"
 alt="Loading..."
 style="display:none"
/>

Resolution is to import and use struts-dojo-tags plugin instead:

<%@ page contentType="text/html; charset=UTF-8"
 language="java"
 %>

<%@ taglib prefix="s"
 uri="/struts-tags"
%>

<%@ taglib prefix="sx"
 uri="/struts-dojo-tags"
 %>

<s:url var
="jobStatus"
 includeParams="get"
 value="/RefreshOptimizationJobStatus.action"
 />

<sx:div id="jobStatus"
  href="%{#jobStatus}"
 updateFreq="5000"
 autoStart="
true
"
  indicator="indicator"
>

</sx:div>

<img id="indicator"
 src="img/indicator.gif"
 alt="Loading..."
 style="display:none"
/>

Other Ajax UI tags were also moved to the dojo plugin

Note the use of remote div is now through the dojo plugin taglib sx. Other ui tags are also no longer available through the /struts-tags taglib but only through the /struts-dojo-tags taglib: datetimepicker and autocompleter.

User-defined converter (subclassing StrutsTypeConverter) will no longer be needed when using datetimepicker:

Problem Symptom: Your custom StrutsTypeConverter implementation does not longer work in version 2.1.x. In 2.0.x you needed to implement a custom StrutsTypeConverter e.g. StringToDateConverter to be able to parse and convert to Date the String posted from a datetimepicker control into the action. In version 2.0.x datetimepicker was posting a String formatted as specified in the "displayFormat" field e.g.

<%@ taglib prefix="s"
  uri="/struts-tags"
%>

<s:datetimepicker label="Begin Date"
 name="beginDate"
 displayFormat="yyyy.MM.dd"
>

In version 2.1.x datetimepicker will post a String Date in RFC 3339 format, so you can define your setter to receive a Date directly and avoid using converters for this purpose e.g.

<%@ taglib prefix="s"
 uri="/struts-tags"
%>
<%@ taglib prefix="sx"
 uri="/struts-dojo-tags"
%>

<sx:datetimepicker label="Begin Date"
 name="beginDate"
 displayFormat="yyyy.MM.dd"
>

ActionMappingParams

Parameters set by the action mapping are not set/not available through ParameterAware (This change is only needed when going to 2.1.x (where x>0))

These are now only available if you use the new interceptor named "actionMappingParams".

分享到:
评论

相关推荐

    Struts2.0.11.1所有JAR包

    配置文件如struts.xml是整个框架的中枢,定义了Action的映射、结果类型、拦截器栈等。同时,良好的安全实践也非常重要,因为Struts2历史上曾出现过严重的安全漏洞,比如著名的CVE-2017-5638“斯特拉托斯2远程代码...

    struts2.0升级到struts2.1的工具

    struts2.0升级到struts2.1的工具,自动修改配置文件和页面

    struts-2.0.11.2包

    在使用Struts2.0.11.2时,你需要根据项目需求配置`struts.xml`,定义Action和结果类型,设置拦截器链,以实现应用程序的流程控制。同时,通过编写Action类,实现业务逻辑,并利用OGNL表达式在Action和视图之间交换...

    struts-2.0.dtdstruts-2.0.dtdstruts-2.0.dtd

    本文将深入探讨Struts 2.0的相关知识点,包括DTD(Document Type Definition)的作用、Struts配置文件`struts.xml`的重要性和SSH2框架的搭建过程。 首先,`struts-2.0.dtd`是Struts 2.0的文档类型定义,它是XML文件...

    struts-2.0.11.2-lib

    - 使用`struts.xml`或`struts-default.xml`等配置文件来配置Action、结果页面和拦截器栈。 6. **安全性**: - Struts2.0.11.2版本在安全方面已经进行了多次优化,但依然需要注意其漏洞,例如著名的OGNL注入漏洞,...

    对struts1.x与struts2.x的区别的总结

    - **Struts2.x** 配置文件较少,主要为struts.xml,支持注解配置,减少XML配置的繁琐。 8. **插件与扩展性**: - **Struts1.x** 插件较少,扩展性相对较弱。 - **Struts2.x** 有丰富的插件系统,如Ajax、...

    ExtJs在struts2.0.x下实现动态树的解决方案

    在struts.xml配置文件中,为Action配置相应的结果类型,例如JSON: ```xml &lt;action name="load" class="com.example.TreeAction"&gt; &lt;param name="root"&gt;nodes ``` 4. **创建ExtJs TreePanel** 在...

    struts2核心包源码-2.0.11.2

    - 探究Struts2的配置机制,包括struts.xml和struts.properties文件的作用。 通过阅读源码,开发者能够更深入地理解Struts2的工作原理,从而在实际项目中更好地应用和优化框架。同时,对于提高问题排查能力、理解...

    struts2.0.11.1去多余插件jar

    同时,确保所有的配置文件(如struts.xml)中没有引用已移除的插件,以免出现配置错误。 总之,"struts2.0.11.1去多余插件jar"是为了提供一个精简、稳定的Struts2运行环境,它适用于那些不需要所有默认插件功能,...

    struts 2.0.zipstruts 2.0.zipstruts 2.0.zip

    Struts 2.0的配置文件通常是`struts.xml`,在这里定义Action、Result和Interceptor的配置。它支持XML和注解两种配置方式,注解可以减少配置文件的复杂性,使代码更加模块化。此外,Struts 2还提供了动态方法调用,...

    Spring2.5.3+Struts2.0.11.1+Hibernate3.2.6整合备忘 (转载)

    Spring2.5.3+Struts2.0.11.1+Hibernate3.2.6整合备忘 (转载)

    struts1.x和struts2.x区别

    在Struts1.x中,Action是核心组件之一,它必须继承自org.apache.struts.action.Action类,并且需要覆盖execute方法。Action对象由框架创建和管理,每一个HTTP请求都对应一个Action实例。然而,在Struts2.x中,Action...

    struts-2.0.11.2-all

    3. **配置文件**:Struts 2使用XML配置文件(struts.xml)来定义Action、结果类型、拦截器等。这些配置可以动态加载,提供了灵活的配置机制。 4. **拦截器(Interceptor)**:拦截器是Struts 2的一个重要特性,它们...

    Struts1.x常用的开发包,需要学习struts1.x朋友可以下载

    Struts1.x是一个经典的Java Web框架,由Apache软件基金会维护,它在2000年代中期至晚期广泛应用于企业级应用开发。这个框架基于Model-View-Controller(MVC)设计模式,帮助开发者构建结构清晰、可维护性强的Web应用...

    struts2.0.jar

    3. **配置文件**:Struts 2使用struts.xml配置文件来定义Action类、结果映射、拦截器链等。此外,还可以使用注解进行配置,使得配置更加灵活。 4. **拦截器**:这是Struts 2的一个强大特性,允许开发者定义拦截器链...

    struts1.x和struts2.0电子书

    这个压缩包包含了两个关键版本的Struts框架的电子书,即Struts1.x和Struts2.0的相关资料。 **Struts1.x** Struts1.x是最初的Struts版本,它极大地简化了Java Servlet和JSP的应用开发。Struts1的核心概念包括Action...

    struts-2.0.11.2_EN_US.CHM

    struts-2.0.11.2_EN_US.CHM 参考文档 struts-2.0.11.2_EN_US.CHM 参考文档 struts-2.0.11.2_EN_US.CHM 参考文档

    struts2-core-2.0.11.2.jar

    struts2-core-2.0.11.2.jar

    struts-2.0.11.1-lib.zipstruts-2.0.11.1-lib.zip

    struts-2.0.11.1-lib.zipstruts-2.0.11.1-lib.zipstruts-2.0.11.1-lib.zipstruts-2.0.11.1-lib.zip

    Struts2.0.rar

    4. **配置文件详解**:深入剖析struts.xml配置文件,包括常量配置、package定义、action配置、结果类型配置等。 5. **Action与结果**:讲解Action类的编写,以及如何通过注解或XML配置来定义Action的执行逻辑和结果...

Global site tag (gtag.js) - Google Analytics