struts2使用,servlet容器
大家好,关于struts2使用很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于servlet容器的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
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的心得
最近做一个应用的时候用到了Jmesa(至于Jmesa的详细介绍,请Google),但是关于Struts2和Jmesa的资料特别少,费尽周折总算让他们两个正常运行了,现在把使用他们的一些心得写下来与大家分享。
版本:
Struts2: 2.0.11
Spring: 2.5.1
Freemarker: 2.3.12
Jmesa: 2.2.9
Eclipse 3.3
对应Eclipse3.3的插件(没用MyEclipse,我依然活得不错,哈哈~)
Tomcat 6.0.*
Struts2与Freemarker的配置非常简单——根本不用配置,呵呵,关键点就在:怎么在Struts2环境下使用Jmesa?当然我只用到了Jmesa提供的Taglib,没用使用到其他高级功能。
(1)、Jmesa实现的Taglib只需要在页面给它一个 List等集合类型的变量就可以正常显示。使用分页功能需要加入下面这段脚本:<script type="text/javascript">
function onInvokeAction(id)...{
setExportToLimit(id,'');
createHiddenInputFieldsForLimitAndSubmit(id);
}
</script>
(2)、使用导出功能,此处以Excel为例。需要加入以下脚本:<script type="text/javascript">
function onInvokeExportAction(id)...{
var parameterString= createParameterStringForLimit(id);
alert(parameterString);
location.href='${request.getContextPath()}/(此处为Action的Url)?'+ parameterString;
}
</script>
还有关键的一点就是:Action要实现ServletRequestAware,ServletResponseAware这两个接口,并且加入以下代码: private HttpServletRequest request;
private HttpServletResponse response;
public void setServletRequest(HttpServletRequest request)......{
this.request= request;
}
public void setServletResponse(HttpServletResponse response)......{
this.response= response;
}
以上变量定义了实例变量request和 response,为什么要这样做呢?看一下Jmesa的Tag example就知道了,如下:
TableFacade tableFacade= new TableFacadeImpl(id, request);
tableFacade.setItems(items);
tableFacade.setColumnProperties("password","nickname");
tableFacade.setExportTypes(response, CSV, EXCEL);// Tell the tableFacade what exports to use.
Limit limit= tableFacade.getLimit();
if(limit.isExported())...{
tableFacade.getTable().setCaption("user");
tableFacade.getTable().getRow().getColumn("password").setTitle("password");
tableFacade.getTable().getRow().getColumn("nickname").setTitle("nickname");
tableFacade.render();
return null;
}
最关键的就是这两句了: TableFacade tableFacade= new TableFacadeImpl(id, request);
tableFacade.setExportTypes(response, CSV, EXCEL);// Tell the tableFacade what exports to use.
第一句中如果没有request对象的话,不能实例化TableFacade类型的对象。
第二句中如果没有response对象的话,就没有数据。
除此之外还有一点要注意的就是页面中定义的tableFacade的id一定要与Action中的id的值相同,此id起标识导出文件的文件名的作用,也唯一标识一个table。
好了只要注意以上这些Jmesa的这个Taglib就可以使用了。
至于在Freemarker中使用Jmesa的这个Taglib,有以下注意事项:
(1)、items的值(即数据集合)直接写变量名就可以
(2)、maxRows属性写为maxRows=8不用加引号
以上两处注意事项不知道是不是Freemarker版本的问题,呵呵,有待检验。
注:Jmesa的功能非常强大,可以实现复杂的表格。。。。。。好东西思想先进
如何在jsp页面中使用struts2标签
要在jsp中使用struts2.0的标签,首先要在页面使用taglib指令,将struts2的tld文件导入
<%@taglibprefix="s"uri="/struts-tags"%>
struts2的标签主要分为两大类:
UI标签这个几乎不怎么用就不介绍了
非UI标签
if,elseif和else
<s:iftest="link_type==1">//只有当test的的值为true时,才会执行if语句块里面的内容
文字
</s:if>
<s:elseiftest="link_type==2">
图片
</s:elseif>
<s:else>
-----
</s:else>
迭代标签的使用
iterator
用于遍历集合(java.util.Collection)或枚举值(java.util.Iterator)。
<ol>
<s:iteratorvalue="#request.names"status="stuts">
<s:iftest="#stuts.odd==true">//判断取出数据的奇偶性
<li>White<s:property/></li>
</s:if>
<s:else>
<listyle="background-color:gray"><s:property/></li>
</s:else>
</s:iterator>
</ol>
上述代码的显示效果就是相邻的两行颜色是区分开来的
URL地址标签,<s:url>用于生成一个URL地址,可以通过URL标签指定的<s:param>
子元素向URL地址发送请求参数
<s:urlaction="">
<s:paramname=""value=""></s:param>
</s:url>
超链接<ahref>一般和<s:url>标签一起使用,用于带多个参数。
<arel="external nofollow" href="
<s:urlaction="">
<s:paramname=""value=""></s:param>
<s:paramname=""value=""></s:param>
<s:paramname=""value=""></s:param>
</s:url>">
链接到...
</a>
set标签,用于将某个值放入指定的范围内。例如application,session等。
<s:setname="user"value="userName"scope=”request”/>
Struts2页面开发中常用标签使用规范:
2.1.通过<inputname="userName"type="text"class=""size="15">
往action中传值,action中要有相应的属性,并提供SET/GET方法。
(在数量少时可以使用request.getParameter(“userName”);)
2.2.在页面显示action传来的数据,使用property标签。需要显示的数据从action中获得。
2.3.往action中的实体对象内传值,使用textfield标签。
2.4.在页面中判断指定值使用<s:if>标签。判断数据从action中获得。
2.5.在页面中需要循环列表显示的数据使用<s:iterator>标签,列表数据从action中获得。
2.6.URL地址和超链接可以使用<ahref>和<s:url>,在传多值时建议<ahref>和<s:url>一起使用
好了,关于struts2使用和servlet容器的问题到这里结束啦,希望可以解决您的问题哈!