struts2-学习笔记(一)



Struts2学习笔记(一)

一、Struts2概述

1. 是什么?

Struts2 是一个非常优秀的MVC框架,基于Model2 设计模型

Struts2是一个M(模型-----范围模型)VView视图)C(控制器)框架(模型2)。框架都是一个半成品。 

提高开发效率。

Struts1是一个MVC框架,非常流行。有很大的缺点。此时一个webwork的框架设计超前,名气不是很大。

Struts1+webwork=struts2用的是struts1的名字,但是与sruts1没啥关系,struts2的核心是webwork框架。

2. 能干什么?

web开发主要干的工作:

 

获取请求参数   封装到JavaBean   验证和转换   调用业务代码存数据     转向某个页面展示结果

 

 

 

表现层的开发技术。(背景色为蓝色区域)

 

 

 

二、搭建struts2的开发环境

1、下载地址:http://struts.apache.org

 

 

2、解压后的目录结构:

a) apps框架本身提供一些案例(学习)

b) docs框架本身提供的文档(指南和API)。不保证100%正确

c) lib: 框架需要的jar包及第三方的jar包(不要全拷贝)

d) src: 源码

 

搭建步骤:

a、新建一个JavaWeb工程

 

b、拷贝struts2运行所需的必要jar包。(方便办法:struts2发行包\apps\struts-blank.war,拷贝其中的lib下的所有jar

 

struts2-core-2.3.15.3.jarStruts 2框架的核心类库

xwork-core-2.3.15.3.jarCommand模式框架,WebWorkStruts2都基于xwork 

ognl-3.0.6.jar对象图导航语言(Object Graph Navigation Language), struts2框架通过其读写对象的属性

freemarker-2.3.19.jarStruts 2UI标签的模板使用FreeMarker编写

commons-logging-1.1.x.jarASF出品的日志包,Struts 2框架使用这个日志包来支持Log4JJDK 1.4+的日志记录。

commons-fileupload-1.2.2.jar文件上传组件,2.1.6版本后需要加入此文件

commons-io-2.0.1.jar传文件依赖的jar

commons-lang-2.5.jar:对java.lang包的增强

javassist-3.11.0.GA.jar:动态代理的开发包。日本鬼子弄的(Jboss)。Hibernate也会用到

 

3、web.xml中配置核心过滤器:StrutsPrepareAndExcuteFilter(框架提供)

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.class

 

4、WEB-INF\classes目录下建立一个名称为struts.xml的配置文件。内容如下:(可以从struts2发型包\apps\struts-blank.war中拷贝)。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

"http://struts.apache.org/dtds/struts-2.3.dtd">

 

<struts>

 

</struts>

 

5、把应用部署到Tomcat中,启动Tomcat,如果没有报错,说明搭建成功

三、第一个Struts2应用案例(编码步骤)

1、编写2jsp

hello.jsp

 

success.jsp

 

2、编写一个动作类(POJO,之前所谓的按照JavaBean规范编写的一个普通的类)

 

3、struts.xml配置。告知控制器该实例化那个类,调用该类的那个方法,根据方法的返回值转向哪个页面

4、访问测试:

http://localhost:8080/day26_struts2_00_helloworld/hello.jsp

四:执行过程和原理(可能面试题)

一个请求在Struts2框架中的处理大概分为以下几个步骤 

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求

 

2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 

 

3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 

 

FilterDispatcher是控制器的核心,就是mvcc控制层的核心。下面粗略的分析下我理解的FilterDispatcher工作流程和原理:FilterDispatcher进行初始化并启用核心doFilter

 

4、如果ActionMapper决定需要调用某个ActionFilterDispatcher把请求的处理交给ActionProxy 

 

5ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类 ,这里,我们一般是从struts.xml配置中读取。

 

6ActionProxy创建一个ActionInvocation的实例。

 

7ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

 

 下面我们来看看ActionInvocation是如何工作的:

 

ActionInvocationXworks Action 调度的核心。而对Interceptor 的调度,也正是由ActionInvocation负责。ActionInvocation 是一个接口,而DefaultActionInvocation 则是Webwork ActionInvocation的默认实现。

 

Interceptor的调度流程大致如下:

 

    1.ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor

 

    2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor

 

    Interceptor将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为具有很好的重用性。XWorkWebWork的许多功能都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在Action执行前后运行。

 

    这里,我们简单的介绍一下Interceptor

 

    在struts2中自带了很多拦截器,在struts2-core-2.1.6.jar这个包下的struts-default.xml中我们可以发现:

 

 8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

 

在上述过程中所有的对象(ActionResultsInterceptors,等)都是通过ObjectFactory来创建的

 

 

 

    

 

a、过滤器的初始化

1StrutsPrepareAndExecuteFilter是一个过滤器,过滤器就有初始化方法

关键代码:57dispatcher = init.initDispatcher(config);//初始化请求分发器。

2InitOperations

public Dispatcher initDispatcher( HostConfig filterConfig ) {

        Dispatcher dispatcher = createDispatcher(filterConfig);

        dispatcher.init();

        return dispatcher;

}

 

init_FileManager();

init_DefaultProperties(); // [1]

init_TraditionalXmlConfigurations(); // [2]

init_LegacyStrutsProperties(); // [3]

init_CustomConfigurationProviders(); // [5]

init_FilterInitParameters() ; // [6]

init_AliasStandardObjects() ; // [7]

 

Dispatcher:分发器

 private void init_TraditionalXmlConfigurations() {

        String configPaths = initParams.get("config");

        if (configPaths == null) {

            configPaths = DEFAULT_CONFIGURATION_PATHS;

        }

        String[] files = configPaths.split("\\s*[,]\\s*");

        for (String file : files) {

            if (file.endsWith(".xml")) {

                if ("xwork.xml".equals(file)) {

                    configurationManager.addContainerProvider(createXmlConfigurationProvider(file, false));

                } else {

                    configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, falseservletContext));

                }

            } else {

                throw new IllegalArgumentException("Invalid configuration file name");

            }

        }

    }

 

 

(重要)结论:

初始化过滤器时,会按顺序加载以下配置文件:

struts-default.xml,struts-plugin.xml,struts.xml这几个配置文件

 

 

struts-default.xml:struts2-core-**.jar包内部(框架内部的配置文件)

其中定义了一些Bean对象;有一个抽象的package,内部有一些结果类型,一些拦截器的定义,还有拦截器小组的定义。默认的拦截器小组名字是defaultStack

struts-plugin.xml:struts2提供的插件中(插件内部提供)

struts-xml:程序员自己定义的(开发中经常搞)

b、过滤器的doFilter方法:用户的每次访问

 

1、ActionMapping mapping = prepare.findActionMapping(request, response, true);根据你的动作请求,从已经初始化好的配置文件中找对应的动作名称。

2、Dispatcher

ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(

                    namespace, name, method, extraContext, truefalse);

五、Eclipse编写struts.xml没有提示的问题

原因:找不到约束文件

解决:

1、联网

2、手工配

aeclipse的菜单:window\preferences

 

 

六、Struts2的配置文件

 

1default.properties:在struts2-core-**.jarorg.apache.struts包中关于Struts2一些常量配置(框架内部)

 

2、struts-default.xml:在struts2-core-**.jar中。(框架内部)

定义了一些bean

定义了一个抽象的包:struts-default

定义了一些结果视图

定义了一些拦截器和拦截器小组

 

3、struts-plugin.xml :在struts2的第三方插件中(插件内部)

 

4、struts.xml:用户自己编写的(重点)

 

5、struts.properties:用户自己编写的(类路径中。不需要)

 

6、web.xml:struts2的一些配置可以写在这(Web应用中。不需要)

 

 

 

 

结论:1~6:后面的配置文件内容,会覆盖前面的。

 

比如:在struts.xml中覆盖default.properties中的内容,可以这么办:

<constant name="struts.action.extension" value="do"></constant>

 

 

比如:在web.xml中把访问的扩展名改为itheima

<filter>

  <filter-name>struts2</filter-name>

  <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

  <init-param>

  <param-name>struts.action.extension</param-name>

  <param-value>itheima</param-value>

  </init-param>

  </filter>

 

 

6.1 struts.xml中的package元素:

package属性:

方便管理动作

name

配置文件中唯一

 

namespace

取值一般以/开头,它与动作名称组成完成的访问路径。默认值是””

 

Extends

父包名称。把父包中定义的内容完全集成下来。一般情况下,在struts2开发中需要继承(直接或间接)struts-default(struts-default.xml)

 

abstract

抽象包。抽象的东西就是设计被别人继承的。没有任何action子元素的packkage就可以定义为抽象的。

 

 

6.2 packagenamespace和动作访问专题:(小难点)

 

区分:namespace=/,实实在在的一个名称空间。绝对不是默认的:namespace=””或者不写

 

 

6.3 struts.xmlaction元素的配置

作用:定义动作类

属性:

class:动作类的全名。默认值是com.opensymphony.xwork2.ActionSupport

因为struts-default.xml有指定。

<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />

method:指定动作类中的哪个方法。默认值是execute

 

小知识:

可以在自己的package中通过以下标签,指定默认的动作类

<default-class-ref class="com.itheima.action.HelloAction"></default-class-ref>

 

6.4 strutx.xml中的result元素的默认配置

作用:定义动作类执行完毕后转向的结果视图

属性:

name:结果视图的名称。与当前的动作类的动作方法返回值对应。默认值是success

type:结果视图的类型。默认是dispatcher.(转发)

来自:struts-default.xml中的结果视图的定义。

 

6.5 struts2的一些常量含义及配置

 

覆盖这些框架的默认值:struts.xml

<constant name="struts.action.extension" value="do"></constant>

struts.i18n.encoding=UTF-8框架使用的编码

 

struts.action.extension=action,,动作的访问后缀。多个可以使用逗号分隔

 

struts.serve.static.browserCache=true指示浏览器是否缓存资源

(原理:三个响应消息头:Expires Cache-Control Pragma

 

struts.configuration.xml.reload = true 是否在更改了struts.xml后自动重新加载。开发阶段有用。

 

struts.devMode = false是否是开发模式。开发阶段建议为true如果为truestruts.configuration.xml.reload就会为true

 

struts.ui.theme=xhtml指定页面用的主题(struts标签时介绍)

 

struts.objectFactory = spring默认情况,Action都是struts2框架给我们创建的(ObjectFactory,实例工厂)。与Spring框架整合时用。

 

struts.enable.DynamicMethodInvocation = false 是否允许DMI(动态方法调用:Dynamic Method Invocation)。

 

struts.multipart.maxSize=2097152 指定文件上传时的大小限制。2M

 

 

6.6 配置文件分模块化

引入外部的struts.xml配置文件(xml声明和根元素一致)

<include file="user.xml"></include>

七、Action动作类(一般用**Action结尾)

1、编写动作类的三种方式

a、动作类不实现、也不继承任何的接口和类。即动作类是一个非常普通的JavaBean

public class HelloAction1{

 

}

b、动作类实现com.opensymphony.xwork2.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";登录视图(用户没有登录)

public String execute() throws Exception;

c、继承com.opensymphony.xwork2.ActionSupport(开发中建议)

 

定义了 表单域校验、错误信息设置和获得国际化信息相关一些方法

2、动作类中的动作方法

要求:

a、必须是public

b、必须返回String类型的

c、必须没有参数

八、动作类中动作方法的调用

1、可以使用通配符

 

2、动态方法调用(官方不建议使用)

  <a href="${pageContext.request.contextPath}/user/user2!add.action">添加用户</a><br/>

  <a href="${pageContext.request.contextPath}/user/user2!edit.action">修改用户</a><br/>

  <a href="${pageContext.request.contextPath}/user/user2!del.action">删除用户</a><br/>

 

struts.xml配置文件:

<package name="p4" extends="struts-default" namespace="/user">

 <action name="user2" class="com.itheima.action.UserAction2"></action>

</package>

 

特别注意:默认情况下是访问不成功。要开启一个参数设置:

<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>

 

 

 

3、访问默认的动作:找不到动作名称,找包中的默认的

 

 

九、在动作类中访问ServletAPI

1、方式一:(简单,推荐使用)ServletActionContext

 

 

2、方式二:(麻烦)

动作类实现特定的接口。就必须实现特定的方法,调用动作方法前,框架会把响应的对象给注入进来。

 

 

原理:是一个拦截器给你注入进来的。struts-default.xml

<interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>

一看源码便知

 

十、结果集

1、Struts.xml配置文件

18、常用的结果视图类型(共10个)

<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>

dispatcher:从一个动作转发到另外一个JSP

 

<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>

chain从一个动作转发到另外一个动作

<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>

 

<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>

 

<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>

Redirect:从一个动作重定向到一个JSP

<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>

从一个动作重定向到另外一个动作

<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>

文件下载

<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>

<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>

<result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />

以纯文本的形式显示JSP

result元素:指定动作类的动作方法执行完后的结果视图。

属性:

name:字符串,与动作方法返回的值一致。默认是success

       type:指定处理结果的结果类型的别名。(struts-default.xml有定义)。默认值是dispatcher

2、局部和全局结果视图

 

 

 

3、补充知识:动作类的生命周期

Struts2每次请求,都会实例化动作类的对象,因此它是线程安全的。

4Struts2提供的结果视图

 

chain:转发到另外一个动作

 

 

转发到包内的动作:

 

转发到另外一个带有名称空间的包中的动作

 

 

dispatcher:转发到一个页面,jsp

该结果类型有一个 location 参数它是一个默认参数

dispatcher 结果类型将把控制权转发给应用程序里的某个资源

dispatcher 结果类型不能把控制权转发给一个外部资源若需要把控制权重定向到一个外部资源应该使用 redirect 结果类型

 

 

redirect:重定向到一个页面

redirect 结果类型将把响应重定向到另一个资源而不是转发给该资源.

redirect 结果类型接受下面这些参数:

location: 用来给出重定向的目的地

param: 用来表明是否把 location 参数的值视为一个 OGNL 表达式来解释默认值为 true

redirect 结果类型可以把响应重定向到一个外部资源

 

 

redirectAction:重定向到一个动作


 

stream:文件下载(此处不讲,文件上传和下载再讲)

plainText:以纯文本的形式显示结果

 

---------------------------------------------------------------------------------------------

 

转载于:https://www.cnblogs.com/thankyou/p/4352103.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值