struts2流程和配置步骤.docx

上传人:b****6 文档编号:6029711 上传时间:2023-01-03 格式:DOCX 页数:6 大小:21.27KB
下载 相关 举报
struts2流程和配置步骤.docx_第1页
第1页 / 共6页
struts2流程和配置步骤.docx_第2页
第2页 / 共6页
struts2流程和配置步骤.docx_第3页
第3页 / 共6页
struts2流程和配置步骤.docx_第4页
第4页 / 共6页
struts2流程和配置步骤.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

struts2流程和配置步骤.docx

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

struts2流程和配置步骤.docx

struts2流程和配置步骤

Struts2执行流程2009-12-1612:

19

Struts2执行流程

1.web.xml部署描述符

2.FilterDispatcher实现StrutsStatics,Filter接口

(1)Filter:

一个filter是一个对象用于执行过滤任务为每个请求资源(一个servlet或静态内容),或响应一个资源,或两者.过滤器执行过滤是在doFilter方法中.每个过滤器访问一个FilterConfig对象从中获取初始化参数,一个引用到ServletContext可以被使用,例如,在过滤器任务需要时装载资源.过滤器的配置在Web应用程序的部署描述符中.

init()-初始化过滤器,它的输入参数javax.servlet.FilterConfig的一个实例,可以这里初始化过滤要使用到的FilterConfig。

这个方法由Web容器自动调用。

doFilter()-进行具体的过滤操作,这个方法以javax.servlet.ServletRequest请求信息,javax.servlet.ServletResponse响应信息,javax.servlet.FilterChain过滤链。

过滤链,在Web应用程序中所有的过滤器会构成一个链状,符合过滤条件的程序将会根据定义的顺序执行所有链中的过滤器。

在这个方法中调用FilterChain的doFilter(javax.servlet.ServletRequest,javax.servlet.SerletResponse)方法就可以传递到链中的下一个过滤器。

destory()-销毁过滤器,可以在这里释放使用完的资源,例如设置过滤器中FilterConfig为null。

(2)StrutsStatics:

定义Struts中使用的常量,常量用来获取和设置Action上下文以外的对象或其它集合.可以使用如下方式获取这些对象

ActionContextcontext=ActionContext.getContext();

HttpServletRequestrequest=(HttpServletRequest)context.get(HTTP_REQUEST);

(3)FilterConfig接口:

一个过滤器配置对象,用于Servlet容器传递信息到过滤器在初始化期间.

BeanSelectionProvider类:

选择框架实现的关键扩展点,用于装载属性常量.选择的实现是从containerbuilder使用的名字定义关联属性,默认名为”struts”

例如:

获取request

ActionContext.getContext().put(HTTP_REQUEST,request)

执行流程:

※init(FilterConfigfilterConfig)初始化过滤器

->createDispatcher(filterConfig);创建调度器,返回带有过滤器参数Dispatcher

->执行Dispatcher的init方法,首先创建configurationManager,如果为null使用BeanSelectionProvider.DEFAULT_BEAN_NAME参数创建.

->配置的初始化

//加载org/apache/struts2/default.properties文件

init_DefaultProperties();//[1]

//加载格式相同的struts-default.xml,struts-plugin.xml,struts.xml

init_TraditionalXmlConfigurations();//[2]

//可读取publicstaticfinalStringSTRUTS_LOCALE="struts.locale";配置

init_LegacyStrutsProperties();//[3]

//加载Web.xml中的actionPackages配置

init_ZeroConfiguration();//[4]

//读取configProviders参数,配置用户定义的provider

init_CustomConfigurationProviders();//[5]

//Struts2.0.9中为空

init_MethodConfigurationProvider();

//初始化Filter中的config参数中指定的配置文件,initParams参数的获取是在Dispatcher创建时

init_FilterInitParameters();//[6]

//在BeanSelectionProvider中注册别名

init_AliasStandardObjects();//[7]

//读取publicstaticfinalStringSTRUTS_I18N_RELOAD="struts.i18n.reload";参数,

Containercontainer=init_PreloadConfiguration();

//读取publicstaticfinalStringSTRUTS_CONFIGURATION_XML_RELOAD="struts.configuration.xml.reload";

init_CheckConfigurationReloading(container);

//初始化weblogic相关配置

init_CheckWebLogicWorkaround(container);

->Stringparam=filterConfig.getInitParameter("packages");

Stringpackages="org.apache.struts2.statictemplateorg.apache.struts2.interceptor.debugging";设置静态资源Prefixes

※->doFilter

处理一个Action和它请求的静态资源,过滤器尝试配置请求到一个Actionmapping.如果mapping找到了,Action的处理在dispatcher的serviceAction方法.如果Action处理失败,doFilter将会尝试去创建一个错误页面通过dispatcher.另外请求一个静态资源,资源将直接Copy到响应,使用适当的caching头设置.如果请求没有匹配一个Actionmapping或一个静态资源页,那么将通过.

(1)getServletContext

Servlet2.3规范中ServletContext可以从Session中从新获取。

不幸的是,一些版本的Weblogic不能够从新获取从Filter的配置中.因此,这个方法允许子类重新获取ServletContext从其它源.

(2)prepareDispatcherAndWrapRequest(request,response)

包装和返回给定的request,如果需要,作为处理multipartdata包装给定的request.

1.dispatcher.prepare(request,response);

准备request,包括设置encoding和locale,使用注入的publicstaticfinalStringSTRUTS_I18N_ENCODING="struts.i18n.encoding"、publicstaticfinalStringSTRUTS_LOCALE="struts.locale"和publicstaticfinalStringSTRUTS_DISPATCHER_PARAMETERSWORKAROUND="struts.dispatcher.parametersWorkaround";(是否使用一个Servletrequest参数,对一些版本的Weblogic是必需的)

2.request=dispatcher.wrapRequest(request,getServletContext());

首先包装request,通过预先编码可以使用multipart/form-data参数访问的情况.

3.mapping=actionMapper.getMapping(request,dispatcher.getConfigurationManager());找到对应的Action映射.

4.如果找不到就去查找静态资源.

可以设置publicstaticfinalStringSTRUTS_SERVE_STATIC_CONTENT="struts.serve.static";

5.然后是正常的chain.doFilter(request,response);请求传递

6.dispatcher.serviceAction(request,response,servletContext,mapping);

装载映射的Acation类和调用适当的Action方法,或直接转向Result.这个方法首先创建Action上下文从给定的参数,并且装载一个ActionProxy从给定的Action名和namespace.然后,Action方法被直行和输出通道通过response对象.Action没有找到,发送到用户是通过Dispatcher的sendError方法,使用404返回码.所有的其它错误是通过抛出ServletException异常.

①ValueStackstack=(ValueStack)request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

如果已经存在这样的值栈,创建一个新的,拷贝和传递它为新的Action所使用.

②ActionProxyproxy=config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(

namespace,name,extraContext,true,false);

ActionProxy将会查阅框架的配置文件管理(初始化是从Struts.xml文件),下一步,ActionProxy创建一个ActionInvocation,它来负责命令模式的实现.包括调用拦截器在调用Action自身之前.

③proxy.setMethod(method);

设置Action调用中要执行的方法.如果没有方法被指定,将会由Action的配置来提供.

设置Action中执行的方法.

④如果ActionMapping直接到一个result

if(mapping.getResult()!

=null){

Resultresult=mapping.getResult();

result.execute(proxy.getInvocation());

}else{

//没有配置result的情况

proxy.execute();

}

⑤调用ActionProxy接口中的Stringexecute()throwsException;方法,它的实现类为DefaultActionProxy,在其中会调用retCode=invocation.invoke()方法.

⑥ActionInvocation接口的实现类DefaultActionInvocation的invoke方法首先调用拦截器栈,如果拦截器执行完,调用Action使用resultCode=invokeActionOnly();

⑦接下来迭代preResultListeners中的PreResultListener并执行其中的listener.beforeResult(this,resultCode);方法,在Action与Result之间.

⑧执行Result

if(proxy.getExecuteResult()){

executeResult();

}

⑨到此serviceAction方法执行完毕,返回到FilterDispatcher的doFilter方法中

⑩释放本地线程和创建的DispatchListeners

publicvoiddestroy(){

if(dispatcher==null){

LOG.warn("somethingisseriouslywrong,Dispatcherisnotinitialized(null)");

}else{

dispatcher.cleanup();

}

}

1.FilterDispatcher

(一)Struts的主要filter有四种不同的职责:

(1)执行Action

这个Filter执行Action是通过查找ActionMapper来确定请求的URL将会调用的Action.如果mapper中指定,其它的Filterchain将会停止并且Action会被调用.这一点非常重要,它意味着像SiteMesh过滤器必需被放置在它之前或者将不会被修饰输出的Action.

(2)CleaningupActionContext(清理上下文)

这个Filter将自动为你清理ActionContext,确保不会出现内存泄漏.然而,有时会引起一些集成上的问题像使用SiteMesh.见ActionContextCleanUp来获取更多的信息处时这个问题.

(3)Servingstaticcontent(静态内容服务)

这个过滤器也服务于普通的静态内容,需要使用Struts中的很多部分,像JavaSctipt文件,CSS文件,等等.它的工作通过查找请求中的/struts/*,并且映射值在”/struts/”后面的常用包,它是可选的在你的classpath中.默认情况下,下面的包将会自动被搜索:

★org.apache.struts2.static

★template

这意味着你可以请求/struts/xhtml/styles.css和XHTMLUI主题的默认stylesheet将会被返回.同样的很多AJAXUI组件需要的JavaScript文件也可以在org.apache.struts2.static包中找到.如果你希望添加额外的包被查找到,你可以增加一个逗号分隔的列表在过滤器的被始化参数”packages”中.注意,这样将暴露了你的包中的敏感信息,像访问数据库的属性文件.

(4)KickingoffXWork'sinterceptorchainfortherequestlifecycle

(二)这个Filter必需映射到所有的请求.除非你道它在做什么,通常映射到/*种URL模式

(三)这个Filter支持如下init-params:

★config---------------一个逗号分隔的XML配置文件将会被装载

★actionPackages----一个逗号分隔的JavaAction包将会被扫描.

★configProviders---一逗号分隔的实现com.opensymphony.xwork2.config.ConfigurationProvider接口的Java类列表,用于构建com.opensymphony.xwork2.config.Configuration。

★*-------------任何其它的参数,作为框架的常量来对待.

(四)使用定制的Dispatcher,createDispatcher方法可以被覆盖通过子类.

通配符映射

随着应用程序的增大,Action的数量也会增多.通配符可以用来组合简单的映射到多个通用映射.

最好的解释通配符的方法是通过一个例子和它是怎样工作的来展示.这个例子修改一个习惯上用通配符来匹配所有以/edit开头的页面;

--Genericedit*mapping-->

name="/edit*"

class="org.apache.struts.webapp.example.Edit{1}Action">

name="failure"

path="/mainMenu.jsp"/>

path="/\{1\}.jsp"/>

在路径中的“*”属性允许映射匹配请求的URI/editSubscription,editRegistration,或其它URI以/edit开头的,然而/editSubscription/add将不会被匹配.URI的部分匹配通过通配符,被替代的是Action映射中的变量属性和Action结果替换{1}.为了其它的请求,框架将查看Action映射和Actionresult中包括的新值.

映射的匹配依赖于请求,依次出现在框架的配置文件中。

如果一个或多个模式匹配最后一个模式将得到,所以较少的指定模式,必需呈现多个指向同一个之前.然而,如果请求的URL可以被匹配依赖于一个路径不需要任何通配置,没有通配置被执行,同时顺序也不重要了.

通配符模式可以包含一个或多个下面的指定标记:

*匹配一个或多个字符包括斜线(‘/’)字符.

**匹配一个或多个字符除了斜线(‘/’)字符.

\字符,反斜杠字符用来作为一个脱字符连接.因此*匹配字符星(‘*’),和匹配字符反斜框(‘\’).

在ActionMapping和ActionResult,通配符匹配值可以被该问使用标记{N},N从1到9指示通配符匹配值到被替代属性.全部的请求URI可以被该问用{0}标记.

同样的,ActionMapping属性(设置使用语法)将接受通配符匹配字符串在他们的值属性.

像ActionMapping,Actionresult属性(设置使用语法)将接受通配符匹配字符串在他们的值属性.

例子代码:

/example/Login.jsp

Menu

/example/{1}.jsp

Struts2配置步骤

1.将文件struts2-blank-2.0.11.war解压,将lib下的5个jar文件放到项目的lib下

2.web.xml

添加过滤器和默认配置文件,注册一个FilterDispatcher

struts2

org.apache.struts2.dispatcher.FilterDispatcher

struts2

/*

3.在src目录下创建struts.xml(项目发布后,struts.xml将会被复制到WEB-INF/classes下面)

在空的struts.xml中填入

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEstrutsPUBLIC

"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"

"http:

//struts.apache.org/dtds/struts-2.0.dtd">

--添加Action定义-->

//package可以将Action分类,划分到不同的包中,java中的包不可以继承,而这些包可以互相继承,包括拦截器,action映射等都可以继承extend

支持多个文件的定义,如user.xml格式和struts.xml相同,可以放在src或src的子文件夹下

最后在struts.xml中使用include嵌入

4.新建类继承ActionSupport

在其中设定方法和属性,在方法中给属性赋值,返回SUCCESS常量

5.struts.xml中加入一个action定义

/index.jsp

6.index.jsp页面显示属性值

propertyvalue="message"/>或使用EL表达式

7访问http:

//localhost:

8080/Struts2_prj/Hello.action

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

当前位置:首页 > 初中教育 > 科学

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

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