Cheug's Blog

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

Struts2[一]

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

Struts2概述

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

     Struts2的来历

n Struts1:

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

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

n Struts2:

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

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

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

 

Struts的环境搭建

下载Struts2开发包

n http://struts.apache.org

n 下载2.3.33的版本

解压后的目录结构

n 解压zip后的目录结构如下图

        image.png

apps 官方提供的案例Demo

docs 官方提供的文档

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

       src 源码

struts jar包介绍

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

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

n 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项目

n 目标:集成Struts需要的东西

步骤:

第一步:创建Web工程

n 创建一个Web工程,名为demo01

第二步:导jar包

n 把struts2-blank.war中的lib下所有的包导入自己创建的工程

第三步:添加配置文件

n 把struts2-blank里classes目录下的struts.xml配置文件拷贝到自己创建工程的src中

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

第四步:配置struts的过滤器

n 在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>

n 配置的目的是用于拦截请求,由Struts的规则去处理请求,而不是用以前的servlet去处理

第五步:Tomcat运行Web工程

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

1.1 Struts 的Action配置讲解

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

第一步:

n 在struts中配置package和action,写如下代码

image.png

image.png

第二步:

n 写一个HelloAction的类,需要写个sayHello方法

image.png

第三步:

n 在WebContent中添加一个success.jsp页面

image.png

第四步:

n 浏览器访问下面三个路径

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

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

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

n 因为struts默认是处理.action的请求,或者不带action也可以,其它后缀的都不会拦截,会放行,如jsp


Struts执行流程图

image.png

查看Struts的文档

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

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

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

image.png

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

Struts配置文件的加载顺序

加载时机

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

n 当应用被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中默认的拦截器分组

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

image.png

n 如图,默认情况下,struts会使用defaultStack的拦截器分组

image.png

n struts-defualts中主要的内容

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

image.png


修改struts的访问后缀

第一种方式:

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

第二种方式:

n 在src下创建struts.properties

n 添加struts.action.extension=htm

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

第三种方式:

n 在web.xml中配置

image.png

配置struts的开发模式

n 如图,在struts.xml中做如下配置

image.png

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

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

package元素

作用:

n 在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 元素

作用:

n 配置动作,处理请求路径

属性:

n name:动作名称    

n class:动作类全名。

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

方法的要求:      

1.public的

2.返回值必须是String

3.没有参数

动作类的第一种写法

n 直接在写个Action类,不需要继承任何类,然后在struts.xml中配置

image.png

image.png

动作类的第二种写法

n 写个Action类实现Action接口,然后实现excute方法

image.png

image.png

Struts.xml:如果没有配置Method,默认执行Action的excute方法

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

image.png

n 常量说明

常量变量名

对应的值

说明

SUCCESS

success

动作方法执行一切OK

ERROR

error

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

INPUT

input

回显

LOGIN

login

一般转向登陆页面

NONE

none

不转向任何的视图


动作类的第三种写法

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

n ActionSupport是实现Action接口的类

image.png

image.png

默认的动作类

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

n 就是com.opensymphony.xwork2.ActionSupport 这个类

image.png

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

动作访问之通配符

*号通配符优化struts.xml代码

image.png

多个*号通配符

image.png

动态方法的调用

n 不经常用

访问路径:

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

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

image.png

image.png


result 元素

作用:

n 为动作指定结果视图

属性:

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

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

 

result中type的取值

n result中type的取值有四种类型

dispatcher

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

redirect

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

chain

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

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

redirectAction

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

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

 

n type的默认取值是dispatcher

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

redirect重定向

image.png

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

image.png

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

image.png

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

image.png

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

image.png

result元素中param子元素

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

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

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

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

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

 

自定义结果类型

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

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

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

n struts的内部实现就是Servlet

 

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

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

n 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>

全局视图和局部视图

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

n 全局视图的配置

image.png


动作类中的servlet api访问

n 获取servlet 的api方式

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

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

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

image.png


Powered By Cheug's Blog

Copyright Cheug Rights Reserved.