Struts2 学习

一、Struts2简介

  1.概念:轻量级的MVC框架,主要解决了请求分发的问题,重心在控制层和表现层。低侵入性,与业务代码的耦合度很低。Struts2实现了MVC,并提供了一系列API,采用模式化方式简化业务开发过程。

  2.与Servlet对比

    优点:业务代码解耦,提高开发效率

    缺点:执行效率偏低,需要使用反射、解析XML等技术手段,结构复杂

  3.不同框架实现MVC的方式

    Servlet:

    

    Spring:

    

    Struts2:

    

二、Struts2使用

  1.使用步骤

    导入Struts2核心jar包

    在web.xml配置前端控制器filter

<filter>
    <filter-name>Struts2</fileter-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.xml(格式可以参考核心包根路径下的DTD文件,struts-default.xml)

    编写控制器Action

      - 方法是public的

      - 返回值为String类型(返回值与struts.xml->action->result的name属性匹配,即根据此返回值找到对应result)

      - 参数列表为空

    创建JSP页面

    配置struts.xml

<struts>
   

  

      

    <!-- i18n:国际化,解决post乱码问题 -->
    <constant name="struts.i18n.encoding" value="=UTF-8"></constant>
    <!-- 指定范文action的后缀名;如果不设置可以直接访或者直接访问路径.action,两个逗号表示可以为空,默认为action,如果设置则必须加.value(设置的值) -->
    <constant name="struts.action.extension" value="=action,,"></constant>
    <!-- 模式配置是false,如果改为true;
    表示开发模式 1、热加载主配置(只对struts配置生效)不需要重启即可生效
    2、可以提供更多的错误输出,方便开发时的调试 -->
    <constant name="struts.devMode" value="=false">

  </constant>

    

    <!--
        package:包,用于对Action进行封装
        name:包名,根元素下可以有多个包,彼此不能重名
        extends:继承,用于指定继承的包,相当于将继承包下的配置信息复制到当前包
        namespace:命名空间,用于规定Action的访问路径,必须“/”开头    -->
    <package name="test01" namespace="/test01" extends="struts-default">
        <!--action:业务控制器,用于注册业务控制器组件
            name:action名称,用于规定Action的访问路径
            class:业务控制器组件,用于指定业务控制器对应的类
            method:方法,用于指定访问当前action时要调用的方法
            *请求URL:http://ip:port/projectName/namespace/ActionName.action
        -->
        <action name="hello" class="test01.konrad.action.HelloAction" method="execute">
            <!--result:输出组件,用于转发、重定向、直接输出
                name:名称,一个action下可以有多个result,彼此不能重名
                默认值转发,元素内设置转发的页面
            -->
            <result name="success">/hello.jsp</result>
        </action>
    </package>
</struts>

三、参数传递

  1.Action从页面取值  

    a)基本属性注入(页面,Action)

    

    b)域模型注入(页面,Action)

    

  2.页面从Action取值

    a)使用EL表达式

    

    b)OGNL

四、OGNL

  1.概念:Object Graph Navigation Language,是一门功能强大的表达式语言,类似于EL。Strut2默认采用OGNL表达式访问Action的数据,实际上是通过ValueStack对象来访问Action。

  2.用法:在Struts2中,OGNL表达式要结合Struts2标签来访问数据

    EL:${user.userName} <==> OGNL:<s:property value="user.userName">

    *a)访问基本属性  <s:property value="属性名"/>

    *b)访问实体对象  <s:property value="对象名.属性名"/>

    c)访问数组/集合  <s:property value="someArray[1]"/> | <s:property value="someList[1]"/>

    d)访问Map  <s:property value="someMap.key" />

    e)运算  <s:property value="‘My name is‘ + name" />

    f)调用方法  <s:property value="name.toUpperCase()" />

    g)创建集合  <s:property value="{‘a‘,‘b‘,‘c‘}" /> ArrayList

    h)创建Map  <s:property value="#{‘mm‘:‘MM‘,‘nn‘:‘NN‘}" /> LinkedHashMap

      

五、ValueStack

  1.概念:是Struts2中,Action向页面传递数据的媒介,封装了Action的数据,并允许JSP通过OGNL来对其访问

  2.原理

  

  3.访问ValueStack

    a)通过<s:debug>观察其结构

    b)输出栈顶:<s:property />

    c)访问Context对象:

      - OGNL表达式以"#"开头

      - 以key来访问context对象的值,即"#key"得到context中某属性值

    d)迭代集合  

     

    

    e)按数字迭代

 

  4.ValueStack栈顶的变化

    - 默认情况下栈顶为Action

    - 循环过程中,栈顶为循环变量(集合迭代时,循环变量是集合中的对象,即栈顶为实体对象,可以以实体对象为root来写OGNL表达式;数字迭代时,循环变量是数字,不能以数字为实体对象,需要通过var声明变量名,以"#变量名"来引用,此情况下,是从context对象中取出值)

    - 循环结束后,栈顶变回Action

  5.EL表达式访问ValueStack

    a)EL也是从ValueStack中取的值

    b)EL默认的取值范围是page,request,session,application

    c)Struts2重写的request的getAttribute方法,先试图从原始request中取值,如果没取到再从ValueStack中取值

六、Action基本原理

  1.6大核心组件

  

  FC:前端控制器,负责统一的分发请求

  Action:业务控制器,负责处理某一类业务

  ValueStack:Action与JSP数据交互的媒介

  Interceptor:拦截器,负责扩展Action,处理Action的共通事务

  Result:负责输出的组件

  Tags:标签,负责显示数据、生成框体

  

  2.获取Session的方式

    a)ActionContext

      - ActionContext.getContext().getSesion(),返回Map<String, Object>

    b)ServletActionContext

      - ServletActionContext.getRequest().getSession(),返回HttpSession

    c)SessionAware(推荐使用)

      - 让Action实现SessionAware接口

      - 实现setSession(Map<String, Object> session)方法,Struts2会在实例化Action后调用方法,通过方法参数将Session对象注入进来

      - 定义成员变量,接收注入进来的Session对象

七、Result原理

  1.介绍:用于做输出的组件,用于向页面输出一些内容,转发、重定向可以理解为特殊方式的输出。每一个Result实际上是一个类,这些类都实现了共同的接口Result。Struts2预置了10种类型的Result,定义在strtus-default.xml

  2.Result类型

    a)dispatcher:用于转发的result,可以将请求转发给JSP,这种类型的Result对应的类为ServletDispacherResult,通过default="true"指定该Result为Struts2默认的Result类型。

    b)stream:用于向页面输出二进制数据,此种类型的Result可以将二进制数据输出到请求发起端,对应类为StreamResult

<result name="success" type="stream">  <!--codeStream 为定义在Action的输入流InputStream -->
    <param name="inputName">codeStream</param>
</result>

    c)redirectAction:用于将请求重定向给另外一个Action,对应类为ServletActionRedirectResult

<result name="login" type="redirectAction">
    <!--若重定向的Action与当前Action在同一个namespace下,可以省略namespace-->
    <param name="namespace">
    /命名空间
    </param>
    <param name="actionName">
    action名
    </param>
</result>

    d)json:用于向页面输出json格式的数据,可以将json字符串输出到请求发起端。对应类为JSONResult

<result name="success" type="json">
    <!--输出一个Action属性
    指定属性为基本类型,则直接返回该属性值
    如果指定属性为实体对象,则返回格式{"code":"as1","name":"hk"}
    -->
    <param name="root">属性名</param>
    <!--输出多个Action属性-->
    <param name="includeProperties">属性名1,属性名2...</param>
    <!--输出所有属性,不需要param标签-->

</result>

    json需要导包,修改package继承关系为json-default

八、UI标签

  1.表单  <s:form action="" method="" theme="simple" ></s:form>

  2.文本框  <s:textfield name="userName" />

  3.布尔框  <s:checkbox name="marry" />

  4.单选框  <s:radio name="sex" list="#{‘M‘:‘男‘,‘F‘:‘女‘}"/> 静态初始化

        <s:radio name="favoriteCities" list="cities" listKey="cityCode" listValue="cityName" /> 动态初始化

  5.多选框  <s:checkboxlist name="travelCities" list="#{‘01‘:‘北京‘,‘02‘:‘上海‘,‘03‘:‘广州‘}" /> 静态初始化

        <s:checkboxlist name="travelCities" list="cities" listKey="cityCode" listValue="cityName" /> 动态初始化

  6.下拉选  <s:select name="home" list="#{‘01‘:‘北京‘,‘02‘:‘上海‘,‘03‘:‘广州‘}" /> 静态初始化

        <s:select name="home" list="cities" listKey="cityCode" listValue="cityName" /> 动态初始化

九、拦截器

  1.用途:拦截器适合封装一些通用处理,便于重复利用。例如请求参数传递给Action属性,日志的记录,权限检查,事务处理等。拦截器是通过配置方式调用,因此使用方法比较灵活,便于维护和扩展。

  2.使用步骤

    创建拦截器组件(创建一个类,实现Interceptor接口,并实现intercept方法;也可以继承MethodFilterInterceptor,这种方式可以使action中某个方法不进行拦截)

public String intercept(ActionInvocation invocation){
   //拦截器--前部分处理
   invocation.invoke();
   //拦截器--后续处理
}

    注册拦截器

<package>
    <interceptors>
        <interceptor name="别名" class="实现类"/>
        <!--其他拦截器-->
    </interceptors>
</package>

    引用拦截器(哪个Action希望被拦截器扩展,需要在此action配置下,引用拦截器)

<action>   <!--手动的使用一次系统默认的拦截器-->   <interceptor-ref name="defaultStack"/>
    <interceptor-ref name="拦截器别名"/>
    <!--可以写多个-->   <!--可以使用excludeMethods参数属性,设置不过滤的方法-->
</action>

  

  3.拦截器栈

<interceptor-stack name="myStack">
    <interceptor-ref name="拦截器别名1"/>
    <interceptor-ref name="拦截器别名2"/>
</interceptor-stack>

  4.FileUpload拦截器

    a)原理:首先FileUpload拦截器将表单中提交的文件,以临时文件的形式保存到服务器临时路径下。之后FileUpload拦截器将该临时文件对象注入给Action,Action自主处理该临时文件。最后FileUpload拦截器删除临时文件。

    b)使用步骤

      导包 commons-io.jar

      Action:定义File类型属性(如some),接受拦截器注入的临时文件对象。若想要获取原始文件名,要定义String类型属性,属性名为File类型属性+FileName(如someFileName)

      表单设置:method="post", enctype="multipart/form-data"

    c)设置限制(Struts2文件上传默认最大值为2097152B,即2M)

      在struts.xml中重置默认限制值  <constant name="struts.multipart.maxSize" value="5000000" />

原文地址:https://www.cnblogs.com/yzxiao/p/10201041.html

时间: 2024-10-15 09:03:14

Struts2 学习的相关文章

struts2 学习记录 之 国际化

struts2 接下来是国际化,如果一个系统想要被多个国家的人所用就不得不考虑国际化的问题,如果为每一个国家都开发一套系统维护起来会很麻烦,所以就有了个思想,那就是把动态的,用不同语言展示的部分,放到配置文件中,动态的从文件里读取想要展示的内容,不同国家的人就得到了不同的展示,这是一个很好的思想,所以我把它记录一下了,嘻嘻... 首先 struts2 要把它的配置文件写好,以中文和美式英语为例,配置文件如下: 配置文件是以键值对的形式存在的,且以properties结尾,命名也有一定的格式,如t

struts2 学习记录 过滤器 国际化

struts2接触不是一天两天了,但是一直没有用它做什么项目,但老师确一直说它有很大的学习价值,所以还是把我学习到的东西给记录一下,记录的东西没有规律,只是给自己留个备份, struts2中最关键的是action,action可以用来传值,用起来很方便,它可以用el表达式在jsp页面上展示出来,也可以用ognl,el只能表达作用域里面的值,而struts2里面还有个放数据的地方叫做ActionContext,这个类里面可以放不在作用域里的键值对,但是el表达式还是可以获取到,但是效率很低,所以尽

struts2学习笔记(二)—— 获取登录信息及计算在线人数

实现目的: 1.点击"Login"的超链接,进入登录页面 2.填写登录信息,提交表单,将用户信息保存进Session 3.显示用户名,并计算在线人数 4.点击"Logout"的超链接,在线人数减一,并使Session失效 Struts2实现: 1.配置web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:/

struts2学习笔记(8)-------struts2的ajax支持

struts2支持一种stream类型的Result,这种类型的Result可以直接向客户端浏览器响应二进制,文本等, 我们可以再action里面生成文本响应,然后在客户端页面动态加载该响应即可. 直接看例子: public class LoginAction { private String user; private String pass; private InputStream inputStream; public InputStream getInput(){ return inpu

Struts2学习

Struts2流程 Web端发起一个request到Struts2action的过程为:首先对提交的表单或者数据进行类型转换,如果转换失败,则action跳转至input所对应的页面,如果没有设置input对应的页面则页面报错.如果转换成功,则已经自动给action的属性赋值了,接下来会调用action中的validate()校验方法,如果校验失败,则同转换失败一样跳转至input所对应的页面,只有校验通过了,才会去执行execute()方法,然后根据返回值跳转到对应的页面. JSP EL表达式

Struts2学习笔记(OGNL表达式)

Struts2学习笔记(OGNL表达式) Struts 2支持以下几种表达式语言: OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言: JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言: Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python.Ruby和Smarttalk等)的一些起特性: Velocity,严格来说不是表达式语言,它是一种基于Ja

Struts2 学习笔记(概述)

Struts2 学习笔记 2015年3月7日11:02:55 MVC思想 Strust2的MVC对应关系如下: 在MVC三个模块当中,struts2对应关系如下: Model: 负责封装应用的状态,并实现应用的功能.通常分为数据模型和业务逻辑模型,数据模型用来存放业务数据,比如订单信息.用户信息等:而业务逻辑模型包含应用的业务操作,比如订单的添加或者修改等. 封装应用状态:某些应用数据封装起来,使得视图只能通过接口获取对应的数据 响应状态查询:对应用的状态改变进行处理 暴露应用功能:暴露接口 通

struts2学习笔记(一)

一.struts2和struts1的区别 1.Action类 a) Struts1要求Action类继承于一个抽象类,Struts1普遍使用抽象类编程而不是接口 b) Struts2的Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能.Struts2提供一个ActionSupport基类去实现常用的接口.Action接口不是必须的,任何有execute标识的POJO对象都可以作为Struts2的Action对象. 2.线程模式 a) Struts1的Act

struts2学习笔记(7)------------ognl表达式

OGNL表达式(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言.是一种可以方便地操作对象属性的开源表达式语言. Struts2自行维护一个特定范围的"银行",Action将数据放入其中,而JSP页面可从中取数据,表面上似乎看起来像是jsp可以直接访问Action数据.. 当Action属性不再是简单的值,而是某个对象,数组,集合时,就需要使用ognl表达式来访问这些对象,数组,集合内的数据了. 1)ognl的stack Conte

Struts2学习笔记1

一.下载struts2.0.1 http://struts.apache.org/downloads.html,下载struts-2.0.1-all.zip,这个压缩包中包括了开发struts2所需的struts2-core.jar核心包以及其他struts2所依赖的JAR文件,另外另一些struts2的演示样例程序以及一些HTML的API文档. 二.试用struts2.0.1 1. 新建一个WEBproject,将struts-2.0.1-all.zip压缩包中的lib文件夹下的全部jar文件