Cheug's Blog

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

Struts2[一]

2019-09-17 / JAVA / 1053 次围观 / 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的目录结构下图

        image.png

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,写如下代码

image.png

image.png

二步:

一个HelloAction类,需要写sayHello方法

image.png

WebContent添加一个success.jsp页面

image.png

浏览器访问下面三个路径

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

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

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

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


Struts执行流程图

image.png

Struts文档

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

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

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

image.png

注: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默认的拦截器分组

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

image.png

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

image.png

struts-defualts主要的内容

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

image.png


修改struts访问后缀

一种方式:

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

第二种方式:

src下创建struts.properties

添加struts.action.extension=htm

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

第三种方式:

web.xml配置

image.png

配置struts开发模式

图,struts.xml做如下配置

image.png

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

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

package元素

作用:

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

 

属性:

name

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

extends

 一般情况下需要继承struts-default包,但不是必须的。

 不过如果不继承的话,将无法使用struts2提供的核心功能。

 struts-default.xml中定义着struts-default这个包。

 struts-default.xml是在我们的struts.xml加载之前加载。

abstract

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

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

namespace

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

 

namespace详解

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

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

image.png

² 访问路径为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查找规则

image.png

action 元素

作用:

配置动作,处理请求路径

属性

name:动作名称    

class:动作类全名。

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

方法的要求:      

1.public

2.返回值必须是String

3.没有参数

动作类的第一种写法

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

image.png

image.png

动作类的第种写法

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

image.png

image.png

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

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

image.png

常量说明

常量变量名

对应的值

说明

SUCCESS

success

动作方法执行一切OK

ERROR

error

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

INPUT

input

回显

LOGIN

login

一般转向登陆页面

NONE

none

不转向任何的视图


动作类的第种写法

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

ActionSupport是实现Action接口的类

image.png

image.png

默认的动作类

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

com.opensymphony.xwork2.ActionSupport 个类

image.png

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

动作访问通配符

*通配符优化struts.xml代码

image.png

*通配符

image.png

动态方法的调用

不经常用

访问路径:

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

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

image.png

image.png


result 元素

作用:

为动作指定结果视图

属性:

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

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

 

resulttype的取值

resulttype取值有四种类型

dispatcher

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

redirect

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

chain

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

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

redirectAction

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

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

 

type默认取值是dispatcher

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

redirect重定

image.png

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

image.png

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

image.png

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

image.png

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

image.png

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>

全局视图和局部视图

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

全局视图配置

image.png


动作类中的servlet api访问

获取servlet api方式

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

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

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

image.png


Powered By Cheug's Blog

Copyright Cheug Rights Reserved.