struts2请求处理流程 以下哪些是技术服务请求处理流程
本篇文章给大家谈谈struts2请求处理流程,以及以下哪些是技术服务请求处理流程对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
struts2的主要工作流程,处理方式
给LZ说一下struts2的主要工作流程吧,你可以下载一下他的流程图,首先我们有个请求request进入,会首先走ActionContextClearup清空值栈等,但是会留下我们的session和setgetAttribute等,然后会走一下OtherFilter,其他的一些过滤器什么的,然后就会走到我们的filterDispathcer总控,会询问ActionMapping是否此请求需要struts2处理,如果需要,走到ActionProxy代理类,其次,根据ConfigurationManger配置管理找到struts配置文件,然后才是走到真正需要做事的地方,ActionInvocation会依次走我们的拦截器,拦截器走的时候回去值栈中取值,就是通过taglib放到页面上去,走action再走对应result,最后生成相应返回回去。
给LZ两个图吧,第一个图是具体的点击新增按钮后的一系列处理,第二个图是详细的struts2的流程
struts2的工作流程
在Struts2框架中的处理大概分为以下几个步骤:
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。
在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及ActionMapper。
扩展资料:
应用流程注解
当Web容器收到请求(HttpServletRequest)它将请求传递给一个标准的的过滤链包括(ActionContextCleanUp)过滤器。
经过Other filters(SiteMesh,etc),需要调用FilterDispatcher核心控制器,然后它调用ActionMapper确定请求哪个Action,ActionMapper返回一个收集Action详细信息的ActionMaping对象。
FilterDispatcher将控制权委派给ActionProxy,ActionProxy调用配置管理器(ConfigurationManager)从配置文件中读取配置信息(struts.xml),然后创建ActionInvocation对象。
ActionInvocation在调用Action之前会依次的调用所用配置拦截器(Interceptor N)一旦执行结果返回结果字符串ActionInvocation负责查找结果字符串对应的(Result)然后执行这个Result Result会调用一些模版(JSP)来呈现页面。
拦截器(Interceptor N)会再被执行(顺序和Action执行之前相反)最后响应(HttpServletResponse)被返回在web.xml中配置的那些过滤器和核心控制器(FilterDispatcher)。
参考资料:百度百科-Struts 2
struts2怎么处理ajax请求
Ajax本质上和普通的HTTP请求是一样的,只不过普通的HTTP请求是给人看的,而Ajax请求是给JS代码去用的。
所以Ajax请求的页面一般比普通的HTTP请求的响应内容还要简单,可能是一个页面的一部分,也可能是xml、json等结构化的数据,还可能是一个简单的字符串。
所以,在Struts 2中使用Ajax,Action一般就不会调用一个jsp视图来显示了(如果Ajax请求内容是页面的一部分也可能调用jsp视图),而是通过一些其他的方式。
下面介绍了三种方法,用于Action实现Ajax请求。
方法1:依赖Servlet API
[java]view plaincopy
publicclassHelloActionextendsActionSupport{
publicStringexecute()throwsException{
HttpServletResponseresponse=ServletActionContext.getResponse();
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
PrintWriterout=response.getWriter();
out.print("HelloWorld");
out.flush();
out.close();
returnNONE;//或returnnull
}
}
[html]view plaincopy
<packagename="main"namespace="/"extends="struts-default">
<actionname="hello"class="com.xxg.HelloAction"method="execute">
</action>
</package>
在Action的方法中return NONE或return null表示直接用Action来处理,而不需要调用result,所以在配置文件的action标签中也没有result标签。
这里直接获取到Servlet中的HttpServletResponse对象,通过response的输出流写一个字符串,和不使用Struts 2直接用Servlet类似。
方法2:使用result type="stream"
在Struts 2的文档中推荐了一个比上一个方法更简单的方式,使用type为stream的result。通过这种方法,可以不依赖于Servlet API,所以单元测试会更方便。
[java]view plaincopy
publicclassHelloActionextendsActionSupport{
privateInputStreaminputStream;
publicInputStreamgetInputStream(){
returninputStream;
}
publicStringexecute()throwsException{
Stringstr="HelloWorld";
inputStream=newByteArrayInputStream(str.getBytes("UTF-8"));
returnSUCCESS;
}
}
[html]view plaincopy
<packagename="main"namespace="/"extends="struts-default">
<actionname="hello"class="com.xxg.HelloAction"method="execute">
<resultname="success"type="stream">
<paramname="contentType">text/html;charset=utf-8</param>
<paramname="inputName">inputStream</param>
</result>
</action>
</package>
在struts配置文件中,result的type设为stream。其中包含两个参数,第一个是contentType,表示响应的类型,如果有中文的话最好设置一下编码,第二个参数是用来指定Action中的对应的输入流,它的默认值就是inputStream,所以可以省略。
方法3:struts 2 json插件
上面两种方法可以返回的内容很随意,可以是任何字符串。
在很多Ajax请求会用到json字符串,因为它可以很方便的转换成JavaScript对象。
使用struts2-json-plugin可以很方便的生成json(用上面的两种方法调用json工具生成json也是不错的选择,这样可以不用使用这个插件)。
此时需要添加一个jar文件:struts2-json-plugin-x.x.x.x.jar。
[java]view plaincopy
publicclassHelloActionextendsActionSupport{
privateStringname;
privateintage;
privateList<String>friends;
publicStringgetName(){
returnname;
}
publicintgetAge(){
returnage;
}
publicList<String>getFriends(){
returnfriends;
}
publicStringexecute()throwsException{
this.name="xxg";
this.age=22;
this.friends=newArrayList<String>();
this.friends.add("姚明");
this.friends.add("林丹");
returnSUCCESS;
}
}
[html]view plaincopy
<packagename="main"namespace="/"extends="json-default">
<actionname="hello"class="com.xxg.HelloAction"method="execute">
<resultname="success"type="json"></result>
</action>
</package>
在package中extends应该改为json-default而不是struts-default,result的type设为json。
通过浏览器打开这个页面可以看到这个json:
{"age":22,"friends":["姚明","林丹"],"name":"xxg"}
OK,本文到此结束,希望对大家有所帮助。