笔记-struts2

1.struts2:主流的开发技术,很多公司都在用 基于mvc模式,mvc结构是一个优秀的设计思想,可以提高程序结构的灵活性便于日后的维护和扩展

    特点:提供了action组件,充当struts1的Action和ActionForm的功能
        提供了大量的result组件
        提供了拦截器
        可测性强,便于维护

2.struts的发展

strut1 实现了mvc架构-->最成熟的版本struts1.2-->
 出现webwork-->webwork核心xwork基础上包装struts1(两种框架整合)-->struts2
*struts2不是struts1的升级版本,是webwork的升级版本

3.struts2实现MVC步骤:

   struts2采用filter充当控制器--->根据struts.xml配置-->将请求分发给
不同的业务控制器action-->action处理业务返回字符串-->filter根据返回的字符串 -->在struts.xml中找到相应的result-->result根据请求转发页面

4.struts2的action工作原理:

1)发送请求-->到达控制器
2)-->根据请求创建valuestack对象,每个请求创建一个action对象
-->action对象存储 在valuestack的root区域,valuestack对象存放在request中,存储的值为struts.valuestack
3)控制器调用action接收请求参数,执行业务
4)控制器根据action返回值创建result视图组件处理
5)请求处理完成后,将valuestack对象和action销毁

5.在struts2中页面向Action传参

  struts2中常用的传参方式有两种:基本属性注入和域模型注入
 其中,基本属性注入是将表单中的数据,分别传给Action中声明的基本属性,要求 这些属性有set方法,并且名称与表单中框体的name值一致
 域模型注入是将表单中的数据,传给Action中的一个实体对象,要求这个对象具有set方法,并且表单中框体的name中的表达式要有"对象.属性"的格式

6.struts2的配置文件

 1)struts-default.xml
  定义了很多result组件(默认result-type,dispatcher)和拦截器(默认default-stack),还有框架的核心bean
 2)struts.xml(开发者创建)
  可继承struts-default.xml
 <struts>
 <package namespace="/" extends="struts-defualt" name="">
 <action name="login" class="cre.action.login" method="">
 <result name="" type="dispatcher">
 param name="location">/WEB-INF/ok.jsp</param>
 **location
 </result>
 </action>
 </package>
 </struts>
定义开发者编写的Result组件,拦截器组件,Action组件
3)default.properties(框架自带)
 定义了系统参数
4)struts.properties(由开发者创建并使用)
用于覆盖default.properties中内置系统参数
a.struts.i18n.encoding=UTF-8:默认编码格式
b.struts.action.extension=action,,:指定了请求的后缀
5)struts-plugin.xml
整合插件包中带的配置文件

7.OGNL

1)Object Graphics Navigation Language 对象图导航语言 ,属于表达式语言的一种,与EL表达式类似,OGNL技术是struts2中的核心知识它封装与ognl.jar中,ognl.jar工具包提供一个引擎,该引擎可以按照提供的ognl表达式访问对象数据和方法
2)OGNL工具构成
  a.OGNL引擎,负责解析执行OGNL表达式
  b.Root存储区,负责存储一个Object类型的对象,该存储区数据访问时,OGNL表达式格式为"属性"
  c.Context存储区,负责存储一个Map类型的对象,该存储区数据访问时,ognl表达式格式为"#key"
3)OGNL作用
  a.对对象的属性获取和设置
  在java代码中使用:
  ognl.Ognl.getValue("address.street", p);
  ognl.Ognl.setValue("address.street", p, "齐鲁软件园A座");
  在jsp页面中:
  <s:property value="name"/>
  b.调用对象的方法
  <s:property value="#session.msg.length()"/>
  c.调用静态属性和方法
  调用静态属性:
  <s:property value="@java.lang.Math@PI"/>
  d.对集合进行过滤
  <s:iterator value="list.{$#this.age >= 18}">
  $最后一个元素
  ?所有元素
  ^第一个元素
  e.支持java中的运算符和操作符
  <s:iterator value="list.{$#this.age >= 18}">
  f.定义list常量{"tom","sun"}
  g.定义Map常量#{"key":"value","key2":"value2"}

8.struts2中各组件的作用

struts2有6大核心组件,分别为filter(前端控制器),Action(业务控制器),ValueStack(值对象),Interceptor(拦截器),Result(输出组件),Struts2标签
调用顺序:请求提交给前端控制器filter,它会根据struts.xml中的配置找到对应的业务控制器Action,再调用Action的业务方法,在调用过程中会被拦截器组件所拦截,最终根据Action方法的返回值,filter从struts.xml中可以找到对应的Result,使用这个Result向页面输出内容
最常见的输出实际上是将请求转发给一个JSP,在容器解析JSP生成HTML的过程中,S突突死标签将被解析,此时标签中的OGNL表达式会发送给ValueStack取值,返回的结果被写入最终生成的HTML

9.Struts2中Action相关配置

(1)<package>元素的namespace属性
   用于指定package中的action对应的请求路径.
   请求路径格式为:http://localhost:8080/工程名+struts.xml中的
   namespace属性+<action>元素的name属性
(2)<action>元素的method属性
   用于指定action中的业务方法名,默认为execute
(3)<param>元素
   用于为Action,Result或拦截器组件的属性指定值.
(4)通配符*的使用name="opt"
   <action>的name属性可以使用若干个*号,其他属性可以使用{1},{2}格式指定.
(5)动态方法调用
   通过请求格式指定业务方法名.
   格式:  请求名!方法名.action 

10.ValueStack,ActionContext,ServletActionContext

(1)ValueStack
   主要用于存储请求相关信息,内部结构如下:
   root区域:被称为根存储区,是一个栈结构,栈顶元素为当前请求的Action对象
   context区域:被称为变量存储区,是一个Map结构,存储了request,session,application等对象
(2)ActionContext用于获取context存储区内容,
   可以将request,session,application对象以Map结构返回
   ActionContext.getContext().getSession();
   ActionContext.getContext().getApplication();
   ActionContext.getContext().get("request");
(3)ServletActionContext是ActionContext子类,
   可以获取Servlet API类型的对象

11.struts2的Interceptor组件

1)可以用于封装共通的业务处理,之后可以通过配置作用到Action组件上,使用方法灵活,便于维护
  例如共通的业务:登录检查,日志记录,性能检测,事务处理
2)拦截器规范
  a.拦截器组件必须实现Interceptor接口,实现interceptor方法
  b.拦截器可以继承AbstractInterceptor类
  c.拦截器组件可以继承MethodFilterInterceptor类
3)拦截器相关配置
  a.声明
  <interceptor name="拦截器名" class="包名.类名"/>
  b.引用
  <interceptor-ref name="拦截器名或拦截器栈名"/>
  c.注意:当为Action组件引用了拦截器后,需要显式将defaultStack引入
4)声明拦截器

<interceptors>
<interceptor name="拦截器的名字" class"包名.类名""></interceptor>
<interceptor-stack name="拦截器栈的名字"></interceptor-stack>
<interceptor-ref></interceptor-ref>
</interceptors>
5)内置拦截器
   //1.cookie解析
      <interceptor name="cookie"     class="org.apache.struts2.interceptor.CookieInterceptor"/>
   //2.清除session
     <interceptor name="clearSession"  class="org.apache.struts2.interceptor.ClearSessionInterceptor" />
   //3.创建session
     <interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
   //4.关于调试的
     <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
   //5.关于异常
     <interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
   //6.关于文件上传
     <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
     (1)作用 
        调用上传文件解析器解析出上传文件,并将其放在临时目录下,在请求处理结束后将其删除.
     (2)使用
        a.编写Action组件,定义xxx,xxxFileName,xxxContentType,添加set方法
        b.在Action业务方法中,将xxx临时文件对象复制到指定目录.
   -----限定上传文件类型和大小
        c.在struts.xml的action配置中,定义fileUpload拦截器的引用,并指定限定参数
        <interceptor-ref name="fileUpload">
        <param name="allowedTypes">image/jpeg,image/gif</param>
        <param name="maximumSize">102400</param>
        </interceptor-ref>
        d.将Action组件继承ActionSupport,并在action配置中添加input视图
        e.在input视图中使用<s:fielderror name=""/>标签显示提示信息
   -----自定义提示信息<s:actionerror key="">
        f.在struts.properties中指定资源文件位置struts.custom.i18n.resources=包名.资源文件名
        g.在资源文件中覆盖原有提示信息
         struts.messages.error.content.type.not.allowed=自定义消息
         struts.messages.error.file.too.large=自定义消息
   //7.关于国际化
     <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
   //8.关于日志记录
     <interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
  //9.把请求信息封装在action中
    <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
  //10.把配置文件中的参数给action传入
    <interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
  //11.关于验证
    <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
  //12.关于工作流
    <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
  //13.表单中的checkbox
    <interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />
  //14.关于重复表单提交的拦截器
    <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
    (1)token拦截器的使用
       a.在JSP表单中添加<s:token/>标签.
       b.在struts.xml的action配置中,添加token拦截器的引用
         <interceptor-ref name="token"/>
         token拦截器负责将表单中的ID与session
         中ID对比
       c.在struts.xml的action配置中,添加invalid.token视图.
       如果拦截器发现重复提交,将自动调用此视图响应.
    (2)tokenSession拦截器的使用
       a,b两步与token的使用相同.不需要c步骤,tokenSession如果发现重复提交,将采用第一次提交的响应界面
6)异常拦截器
    使用:
struts.xml:
<exception></exception>
<exception-mapping></exception-mapping>

<!-- 处理action组件抛出的异常 -->
<global-exception-mappings>
<exception-mapping result="fail" exception="java.sql.SQLException">
</exception-mapping>
</global-exception-mappings>
7)param拦截器
     <interceptor name="params" 
class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
8)自定义拦截器
 a.实现Interceptor
 b.继承AbstractInterceptor 实现interceptor方法
 c.继承MethodFieldInterceptor 实现doIntercept方法(ActionInvocation invocation)
 d.在xml配置
     <interceptors>
     <interceptor name="mylogger" class="">
     <interceptor-stack>
     <interceptor-ref></interceptor-ref>
     </interceptor-stack>

     <action>
        <interceptor-ref name="mylogger"></interceptor-ref>
        <param name="includeMethods">add,delete,update,init</param>
        <interceptor-ref name="defaultstack"></interceptor-ref>
     </action>

12.struts2的Result组件

dispatcher(默认) 以请求转发方式调用一个JSP,生成响应视图
redirect 以重定向的方式调用一个JSP,生成响应视图
redirectAction 以重定向方式调用一个action
chain 以请求转发方式调用一个action
stream 以字节流方式响应,将Action中指定的一个InputStream类型属性输出,将Action中的InputStream属性以字节流方式输出
json 以json字符串方式响应,将Action中指定的属性,拼成一个json字符串输出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值