struts2基础

来源:互联网 发布:js中settimeout 编辑:程序博客网 时间:2024/06/01 15:33
1).掌握MVC设计模式
2).Struts2简介
3).掌握Struts2框架搭建
4).掌握Struts2第一杯咖啡
5).掌握Struts2工作流程
6).掌握Struts2和MVC的关系
7).掌握struts.xml配置
8).掌握Struts2中的Action
9).掌握表单传参(Struts2属性绑定)
10).掌握Action动态方法调用(DMI)

1、MVC设计模式
model1模式:M+V,没有控制层C
model2模式:M+V+C

框架:
SSH:Struts2(控制层)+Spring4(大管家)+Hibernate4(持久层)
SSM:Spring MVC(控制层)+Spring+Mybatis(持久层)


2、Struts2简介
(1).Struts2是Apache基金会旗下开源的web开发框架,
       它基于WebWork2(另外一款web框架)开发而来,与Strut1没太大关系。
(2).基于MVC模式,可以替代servlet作为请求控制层。
       (Struts2是基于Action的MVC框架)
(3).Struts2提供属性绑定,数据转换,拦截器等功能,简化开发。
(4).Struts2 Action 在多线程是安全的,而Servlet本身
      是不安全的(程序员可控) 。
(5). Struts2 中的许多特性都是通过拦截器来实现的, 例如异常处理,
文件上传,验证等。拦截器是可配置与重用的。
面试题:什么是Struts2?
答案在上面
课外补充:struts1和struts2的区别?
Action 类:
• Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Action是接口。
• Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去 实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。


线程模式:
• Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
• Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)


Servlet 依赖:
• Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。
• Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。


可测性:
• 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。
• Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。


捕获输入:
• Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存 在的JavaBean(仍然会导致有冗余的javabean)。
• Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。


表达式语言:
• Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。
• Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL).


绑定值到页面(view):
• Struts 1使用标准JSP机制把对象绑定到页面中来访问。
• Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。


类型转换:
• Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。
• Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。


校验:
• Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
• Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性


Action执行的控制:
• Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。
• Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。
                      
Spring mvc和Struts2的区别?
Struts代替了控制层的servlet作为控制层的技术
Struts包括核心处理器和action


3、Struts2框架搭建


struts2-core-2.3.24.jar-->右键buildPath-->Add to build path;
打开:Libraries-->struts2-core-2.3.24.jar-->struts-default.xml
打开:Libraries-->struts2-core-2.3.24.jar-->org.apache.struts2-->static-->default.properties


方式:
   (1)下载Struts2源码包,里面附带有源码,依赖包,文档,以及实例程序
   (2)直接通过IDE(例如MyEclipse)直接导入Struts2
    (3)采用Maven等项目构建工具搭建
步骤:
1).找到开发Struts应用需要使用到的jar文件(http://struts.apache.org)-Struts 2.3.24(位置在:      struts-   2.3.24\apps\WEB-INF\lib)
2).配置Struts2的配置文件struts.xml(struts-2.3.24\apps\WEB-INF\src\java);;;;在IDE中,struts.xml必须放在src的根目录中,编译后,其必须在WEB-INF/classes的根目录下
3).在web.xml中加入Struts2 MVC框架启动配置;web.xml可从\框架\struts-2.3.24\apps\WEB-INF下面复制过来
        <!-- Struts2框架启动配置 :
     核心过滤器:1、在初始化时解析struts.xml
           2、将拦截到的.action或没有后缀的请求交给struts2管理:::::默认情况下,如果用户请求的路径以.action结尾,该请求将被转入Struts 2框架处理,否则该请求将略过Struts 2框架的处理。
  -->
     <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>
     


4、Struts2第一杯咖啡


5、简述Struts2的工作流程(面试题)
①. 请求发送给核心控制器(StrutsPrepareAndExecuteFilter)
②. 核心控制器判断该请求是否是一个Struts2请求(以.action结尾或无后缀名)
③. 若该请求是一个Struts2请求,则核心控制器把请求的处理交给ActionProxy(管理器)
④. ActionProxy创建一个ActionInvocation的实例,并进行初始化
⑤. ActionInvocation实例在调用Actiond的过程前后,涉及到相关拦截器(Intercepter)的调用
⑥. Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果 
⑦. 执行各个拦截器invocation.invoke()之后的代码
⑧. 把结果发送到浏览器端


6、Struts2和MVC的关系


Struts代替了控制层的servlet作为控制层的技术
Struts包括核心处理器和action


7、struts.xml配置
1).Struts2自带的开发模式常量
2).包配置
3).Action配置中各项默认值
4).Result配置


1)、Struts2自带的开发模式常量
<!--指定需要Struts 2处理的请求后缀-->
<constant name="struts.action.extension" value="do,action,"></constant>
<!--当struts的配置文件修改后,系统是否自动重新加载该文件-->
<!-- 是否重新加载配置 -->
<!--某些版本中,当struts中配置修改时,服务器会自动加载,不用手动重启-->
<constant name="struts.configuration.xml.reload" value="true"></constant> 
<!-- 配置开发模式 -->
<constant name="struts.devMode" value="true"></constant>
<!--该属性设置Struts 2是否支持动态方法调用-->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>


2)、包配置
<package name=""  namespace=""  extends="">...</package>
a).name:配置包时必须指定name属性,如果其他包要继承该包,必须通过该属性进行引用。name属性值不能有相同
b).namespace:包的namespace属性用于定义该包的命名空间。该属性可以不配置,对本例而言,如果不指定该属性,默认的命名空间为“”(空字符串)
c).extends="struts-default":通常每个包都应该继承struts-default包, struts-default包是由struts内置的,它定义了struts2内部的众多拦截器和Result类型。
d).abstract:可选属性;包还可以通过abstract=“true”定义为抽象包,抽象包中不能包含action,且该包要被继承
指定包是否是一个抽象包,抽象包中不能含有Action的定义。


3)、Action配置中各项默认值
<action name="" class="" method="">
<result name="">/目标路径</result>
</action>
a).action中的name:action的名称
b).class:默认值ActionSupport。action相对应的action全类名<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
c).method:默认值execute()。该action类中的所需执行的方法
d).result中的name的默认值为success


4)、result配置
在Struts2中,从作用域来划分,可以将result划分为2种
--全局result配置 <global-result>
--局部result配置<result>
a.搜索顺序:就近原则
b.result type:redirect,dispatcher,redirectAction


Struts2 有哪几种结果类型 ?【面试题】
 chain:用来处理action莲
 dispatcher:用来转向页面,通常处理jsp页面
 redirect:重定向到一个URL
 redirectAction:重定向到一个action


8、Struts2中的Action
1).Action的三种实现方式
2).Action的生命周期
3).Action访问servlet api


1)、Action的三种实现方式
a).?普通JAVA类
b).?继承ActionSupport【常用】
c).?实现Action接口


2)、Action的生命周期:
在每一次Web请求的时候就要新建一个实例


3)、Action访问servlet  api


9、表单传参(二种模式)见0921-Struts的loginaction.java(面试)
第一种模式:1、获得页面输入的信息,Struts2和Servlet Api无关,让他们强行有关
2、判断登陆
拿值的时候:${sessionScope.username}
属性绑定(普通绑定)
1、username必须和输入框的name值相同
2、自动生成get和set方法
拿值的时候:${requestScope.username}
第二种:
1、创建一个user类实现get和Set方法
2、loginaction.java里面private User user;实现get和Set方法,判断的时候需要使用user对象的get和Set方法调用user的属性
3、需要login.jsp:<input type="text" name="user.username"/>
4、${requestScope.user.username }登陆成功
总结:第一种模式:绑定普通属性
1、在Action中写属性,属性名和输入框的name值相同
2、自动生成属性的get和set方法
第二种模式:
绑定域模型
1、创建域模型(类),类中的属性名和输入框的name值相同
2、在Action中声明类对象(域模型)
3、自动生成对象属性的get和set方法
4、在输入框的name值前加上对象名
10、Action的动态方法调用(DMI)
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<form action="dremap/login!方法名.action" method="post">
原创粉丝点击