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

2017-10-15  本文已影响202人  贾里

1.什么是框架

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

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

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

2).最佳实践三要素:

简单就是美:

减少依赖,消除耦合

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

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


2.MVC设计思想

1).思想:责任分离.

MVC组件类型的关系和功能.png

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

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


3.前端控制器

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

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

前端控制器.png

2).前段控制器原理

前段控制器原理.png

4.mini MVC

mini MVC.png

5.Struts2简介

1).Struts2的前世今生:

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

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

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

Struts2.png

3).Strust2 核心功能:

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


6.Struts2的HelloWorld

1).Struts2运行必要jar包:

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语法提示

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配置:
前三个文件时框架自带的,我们不能修改,只能使用.

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

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

3).常见的常量配置:


10.package,action,result配置

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

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

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

常见的属性:

在开发中的最佳实践:

Paste_Image.png Paste_Image.png

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

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

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

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

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

<package name="oa" extends="basePkg" namespace="/oa">
        <global-results>
            <result></result>
</global-results>
</package>
Paste_Image.png

常见的属性:

Paste_Image.png

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

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

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方法.

上一篇 下一篇

猜你喜欢

热点阅读