Struts2总结

来源:互联网 发布:淘宝海外全球购 编辑:程序博客网 时间:2024/06/07 08:03

Struts 总结

MVC架构
Model——模型 View——视图 Controller——控制器
Model:底层基础,负责对数据进行维护(bean)
View:向用户呈现数据(jsp asp)
Controller:通过代码控制模型和视图界面进行交互(action service)

架构图:
这里写图片描述
特点:解耦 更方便去维护数据
工作流程:控制层接受所有来自程序的请求,调用模型去准备相应的数据,并将数据处理结果反馈给控制层,最终视图层通过控制层返回的数据响应,生成可视界面响应。

Struts2架构
Struts2是一个MVC框架,主要通过一下5个部分实现:
1.Action:操作
2.Intercept:拦截器
3.值栈(Value stack):OGNL
4.Result:结果类型
5.视图技术
架构图
这里写图片描述
在Struts2的架构下Model View Controller。Controller通过Struts2分派Servlet过滤器、拦截器对数据进行过滤拦截。Model是通过Action来实现对数据的管理。View则是Result和Result Type的结合。OGNL/Value Stack提供桥梁。

用户请求生命周期:
1. 用户请求(页面)
2. 核心控制器查看请求并做出相应的操作
3. 启用拦截器 过滤器功能
4. 执行未完成的动作
5. ?拦截器后期处理
6. 通过视图返回结果

基本组件
序号 名称及描述
1 Action(操作)
创建一个动作类,包含完整的业务逻辑并控制用户、模型以及视图间的交互。
2 Interceptors(拦截器)
这是控制器的一部分,可依据需求创建拦截器,或使用现有的拦截器。
3 View(视图)
创建一个JSP与用户进行交互,获取输入并呈现最终信息。
4 Configuration Files(配置文件)
创建配置文件来连接动作、视图以及控制器,这些文件分别是struts.xml、web.xml以及struts.properties。

Struts2配置文件
Web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns="http://java.sun.com/xml/ns/javaee"    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"   id="WebApp_ID" version="3.0">   <display-name>Struts 2</display-name>   <welcome-file-list>      <welcome-file>index.jsp</welcome-file>   </welcome-file-list>   <filter>      <filter-name>struts2</filter-name>      <filter-class>         org.apache.struts2.dispatcher.FilterDispatcher      </filter-class>   </filter>   <filter-mapping>      <filter-name>struts2</filter-name>      <url-pattern>/*</url-pattern>   </filter-mapping></web-app>

Struts.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"   "http://struts.apache.org/dtds/struts-2.0.dtd"><struts>   <constant name="struts.devMode" value="true" />   <package name="helloworld" extends="struts-default">      <action name="hello"             class="cn.zl.struts2.HelloWorldAction"             method="execute">            <result name="success">/HelloWorld.jsp</result>      </action>      <-- more actions can be listed here -->   </package>   <-- more packages can be listed here --></struts>

用于表明不同的包,而且还允许分类和模块化
属性 描述
name(必需) 为package的唯一标识
extends 指定package继承另一package的所有配置。通常情况下,我们使用struts-default作为package的基础。
Eg:package name=”a” extends=”struts-default”,
package name=”b” extends=”a”,
package name=”c” extends=”b”
abstract 定义package为抽象的。如果标记为true,则package不能被最终用户使用。
namespace Actions的唯一命名空间

标签以及name和value属性将用于覆盖default.properties中定义的任一属性,就像我们设置的struts.devMode属性一样。设置struts.devMode属性允许我们在日志文件中查看更多的调试消息。

标签对应于我们想要访问的每个URL,并且使用execute()方法定义一个访问相应的URL时将要访问的类。

Results(结果)确定在执行操作后返回到浏览器的内容,而从操作返回的字符串应该是结果的名称。 Results按上述方式配置,或作为“全局”结果配置,可用于包中的每个操作。 Results有name(Success input error login none)和type属性可选,默认的name值是“success”。

Action:
Public class XxxAxtion(){
Public String method1(){
return SUCCESS;
}
Public String method2(){
return INPUT;
}
Public String method1(){
return ERROR;
}
…………
}

Struts.xml

<struts>……<package namespace=”page1”><action name=”name1” class=”nameClass” method=”excute”>    <result name=”SUCCESS”>page1</result><result name=”input”>page2</result><result name=”error”>page3</result></action></package>……</struts>

Open Web:http://localhost:8080/projectName/pageName/actionName

Interceptor
拦截器概念上和servlet过滤器和 JDK代理相似,拦截器允许横切功能,具体操作:
1. 在action调用之前提供预处理逻辑
2. 在action调用之后提供后出处理逻辑
3. 捕获异常

Struts自带拦截器
序号 拦截器和说明
1 alias
允许参数在请求之间使用不同的别名。
2 checkbox
通过为未检查的复选框添加参数值false,以辅助管理复选框。
3 conversionError
将字符串转换为参数类型的错误信息放置到action的错误字段中。
4 createSession
自动创建HTTP会话(如果尚不存在)。
5 debugging
为开发人员提供一些不同的调试屏幕。
6 execAndWait
当action在后台执行时,将用户发送到中间的等待页面。
7 exception
映射从action到结果抛出的异常,允许通过重定向自动处理异常。
8 fileUpload
便于文件上传。
9 i18n
在用户会话期间跟踪选定的区域。
10 logger
通过输出正在执行的action的名称提供简单的日志记录。
11 params
设置action上的请求参数。
12 prepare
这通常用于执行预处理工作,例如设置数据库连接。
13 profile
允许记录action的简单分析信息。
14 scope
在会话或应用程序范围内存储和检索action的状态。
15 ServletConfig
提供可访问各种基于servlet信息的action。
16 timer
以action执行时间的形式提供简单的分析信息。
17 token
检查action的有效性,以防止重复提交表单。
18 validation
提供action的验证支持。

使用:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"   "http://struts.apache.org/dtds/struts-2.0.dtd"><struts>   <constant name="struts.devMode" value="true" />   <package name="helloworld" extends="struts-default">      <action name="hello"          class="cn.zl.struts2.HelloWorldAction"         method="execute">         <interceptor-ref name="params"/>         <interceptor-ref name="timer" />         <result name="success">/HelloWorld.jsp</result>      </action>   </package></struts>

自定义拦截器
在你的应用程序中使用自定义拦截器是提供跨切割应用程序功能的简洁方式。创建自定义拦截器很容易,需要扩展的是以下Interceptor接口:

public interface Interceptor extends Serializable{   void destroy();   void init();   String intercept(ActionInvocation invocation)   throws Exception;}

正如name所指出的,init()方法提供了一种初始化拦截器的方法,而destroy()方法为拦截器清理提供了一个工具。与action不同,拦截器在请求之间重复使用,需要线程安全,特别是intercept()方法。
ActionInvocation对象可访问运行时的环境。它允许访问action本身以及方法来调用action,并确定action是否已被调用。
如果你不需要初始化或清理代码,可以扩展AbstractInterceptor类,以实现init()和destroy()的默认的无操作指令。

public class MyInterceptor extends AbstractInterceptor {   public String intercept(ActionInvocation invocation)throws Exception{      String output = "Pre-Processing";       System.out.println(output);      String result = invocation.invoke();      output = "Post-Processing";       System.out.println(output);      return result;   }}

拦截器堆栈
当action要 配置多个拦截器难以管理,因此引入拦截器堆栈进行管理,直接写在struts-config.xml中:

<interceptor-stack name="basicStack">   <interceptor-ref name="exception"/>   <interceptor-ref name="servlet-config"/>   <interceptor-ref name="prepare"/>   <interceptor-ref name="checkbox"/>   <interceptor-ref name="params"/>   <interceptor-ref name="conversionError"/></interceptor-stack>

上面的堆栈称为basicStack,可以如下所述在你的配置中使用,此配置节点放置在

<action name="hello" class="com.tutorialspoint.struts2.MyAction">   <interceptor-ref name="basicStack"/>   <result>view.jsp</result></action>

上述basicStack将完全注册action使用的6个拦截器

Value Stack/OGNL
Value Stack是一组对象,按照提供顺序储存以下对象:
序号 对象和说明
1 Temporary对象
实际中存在各种在页面执行期间创建的temporary对象。例如,JSP标签循环集合的当前迭代值。
2 Model对象
如果在struts应用程序中使用Model对象,则当前Model对象放在值堆栈上的action之前。
3 Action对象
这是指正在执行的当前action对象。
4 命名对象
这些对象包括#application,#session,#request,#attr和#parameters以及所引用的相应的servlet作用域。

值栈可以通过为JSP,Velocity或Freemarker提供的标签进行访问。我们将在单独的章节中学习到用于获取和设置struts2 值栈的各种标签。你可以在action中获取值栈对象,如下所示:
ActionContext.getContext().getValueStack()
一旦你有一个值栈对象,你可以使用以下方法来操纵该对象:
序号 值栈方法和说明
1 Object findValue(String expr)
通过在默认搜索顺序中对值栈评估所给定的表达式来查找值。
2 CompoundRoot getRoot()
获取将对象推入值栈的CompoundRoot。
3 Object peek()
获取值栈顶部的对象而不改变值栈。
4 Object pop()
获取值栈顶部的对象,并将其从值栈中删除。
5 void push(Object o)
将对象放在值栈的顶部。
6 void set(String key,Object o)
使用给定的key在值栈上设置一个对象,使其可通过findValue(key,…)检索。
7 void setDefaultType(Class defaultType)
设置在获取值时要转换的默认类型。
8 void setValue(String expr,Object value)
尝试使用由默认搜索顺序给定的表达式在值栈的bean上设置属性。
9 int size()

获取值栈中的对象数

OGNL(对象图导航语言)
OGNL是一种强大的表达语言,用于引用值栈上的数据,还可以用于数据传输 。
OGNL非常类似于JSP表达式语言。OGNL基于上下文中存有根对象或默认对象的理念,使用标记符号(即#号)来引用默认或根对象的属性。

如前面所述,OGNL是基于上下文的,而Struts构建了一个ActionContext映射以供OGNL使用。 ActionContext映射包含以下内容:
1. 应用程序:应用程序作用于变量
2. 会话:会话作用域变量
3. 根/值栈:所有action变量都储存在这里
4. 请求:请求作用变量
5. 参数:请求参数
6. 属性:存储在页面,请求,会话和应用程序作用域中的属性

有必要了解的是,Action对象在值栈中总是可用的,因此如果你的Action对象有x和y属性,你可以随时使用。
ActionContext中的对象使用#号引用,但是,值栈中的对象可以直接引用,例如,如果employee是action类的属性,则可以按如下方式引用:

替代

如果你在会话中有一个名为“login”的属性,你可以按如下方式检索:

Tag/标签
ControlTag
If/else Tag

<s:if test="%{false}">    <div>Will Not Be Executed</div></s:if><s:elseif test="%{true}">    <div>Will Be Executed</div></s:elseif><s:else>    <div>Will Not Be Executed</div></s:else>

Iterator Tag
迭代器,可以遍历java.util.Collection,java.util.Iterator任意一个的值,同时可以使用Sort对数据进行排序

<s:iterator value="days">  <p>day is: <s:property/></p></s:iterator>

Merge Tag
Merge采用两个或对个列表List作为参数,并将它们合并在一起。假设你有A和B两个列表,值为A1,A2和B1,B2。合并列表将得出A1,B1,A2,B2。

<s:merge var="myMergedIterator">     <s:param value="%{myList1}" />     <s:param value="%{myList2}" />     <s:param value="%{myList3}" /></s:merge><s:iterator value="%{#myMergedIterator}">     <s:property /></s:iterator>

Append Tag
这些append标签采用两个或多个列表作为参数,并将它们全部附加在一起。假设你有A和B两个列表,值为A1,A2和B1,B2。合并列表将得出A1,B1,A2,B2,而附加列表将给你得出A1,A2,B1,B2。

<s:append var="myAppendIterator">     <s:param value="%{myList1}" />     <s:param value="%{myList2}" />     <s:param value="%{myList3}" /></s:append><s:iterator value="%{#myAppendIterator}">     <s:property /></s:iterator>

Generator Tag
这些generator标签基于提供的val属性生成迭代器。下面的generator标签生成一个迭代器并使用iterator标签打印出来。

<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}"> <s:iterator>     <s:property /><br/> </s:iterator></s:generator>

Data Tag
(主要用于操作界面上显示数据)

整合
Struts+Spring

架构图
这里写图片描述
WEB.XML配置

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns="http://java.sun.com/xml/ns/javaee"     xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"    id="WebApp_ID" version="3.0">   <display-name>Struts 2</display-name>   <welcome-file-list>      <welcome-file>index.jsp</welcome-file>   </welcome-file-list><!—spring 监听 -->   <listener>      <listener-class>         org.springframework.web.context.ContextLoaderListener      </listener-class>   </listener>

 <filter>      <filter-name>struts2</filter-name>      <filter-class>         org.apache.struts2.dispatcher.FilterDispatcher      </filter-class>   </filter><!—struts2映射-->   <filter-mapping>      <filter-name>struts2</filter-name>      <url-pattern>/*</url-pattern>   </filter-mapping></web-app>

SPRING 配置文件(applicationContext.xml 与web.xml 同级)

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><!—创建bean对象 并且为参数设置值-->   <beans>      <bean id="userClass" class="cn.w3cschool.struts2.User">      <property name="firstName" value="Michael" />      <property name="lastName" value="Jackson" />   </bean></beans>

然后创建VIEW界面,最后通过STRUTS.XML将界面联系在一起

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"><struts>   <constant name="struts.devMode" value="true" />   <package name="helloworld" extends="struts-default">      <action name="user" class="userClass"          method="execute">         <result name="success">/User.jsp</result>      </action>   </package></struts>

重点需要注意的是,我们使用id userClass来引用类,这意味着我们使用spring为User类做依赖注入。

Struts+Hinernate
创建hibernate配置文件hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory>   <property name="hibernate.connection.driver_class">c      om.mysql.jdbc.Driver   </property>   <property name="hibernate.connection.url">      jdbc:mysql://www.w3cschool.cn/struts_tutorial   </property>   <property name="hibernate.connection.username">root</property>   <property name="hibernate.connection.password"></property>   <property name="hibernate.connection.pool_size">10</property><!—是否打印sql语句-->   <property name="show_sql">true</property><!—设置数据方言-->   <property name="dialect">      org.hibernate.dialect.MySQLDialect   </property><!—数据库模式-->   <property name="hibernate.hbm2ddl.auto">update</property><!—映射对象-->   <mapping class="cn.w3cschool.hibernate.Student" /></session-factory></hibernate-configuration> 

Struts.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"   "http://struts.apache.org/dtds/struts-2.0.dtd"><struts><!—调试模式-->   <constant name="struts.devMode" value="true" />   <package name="myhibernate" extends="hibernate-default">      <action name="addStudent" method="execute"         class="cn.w3cschool.struts2.AddStudentAction">         <result name="success" type="redirect">               listStudents         </result>      </action>      <action name="listStudents" method="listStudents"         class="cn.w3cschool.struts2.AddStudentAction">         <result name="success">/students.jsp</result>      </action></package></struts>

附录
@Action来代替元素!
l String value():指定访问路径;
l Result[] results():指定局部结果。
@Result来代替元素!
l String name():指定结果名称;
l String location():指定结果路径。
@Namespace代替的namespace属性:
l String value():指定名称空间。
@ParentPackage代替的extends属性:
l String value():指定父包名称

@Namespace("/order")@ParentPackage("struts-default")publicclass OrderAction extends ActionSupport  {    @Action(value="add", results={           @Result(name="success", location="/index.jsp"),           @Result(name="input", location="/add.jsp")})    public String add() {       System.out.println("add()");       returnSUCCESS;    }    @Action(value="mod", results={@Result(name="success", location="/index.jsp")})    public String mod() {       System.out.println("mod()");       returnSUCCESS;    }    @Action(value="del", results={@Result(name="success", location="/index.jsp")})    public String del() {       System.out.println("del()");       returnSUCCESS;    }}

2017/07/25

原创粉丝点击