Struts的流程,应用 标签库
2013-02-21 18:26
162 查看
struts的流程
Struts controller基本功能是
1. 截获用户的Http请求
2. 把这个请求映射到一个定义好的业务操作上
3. 获取业务操作结果,提供给客户端
4. 决定下一步应该显示哪一个页面
有几个部分共同组成了Struts
的Controller,用户的请求发送到ActionServlet中,ActionServlet调用RequestProssor开始处理用户请求的流程,在这个流程中,会查找ApplicationConfig,得到用户请求对应的Action,调用相应的Action来具体执行用户的请求,最后返回ActionForward,转向相应的流程。
================
org.apache.struts.action.ActionServlet 是Struts
Controller中最主要的部分,所有用户请求都会被发送到这里,所有的其它处理也必须从这里经过。ActionServlet是从HttpServlet中继承过来的。
当ActionServlet接收到HTTP
request的时候,不管是doGet()或者doPost()方法,都会调用process()方法。
protected void process(HttpServletRequest
request,HttpServletResponse response) throws IOException,
ServletException { RequestUtils.selectApplication( request,
getServletContext() );
getApplicationConfig(request).getProcessor().process( request,
response );}
一般情况下,我们不需要自己实现或者修改ActionServlet类,仅仅使用就可以了。某些情况下,我们可以自己扩展ActionServlet类,从ActionServlet继承,实现自己的MyActionServlet类。覆盖其中的一些方法来达到你的特殊处理的需要。ActionServlet继承自javax.servlet.http.HttpServlet,所以在本质上它和一个普通的servlet没有区别,你完全可以把它当做一个servlet来看待,只是在其中完成的功能不同罢了。
================
RequestProssor具体处理用户的request,作为一个request
handler存在。同样,处理request的时候,会执行RequestProcessor类中的process(execute)方法。
process中调用的方法都是可以重载的,
如果有需要,可以实现为自己特定的方法。比如,对于Locale问题,通常都是在系统最一开始加载的时候读取的,如果用户想在任何时刻都可以切换或者选择自己的Locale,我们就可以重载processLocale()方法。然后只需要在配置文件中加入段就可以了
================
Action类是实现整个体系的核心部分,它在客户请求、界面表示和业务逻辑之间起到一个桥梁的作用。每一个Action都用来处理某一项任务,或者进行一个业务操作。当然了,我们说一项任务不是说Action只实现一个业务操作方法,而是集中实现某一个功能单元。比如登录用的LogonAction、查找用的SearchAction等等。Action是在RequestProcessor中,由processActionPerform方法调用的
非常重要的一点:不要在Action中包含任何业务逻辑操作,而是应该调用一个Model层的JavaBean来实现你的业务逻辑操作。在某些情况下,可能包含少许表现逻辑。这样,就可以充分进行代码重用,比如上例中调用的IStorefrontService接口,这个接口在实现时完全可以不用考虑客户端的事情,所以它可以被其它部分或者其它系统所使用。否则的话,Action会变得非常难于理解,难于维护,代码也不能重用。
struts-example工程的设计就是一个bug,它把业务逻辑封装到了Action类中
===================
在Action的execute方法中,返回一个ActionForward类。ActionForward把配置文件中forward部分的信息包装起来,减少了应用程序和物理资源信息之间的耦合性。通过ActionMapping类,可以在配置文件中查找相应的forward信息。例如,对于一个LoginAction,它的配置信息可能是这样的:
返回的ActionForward就会包含段中的信息。在ActionMapping类的findForward方法中,首先会根据查找forward的name查找是否有相应的forward段,如果没有,则在配置文件中的段中进行查找,如果还没有就会抛出一个例外。
=====================
以前,页面上的输入数据都通过HTTP
request提交,服务方检索出输入的数据,进行验证,然后将这些数据传递给其它组件进行业务处理。一切基本都需要手工编写代码进行操作,比较麻烦,也使代码变得复杂。
Actionform[org.apache.struts.action.Actionform]用来收集用户的输入,并且把这些信息传递给Action对象,然后,在Action对象中,Actionform中的数据被取出来传递给业务逻辑层进行处理。
Actionform一方面作为一个缓冲区,临时存储用户输入的数据;另一方面,可以把Actionform当成是HTTP和Action之间的一个防火墙,它可以验证输入数据的正确性,如果验证不通过,这个request是不会发送给Action进行处理的。
Actionform可以有两种Scope,request或者session。request就是只能在rquest到response,之后Actionform就不可见了;session可以保存时间长一点。
==================
在Actionform的Validate方法中返回的是ActionErrors对象。这个对象可以将错误信息都封装起来,并且自动把它们显示给用户。
在相应JSP页面上添加,可以自动将ActionErrors中的错误信息显示出来。包括,每一个具体的,通过add添加的错误信息,和一个ErrorHeader和一个ErrorFooter,这些都可以通过配置文件指定,并且可以包含HTML语法。
==========================
Struts提供了四种自定义Tag库:
bean:struts-bean taglib包含在访问bean和bean属性时使用的tag,也包含一些消息显示的tag。
html:struts-html
taglib包含用来创建struts输入表单的tag,和其它通常用来创建基于HTML用户界面的tag。
logic:struts-logic taglib包含的tag用来管理根据条件生成输出文本,和其它一些用来控制的信息。
template:struts-template taglib包含的tag用来定义模板机制。
Struts Logic标签库
Struts Logic标签库中的标签可以根据特定逻辑条件来控制输出网页内容,或者循环遍历集合中的所有元素,分为以下几类:
1.比较标签
2.循环遍历标签
3.匹配标签
4.存在标签
5.判空标签
6.转发与重定向标签
Logic 比较标签(一)
1.<logic:equal>
判断变量是否与指定的常量相等。
2.<logic:greaterThan>
判断常量变量是否大于指定的常量。
3.<logic:greaterEqual>
判断变量大小是否大于等于指定的常量。
4.<logic:lessThan>
判断变量是否小于指定的常量。
5.<logic:lessEqual>
判断变量是否小于等于指定的常量。
Struts logic标签(二)
循环遍历标签<logic:iterate>
该标签用于在页面中创建一个循环,以次来遍历数组、Collection、Map这样的对象。在Struts中经常用到!
例如:
<%
String
[]testArray={"str0","str1","str2","str3","str4","str5"};
pageContext.setAttribute("test",testArray);
%>
<logic:iterate id="array"
name="test">
<bean:write
name="array"/>
</logic:iterate>
首先定义了一个字符串数组,并为其初始化。接着,将该数组存入pageContext对象中,命名为test1。然后使用logic:iterate标记的name属性指定了该数组,并使用id来引用它,同时使用bean;write标记来将其显示出来。
还可以通过length属性指定输出元素的个数,offset属性指定从第几个元素开始输出。例如:
<logic:iterate id="array1" name="test1" length="3"
offset="2">
<bean:write
name="array1"/><br>
</logic:iterate>
<logic:iterate>标签不仅可以循环字符数据对于任意一种对像都是可以的,如果参与循环的是一个对象数组那么他应该这么写,在这之前与前面的一样都需要将对象数组放到pageContext范围或request范围
<logic:iterate id="临时对象名"
name="要循环的集合或对象数组">
<bean:write name="临时对象名"
property="对象属性名"/>
</logic:iterate>
Struts logic标签(三)
<logic:match>和<logic:notmatch>
该标签用于判断变量中是否或者是否不包含指定的常量字符串。例如:
<%
pageContext.setAttribute("test","helloWord");
%>
<logic:match value="hello"
name="test">
hello 在helloWord中
</logic:match>
Match标记还有一个重要属性,就是location属性。location属性所能取的值只有两个,一个是"start",另一个是"end"。例如:
<logic:match value="hello" name="test"
location="start">
helloWord以 hello开头
</logic:match>
Struts logic存在标签(四)
<logic:present>
<logic:notpresent>
<logic:messagePresent>
<logic:messageNotPresent>
<logic:present>和<logic:notpresent>标签主要用于判断所指定的对象是否存在;
例如:
<%
pageContext.setAttribute("test","testString");
%>
<logic:present name="test">
true
</logic:present>
<logic:present>和<logic:notpresent>标记有以下几个常用属性:
header属性:
判断是否存在header属性所指定的header信息。
parameter属性:判断是否存在parameter属性指定的请求参数。
cookie属性:
判断cookie属性所指定的同名cookie对象是否存在。
name属性:
判断name属性所指定的变量是否存在。
property属性:和name属性同时使用,当name属性所指定的变量是一个JavaBean时,判断property属性所指定的对象属性是否存在。
<%
Cookie cookie=new Cookie("name","value");
response.addCookie(cookie);
%>
<logic:present cookie="name">
true
</logic:present>
<logic:messagePresent>和<logic:messageNotPresent>这两个标记是来判断是否在request内存在特定的ActionMessages或ActionErrors对象。它们有几个常用的属性:
name属性:
指定了ActionMessages在request对象内存储时的key值。
message属性:message属性有两种取值。当其为true时,表示使用Globals.MESSAGE_KEY做为从request对象中获取ActionMessages的key值,此时无论name指定什么都无效;当其为false时,则表示需要根据name属性所指定的值做为从request对象中获取ActionMessages的key
值,倘若此时未设置name属性的值,则使用默认的Globals.ERROR_KEY。
property属性:指定ActionMessages对象中某条特定消息的key值。
例如:
<%
ActionErrors errors = new ActionErrors();
errors.add("totallylost", new
ActionMessage("application.totally.lost"));
request.setAttribute(Globals.ERROR_KEY, errors);
request.setAttribute("myerrors", errors);
%>
<logic:messagesPresent
name="myerrors">
Yes
</logic:messagesPresent>
Struts logic判空标签(五)
<logic:empty>
<logic:notEmpty>
该标签用于判断指定的字符是否为空。
例如:
<%
pageContext.setAttribute("test","");
%>
<logic:empty
name="test">
test 为空
</logic:empty>
Struts logic转发和重定向标签(六)
1.<logic:foward>转发标签
该标签用于进行全局转发,使用该标签的页面一般不再编写其他内容,因为随着转发,页面将跳转,原页面中的内容也没有意义了。例如:
this
is a test
<logic:forward name="welcome"/>
this is a new test
2.<logic:redirect>重定向标签
该标签用于进行重定向。具有属性:
href属性:
将页面重定向到href指定的完整外部链接。
page属性:
该属性指定一个本应用内的一个网页,标记将页面重定向到这个新的网页。
forward属性:该属性与struts-config.xml中的<global-forward>内的子项相对应。即将页面重定向到forward所指定的资源
Struts controller基本功能是
1. 截获用户的Http请求
2. 把这个请求映射到一个定义好的业务操作上
3. 获取业务操作结果,提供给客户端
4. 决定下一步应该显示哪一个页面
有几个部分共同组成了Struts
的Controller,用户的请求发送到ActionServlet中,ActionServlet调用RequestProssor开始处理用户请求的流程,在这个流程中,会查找ApplicationConfig,得到用户请求对应的Action,调用相应的Action来具体执行用户的请求,最后返回ActionForward,转向相应的流程。
================
org.apache.struts.action.ActionServlet 是Struts
Controller中最主要的部分,所有用户请求都会被发送到这里,所有的其它处理也必须从这里经过。ActionServlet是从HttpServlet中继承过来的。
当ActionServlet接收到HTTP
request的时候,不管是doGet()或者doPost()方法,都会调用process()方法。
protected void process(HttpServletRequest
request,HttpServletResponse response) throws IOException,
ServletException { RequestUtils.selectApplication( request,
getServletContext() );
getApplicationConfig(request).getProcessor().process( request,
response );}
一般情况下,我们不需要自己实现或者修改ActionServlet类,仅仅使用就可以了。某些情况下,我们可以自己扩展ActionServlet类,从ActionServlet继承,实现自己的MyActionServlet类。覆盖其中的一些方法来达到你的特殊处理的需要。ActionServlet继承自javax.servlet.http.HttpServlet,所以在本质上它和一个普通的servlet没有区别,你完全可以把它当做一个servlet来看待,只是在其中完成的功能不同罢了。
================
RequestProssor具体处理用户的request,作为一个request
handler存在。同样,处理request的时候,会执行RequestProcessor类中的process(execute)方法。
process中调用的方法都是可以重载的,
如果有需要,可以实现为自己特定的方法。比如,对于Locale问题,通常都是在系统最一开始加载的时候读取的,如果用户想在任何时刻都可以切换或者选择自己的Locale,我们就可以重载processLocale()方法。然后只需要在配置文件中加入段就可以了
================
Action类是实现整个体系的核心部分,它在客户请求、界面表示和业务逻辑之间起到一个桥梁的作用。每一个Action都用来处理某一项任务,或者进行一个业务操作。当然了,我们说一项任务不是说Action只实现一个业务操作方法,而是集中实现某一个功能单元。比如登录用的LogonAction、查找用的SearchAction等等。Action是在RequestProcessor中,由processActionPerform方法调用的
非常重要的一点:不要在Action中包含任何业务逻辑操作,而是应该调用一个Model层的JavaBean来实现你的业务逻辑操作。在某些情况下,可能包含少许表现逻辑。这样,就可以充分进行代码重用,比如上例中调用的IStorefrontService接口,这个接口在实现时完全可以不用考虑客户端的事情,所以它可以被其它部分或者其它系统所使用。否则的话,Action会变得非常难于理解,难于维护,代码也不能重用。
struts-example工程的设计就是一个bug,它把业务逻辑封装到了Action类中
===================
在Action的execute方法中,返回一个ActionForward类。ActionForward把配置文件中forward部分的信息包装起来,减少了应用程序和物理资源信息之间的耦合性。通过ActionMapping类,可以在配置文件中查找相应的forward信息。例如,对于一个LoginAction,它的配置信息可能是这样的:
返回的ActionForward就会包含段中的信息。在ActionMapping类的findForward方法中,首先会根据查找forward的name查找是否有相应的forward段,如果没有,则在配置文件中的段中进行查找,如果还没有就会抛出一个例外。
=====================
以前,页面上的输入数据都通过HTTP
request提交,服务方检索出输入的数据,进行验证,然后将这些数据传递给其它组件进行业务处理。一切基本都需要手工编写代码进行操作,比较麻烦,也使代码变得复杂。
Actionform[org.apache.struts.action.Actionform]用来收集用户的输入,并且把这些信息传递给Action对象,然后,在Action对象中,Actionform中的数据被取出来传递给业务逻辑层进行处理。
Actionform一方面作为一个缓冲区,临时存储用户输入的数据;另一方面,可以把Actionform当成是HTTP和Action之间的一个防火墙,它可以验证输入数据的正确性,如果验证不通过,这个request是不会发送给Action进行处理的。
Actionform可以有两种Scope,request或者session。request就是只能在rquest到response,之后Actionform就不可见了;session可以保存时间长一点。
==================
在Actionform的Validate方法中返回的是ActionErrors对象。这个对象可以将错误信息都封装起来,并且自动把它们显示给用户。
在相应JSP页面上添加,可以自动将ActionErrors中的错误信息显示出来。包括,每一个具体的,通过add添加的错误信息,和一个ErrorHeader和一个ErrorFooter,这些都可以通过配置文件指定,并且可以包含HTML语法。
==========================
Struts提供了四种自定义Tag库:
bean:struts-bean taglib包含在访问bean和bean属性时使用的tag,也包含一些消息显示的tag。
html:struts-html
taglib包含用来创建struts输入表单的tag,和其它通常用来创建基于HTML用户界面的tag。
logic:struts-logic taglib包含的tag用来管理根据条件生成输出文本,和其它一些用来控制的信息。
template:struts-template taglib包含的tag用来定义模板机制。
Struts Logic标签库
Struts Logic标签库中的标签可以根据特定逻辑条件来控制输出网页内容,或者循环遍历集合中的所有元素,分为以下几类:
1.比较标签
2.循环遍历标签
3.匹配标签
4.存在标签
5.判空标签
6.转发与重定向标签
Logic 比较标签(一)
1.<logic:equal>
判断变量是否与指定的常量相等。
2.<logic:greaterThan>
判断常量变量是否大于指定的常量。
3.<logic:greaterEqual>
判断变量大小是否大于等于指定的常量。
4.<logic:lessThan>
判断变量是否小于指定的常量。
5.<logic:lessEqual>
判断变量是否小于等于指定的常量。
Struts logic标签(二)
循环遍历标签<logic:iterate>
该标签用于在页面中创建一个循环,以次来遍历数组、Collection、Map这样的对象。在Struts中经常用到!
例如:
<%
String
[]testArray={"str0","str1","str2","str3","str4","str5"};
pageContext.setAttribute("test",testArray);
%>
<logic:iterate id="array"
name="test">
<bean:write
name="array"/>
</logic:iterate>
首先定义了一个字符串数组,并为其初始化。接着,将该数组存入pageContext对象中,命名为test1。然后使用logic:iterate标记的name属性指定了该数组,并使用id来引用它,同时使用bean;write标记来将其显示出来。
还可以通过length属性指定输出元素的个数,offset属性指定从第几个元素开始输出。例如:
<logic:iterate id="array1" name="test1" length="3"
offset="2">
<bean:write
name="array1"/><br>
</logic:iterate>
<logic:iterate>标签不仅可以循环字符数据对于任意一种对像都是可以的,如果参与循环的是一个对象数组那么他应该这么写,在这之前与前面的一样都需要将对象数组放到pageContext范围或request范围
<logic:iterate id="临时对象名"
name="要循环的集合或对象数组">
<bean:write name="临时对象名"
property="对象属性名"/>
</logic:iterate>
Struts logic标签(三)
<logic:match>和<logic:notmatch>
该标签用于判断变量中是否或者是否不包含指定的常量字符串。例如:
<%
pageContext.setAttribute("test","helloWord");
%>
<logic:match value="hello"
name="test">
hello 在helloWord中
</logic:match>
Match标记还有一个重要属性,就是location属性。location属性所能取的值只有两个,一个是"start",另一个是"end"。例如:
<logic:match value="hello" name="test"
location="start">
helloWord以 hello开头
</logic:match>
Struts logic存在标签(四)
<logic:present>
<logic:notpresent>
<logic:messagePresent>
<logic:messageNotPresent>
<logic:present>和<logic:notpresent>标签主要用于判断所指定的对象是否存在;
例如:
<%
pageContext.setAttribute("test","testString");
%>
<logic:present name="test">
true
</logic:present>
<logic:present>和<logic:notpresent>标记有以下几个常用属性:
header属性:
判断是否存在header属性所指定的header信息。
parameter属性:判断是否存在parameter属性指定的请求参数。
cookie属性:
判断cookie属性所指定的同名cookie对象是否存在。
name属性:
判断name属性所指定的变量是否存在。
property属性:和name属性同时使用,当name属性所指定的变量是一个JavaBean时,判断property属性所指定的对象属性是否存在。
<%
Cookie cookie=new Cookie("name","value");
response.addCookie(cookie);
%>
<logic:present cookie="name">
true
</logic:present>
<logic:messagePresent>和<logic:messageNotPresent>这两个标记是来判断是否在request内存在特定的ActionMessages或ActionErrors对象。它们有几个常用的属性:
name属性:
指定了ActionMessages在request对象内存储时的key值。
message属性:message属性有两种取值。当其为true时,表示使用Globals.MESSAGE_KEY做为从request对象中获取ActionMessages的key值,此时无论name指定什么都无效;当其为false时,则表示需要根据name属性所指定的值做为从request对象中获取ActionMessages的key
值,倘若此时未设置name属性的值,则使用默认的Globals.ERROR_KEY。
property属性:指定ActionMessages对象中某条特定消息的key值。
例如:
<%
ActionErrors errors = new ActionErrors();
errors.add("totallylost", new
ActionMessage("application.totally.lost"));
request.setAttribute(Globals.ERROR_KEY, errors);
request.setAttribute("myerrors", errors);
%>
<logic:messagesPresent
name="myerrors">
Yes
</logic:messagesPresent>
Struts logic判空标签(五)
<logic:empty>
<logic:notEmpty>
该标签用于判断指定的字符是否为空。
例如:
<%
pageContext.setAttribute("test","");
%>
<logic:empty
name="test">
test 为空
</logic:empty>
Struts logic转发和重定向标签(六)
1.<logic:foward>转发标签
该标签用于进行全局转发,使用该标签的页面一般不再编写其他内容,因为随着转发,页面将跳转,原页面中的内容也没有意义了。例如:
this
is a test
<logic:forward name="welcome"/>
this is a new test
2.<logic:redirect>重定向标签
该标签用于进行重定向。具有属性:
href属性:
将页面重定向到href指定的完整外部链接。
page属性:
该属性指定一个本应用内的一个网页,标记将页面重定向到这个新的网页。
forward属性:该属性与struts-config.xml中的<global-forward>内的子项相对应。即将页面重定向到forward所指定的资源
相关文章推荐
- Struts logic标签
- struts 基本标签
- struts标签格式化时间<s:date name="neowaveBloodPressure.monitorTime" format="yyyy-MM-dd HH:mm:ss" />
- 2013/10/17 WIN8.1应用商店开…
- <meta property="og:需要写的标签"的应用
- struts2 在<s:form>之间添加<s:textfield>或其他标签是出现可能的错误
- 通过Struts标签和JSTL标签来遍历List<Map<String,String>>格式的数据
- java break 语句的应用
- struts1标签之<logic:iterate>
- Java&nbsp;Web应用开发中的一些概念
- Android&nbsp;4.0应用界面设计分析
- Loadrunner中关于C&nbsp;指针的简单应用
- L298N 驱动模块的应用
- 兴趣学习: 余弦定理的应用&nb…
- 关于手机应用到Samsung&nbsp;Galax…
- Linux rhythmbox 歌曲标签中文显示
- 第12课: 、<hr>标签添加水平横线
- 最简单的&nbsp;Git&nbsp;使用流程
- android源码解析之(十一)-->应用进程启动流程
- dede tag标签,dede关键字调…