Struts2(一)Struts2介绍及基本使用

1.什么是框架

什么是框架,框架从何而来,为什么使用框架?

1).框架(framework)——半成品:

  • 1.是一系列jar包,其本质是对JDK功能的拓展.jar其实就是多份字节码的集合.
  • 2.框架是一组程序的集合,包含了一系列的最佳实践,作用是解决某一个领域的问题.
    不同类型的框架,解决不同领域的问题.

最佳实践(Best Practice):实际上是无数程序员经历过无数次尝试之后,总结出来的处理特定问题的特定方法.
如果把程序员的自由发挥看作是一条通往成功的途径,最佳实践就是其中的最短路径,能极大的解放生产力(提高效率).

2).最佳实践三要素:

  • 可读性
  • 可维护性
  • 可拓展性.

简单就是美:

  • 消除重复
  • 化繁为简
  • 简单必须可读,简单必须可拓展

减少依赖,消除耦合

3).Web开发中的最佳实践:分层开发模式(技术层面的"分而治之")

JavaEE开发根据职责的纵向划分:表现层,业务层,持久层:

  • 表现层(Predentation Layer):Web层/MVC层/UI层:MVC框架:负责处理与界面交互的相关操作——(EasyJWeb/Struts/Struts2/SpingMVC)
  • 业务层(Business Layer):service层,负责复杂的业务逻辑计算和判断——(Spring,一站式容器)
  • 持久层(Persistent Layer):DAO层,负责将业务逻辑数据进行持久化存储——(Hibernate/MyBatis)

2.MVC设计思想

1).思想:责任分离.

  • M: 数据模型对象:封装数据,封装处理业务的功能.
  • V: 视图(界面):给用户呈现界面,展现数据.
  • C: 控制器: 接受请求/控制界面跳转.
MVC组件类型的关系和功能.png

2).MVC框架的功能作用(WEB开发常见功能):

MVC令程序开发有章可循,撇开框架,但是表现层的困惑也就出来了.
表现层需要处理的功能:

  • 设置编码
  • 接受请求参数
  • 参数类型转换
  • 把参数封装成对象
  • 响应
  • 验证
  • 文件上传
  • 国际化
  • Token
  • 自定义标签.

3.前端控制器

1).什么是前端控制器:

前端控制器(Front Controller)/核心控制器:是J2EE中的的一个设计模式.
目的:针对有多个请求的共同操作做封装.

前端控制器.png

2).前段控制器原理

前段控制器原理.png

4.mini MVC

mini MVC.png

5.Struts2简介

1).Struts2的前世今生:

  • 1.早期开发模型Servlet+JSP+JavaBean(Model2)显得力不从心:流程凌乱、数据传递无序、缺乏辅助功能。
  • 2.MVC模式的轻量级Web应用框架:Apache Struts1很快风靡全球。
    代码结构划分合理,实用工具框架(如验证框架、国际化框架,标签)等。
  • 3.时间推移,Struts1的缺点:
    线程不安全、灵活性低、和ServletAPI耦合、页面传值麻烦等。
  • 4.异军突起,SpringMVC和OpenSymphony的WebWork等。
  • 5.Apache Struts + OpenSymphony WebWork2 = Struts2

2).Struts2:基于MVC的轻量级的Web应用框架,

来源于Webwork2与Struts1.x完全不兼容

Struts2 是一个非常优秀的MVC框架,基于Model2 设计模型.
由传统Struts1和WebWork两个经典框架发展而来:Struts2框架=Struts2+XWork

Struts2.png

3).Strust2 核心功能:

  • 允许POJO(Plain Old Java Objects)对象作为Action.
  • Action的execute 方法不再与Servlet API耦合,更易测试
  • 支持更多视图技术(JSP、FreeMarker、Velocity)
  • 基于Spring AOP思想的拦截器机制,更易扩展
  • 更强大、更易用输入校验功能
  • 整合Ajax支持
    等等

4).Struts2框架下目录分析(struts-2.3.24-all.zip):

  • apps:该文件夹包含了基于struts2 的示例应用,这些示例应用对于学习者是非常有用的

  • docs:该文件夹下包含了struts2 相关文档,包括struts2 快速入门、struts2的文档以及API文档等

  • lib:该文件夹下包含了Struts2框架和核心类库,以及struts2第三方插件类库

  • src: 该文件夹下包含了Struts2框架的全部源代码


6.Struts2的HelloWorld

1).Struts2运行必要jar包:

  • struts2-core-2.3.1.1.jar:Struts 2框架的核心类库
  • xwork-core-2.3.1.1.jar:Command模式框架,WebWork和Struts2都基于xwork
  • ognl-3.0.3.jar:对象图导航语言(Object Graph Navigation Language), struts2框架通过其读写对象的属性
  • freemarker-2.3.18.jar:Struts 2的UI标签的模板使用FreeMarker编写
  • commons-logging-1.1.x.jar:ASF出品的日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 1.4+的日志记录。
  • commons-fileupload-1.2.2.jar: 文件上传组件,2.1.6版本后需要加入此文件
  • commons-io-2.0.1.jar:传文件依赖的jar包
  • commons-lang-2.5.jar:对java.lang包的增强

2).开发Struts2的Hello程序:

1.准备Struts2依赖的jar文件.
注意:别拷贝Struts2中lib下所有的jar
Struts2根/apps下,解压struts2-blank.war,拷贝其WEB-INF/lib中的所有的jar到自己的项目中.

2.在web.xml中配置前端控制器.StrutsPrepareAndExecuteFilter-(参阅struts2-blank项目的web.xml文件.)

Paste_Image.png

3.准备Struts2的配置文件:struts.xml.从struts2-blank\WEB-INF\classes中拷贝到项目的source folader目录.

Paste_Image.png

4:定义一个POJO类:HelloAction,提供一个sayHello方法(公共无参数).

Paste_Image.png

5.在struts.xml中,配置HelloAction.(把HelloAction交给Struts2管理).

Paste_Image.png

6:部署项目,访问Action:

访问格式:http://ip:port/contextPath/namespace/actionName[.action]
http://localhost/pss/hello.action


7.Eclipse支持struts.xml语法提示

  • 方式1:如果可以联网,Eclipse工具就可以把struts.xml依赖的struts-2.3.dtd文件下载下来.
  • 方式2:离线情况,手动的管理dtd文件.
    (struts-2.3.dtd文件在struts2-core-2.3.24.jar文件中.)
    关闭xml文件,再打开.
Paste_Image.png

8.Struts2简单执行流程

Paste_Image.png

9.配置文件和常见的常量配置

1).文件拆分

在大部分应用里,随着应用规模的增加,系统中Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿。为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。下面的struts.xml通过<include>元素指定多个配置文件:
struts.xml:

<struts>
    <include file="struts-part1.xml"/>
        <include file="struts-part2.xml"/>
</struts>

2).Struts2中的6大配置文件:

Struts2框架按照如下顺序加载struts2配置:
前三个文件时框架自带的,我们不能修改,只能使用.

  • 1.default.properties 该文件保存在 struts2-core-2.3.7.jar 中 org.apache.struts2包里面:包含了Struts2的默认常量配置
  • 2.struts-default.xml 该文件保存在 struts2-core-2.3.7.jar:包含了框架依赖的对象配置和结果类型,拦截器等配置.
  • 3.struts-plugin.xml 该文件保存在Struts2框架的插件中:struts-Xxx-2.3.7.jar.由插件提供
    前三个文件时框架自带的,我们不能修改,只能使用.

后三个文件是我们可以修改操作的.

  • 4.struts.xml 该文件是web应用默认的struts配置文件.重点.配置自定义的Action和其他信息.
  • 5.struts.properties 该文件是Struts的默认配置文件-->可以修改default.properties 的常量配置(不用).
  • 6.web.xml 该文件是Web应用的配置文件

如果多个文件配置了同一个struts2 常量,则后一个文件中配置的常量值会覆盖前面文件配置的常量值.
注意:一般的,我们只在struts.xml中做常量配置.
<constant name="struts.action.extension" value="action,opensource,do,,"/>

3).常见的常量配置:

  • 指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出
    <constant name="struts.i18n.encoding" value="UTF-8"/>
    该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。

  • 如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开
    <constant name="struts.action.extension" value="action,,"/>

  • 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
    <constant name="struts.serve.static.browserCache" value="false"/>

  • 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开
    <constant name="struts.configuration.xml.reload" value="true"/>

  • 开发模式下使用,这样可以打印出更详细的错误信息
    <constant name="struts.devMode" value="true" />:修改struts.xml之后,不要重启Tomcat.

  • 默认的视图主题
    <constant name="struts.ui.theme" value="simple" />

  • 是否支持动态方法调用
    <constant name="struts.enable.DynamicMethodInvocation" value="false"/>


10.package,action,result配置

1).<package>元素: 是<struts>根元素的子元素.

<package name="" extends="" namespace="" abstract=""></package>

用来对多个<action>元素分类管理,和Java中的package没有关系.

常见的属性:

  • name: 表示<package>元素的名字,但是要保证不同的<package>元素的name不同. 可以通过该名字被其他的包所指代.

  • extends: 表示当前<package>继承哪一个<package>,一般都是:struts-default.
    而struts-default其实就是struts-default.xml中<package>元素的名字.
    继承struts-default之后,就拥有了该<package>定义的所有资源.(结果返回类型,拦截器..,
    如果当前<package>元素需要继承多个<package>,可以以逗号分割即可.

  • namespace: 表示命名空间,一般的以"/"打头.命名一般以模块名.如: /crm, /oa. 和<action>的name决定了一个Action类的访问路径.

  • abstract: 抽象的,缺省值是false. 若一个<package>的abstract="true",那么该<package>中就不能再定义<action>元素,只能用来继承.

在开发中的最佳实践:

Paste_Image.png
Paste_Image.png

2).<action>元素:是<package>元素的子元素.

当前某一个action类需要被外界访问,此时才做配置.
专门用来配置Action对象的(有Action类不一定有action元素,可能某一个Action仅仅是作为父类而存在).
(有action元素,不一定非得有Action类(因为有默认的Action类).)
<action name="" class="" method=""/>
常见的属性:

  • name: action的名称,在同一个<package>中,action的名字必须唯一. 和<package>的namespace共同决定了一个Action类的访问路径.
    注意:action的name值不能以"/"打头.
  • class:一个Action类的全限定名. 缺省值:ActionSupport类.
  • method:当前Action动作访问的方法, 缺省值:execute.

访问路径: http://ip:port/contextPath/namespace/action名[.action]

3).<result>元素:配置结果视图.

<result name="" type=""></result>

  • 局部结果视图: <result>定义在<action>中.
  • 全局结果视图: <result>定义在<global-results>中,而<global-results>在<package>中
<package name="oa" extends="basePkg" namespace="/oa">
        <global-results>
            <result></result>
</global-results>
</package>
Paste_Image.png

常见的属性:

  • name:Action方法返回的逻辑视图名称. 缺省值:success.
  • type:结果的跳转类型.该类型的值在struts-default.xml中已经预定义好了. 缺省值:dispatcher.
    常见的type值(结果类型):
    • dispatcher: 表示从Action请求转发到页面(JSP).
    • redirect: 表示从Action重定向到页面(JSP).
    • chain: 表示从Action请求转发到另一个Action.
    • redirectAction: 表示从Action重定向到另一个Action.
    • stream: 表示返回流. 文件下载时使用.
Paste_Image.png

<param name="">表示参数:name缺省值:location(地址)

先找当前Action的局部结果视图:

  • 1.找 到:跳转
  • 2.找不到: 继续找当前<package>中的全局的结果视图.
    • 1.找 到:跳转
    • 2.找 不到:报错.No result defined will.
Paste_Image.png

11.Action类的三种编写方式

第一种.使用公共的POJO类作为Action. 提供公共的无参数的Action方法.(不推荐).

缺点:
没有一种方式约束Action方法必须是公共的无参数的.
Action方法的返回逻辑视图名可以自定指定. 有时起名不规范. 比如:"ooxx".
解决方案:第二种.

第二种.定义一个类,实现于com.opensymphony.xwork2.Action接口.并覆写execute方法即可.(不推荐)

Action接口中,不仅提供了Action方法的声明,也提供了常用的逻辑视图名称:
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
缺点:
不支持国际化,数据校验,消息机制.
解决方案:第三种

第三种.定义一个类,继承于com.opensymphony.xwork2.ActionSupport类.(推荐)

public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable {}
真实开发中,我们却往往再提供一个BaseAction类.
ActionSupport.
--BaseAction(表示所有自定义Action类的基类,封装了其他Action共同的代码)
-----AAction.
-----BAction.

Paste_Image.png

12.OGNL和ValueStack(值栈)


13.Action中多方法调用

Action中存在多个Action方法会造成<action>配置的臃肿.

Paste_Image.png

解决方案:

方案1: DMI:动态方法调用 :官方不推荐.

格式: action名!方法名
比如: emp!edit emp!list
在Struts2新的版本中,默认的关闭了DMI.若我们需要使用DMI,就需要配置常量,启用动态方法调用.
此时:<action/>元素不需要指定method属性值.
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>

方案2: 使用通配符的方式类配置: 通配符:(表示任意字符)

<action name="emp_*" class="com._520it.manymethod.EmployeeAction" method="{1}">

Action的名字: emp_Action方法: 比如:
emp_list,那么{1}的值就是list
emp_edit,那么{1}的值就是edit

两个通配符:

<action name="*_*" class="com._520it.manymethod.{1}Action" method="{2}">

Action名字:Action类名_Action方法.
比如:Employee_list,表示调用的EmployeeAction中的list方法
比如:Department_edit,表示调用DepartmentAction中的edit方法.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容

  • 概述 什么是Struts2的框架Struts2是Struts1的下一代产品,是在 struts1和WebWork的...
    inke阅读 2,178评论 0 50
  • 本文包括: 1、Struts 2 概述2、Struts 2 快速入门3、Struts 2 的执行流程4、配置 st...
    廖少少阅读 2,901评论 3 13
  • 详谈 Struts2 的核心概念 本文将深入探讨Struts2 的核心概念,首先介绍的是Struts2 的体系结构...
    可爱傻妞是我的爱阅读 1,075评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,292评论 18 399
  • 目录 1. 什么是Struts2 2. Struts2下载 3. Struts2的目录结构 4. Struts2中...
    深海鱼Q阅读 927评论 0 16