Struts2笔记

2018-02-11  本文已影响0人  Kylin824

3.1.1 - Model1和Model2

Model1与Model2很不同,Model2基于MVC

3.1.2 - MVC思想及其优势

Model、View、Controller三个部分以最少的耦合协作,使应用具有较好的可扩展性和可维护性

3.2 3.3 - 创建第一个struts2项目

  1. 下载Struts2包

  2. IDEA创建Struct2项目,将Struts2的lib文件夹下的几个必须的包复制到WEB-INF/lib路径下

  3. 编辑web.xml配置文件,配置Struts2的核心Filter,使拦截所有用户请求

    <filter>    
    <filter-name>struts2</filter-name>    
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    
    <filter-mapping>    
    <filter-name>struts2</filter-name>    
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  4. 创建登录的Action类:LoginAction

  5. 创建登录页面:login.jsp;登录成功页面:welcome.jsp

  6. 配置struts.xml,配置LoginAction来处理login.jsp的请求

3.4.1 - 常量配置:

Struts2按如下搜索顺序加载常量:

struts-default.xml -> struts-plugin.xml -> struts.xml -> struts.properties -> web.xml ,这些配置文件中都可以配置struts常量

struts2常量对整个应用起作用,也被称为struts2属性

3.4.2 - 包含其他配置文件

为避免struts.xml文件过于庞大,可分为多个配置文件,然后在struts.xml中通过include导入

3.5.1 - action接口和actionsupport基类

使用Action来封装HTTP请求参数,因此Action类中应包含与请求参数对应的属性,并为属性提供对应的setter和getter方法,Action类中的execute()方法用于处理用户请求并返回result

struts2只提供了Action接口

public interface Aciton
{
  public static final String ERROR = "error";
  public static final String INPUT = "input";
  public static final String LOGIN = "login";
  public static final String NONE = "none";
  public static final String SUCCESS = "success";
  
  public String execute() throws Exception;
}

另外struts2为Action接口提供了一个实现类:ActionSupport,该类中提供了许多默认方法,自定义的Action类只需继承ActionSupport类,大大简化开发

3..5.2 - Action访问Servlet API

Struts2提供了ActionContext类,可通过该类访问Servlet API,获得request、session、application等对象

3.5.3 - Aciton直接访问Servlet API

除了通过ActionContext访问,Struts2还提供以下几个接口使直接访问Servlet API:

ServletContextAware  实现该接口的Action可直接访问ServletContext实例
ServletRequestAware  实现该接口的Action可直接访问HttpServletRequest实例
ServletResponseAware 实现该接口的Action可直接访问HttpServletResponse实例

3.5.4 - 使用ServletActionContext工具类访问Servlet API

3.5.2的ActionContext需要实例化对象,3.5.3需要实现接口,通过ServletActionContext工具类不须实例化,直接调用对应方法获取API对象,更加简单

3.6 - 配置Action

在struts.xml中配置Action,目的是完成用户请求和Action之间的对应关系,让Struts2知道哪个Action处理哪个请求

    <package name="com" namespace="/lky" extends="struts-default">
        <action name="login" class="com.LoginAction">
            <result name="success">/welcome.jsp</result>
            <result name="login">/login.jsp</result>
            <result name="error">/error.jsp</result>
        </action>
    </package>

3.6.1 - 包package 和 命名空间namespace

Action必须放在包<package.../>定义下,每个package元素配置一个包

通过为包指定namesapce属性为包下面的所有Action指定共同的命名空间,若没指定则处于默认包空间下

命名空间主要为解决同名Action发生冲突,不同命名空间内可以有同名Action

指定了命名空间后,Action处理的URL应变为 命名空间+Action名

extends 继承 struts2源码中的struts-default抽象包,该包下包含了大量结果类型定义、拦截器定义、拦截器引用定义等,是配置普通Action的基础,开发者定义的package通常应该继承struts-default包

3.6.2 - action的基本配置

name属性:指定Action的名字,也代表Action所处理的请求的URL

class属性:指定该Action的实现类,非必需,若不指定class则默认使用系统的ActionSupport类

method属性:指定Action类中处理请求的方法,若不指定则默认使用execute()方法

result元素:配置Action与视图资源(JSP)的关系,Action处理完请求后,将指定的视图资源呈现给用户,不同result对应不同视图,result中需指定name属性

3.6.3 - 使用action的动态方法调用DMI

作用:实现form表单提交到action的不同方法

例子:原本<form action="login" method="post" >是提交到名为login的Action的默认方法处理,

现在<form action="login!regist" method="post" >则可以提交到名为login的Action的regist()方法处理

设置DMI应在struts.xml中配置以下属性

<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<global-allowed-methods>regist</global-allowed-methods>     

3.6.4 - 指定method属性

对于一个Action需要处理多个控制逻辑,可将Action配置成多个逻辑Action

如下,第一个配置action默认使用execute()方法控制,第二个配置action使用regist()方法控制

<action name="login" class="com.LoginAction" >
    <result name="success">/welcome.jsp</result>
    <result name="login">/login.jsp</result>
    <result name="error">/error.jsp</result>
</action>
<action name="login" class="com.LoginAction" method="regist">
    <result name="success">/welcome.jsp</result>
    <result name="login">/login.jsp</result>
    <result name="error">/error.jsp</result>
</action>

使用通配符

以下的配置很大部分相同,代码冗余,使用通配符简化如下

<action name="*Action" class="com.LoginAction" method="{1}">
    <result name="success">/welcome.jsp</result>
    <result name="login">/login.jsp</result>
    <result name="error">/error.jsp</result>
</action>

*Action定义为:只要用户请求的URL时*Action的模式,都可以使用该Action来处理,method属性{1}表示该值为name属性值中第一个*的值

因此若用户请求form提交的url为loginAction,则调用Action类中的login()方法处理,若提交的action为registAction,则调用regist()方法处理

除此之外,class、<result.../>也可以使用{N}来代表前面第N个星号(*)所匹配的子串

3.6.5 - 配置默认Action

通过<default-action-ref.../>元素配置,当用户请求找不到对应的Action时,默认的Action会处理用户请求

3.6.6 - 配置默认Action的默认处理类

通过<default-class-ref.../>元素配置,当用户请求找不到对应的Action时,默认的Action会执行定义的默认处理类来处理用户请求

3.7.1 - 理解处理结果

Action处理完用户请求后,并未直接将请求转发到具体的物理视图资源,而是返回一个逻辑视图(即一个普通字符串),由Struts2框架通过这个字符串去把请求转发给对应的视图资源

3.7 2 - 配置结果

为了完成Action返回的普通字符串与物理视图资源的映射,需要在struts.xml的<action.../>中配置<result.../>元素

<result name="success" type="dispatcher">/welcome.jsp</result>

<result.../>元素下有两个属性:

3.7.3 - struts2支持的结果类型(type)

chain:Action链式处理
dispatcher:-> 将请求forward到指定的视图资源,不会丢失请求参数
freemarker:用于指定使用FreeMarker模板作为视图
httpheader:用于控制特殊的HTTP行为
redirect:-> 将请求redirect到指定的视图资源,重定向会丢失所有的请求参数、属性和Action处理结果
redirectAction:-> 将请求redirect到指定的视图资源其他Action
stream:用于向浏览器返回一个InputStream(一般用于文件下载)
velocity:用于指定使用Velocity模板作为视图
xslt:用于与XML/XSLT整合
plainText:用于显示某个页面的原始代码(用得少)

3.7.7 - 动态结果

通过在<result.../>的name中使用表达式{N},可实现动态返回视图界面

3.7.8 - action属性值决定物理视图资源

3.7.9 - 全局结果

<global-result>
    <result...>...</result>
</global-result>

全局结果对所有的Action对起作用

3.7.10 - 使用PreResultListener:

PreResultListener监听器可以在Action完成控制处理之后,系统转入实际的物理视图之前被回调

添加PreResultListener监听器的方法:

通过ActionIovocation(由ActionContext.getContext().getActionInvocation()方法获得)的addPreResultListener()方法完成

上一篇下一篇

猜你喜欢

热点阅读