第一篇:struts2核心工作流程与原理
struts2核心工作流程与原理 收藏
这是Struts2官方站点提供的Struts 2 的整体结构。
一个请求在Struts2框架中的处理大概分为以下几个步骤: 1.客户端提起一个(HttpServletRequest)请求,如上文在浏览器中输入”http://localhost:8080/TestMvc/add.action”就是提起一个(HttpServletRequest)请求。
2.请求被提交到一系列(主要是三层)的过滤器(Filter),如(ActionContextCleanUp、其他过滤器(SiteMesh等)、FilterDispatcher)。注意这里是有顺序的,先ActionContextCleanUp,再其他过滤器(SiteMesh等)、最后到FilterDispatcher。
3.FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。下面粗略的分析下我理解的FilterDispatcher工作流程和原理:FilterDispatcher进行初始化并启用核心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);//正如这个方法名字一样进行locale、encoding以及特殊request parameters设置
8.try...{
9.request = du.wrapRequest(request, servletContext);//对request进行包装 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.//整个框架最最核心的方法,下面分析
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.//这个方法询问ActionMapper是否需要调用某个Action来处理这个(request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给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());//实例化Map请求,询问ActionMapper是否需要调用某个Action来处理这个(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.//通过代理模式执行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是否需要调用某个Action来处理这个(request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。
4.ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类.如上文的struts.xml配置
1.
2. 3.
4.
5.
6. 7.class=”edisundong.AddAction“ > 8.
5.ActionProxy创建一个ActionInvocation的实例,同时ActionInvocation通过代理模式调用Action。但在调用之前ActionInvocation会根据配置加载Action相关的所有Interceptor。(Interceptor是struts2另一个核心级的概念)
下面我们来看看ActionInvocation是如何工作的:
ActionInvocation 是Xworks 中Action 调度的核心。而对Interceptor 的调度,也正是由ActionInvocation负责。ActionInvocation 是一个接口,而DefaultActionInvocation 则是Webwork 对ActionInvocation的默认实现。
Interceptor 的调度流程大致如下:
1.ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。
2.通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。
Interceptor将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为具有很好的重用性。XWork、WebWork的许多功能都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行前后运行。那么什么是拦截器。
拦截器就是AOP(Aspect-Oriented Programming)的一种实现。(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。)
拦截器的例子这里就不展开了。struts-default.xml文件摘取的内容:
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执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。如上文中将结构返回“add.jsp”,但大部分时候都是返回另外一个action,那么流程又得走一遍………
第二篇:MVC以及Struts2工作流程
MVC是一种软件架构的思想,将一个软件系统划分成三种不同类型的模块,分别是模型(model),用于封装业务逻辑。视图(view),提供用户操作的接口(提供业务数据的展现,并且,用户也可以通过视图来提交请求)。控制器(controller),将视图与模型解耦,也就是说视图要向控制器发送请求,由控制器来决定调用哪一个模型来处理,反过来,模型处理之后的结果也交给控制器,由控制器来选择合适的视图来展现。
Model:使用java类来实现(也可以使用spring容器管理的javabean,ejb等)View:使用jsp Controller:使用servlet或者filter 优点:
1.model可以被多个view共享,model处理之后的结果可以使用不同的界面来展现,多种不同类型的界面,可以调用相同的model 来处理。
2.model可以当便测试(如,将业务逻辑写在了servlet力需要部署servlet然后才能测试)如果也业务逻辑写在一个java类当中,测可以立即测试 3.方便分工合作 4.方便代码的维护 缺点:
增加代码量(相应的开发周期要延长,并且,要相应增大了设计的难度)。所以,一般来说,对于需要良好的可维护性且项目规模比较大的项目可以用MVC。
Struts2框架的工作流程图
Struts2框架的工作流程
1)服务器启动,创建StrustsPrepareAndExecuteFilter对象,并解析struts.xml配置文件
2)客户端发出action请求后,控制器会调用ActionMapper(Action映射器)完成请求与Action组件之间的映射,便于调用Action处理
3)通过ActionMapper处理后,接着调用ActionProxy(Action代理)提取请求对应的配置文件信息,创建ActionInvocation(Action执行者)对象,ActionProxy通过ConfigurationManager(配置管理器)解析和获取struts的配置信息 4)通过ActionInvocation完成拦截器、Action和Result组件的调用 5)生成响应信息后,为客户端响应
第三篇:Struts2核心拦截器---学习笔记
Struts2的核心——拦截器
在struts2中,拦截器(Interceptor)是其核心的组件,当我们访问一个action时,我们可以通过拦截器的配置,做一些需要的操作。
我们可以写我们自己的拦截器,但是要实现或继承struts2给我们提供的接口或类。
①.我们实现Interceptor接口,该接口是struts2提供的拦截器接口,位于com.opensymphony.xwork2.interceptor包下,其提供了类似与filter的一些方法,我们必须实现它的方法: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类,该类是一个抽象类,它位于com.opensymphony.xwork2.interceptor包下,它实现了Interceptor接口,并完成了对destroy()方法和init()方法的实现,但保留了抽象方法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;}
③.上面两个是对action进行的拦截,粒度比较粗,当然struts2也给我们提供了对action中方法的拦截。这时,我们自己写的类就要继承struts
2给我们提供的方法过滤类,该
类
同
样
位
于MethodFilterInterceptor com.opensymphony.xwork2.interceptor包下,但该类已经完成了对interceptor()方法的简单实现,而提供了一个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文件进行配置来告诉struts2框架,我们的拦截器要拦截的action、方法。
首先,我们要在package包下增加一个新的元素标签 class=“com.test.interceptor.MyInterceptor”>
定义了一个name是myInterceptor的拦截器(即实现了Interceptor接口的那个拦截器),类似的,我们定义了上面我们已写的3个拦截器。
name=“myInterceptor” class=“com.test.interceptor.MyInterceptor”>
请注意下面代码,我们定义了
name=“myInterceptor”>
name=“myInterceptor1”>
defaultStack这个拦截器栈是struts2,提供的一个默认拦截器栈,其中实现了一些常用功能,如:struts2的检验框架,当我们在声明package时候会有extends属性,其值为struts-default,而defaultStack就定义在struts-default包类,进而就被我们的package所继承。
name=“defaultStack”>
在拦截器的配置中,我们可以为package配置一个默认的拦截器或拦截器栈,如果我们不指定,其值就为父包继承下来的defaultStack。
name=“myStack”>
标签,可以对拦截器类中定义的属性赋值,这里是告诉拦截器,只拦截abc()方法。
abc
第四篇:全自动吹塑机的工作流程和原理
全自动吹塑机的工作流程和原理
第一,吹塑机英语全称BLOW MOULDING MACHINE.简称BMM.其基本工作原理为:向软化的热塑性的型坯中充气,使其紧贴到封闭模具的冷却表面,被吹胀的型坯凝固,形成中空塑料制品.第二,我们就从螺杆开始吧.<其他我们不说>吹塑机的螺杆.有单螺杆 双螺杆和多螺杆因其制造的产品不同而不同<本人在德国KAUTEX学习时看到过十二根螺杆的吹塑机>就说说单螺杆.现在的螺杆大都是用电机带动<以前有过液压传动>用变频器控制螺杆转速.螺杆的机筒外面有加热线圈用来溶化塑料.有于每种塑料的溶点不同所以你在设计加热线圈应有三种温度功能显示.<而在电气柜里每个加热线圈的固态继电器都有电流互感器以电流表的形式表示出来清楚可看>一为设定温度如200度.二为最高允许温度如250度,<温度过高塑料的流动性会加快影响产品质量>到达最高温度螺杆会自停.并报警显示.三为最低允许温度如160<温度过低塑料的流动性会很低不但会影响产品质量而螺杆的剪切力会很大.对螺杆的伤害很大>到过最低温度螺杆会自停.并报警显示.而螺杆的温度在最高温度或最低温度时电机无法起动!
第三,模头.模头分为连续式和储料式我们就说连续式吧.模头的主要做为一把溶化的塑料均匀的以中空的型状挤出来以利于吹塑.二为最主要的控制型坯的壁厚以液压的方法来控制主要是用伺服比例阀上下的移动工作来控制模口开口大小从而控制型坯的壁厚.所以你在设计模头控制时我有以下几点意见.一在模头液压没起动时.螺杆电机不可能起动.二在模头口模完全封闭时螺杆电机也不能起动.第四,模具一般吹塑的模具大多是二半的.在工作时把从模头挤出来的型坯合在一起然后吹塑.它的标准程序一般是这样的:移模-合模-锁模-加压-吹针进入-吹气-排气-泄压-开模-移模-进入下一个循环.所以见意你在设计控制时.要求你做到.移模不到位不合模,合模不到位不锁模.锁模不到位不加压.加压不到位吹针不进入.吹针进入不到位不吹气.排气时压力不到设定泄压值时.模具不开模.开模不到位不移模.移模不到位下一个循环停止工作并报警.每一个动作不到位都能报警并在PLC或操作面板能清楚的显示.还有是冷却水温度正常.过高或过低都能显示过高或过低时能报警并能显示不一定要求停机?
现在的吹塑机一般二台液压泵一为伺服液压专用用于控制模头主要为控制型坯的壁厚.二为吹塑机液压系统用.如移模.合模等等.因为你知道液压这东东是有各种电磁阀.液压油缸和各种连接机构组成一个系统.极其繁琐.在有于每个产品的生产和要求不同而它的生产工艺也会不同所以它的工作程序和要求也会不同.所以真的不好说啊!我怕误人子弟啊.我就简单的说一点吧.第一安全要放在第一位的也就是说在一个封闭的吹塑机任意打开一个门液压泵都要停止<伺服油泵例外>只有在人工确认复位后才能重新启动.液压油位都要求有传感器低于液位时能报警并显示.液压油温度传感器常温和过高都能显示过高时能停机.液压在过载时以报警并停机和显示.气压要求能显示常态和过高和过低.在过高和过低能报警并显示.并要求能用按钮控制总进气.并在任意一个门打开时都能切断总进气也只有在人工确认复位后才能重新启动.
第五篇:简单的struts2中英文切换的国际化开发流程
实现Struts2国际化流程
实现的功能效果图:
当你选择 美式英语:
加载全局资源文件
首先 在struts.xml 配置文件 中 配置 struts.custom.i18n.resources常量
需要实现中英文切换的两个资源文件:
如下是把汉字 转换 成 Unicode 编码的 资源文件
然后在login.jsp页面加上如下代码:
以及js:
跳转到的action JAVA 程序国际化的关键类是 ResourceBundle,它有如下一个静态方法: getBundle(String baseName,Locale locale);根据Locale 加载资源文件,而Locale就是代表一个国家/语言。不同的国家/语言环境由不用的Locale代表,baseName 为messageResource的资源文件代表不同的国家语言环境