Cheug's Blog

当前位置:网站首页 / JAVA / 正文

Struts2[一]

2019-09-17 / JAVA / 181 次围观 / 0 次吐槽 /

Struts2概述

Struts2是Apache发行的MVC开源框架。注意:它只是表现层webMVC)框架。

     Struts2的来历

Struts1:

Ø Struts1也是apache开发的一套mvc的开源框架。在2005年之前非常流行。      

Ø 弊端:Struts1的核心控制器就是一个Servlet。随着使用者的增多,弊端开始出现。  

Struts2:

Ø long long ago,有一个设计超前的框架XWork,后来推出了XWork1和WebWork2。

Ø Struts2就是apache和OpenSymphony组织合并开发出来。      

Ø 里面包含了WebWork2的核心及Struts的一些特性和功能。除此之外,和Struts1没有任何关系了。

 

Struts环境搭建

下载Struts2发包

http://struts.apache.org

下载2.3.33版本

解压后的目录结构

解压zip的目录结构下图

        Struts2[一] JAVA 第1张

apps 官方提供的案例Demo

docs 官方提供的文档

lib 官方提供的jar需要用到哪个导入哪

       src

struts jar包介绍

apps目录中,提供了一个struts2-blank.war

初始学者在项目集成中,导入lib的所有即可

jar的介绍

struts2-core-2.3.33.jar

Struts核心jar包

xwork-core-2.3.33.jar


ognl-3.0.19.jar

OGNL表达

log4j-core-2.3.jar

开源日志 log for java

log4j-api-2.3.jar


asm-3.3.jar

基于子类的动态代理

asm-tree-3.3.jar

提供其对象的表现形式

asm-commons-3.3.jar

提供基于事件的表形式

commons-fileupload-1.3.2.jar

文件上传所需要的

asm-commons-3.3.jar


freemarker-2.3.22.jar

页面 板框架

javassist-3.11.0.GA.jar

对于节码的支持,jBoss一个子项目

commons-lang3-3.2.jar

对java.lang扩展

第一个Struts项目

目标集成Struts需要的东西

步骤:

第一步:创建Web工程

创建一个Web工程demo01

二步:jar

struts2-blank.warlib所有的导入自己创建的工程

第三步:添加配置文件

struts2-blankclasses目录下的struts.xml配置文件贝到自己创建工程的src

然后删除struts标签的所有内容,们一步步讲struts标签内容的知识

四步:配置struts过滤器

web.xml,配置Filter

<filter>
        <filter-name>struts2</filter-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规则去处理请求,不是用以前的servlet处理

五步:Tomcat运行Web工程

如果tomcat运行没有报错,代表配置成功

1.1 Struts Action配置讲解

目标:配置一个请求的完整流程

一步:

struts中配置packageaction,写如下代码

Struts2[一] JAVA 第2张

Struts2[一] JAVA 第3张

二步:

一个HelloAction类,需要写sayHello方法

Struts2[一] JAVA 第4张

WebContent添加一个success.jsp页面

Struts2[一] JAVA 第5张

浏览器访问下面三个路径

http://localhost:8080/demo01/hello 【能正常访问】

http://localhost:8080/demo01/hello.action 【也能正常访问】

http://localhost:8080/demo01/hello.act 【不能正确访问

因为struts默认处理.action请求,或者不action可以,其它的都不会拦截放行,jsp


Struts执行流程图

Struts2[一] JAVA 第6张

Struts文档

在线文件:http://struts.apache.org/core-developers/big-picture

离线文档:struts-2.3.33 /docs/docs/home.html

开上面两个连接后,然后查找guides -> bigPictrue执行过程

Struts2[一] JAVA 第7张

注:User created标识的是以后我们经常要写的

Struts配置文件的加载顺序

加载时机

struts有很多配置文件,如下面的表格

当应用被tomcat加载的时候,struts2的配置文件就已经被加载过了。

加载顺序

顺序

配置文件名

所在位置

说明

1

default.properties

struts2-core-2.3.15.3.jar\org\apache\struts2

不能修改

2

struts-default.xml

struts2-core-2.3.15.3.jar

不能修改

3

strtuts-plugin.xml

在struts2提供的插件jar包中

不能修改

4

struts.xml

我们的应用中

修改的:推荐

5

struts.properties

我们的应用中

修改的

6

web.xml

我们的应用中

修改的,可以给过滤器配置参数


default.properties的一些默认配置

struts.i18n.encoding=UTF-8

际化

struts.action.extension=action,,

默认访问扩展后缀以是action可以没有后续

struts.devMode = false

是否是开发模式。开发模式:改了配置文件,不需要重启。输出更多的错误信息。开发阶段建议为true

struts-defaults默认的拦截器分组

图,默认的包里有一结果类型,转发和重定向

Struts2[一] JAVA 第8张

默认情况下,struts使用defaultStack拦截器分组

Struts2[一] JAVA 第9张

struts-defualts主要的内容

² 结果类型、拦截器分组,默认使用的接替器分

Struts2[一] JAVA 第10张


修改struts访问后缀

一种方式:

struts.xml配置文件中添加 <constant name="struts.action.extension" value="do"></constant>

第二种方式:

src下创建struts.properties

添加struts.action.extension=htm

注:如果这样配置会覆盖struts.xml配置

第三种方式:

web.xml配置

Struts2[一] JAVA 第11张

配置struts开发模式

图,struts.xml做如下配置

Struts2[一] JAVA 第12张

开发模式的好处:可以显示更多详细的错误信息

Struts配置文件的主要元素讲解

package元素

作用:

struts2的配置文件中引入了面向对象思想,使用了分包管理。易于管理动作类。便于模块化开发动作类。

 

属性:

name

包的名称。必须写。且必须唯一

extends

Struts2[一] JAVA 第13张 一般情况下需要继承struts-default包,但不是必须的。

Struts2[一] JAVA 第14张 不过如果不继承的话,将无法使用struts2提供的核心功能。

Struts2[一] JAVA 第15张 struts-default.xml中定义着struts-default这个包。

Struts2[一] JAVA 第16张 struts-default.xml是在我们的struts.xml加载之前加载。

abstract

把包声明为抽象包,抽象包就是用来被继承的

只要是没有<action>元素的包,就可以声明为抽象包。

namespace

名称空间。访问路径=名称空间+动作名称

 

namespace详解

² namespace的默认取值是一个""

² 注意:默认值不是/写自定义的namespace时需要加/

Struts2[一] JAVA 第17张

² 访问路径为http://localhost:8080/demo01/user/hello.action

² 注意需要在访问action添加红色命令空间

² 如果访问http://localhost:8080/demo01/a/b/user/hello.action 是访问不了

² 是如果是访问http://localhost:8080/demo01/user/a/b/hello.action 可以访问的

namespace查找规则

Struts2[一] JAVA 第18张

action 元素

作用:

配置动作,处理请求路径

属性

name:动作名称    

class:动作类全名。

method动作类中的方法名称。默认是public String execute(){}

方法的要求:      

1.public

2.返回值必须是String

3.没有参数

动作类的第一种写法

直接在Action需要继承任何类,然后struts.xml配置

Struts2[一] JAVA 第19张

Struts2[一] JAVA 第20张

动作类的第种写法

Action实现Action接口然后实现excute方法

Struts2[一] JAVA 第21张

Struts2[一] JAVA 第22张

Struts.xml如果没有配置Method,默认执行Actionexcute方法

Action接口中,一些静态常量,下图

Struts2[一] JAVA 第23张

常量说明

常量变量名

对应的值

说明

SUCCESS

success

动作方法执行一切OK

ERROR

error

动作方法执行时遇到了异常

INPUT

input

回显

LOGIN

login

一般转向登陆页面

NONE

none

不转向任何的视图


动作类的第种写法

Action类继承ActionSuport【推荐使用这种方式】

ActionSupport是实现Action接口的类

Struts2[一] JAVA 第24张

Struts2[一] JAVA 第25张

默认的动作类

struts-default.xml中定义了默认动作类和方法

com.opensymphony.xwork2.ActionSupport 个类

Struts2[一] JAVA 第26张

struts.xml:以在Action不配置 class method,会由默认的动作类来处理,ActionSupportexcute方法返回的就是success

动作访问通配符

*通配符优化struts.xml代码

Struts2[一] JAVA 第27张

*通配符

Struts2[一] JAVA 第28张

动态方法的调用

不经常用

访问路径:

http://localhost:8080/demo01/student!addStudent.action

http://localhost:8080/demo01/student!deleteStudent.action

Struts2[一] JAVA 第29张

Struts2[一] JAVA 第30张


result 元素

作用:

为动作指定结果视图

属性:

name:逻辑视图的名称,对应着动作方法的返回值。默认值是success

type:结果类型,指的就是用什么方式转到定义的页面。默认是dispatcher转发

 

resulttype的取值

resulttype取值有四种类型

dispatcher

(默认值)使用请求转发,转向一个页面。

redirect

使用重定向,转向一个页面。

chain

转发到另一个相同名称空间的动作

转发到不同名称空间的动作

redirectAction

重定向到另一个相同名称空间的动作

重定向到不同名称空间的动作

 

type默认取值是dispatcher

type属性的取值在struts-default.xml中定义着

redirect重定

Struts2[一] JAVA 第31张

chain 发到同一个名称空间的动作

Struts2[一] JAVA 第32张

redirectAction 定向到同一个名称空间的动作

Struts2[一] JAVA 第33张

chain 发到不同一个名称空间的动作

Struts2[一] JAVA 第34张

redirectAction定向到同一个名称空间的动作

Struts2[一] JAVA 第35张

result元素中param子元素

在转发或者重定向到不同包下的动作时,都用到了result元素的子元素param

param元素的作用:依赖注入(Dependence Injection)思想    

我们通过struts-default.xml中的resultTypes元素中配置可以看出,每个结果类型视图其实都是靠一个类来实现的。

param元素就是将配置的参数,注入到该类中。    

调用的是对应类的setter方法进行注入的。

 

自定义结果类型

其实结果类型就是一个类,这些类都实现com.opensymphony.xwork2.Result接口

或者继承自该接口的实现类org.apache.struts2.dispatcher.StrutsResultSupport

这些类都有一个doExecute方法,用于执行结果视图。【查看源码种结果类型的类结构】

struts内部实现就是Servlet

 

² 上所述自己写一个结果视图

² 例子输出CAPTCHA图像的结果类型

CAPTCHA(Completely Automated Public Turing Test to Tell Computers and Humans Apart 全自动区分计算机和人类的图灵测试)————>简称:验证码

/**
 * 验证码结果类
 */
public class CAPTCHAResult extends StrutsResultSupport {
    private int width;//验证码宽度
    private int height;//验证码高度
    public int getWidth() {
        return width;
    }
    public void setWidth(int width) {
        this.width = width;
    }
    public int getHeight() {
        return height;
    }
    public void setHeight(int height) {
        this.height = height;
    }

    @Override
    protected void doExecute(String s, ActionInvocation actionInvocation) throws Exception {
        ValidateCode code = new ValidateCode(width,height,4,8);//创建验证码对象
        //获取response
        HttpServletResponse response = ServletActionContext.getResponse();
        //响应客户端
        code.write(response.getOutputStream());
    }
}
<package name="p1" extends="struts-default">
   <!-- 声明一个验证码结果类 -->
   <result-types>
      <result-type name="captcha" class="com.cheug.web.result.CAPTCHAResult"></result-type>
   </result-types>
   <!-- action -->
   <action name="checkcode">
      <result type="captcha">
         <param name="width">130</param>
         <param name="height">30</param>
      </result>
   </action>
</package>

全局视图和局部视图

前面的自定义结果类型的写法是局部视图,其它包是不能访问的

全局视图配置

Struts2[一] JAVA 第36张


动作类中的servlet api访问

获取servlet api方式

² 第一种:通过ServletActionContext获取 【推荐使用】

² 第二种:通过注入方式:先让Action实现两个接口

ServletRequestAware,ServletResponseAware 注入方式原理是struts有拦截器

Struts2[一] JAVA 第37张


额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Cheug's Blog

Copyright Cheug Rights Reserved.