第一篇:struts2核心工作流程與原理
struts2核心工作流程與原理 收藏
這是Struts2官方站點(diǎn)提供的Struts 2 的整體結(jié)構(gòu)。
一個(gè)請求在Struts2框架中的處理大概分為以下幾個(gè)步驟: 1.客戶端提起一個(gè)(HttpServletRequest)請求,如上文在瀏覽器中輸入”http://localhost:8080/TestMvc/add.action”就是提起一個(gè)(HttpServletRequest)請求。
2.請求被提交到一系列(主要是三層)的過濾器(Filter),如(ActionContextCleanUp、其他過濾器(SiteMesh等)、FilterDispatcher)。注意這里是有順序的,先ActionContextCleanUp,再其他過濾器(SiteMesh等)、最后到FilterDispatcher。
3.FilterDispatcher是控制器的核心,就是mvc中c控制層的核心。下面粗略的分析下我理解的FilterDispatcher工作流程和原理:FilterDispatcher進(jìn)行初始化并啟用核心doFilter
其代碼如下:
1.public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException...{
2.HttpServletRequest request =(HttpServletRequest)req;
3.HttpServletResponse response =(HttpServletResponse)res;
4.ServletContext servletContext = filterConfig.getServletContext();
5.// 在這里處理了HttpServletRequest和HttpServletResponse。
6.DispatcherUtils du = DispatcherUtils.getInstance();7.du.prepare(request, response);//正如這個(gè)方法名字一樣進(jìn)行l(wèi)ocale、encoding以及特殊request parameters設(shè)置
8.try...{
9.request = du.wrapRequest(request, servletContext);//對request進(jìn)行包裝 10.} catch(IOException e)...{
11.String message = “Could not wrap servlet request with MultipartRequestWrapper!”;12.LOG.error(message, e);
13.throw new ServletException(message, e);14.}
15.ActionMapperIF mapper = ActionMapperFactory.getMapper();//得到action的mapper
16.ActionMapping mapping = mapper.getMapping(request);// 得到action 的 mapping 17.if(mapping == null)...{
18.// there is no action in this request, should we look for a static resource?
19.String resourcePath = RequestUtils.getServletPath(request);
20.if(“".equals(resourcePath)&& null!= request.getPathInfo())...{
21.resourcePath = request.getPathInfo();22.}
23.if(”true“.equals(Configuration.get(WebWorkConstants.WEBWORK_SERVE_STATIC_CONTENT))
24.&& resourcePath.startsWith(”/webwork“))...{
25.String name = resourcePath.substring(”/webwork“.length());
26.findStaticResource(name, response);27.} else...{
28.// this is a normal request, let it pass through 29.chain.doFilter(request, response);30.} 31.// WW did its job here 32.return;33.}
34.Object o = null;35.try...{
36.//setupContainer(request);
37.o = beforeActionInvocation(request, servletContext);
38.//整個(gè)框架最最核心的方法,下面分析
39.du.serviceAction(request, response, servletContext, mapping);40.} finally...{
41.afterActionInvocation(request, servletContext, o);
42.ActionContext.setContext(null);43.} 44.}
45.du.serviceAction(request, response, servletContext, mapping);
46.//這個(gè)方法詢問ActionMapper是否需要調(diào)用某個(gè)Action來處理這個(gè)(request)請求,如果ActionMapper決定需要調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher把請求的處理交給ActionProxy 47.48.public void serviceAction(HttpServletRequest request, HttpServletResponse response, String namespace, String actionName, Map requestMap, Map parameterMap, Map sessionMap, Map applicationMap)...{
49.HashMap extraContext = createContextMap(requestMap, parameterMap, sessionMap, applicationMap, request, response, getServletConfig());//實(shí)例化Map請求,詢問ActionMapper是否需要調(diào)用某個(gè)Action來處理這個(gè)(request)請求
50.extraContext.put(SERVLET_DISPATCHER, this);51.OgnlValueStack stack =(OgnlValueStack)request.getAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY);
52.if(stack!= null)...{
53.extraContext.put(ActionContext.VALUE_STACK,new OgnlValueStack(stack));54.} 55.try...{
56.ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, actionName, extraContext);
57.//這里actionName是通過兩道getActionName解析出來的, FilterDispatcher把請求的處理交給ActionProxy,下面是ServletDispatcher的 TODO:
58.request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY, proxy.getInvocation().getStack());59.proxy.execute();
60.//通過代理模式執(zhí)行ActionProxy 61.if(stack!= null)...{
62.request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY,stack);63.}
64.} catch(ConfigurationException e)...{ 65.log.error(”Could not find action“, e);
66.sendError(request, response, HttpServletResponse.SC_NOT_FOUND, e);
67.} catch(Exception e)...{ 68.log.error(”Could not execute action“, e);
69.sendError(request, response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e);70.} 71.} 72.FilterDispatcher詢問ActionMapper是否需要調(diào)用某個(gè)Action來處理這個(gè)(request)請求,如果ActionMapper決定需要調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher把請求的處理交給ActionProxy。
4.ActionProxy通過Configuration Manager(struts.xml)詢問框架的配置文件,找到需要調(diào)用的Action類.如上文的struts.xml配置
1.
2. 3.
4.
5.
6. 7.class=”edisundong.AddAction“ > 8.
5.ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例,同時(shí)ActionInvocation通過代理模式調(diào)用Action。但在調(diào)用之前ActionInvocation會根據(jù)配置加載Action相關(guān)的所有Interceptor。(Interceptor是struts2另一個(gè)核心級的概念)
下面我們來看看ActionInvocation是如何工作的:
ActionInvocation 是Xworks 中Action 調(diào)度的核心。而對Interceptor 的調(diào)度,也正是由ActionInvocation負(fù)責(zé)。ActionInvocation 是一個(gè)接口,而DefaultActionInvocation 則是Webwork 對ActionInvocation的默認(rèn)實(shí)現(xiàn)。
Interceptor 的調(diào)度流程大致如下:
1.ActionInvocation初始化時(shí),根據(jù)配置,加載Action相關(guān)的所有Interceptor。
2.通過ActionInvocation.invoke方法調(diào)用Action實(shí)現(xiàn)時(shí),執(zhí)行Interceptor。
Interceptor將很多功能從我們的Action中獨(dú)立出來,大量減少了我們Action的代碼,獨(dú)立出來的行為具有很好的重用性。XWork、WebWork的許多功能都是有Interceptor實(shí)現(xiàn),可以在配置文件中組裝Action用到的Interceptor,它會按照你指定的順序,在Action執(zhí)行前后運(yùn)行。那么什么是攔截器。
攔截器就是AOP(Aspect-Oriented Programming)的一種實(shí)現(xiàn)。(AOP是指用于在某個(gè)方法或字段被訪問之前,進(jìn)行攔截然后在之前或之后加入某些操作。)
攔截器的例子這里就不展開了。struts-default.xml文件摘取的內(nèi)容:
1.< interceptor name =”alias“ class =”com.opensymphony.xwork2.interceptor.AliasInterceptor“ /> 2.< interceptor name =”autowiring“ class =”com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor“ />
3.< interceptor name =”chain“ class =”com.opensymphony.xwork2.interceptor.ChainingInterceptor“ />
4.< interceptor name =”conversionError“ class =”org.apache.struts2.interceptor.StrutsConversionErrorInterceptor“ /> 5.< interceptor name =”createSession“ class =”org.apache.struts2.interceptor.CreateSessionInterceptor“ />
6.< interceptor name =”debugging“ class =”org.apache.struts2.interceptor.debugging.DebuggingInterceptor“ /> 7.< interceptor name =”external-ref“ class =”com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor“ />
8.< interceptor name =”execAndWait“ class =”org.apache.struts2.interceptor.ExecuteAndWaitInterceptor“ />
9.< interceptor name =”exception“ class =”com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor“ /> 10.< interceptor name =”fileUpload“ class =”org.apache.struts2.interceptor.FileUploadInterceptor“ />
11.< interceptor name =”i18n“ class =”com.opensymphony.xwork2.interceptor.I18nInterceptor“ />
12.< interceptor name =”logger“ class =”com.opensymphony.xwork2.interceptor.LoggingInterceptor“ />
13.< interceptor name =”model-driven“ class =”com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor“ /> 14.< interceptor name =”scoped-model-driven“ class =”com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor“ /> 15.< interceptor name =”params“ class =”com.opensymphony.xwork2.interceptor.ParametersInterceptor“ />
16.< interceptor name =”prepare“ class =”com.opensymphony.xwork2.interceptor.PrepareInterceptor“ />
17.< interceptor name =”static-params“ class =”com.opensymphony.xwork2.interceptor.StaticParametersInterceptor“ />
18.< interceptor name =”scope“ class =”org.apache.struts2.interceptor.ScopeInterceptor“ />
19.< interceptor name =”servlet-config“ class =”org.apache.struts2.interceptor.ServletConfigInterceptor“ />
20.< interceptor name =”sessionAutowiring“ class =”org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor“ />
21.< interceptor name =”timer“ class =”com.opensymphony.xwork2.interceptor.TimerInterceptor“ />
22.< interceptor name =”token“ class =”org.apache.struts2.interceptor.TokenInterceptor“ />
23.< interceptor name =”token-session“ class =”org.apache.struts2.interceptor.TokenSessionStoreInterceptor“ /> 24.< interceptor name =”validation“ class =”com.opensymphony.xwork2.validator.ValidationInterceptor“ />
25.< interceptor name =”workflow“ class =”com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor“ /> 26.< interceptor name =”store“ class =”org.apache.struts2.interceptor.MessageStoreInterceptor“ />
27.< interceptor name =”checkbox“ class =”org.apache.struts2.interceptor.CheckboxInterceptor“ />
28.< interceptor name =”profiling“ class =”org.apache.struts2.interceptor.ProfilingActivationInterceptor" /> 29.一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對應(yīng)的返回結(jié)果。如上文中將結(jié)構(gòu)返回“add.jsp”,但大部分時(shí)候都是返回另外一個(gè)action,那么流程又得走一遍………
第二篇:MVC以及Struts2工作流程
MVC是一種軟件架構(gòu)的思想,將一個(gè)軟件系統(tǒng)劃分成三種不同類型的模塊,分別是模型(model),用于封裝業(yè)務(wù)邏輯。視圖(view),提供用戶操作的接口(提供業(yè)務(wù)數(shù)據(jù)的展現(xiàn),并且,用戶也可以通過視圖來提交請求)。控制器(controller),將視圖與模型解耦,也就是說視圖要向控制器發(fā)送請求,由控制器來決定調(diào)用哪一個(gè)模型來處理,反過來,模型處理之后的結(jié)果也交給控制器,由控制器來選擇合適的視圖來展現(xiàn)。
Model:使用java類來實(shí)現(xiàn)(也可以使用spring容器管理的javabean,ejb等)View:使用jsp Controller:使用servlet或者filter 優(yōu)點(diǎn):
1.model可以被多個(gè)view共享,model處理之后的結(jié)果可以使用不同的界面來展現(xiàn),多種不同類型的界面,可以調(diào)用相同的model 來處理。
2.model可以當(dāng)便測試(如,將業(yè)務(wù)邏輯寫在了servlet力需要部署servlet然后才能測試)如果也業(yè)務(wù)邏輯寫在一個(gè)java類當(dāng)中,測可以立即測試 3.方便分工合作 4.方便代碼的維護(hù) 缺點(diǎn):
增加代碼量(相應(yīng)的開發(fā)周期要延長,并且,要相應(yīng)增大了設(shè)計(jì)的難度)。所以,一般來說,對于需要良好的可維護(hù)性且項(xiàng)目規(guī)模比較大的項(xiàng)目可以用MVC。
Struts2框架的工作流程圖
Struts2框架的工作流程
1)服務(wù)器啟動(dòng),創(chuàng)建StrustsPrepareAndExecuteFilter對象,并解析struts.xml配置文件
2)客戶端發(fā)出action請求后,控制器會調(diào)用ActionMapper(Action映射器)完成請求與Action組件之間的映射,便于調(diào)用Action處理
3)通過ActionMapper處理后,接著調(diào)用ActionProxy(Action代理)提取請求對應(yīng)的配置文件信息,創(chuàng)建ActionInvocation(Action執(zhí)行者)對象,ActionProxy通過ConfigurationManager(配置管理器)解析和獲取struts的配置信息 4)通過ActionInvocation完成攔截器、Action和Result組件的調(diào)用 5)生成響應(yīng)信息后,為客戶端響應(yīng)
第三篇:Struts2核心攔截器---學(xué)習(xí)筆記
Struts2的核心——攔截器
在struts2中,攔截器(Interceptor)是其核心的組件,當(dāng)我們訪問一個(gè)action時(shí),我們可以通過攔截器的配置,做一些需要的操作。
我們可以寫我們自己的攔截器,但是要實(shí)現(xiàn)或繼承struts2給我們提供的接口或類。
①.我們實(shí)現(xiàn)Interceptor接口,該接口是struts2提供的攔截器接口,位于com.opensymphony.xwork2.interceptor包下,其提供了類似與filter的一些方法,我們必須實(shí)現(xiàn)它的方法:destroy()、init()、intercept(ActionInvocation)。
public class MyInterceptor implements Interceptor {
public void destroy(){
System.out.println(“destroy”);} public void init(){ } public String intercept(ActionInvocation invocation)throws System.out.println(“init”);Exception {
System.out.println(“intercept”);
String resultString= invocation.invoke();System.out.println(“finish”);return resultString;}
②.我們可以繼承AbstractInterceptor類,該類是一個(gè)抽象類,它位于com.opensymphony.xwork2.interceptor包下,它實(shí)現(xiàn)了Interceptor接口,并完成了對destroy()方法和init()方法的實(shí)現(xiàn),但保留了抽象方法interceptor(),以供自定義的攔截器來重寫其方法,完成特定的需求。
public class MyInterceptor1 extends AbstractInterceptor {
} @Override
public String intercept(ActionInvocation invocation)throws
System.out.println(“intercept1”);
String result=invocation.invoke();
System.out.println(“finish1”);Exception { return result;}
③.上面兩個(gè)是對action進(jìn)行的攔截,粒度比較粗,當(dāng)然struts2也給我們提供了對action中方法的攔截。這時(shí),我們自己寫的類就要繼承struts
2給我們提供的方法過濾類,該
類
同
樣
位
于MethodFilterInterceptor com.opensymphony.xwork2.interceptor包下,但該類已經(jīng)完成了對interceptor()方法的簡單實(shí)現(xiàn),而提供了一個(gè)doIntercept()方法。
public class MyInterceptor2 extends MethodFilterInterceptor { @Override
protected String doIntercept(ActionInvocation invocation)throws Exception {
System.out.println(“methodFilterInterceptor2”);String result=invocation.invoke();System.out.println(“finish2”);
return result;} }
寫好了我們自己的攔截器類,還需要在struts.xml文件進(jìn)行配置來告訴struts2框架,我們的攔截器要攔截的action、方法。
首先,我們要在package包下增加一個(gè)新的元素標(biāo)簽 class=“com.test.interceptor.MyInterceptor”>
定義了一個(gè)name是myInterceptor的攔截器(即實(shí)現(xiàn)了Interceptor接口的那個(gè)攔截器),類似的,我們定義了上面我們已寫的3個(gè)攔截器。
name=“myInterceptor” class=“com.test.interceptor.MyInterceptor”>
請注意下面代碼,我們定義了
name=“myInterceptor”>
name=“myInterceptor1”>
defaultStack這個(gè)攔截器棧是struts2,提供的一個(gè)默認(rèn)攔截器棧,其中實(shí)現(xiàn)了一些常用功能,如:struts2的檢驗(yàn)框架,當(dāng)我們在聲明package時(shí)候會有extends屬性,其值為struts-default,而defaultStack就定義在struts-default包類,進(jìn)而就被我們的package所繼承。
name=“defaultStack”>
在攔截器的配置中,我們可以為package配置一個(gè)默認(rèn)的攔截器或攔截器棧,如果我們不指定,其值就為父包繼承下來的defaultStack。
name=“myStack”>
標(biāo)簽,可以對攔截器類中定義的屬性賦值,這里是告訴攔截器,只攔截abc()方法。
abc
第四篇:全自動(dòng)吹塑機(jī)的工作流程和原理
全自動(dòng)吹塑機(jī)的工作流程和原理
第一,吹塑機(jī)英語全稱BLOW MOULDING MACHINE.簡稱BMM.其基本工作原理為:向軟化的熱塑性的型坯中充氣,使其緊貼到封閉模具的冷卻表面,被吹脹的型坯凝固,形成中空塑料制品.第二,我們就從螺桿開始吧.<其他我們不說>吹塑機(jī)的螺桿.有單螺桿 雙螺桿和多螺桿因其制造的產(chǎn)品不同而不同<本人在德國KAUTEX學(xué)習(xí)時(shí)看到過十二根螺桿的吹塑機(jī)>就說說單螺桿.現(xiàn)在的螺桿大都是用電機(jī)帶動(dòng)<以前有過液壓傳動(dòng)>用變頻器控制螺桿轉(zhuǎn)速.螺桿的機(jī)筒外面有加熱線圈用來溶化塑料.有于每種塑料的溶點(diǎn)不同所以你在設(shè)計(jì)加熱線圈應(yīng)有三種溫度功能顯示.<而在電氣柜里每個(gè)加熱線圈的固態(tài)繼電器都有電流互感器以電流表的形式表示出來清楚可看>一為設(shè)定溫度如200度.二為最高允許溫度如250度,<溫度過高塑料的流動(dòng)性會加快影響產(chǎn)品質(zhì)量>到達(dá)最高溫度螺桿會自停.并報(bào)警顯示.三為最低允許溫度如160<溫度過低塑料的流動(dòng)性會很低不但會影響產(chǎn)品質(zhì)量而螺桿的剪切力會很大.對螺桿的傷害很大>到過最低溫度螺桿會自停.并報(bào)警顯示.而螺桿的溫度在最高溫度或最低溫度時(shí)電機(jī)無法起動(dòng)!
第三,模頭.模頭分為連續(xù)式和儲料式我們就說連續(xù)式吧.模頭的主要做為一把溶化的塑料均勻的以中空的型狀擠出來以利于吹塑.二為最主要的控制型坯的壁厚以液壓的方法來控制主要是用伺服比例閥上下的移動(dòng)工作來控制??陂_口大小從而控制型坯的壁厚.所以你在設(shè)計(jì)模頭控制時(shí)我有以下幾點(diǎn)意見.一在模頭液壓沒起動(dòng)時(shí).螺桿電機(jī)不可能起動(dòng).二在模頭口模完全封閉時(shí)螺桿電機(jī)也不能起動(dòng).第四,模具一般吹塑的模具大多是二半的.在工作時(shí)把從模頭擠出來的型坯合在一起然后吹塑.它的標(biāo)準(zhǔn)程序一般是這樣的:移模-合模-鎖模-加壓-吹針進(jìn)入-吹氣-排氣-泄壓-開模-移模-進(jìn)入下一個(gè)循環(huán).所以見意你在設(shè)計(jì)控制時(shí).要求你做到.移模不到位不合模,合模不到位不鎖模.鎖模不到位不加壓.加壓不到位吹針不進(jìn)入.吹針進(jìn)入不到位不吹氣.排氣時(shí)壓力不到設(shè)定泄壓值時(shí).模具不開模.開模不到位不移模.移模不到位下一個(gè)循環(huán)停止工作并報(bào)警.每一個(gè)動(dòng)作不到位都能報(bào)警并在PLC或操作面板能清楚的顯示.還有是冷卻水溫度正常.過高或過低都能顯示過高或過低時(shí)能報(bào)警并能顯示不一定要求停機(jī)?
現(xiàn)在的吹塑機(jī)一般二臺液壓泵一為伺服液壓專用用于控制模頭主要為控制型坯的壁厚.二為吹塑機(jī)液壓系統(tǒng)用.如移模.合模等等.因?yàn)槟阒酪簤哼@東東是有各種電磁閥.液壓油缸和各種連接機(jī)構(gòu)組成一個(gè)系統(tǒng).極其繁瑣.在有于每個(gè)產(chǎn)品的生產(chǎn)和要求不同而它的生產(chǎn)工藝也會不同所以它的工作程序和要求也會不同.所以真的不好說啊!我怕誤人子弟啊.我就簡單的說一點(diǎn)吧.第一安全要放在第一位的也就是說在一個(gè)封閉的吹塑機(jī)任意打開一個(gè)門液壓泵都要停止<伺服油泵例外>只有在人工確認(rèn)復(fù)位后才能重新啟動(dòng).液壓油位都要求有傳感器低于液位時(shí)能報(bào)警并顯示.液壓油溫度傳感器常溫和過高都能顯示過高時(shí)能停機(jī).液壓在過載時(shí)以報(bào)警并停機(jī)和顯示.氣壓要求能顯示常態(tài)和過高和過低.在過高和過低能報(bào)警并顯示.并要求能用按鈕控制總進(jìn)氣.并在任意一個(gè)門打開時(shí)都能切斷總進(jìn)氣也只有在人工確認(rèn)復(fù)位后才能重新啟動(dòng).
第五篇:簡單的struts2中英文切換的國際化開發(fā)流程
實(shí)現(xiàn)Struts2國際化流程
實(shí)現(xiàn)的功能效果圖:
當(dāng)你選擇 美式英語:
加載全局資源文件
首先 在struts.xml 配置文件 中 配置 struts.custom.i18n.resources常量
需要實(shí)現(xiàn)中英文切換的兩個(gè)資源文件:
如下是把漢字 轉(zhuǎn)換 成 Unicode 編碼的 資源文件
然后在login.jsp頁面加上如下代碼:
以及js:
跳轉(zhuǎn)到的action JAVA 程序國際化的關(guān)鍵類是 ResourceBundle,它有如下一個(gè)靜態(tài)方法: getBundle(String baseName,Locale locale);根據(jù)Locale 加載資源文件,而Locale就是代表一個(gè)國家/語言。不同的國家/語言環(huán)境由不用的Locale代表,baseName 為messageResource的資源文件代表不同的國家語言環(huán)境