struts2-学习笔记(一)
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-学习笔记(一)的更多相关文章
- Struts2学习笔记⑧
今天是Struts2学习笔记的最后一篇文章了.用什么做结尾呢,这两天其实还学了很多东西,没有记录下,今天就查漏补缺一下. 文件上传与下载.FreeMarker以及昨天没做完的例子 文件上传与下载 文件 ...
- Struts2学习笔记①
Struts2 学习笔记① 所有的程序学习都从Hello World开始,今天先跟着书做一个HW的示例. Struts2是一套MVC框架,使用起来非常方便,接触到现在觉得最麻烦的地方是配置文件.我的一 ...
- Struts2学习笔记NO.1------结合Hibernate完成查询商品类别简单案例(工具IDEA)
Struts2学习笔记一结合Hibernate完成查询商品类别简单案例(工具IDEA) 1.jar包准备 Hibernate+Struts2 jar包 struts的jar比较多,可以从Struts官 ...
- Struts2 学习笔记(概述)
Struts2 学习笔记 2015年3月7日11:02:55 MVC思想 Strust2的MVC对应关系如下: 在MVC三个模块当中,struts2对应关系如下: Model: 负责封装应用的状态,并 ...
- struts2学习笔记 ⑤
拦截器初探 昨天临睡觉之前看了看拦截器,也在昨天的学习笔记里面胡诌诌了几句,今天就来好好的会会拦截器这个东西.实际上拦截器是一种模块实现的机制<起码我是这么体会的>(至于说书里面说体现了A ...
- [struts2学习笔记] 第二节 使用Maven搞定管理和构造Struts 2 Web应用程序的七个步骤
本文地址:http://blog.csdn.net/sushengmiyan/article/details/40303897 官方文档:http://struts.apache.org/releas ...
- struts2学习笔记之二:基本环境搭建
学习struts2有一段时间了,作为一个运维人员学习的时间还是挺紧张的,写这篇文件为了方便以后复习时使用 环境: MyEclipse 10 tomcat6 jdk1.6 首先建立一个web项目,并 ...
- 【Struts2学习笔记-4】包含其他配置文件
包含其他配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLI ...
- 【Struts2学习笔记-3】常量配置
Struts2常量 配置Struts2常量值有3个地方,1)在struts.properties文件中配置常量:2)在web.xml文件中配置FileterDispatcher指定初始化参数来配置常量 ...
- struts2学习笔记(4)——数据类型转换
回过头来看昨天的那个例子. 在昨天的例子中,只转换了一个Point类,如果想转换多个Point类怎么办呢?在昨天的例子上面做一个小的修改. 首先在input.jsp页面中修改几个输入框. <s: ...
随机推荐
- CountDownLatch和CyclicBarrier 特点比较
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp79 并发编程中的CountDownLatch和CyclicBarri ...
- windows下使用密钥登录Linux及xshell代理转发
1.密钥登录原理 一般我们使用xshell访问远程主机(Linux主机)时,都是先请管理员给我们开一个账户,即为我们设置一个一个用户名和对应的密码,然后我们就可以使用下面的方式登录到远程主机了: 在这 ...
- 团队作业4——第一次项目冲刺(Alpha版本)2017.4.23
1.当天站立式会议照片 本次会议为第一次会议 本次会议在5号公寓1楼召开,本次会议内容: ①:做第一天的简单分工 ②:讨论每个人是否对安排的任务有苦难 ③:规定完成时间是在第二天之前 ④:遇到困难,及 ...
- 201521123050 《Java程序设计》第8周学习总结
1. 本周学习总结 2. 书面作业 1.List中指定元素的删除(题目4-1) 1.1 实验总结 在删除元素时,要注意后续元素位置的前移 2.统计文字中的单词数量并按出现次数排序(题目5-3) 2.1 ...
- 201521123122 Java 第二周学习总结
1. 本周学习总结 1.进一步了解了对码云的使用,学会了将本地代码上传到码云以及将码云上的代码克隆到eclipse上. 2.感觉本章学的基本语法和c的基本上差不多啊 3.string的对象创建后无法修 ...
- 201521123100《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...
- 201521123089《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 1.数据库:为了实现一定目的按某中规划组织起来的"数据"的"集合". 2 ...
- TypeMismatchException: Provided id of the wrong type for class zhongfucheng.user.entity.User.
今天在使用SSH框架做项目的时候出现了这个错误,找了我非常非常多的时间!!!!!!! Struts Problem Report Struts has detected an unhandled ex ...
- 理解 IntelliJ IDEA 的项目配置和Web部署
1.项目配置的理解 IDEA 中最重要的各种设置项,就是这个 Project Structre 了,关乎你的项目运行,缺胳膊少腿都不行.最近公司正好也是用之前自己比较熟悉的IDEA而不是Eclipse ...
- Oracle-SQL-按月统计自助终端交易量
SQL实现的目标: 基本情况 现金交易情况 转账情况 转账交易情况(明细) 其它业务情况 交易量汇总 日均交易量 交易金额 绩效情况(万元) 支行名 支行号 所属网点 网点号 管理员帐户 管理员 终端 ...