Struts2学习笔记(一)

一、Struts2概述

1. 是什么?

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

Struts2是一个M(模型---域--范围模型)V(View视图)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.jar:Struts 2框架的核心类库

xwork-core-2.3.15.3.jar:Command模式框架,WebWork和Struts2都基于xwork

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

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

commons-logging-1.1.x.jar:ASF出品的日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 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、编写2个jsp

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是控制器的核心,就是mvc中c控制层的核心。下面粗略的分析下我理解的FilterDispatcher工作流程和原理:FilterDispatcher进行初始化并启用核心doFilter

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

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

6、ActionProxy创建一个ActionInvocation的实例。

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

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

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

Interceptor的调度流程大致如下:

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

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

Interceptor将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为具有很好的重用性。XWork、WebWork的许多功能都是有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

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

a、过滤器的初始化

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

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

2、InitOperations:

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, false, servletContext));

}

} 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, true, false);

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

原因:找不到约束文件

解决:

1、联网

2、手工配

a、eclipse的菜单:window\preferences

六、Struts2的配置文件

1、default.properties:在struts2-core-**.jar的org.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 package的namespace和动作访问专题:(小难点)

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

6.3 struts.xml中action元素的配置

作用:定义动作类

属性:

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

因为struts-default.xml有指定。

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

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

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

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

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

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

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

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

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

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

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

l 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每次请求,都会实例化动作类的对象,因此它是线程安全的。

4、Struts2提供的结果视图

l chain:转发到另外一个动作

转发到包内的动作:

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

l dispatcher:转发到一个页面,jsp

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

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

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

l redirect:重定向到一个页面

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

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

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

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

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

redirectAction:重定向到一个动作



 

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

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

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

struts2-学习笔记(一)的更多相关文章

  1. Struts2学习笔记⑧

    今天是Struts2学习笔记的最后一篇文章了.用什么做结尾呢,这两天其实还学了很多东西,没有记录下,今天就查漏补缺一下. 文件上传与下载.FreeMarker以及昨天没做完的例子 文件上传与下载 文件 ...

  2. Struts2学习笔记①

    Struts2 学习笔记① 所有的程序学习都从Hello World开始,今天先跟着书做一个HW的示例. Struts2是一套MVC框架,使用起来非常方便,接触到现在觉得最麻烦的地方是配置文件.我的一 ...

  3. Struts2学习笔记NO.1------结合Hibernate完成查询商品类别简单案例(工具IDEA)

    Struts2学习笔记一结合Hibernate完成查询商品类别简单案例(工具IDEA) 1.jar包准备 Hibernate+Struts2 jar包 struts的jar比较多,可以从Struts官 ...

  4. Struts2 学习笔记(概述)

    Struts2 学习笔记 2015年3月7日11:02:55 MVC思想 Strust2的MVC对应关系如下: 在MVC三个模块当中,struts2对应关系如下: Model: 负责封装应用的状态,并 ...

  5. struts2学习笔记 ⑤

    拦截器初探 昨天临睡觉之前看了看拦截器,也在昨天的学习笔记里面胡诌诌了几句,今天就来好好的会会拦截器这个东西.实际上拦截器是一种模块实现的机制<起码我是这么体会的>(至于说书里面说体现了A ...

  6. [struts2学习笔记] 第二节 使用Maven搞定管理和构造Struts 2 Web应用程序的七个步骤

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/40303897 官方文档:http://struts.apache.org/releas ...

  7. struts2学习笔记之二:基本环境搭建

    学习struts2有一段时间了,作为一个运维人员学习的时间还是挺紧张的,写这篇文件为了方便以后复习时使用 环境: MyEclipse 10 tomcat6 jdk1.6   首先建立一个web项目,并 ...

  8. 【Struts2学习笔记-4】包含其他配置文件

    包含其他配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLI ...

  9. 【Struts2学习笔记-3】常量配置

    Struts2常量 配置Struts2常量值有3个地方,1)在struts.properties文件中配置常量:2)在web.xml文件中配置FileterDispatcher指定初始化参数来配置常量 ...

  10. struts2学习笔记(4)——数据类型转换

    回过头来看昨天的那个例子. 在昨天的例子中,只转换了一个Point类,如果想转换多个Point类怎么办呢?在昨天的例子上面做一个小的修改. 首先在input.jsp页面中修改几个输入框. <s: ...

随机推荐

  1. CountDownLatch和CyclicBarrier 特点比较

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp79   并发编程中的CountDownLatch和CyclicBarri ...

  2. windows下使用密钥登录Linux及xshell代理转发

    1.密钥登录原理 一般我们使用xshell访问远程主机(Linux主机)时,都是先请管理员给我们开一个账户,即为我们设置一个一个用户名和对应的密码,然后我们就可以使用下面的方式登录到远程主机了: 在这 ...

  3. 团队作业4——第一次项目冲刺(Alpha版本)2017.4.23

    1.当天站立式会议照片 本次会议为第一次会议 本次会议在5号公寓1楼召开,本次会议内容: ①:做第一天的简单分工 ②:讨论每个人是否对安排的任务有苦难 ③:规定完成时间是在第二天之前 ④:遇到困难,及 ...

  4. 201521123050 《Java程序设计》第8周学习总结

    1. 本周学习总结 2. 书面作业 1.List中指定元素的删除(题目4-1) 1.1 实验总结 在删除元素时,要注意后续元素位置的前移 2.统计文字中的单词数量并按出现次数排序(题目5-3) 2.1 ...

  5. 201521123122 Java 第二周学习总结

    1. 本周学习总结 1.进一步了解了对码云的使用,学会了将本地代码上传到码云以及将码云上的代码克隆到eclipse上. 2.感觉本章学的基本语法和c的基本上差不多啊 3.string的对象创建后无法修 ...

  6. 201521123100《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...

  7. 201521123089《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 1.数据库:为了实现一定目的按某中规划组织起来的"数据"的"集合". 2 ...

  8. TypeMismatchException: Provided id of the wrong type for class zhongfucheng.user.entity.User.

    今天在使用SSH框架做项目的时候出现了这个错误,找了我非常非常多的时间!!!!!!! Struts Problem Report Struts has detected an unhandled ex ...

  9. 理解 IntelliJ IDEA 的项目配置和Web部署

    1.项目配置的理解 IDEA 中最重要的各种设置项,就是这个 Project Structre 了,关乎你的项目运行,缺胳膊少腿都不行.最近公司正好也是用之前自己比较熟悉的IDEA而不是Eclipse ...

  10. Oracle-SQL-按月统计自助终端交易量

    SQL实现的目标: 基本情况 现金交易情况 转账情况 转账交易情况(明细) 其它业务情况 交易量汇总 日均交易量 交易金额 绩效情况(万元) 支行名 支行号 所属网点 网点号 管理员帐户 管理员 终端 ...