为什么使用Struts等框架技术?
让我们的开发变得简单,节省项目成本。
基本的开发模式(不用框架的情况下)
1、数据表 2、java实体类(封装从数据库中查询出的数据) 3、数据访问对象dao 4、jsp/servlet
MVC:
1、Model 模型:模型的职责是负责业务逻辑,包括两部分:业务数据和业务处理逻辑。如实体类、service、dao都属于模型层
2、view 视图:视图的职责是显示界面和用户交互 属于视图的类是不包含业务逻辑和控制逻辑的 JSP:如果页面中有<%%>就不能算是视图层的类,或者jsp中有转发或者重定向的控制逻辑也是不可以的。
3、Controller控制器:控制层是视图层和模型之间的桥梁用于控制流程。 比如AcctionServlet
在web.xml中配置Struts2的前端控制器: 用filter实现的
Struts的优点:
1、数据的自动封装:根据页面组件的name属性,自动封装到action中对应的name属性中 如:在jsp中<input name='name' type='text'> 在action中 会自动的给属性private String name赋值
2、数据的自动传递:Action中的属性可以直接用EL表达式在jsp页面中获得 如:${name}
配置文件Struts.xml:
method:用于指定在对应的类中要执行的方法名,该方法的返回值必须是String类型,如果没有method=“”属性默认执行execute方法。
extends = "struts-default" 继承的包的name,一般继承Struts2默认提供的struts-default包,该包中定义了很多Struts2应用必须的组件(如:拦截器)
<action name="nameform">中只有name属性时,没有class属性Struts框架会默认为该<action>添加一个class作用是转发到对应的<result name="success">中指定的页面
8、OGNL表达式:
ognl封装在ognl.jar包中
EL表达式:EL表达式把数据从四个方面取出来(pageContenxt、request、session、application)中取出来显示或者计算。El表达式解决了java代码和HTML不匹配的问题。El表达式用字符串表达式替换了java代码用来表示对数据的获取和计算。
Ognl引擎访问对象的格式:Ognl.getValue("Ognl表达式",root对象);root对象是Ognl操作的主要对象
1、基本类型属性 Ognl.getValue("id",foo); Ognl.getValue("name",foo);
2、数组、List属性 :属性名[下标] Ognl.getValue("array[0]",foo) Ognl.getValue("list[1]",foo);
3、map属性Ognl.getValue("map.one",foo); Ognl.getValue("map['two'],foo); one、two都是key值
4、基本运算:Ognl.getValue("id+100",foo);
5、调用方法:Ognl.getValue("name.toUpperCase(),"foo); Ognl.getValue("list.size()",foo);
6、调用静态方法,以取出的属性为参数,调用静态方法的格式:@类名@方法名
Ognl.getValue("@java.util.Arrays@toString(arry)",foo)
7、Ognl只能创建Map 和list对象
创建Map对象 注意:#号不能丢Ognl.getValue("#{1:'java',2:'javajava',3:'javajavajava'}", null);
9、OGNL引擎的基本结构:ognl引擎、root对象(ognl操作的对象)、context对象(就是一个map,用于存放一个和整个系统都相关的公共数据);
当有了ongl引擎,在访问中有一些数据时每一次访问都需要用到的,这些数据就可以保存在context对象中
Ognl.getValue("name",root); 不加 # 表示从业务对象root中取出数据
Ognl.getValue("#num",root); 加# 表示从公共对象context中取出数据
10、Xwork对Ognl的扩展:
CompoundRoot对象;在XWork中,root对象被改为类似”栈"一样的存储空间,在该对象空间内可以存放多个root对象;
当去数据符合“栈'的规则,如果OGNL表达式是name在CompoundRoot从栈顶开始依次看是否有name属性。
Context(Map)对象
11、ValueStack基本结构
Struts将之前讲的XWork对Ognl的扩展这一套机制封装起来,这个对象叫做ValueStack
Struts2在启动时,会创建一个ValueStrack对象,当用户发送请求到对应的Action时,Struts2会把当前被请求的Action1放入CommpoundRoot对象的”栈空间"栈顶,请求结束,Action1会被清除,当下一次另一个请求到来时,Struts2会把该请求对应的Action2放入栈顶所以我们可以通过Ognl表达式访问CompoundRoot对象栈顶的Action
12、ValueStack核心概念
Struts2在请求到来时,首先会创建一个Valuestack;然后,把当前的Action对象放入栈顶(CompoundRoot);Struts2会把ValueStack存在request中属性为“struts.valueStack”,所以标记库可以访问到valueStack
Struts2的很多标记就是通过访问ValueStack获得数据的:
通过ognl从valueStack取数据,并且显示:
<s:property value = "ognl..."/>
省略Value,取出ValueStack的栈顶 <s:property/>
通过ognl从Valuestack取出集合,依次将集合中的对象置于栈顶,在循环中,valuestack栈顶即为要显示的数据
13、EL表达式从 pagecontext、request、session、application四个范围中查找name属性,但是name属性是放在Action中的;Action存放于Valuestack中,valuestack存放于request中,也就是说在request中,我们是不能直接找到name的,但是我们为何却可以用EL表达式呢,这是因为Struts支持EL表达式,它通过StrutsRequestWrapper重写了getAttribute方法。如此,在编程过程中,如果丌使用getAttribute方法,request的使用和乊前没有区别,如果调 用getAttribute方法,则会调用Struts2框架重写的方法。
让我们的开发变得简单,节省项目成本。
基本的开发模式(不用框架的情况下)
1、数据表 2、java实体类(封装从数据库中查询出的数据) 3、数据访问对象dao 4、jsp/servlet
MVC:
1、Model 模型:模型的职责是负责业务逻辑,包括两部分:业务数据和业务处理逻辑。如实体类、service、dao都属于模型层
2、view 视图:视图的职责是显示界面和用户交互 属于视图的类是不包含业务逻辑和控制逻辑的 JSP:如果页面中有<%%>就不能算是视图层的类,或者jsp中有转发或者重定向的控制逻辑也是不可以的。
3、Controller控制器:控制层是视图层和模型之间的桥梁用于控制流程。 比如AcctionServlet
在web.xml中配置Struts2的前端控制器: 用filter实现的
<filter>
<filter-name>Struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern> 表示所有的请求都要经过该过滤器
</filter-mapping>
Struts的优点:
1、数据的自动封装:根据页面组件的name属性,自动封装到action中对应的name属性中 如:在jsp中<input name='name' type='text'> 在action中 会自动的给属性private String name赋值
2、数据的自动传递:Action中的属性可以直接用EL表达式在jsp页面中获得 如:${name}
配置文件Struts.xml:
<Struts>
<package name="test" extends="struts-default" namespace="/test">
<action name="welcome" class="com.cn.WelcomeAction" method="">
<result name="success">/jsp/welcome.jsp</result>
<result name="fail>/jsp/nameform.jsp</result>
</action>
</package>
</Struts>
method:用于指定在对应的类中要执行的方法名,该方法的返回值必须是String类型,如果没有method=“”属性默认执行execute方法。
extends = "struts-default" 继承的包的name,一般继承Struts2默认提供的struts-default包,该包中定义了很多Struts2应用必须的组件(如:拦截器)
<action name="nameform">中只有name属性时,没有class属性Struts框架会默认为该<action>添加一个class作用是转发到对应的<result name="success">中指定的页面
8、OGNL表达式:
ognl封装在ognl.jar包中
EL表达式:EL表达式把数据从四个方面取出来(pageContenxt、request、session、application)中取出来显示或者计算。El表达式解决了java代码和HTML不匹配的问题。El表达式用字符串表达式替换了java代码用来表示对数据的获取和计算。
Ognl引擎访问对象的格式:Ognl.getValue("Ognl表达式",root对象);root对象是Ognl操作的主要对象
1、基本类型属性 Ognl.getValue("id",foo); Ognl.getValue("name",foo);
2、数组、List属性 :属性名[下标] Ognl.getValue("array[0]",foo) Ognl.getValue("list[1]",foo);
3、map属性Ognl.getValue("map.one",foo); Ognl.getValue("map['two'],foo); one、two都是key值
4、基本运算:Ognl.getValue("id+100",foo);
5、调用方法:Ognl.getValue("name.toUpperCase(),"foo); Ognl.getValue("list.size()",foo);
6、调用静态方法,以取出的属性为参数,调用静态方法的格式:@类名@方法名
Ognl.getValue("@java.util.Arrays@toString(arry)",foo)
7、Ognl只能创建Map 和list对象
创建Map对象 注意:#号不能丢Ognl.getValue("#{1:'java',2:'javajava',3:'javajavajava'}", null);
9、OGNL引擎的基本结构:ognl引擎、root对象(ognl操作的对象)、context对象(就是一个map,用于存放一个和整个系统都相关的公共数据);
当有了ongl引擎,在访问中有一些数据时每一次访问都需要用到的,这些数据就可以保存在context对象中
Ognl.getValue("name",root); 不加 # 表示从业务对象root中取出数据
Ognl.getValue("#num",root); 加# 表示从公共对象context中取出数据
10、Xwork对Ognl的扩展:
CompoundRoot对象;在XWork中,root对象被改为类似”栈"一样的存储空间,在该对象空间内可以存放多个root对象;
当去数据符合“栈'的规则,如果OGNL表达式是name在CompoundRoot从栈顶开始依次看是否有name属性。
Context(Map)对象
11、ValueStack基本结构
Struts将之前讲的XWork对Ognl的扩展这一套机制封装起来,这个对象叫做ValueStack
Struts2在启动时,会创建一个ValueStrack对象,当用户发送请求到对应的Action时,Struts2会把当前被请求的Action1放入CommpoundRoot对象的”栈空间"栈顶,请求结束,Action1会被清除,当下一次另一个请求到来时,Struts2会把该请求对应的Action2放入栈顶所以我们可以通过Ognl表达式访问CompoundRoot对象栈顶的Action
12、ValueStack核心概念
Struts2在请求到来时,首先会创建一个Valuestack;然后,把当前的Action对象放入栈顶(CompoundRoot);Struts2会把ValueStack存在request中属性为“struts.valueStack”,所以标记库可以访问到valueStack
Struts2的很多标记就是通过访问ValueStack获得数据的:
通过ognl从valueStack取数据,并且显示:
<s:property value = "ognl..."/>
省略Value,取出ValueStack的栈顶 <s:property/>
通过ognl从Valuestack取出集合,依次将集合中的对象置于栈顶,在循环中,valuestack栈顶即为要显示的数据
<s:iterator value = "ognl...list">
<s:property value = “name"/>
</s:iterator>
13、EL表达式从 pagecontext、request、session、application四个范围中查找name属性,但是name属性是放在Action中的;Action存放于Valuestack中,valuestack存放于request中,也就是说在request中,我们是不能直接找到name的,但是我们为何却可以用EL表达式呢,这是因为Struts支持EL表达式,它通过StrutsRequestWrapper重写了getAttribute方法。如此,在编程过程中,如果丌使用getAttribute方法,request的使用和乊前没有区别,如果调 用getAttribute方法,则会调用Struts2框架重写的方法。