Struts2开发入门
2016-01-05 14:38
561 查看
一、Struts2概述
1、Struts2是什么?
Struts2是一个M(模型—域–范围模型)V(View视图)C(控制器)框架(模型2)。框架都是一个半成品。提高开发效率。Struts1是一个MVC框架,非常流行。有很大的缺点。此时一个webwork的框架设计超前,名气不是很大。Struts1+webworkd=struts2。用的是struts1的名字,但是与sruts1没啥关系,struts2的核心是webwork框架。
2、Struts2能干什么?
web开发Strust2 核心功能获取请求参数
封装到JavaBean
验证和转换
调用业务代码存数据
转向某个页面展示结果
是表现层的开发技术。(背景色为蓝色区域)
3、Struts2入门简单原理图
Filter VS Servlet
过滤器要比Servlet要强大,开发中经常用Servlet作为控制器,Filter也可以作为控制器来使用。
二、搭建struts2的开发环境
1、下载地址:http://struts.apache.org2、解压后的目录结构:
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.1.1.jar:Struts 2框架的核心类库
xwork-core-2.3.1.1.jar:Command模式框架,WebWork和Struts2都基于xwork
ognl-3.0.3.jar:对象图导航语言(Object Graph Navigation Language),
struts2框架通过其读写对象的属性
freemarker-2.3.18.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包的增强,比如下面程序
<code class="hljs axapta has-numbering"><span class="hljs-keyword">if</span>(<span class="hljs-keyword">str</span>!=<span class="hljs-keyword">null</span>&&!<span class="hljs-keyword">str</span>.equals(<span class="hljs-string">""</span>)){ } <span class="hljs-comment">//增强的</span> <span class="hljs-keyword">if</span>(StringUtils.isEmpty(<span class="hljs-keyword">str</span>)){ }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul>
javassist-3.11.0.GA.jar:动态代理的开发包。日本鬼子弄的(Jboss)。Hibernate也会用到
3、在web.xml中配置核心过滤器:StrutsPrepareAndExcuteFilter(框架提供)
<code class="hljs vbscript has-numbering"> <<span class="hljs-built_in">filter</span>> <<span class="hljs-built_in">filter</span>-name>struct01</<span class="hljs-built_in">filter</span>-name> <<span class="hljs-built_in">filter</span>-<span class="hljs-keyword">class</span>>org.apache.struts2.dispatcher.ng.<span class="hljs-built_in">filter</span>.StrutsPrepareAndExecuteFilter</<span class="hljs-built_in">filter</span>-<span class="hljs-keyword">class</span>> </<span class="hljs-built_in">filter</span>> <<span class="hljs-built_in">filter</span>-mapping> <<span class="hljs-built_in">filter</span>-name>struct01</<span class="hljs-built_in">filter</span>-name> <url-pattern>/*</url-pattern> </<span class="hljs-built_in">filter</span>-mapping></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul>
4、在WEB-INF\classes目录下建立一个名称为struts.xml的配置文件。内容如下:(可以从struts2发行包\apps\struts-blank.war中拷贝)。抄头超屁股。。。。。。。。。
<code class="hljs xml has-numbering"><span class="hljs-pi"><?xml version="1.0" encoding="UTF-8"?></span> <span class="hljs-doctype"><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"></span> <span class="hljs-tag"><<span class="hljs-title">struts</span>></span> <span class="hljs-tag"></<span class="hljs-title">struts</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul>
5、把应用部署到Tomcat中,启动Tomcat,如果没有报错,说明搭建成功
三、第一个Struts2应用案例(编码步骤)
1、编写2个jsphello.jsp
<code class="hljs xml has-numbering"> <span class="hljs-tag"><<span class="hljs-title">body</span>></span> <span class="hljs-tag"><<span class="hljs-title">a</span> <span class="hljs-attribute">href</span>=<span class="hljs-value">"${pageContext.request.contextPath}/hello.action"</span>></span>访问第一个Struts2案例<span class="hljs-tag"></<span class="hljs-title">a</span>></span> <span class="hljs-tag"></<span class="hljs-title">body</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>
success.jsp
<code class="hljs xml has-numbering"> <span class="hljs-tag"><<span class="hljs-title">body</span>></span> Struts2访问成功 <span class="hljs-tag"></<span class="hljs-title">body</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>
2、编写一个动作类(POJO,之前所谓的按照JavaBean规范编写的一个普通的类)
<code class="hljs cs has-numbering">package xgp.struts.actions; <span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> HelloAction { <span class="hljs-keyword">public</span> String <span class="hljs-title">sayHello</span>(){ System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"动作方法sayHello执行了,访问成功!"</span>); <span class="hljs-keyword">return</span> <span class="hljs-string">"success"</span>; } } </code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul>
3、在struts.xml配置。告知控制器该实例化那个类,调用该类的那个方法,根据方法的返回值转向哪个页面
<code class="hljs xml has-numbering"><span class="hljs-pi"><?xml version="1.0" encoding="UTF-8" ?></span> <span class="hljs-doctype"><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"></span> <span class="hljs-tag"><<span class="hljs-title">struts</span>></span> <span class="hljs-tag"><<span class="hljs-title">constant</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"struts.devMode"</span> <span class="hljs-attribute">value</span>=<span class="hljs-value">"true"</span> /></span> <span class="hljs-tag"><<span class="hljs-title">package</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"default"</span> <span class="hljs-attribute">extends</span>=<span class="hljs-value">"struts-default"</span>></span> <span class="hljs-tag"><<span class="hljs-title">action</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"hello"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"xgp.struts.actions.HelloAction"</span> <span class="hljs-attribute">method</span>=<span class="hljs-value">"sayHello"</span>></span> <span class="hljs-tag"><<span class="hljs-title">result</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"success"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"dispatcher"</span>></span>/success.jsp<span class="hljs-tag"></<span class="hljs-title">result</span>></span> <span class="hljs-tag"></<span class="hljs-title">action</span>></span> <span class="hljs-tag"></<span class="hljs-title">package</span>></span> <span class="hljs-tag"></<span class="hljs-title">struts</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul>
4、访问测试:
http://localhost:8080/xgp.struts/hello.jsp
执行过程如下
四、执行过程和原理(可能面试题)
学习目标:熟知struts2的执行过程(下图记住)。源码可以不看a、过滤器的初始化
1、StrutsPrepareAndExecuteFilter是一个过滤器,过滤器就有初始化方法
关键代码:57:
dispatcher = init.initDispatcher(config);//初始化请求分发器。
2、InitOperations:
<code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> Dispatcher <span class="hljs-title">initDispatcher</span>( HostConfig filterConfig ) { Dispatcher dispatcher = createDispatcher(filterConfig); dispatcher.init(); <span class="hljs-keyword">return</span> dispatcher; }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>
init_FileManager();
init_DefaultProperties(); // [1]
init_TraditionalXmlConfigurations(); // [2]
init_LegacyStrutsProperties(); // [3]
init_CustomConfigurationProviders(); // [5]
init_FilterInitParameters() ; // [6]
init_AliasStandardObjects() ; // [7]
Dispatcher:分发器
<code class="hljs cs has-numbering"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">init_TraditionalXmlConfigurations</span>() { String configPaths = initParams.<span class="hljs-keyword">get</span>(<span class="hljs-string">"config"</span>); <span class="hljs-keyword">if</span> (configPaths == <span class="hljs-keyword">null</span>) { configPaths = DEFAULT_CONFIGURATION_PATHS; } String[] files = configPaths.split(<span class="hljs-string">"\\s*[,]\\s*"</span>); <span class="hljs-keyword">for</span> (String file : files) { <span class="hljs-keyword">if</span> (file.endsWith(<span class="hljs-string">".xml"</span>)) { <span class="hljs-keyword">if</span> (<span class="hljs-string">"xwork.xml"</span>.equals(file)) { configurationManager.addContainerProvider(createXmlConfigurationProvider(file, <span class="hljs-keyword">false</span>)); } <span class="hljs-keyword">else</span> { configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, <span class="hljs-keyword">false</span>, servletContext)); } } <span class="hljs-keyword">else</span> { <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(<span class="hljs-string">"Invalid configuration file name"</span>); } } }</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul>
(重要)结论:
初始化过滤器时,会按顺序加载以下配置文件:
———-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:
<code class="hljs oxygene has-numbering">ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.<span class="hljs-keyword">class</span>).createActionProxy( <span class="hljs-keyword">namespace</span>, name, <span class="hljs-function"><span class="hljs-keyword">method</span>, <span class="hljs-title">extraContext</span>, <span class="hljs-title">true</span>, <span class="hljs-title">false</span>);</span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li></ul>
五、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的第三方插件中(插件内部,给插件用的)Struts2-**-plugin.jar中
4、struts.xml:用户自己编写的(重点)
5、struts.properties :用户自己编写的(类路径中,不需要)key和value的形式
6、web.xml :struts2的一些配置可以写在这(Web应用中,不建议)
结论:1~6:后面的配置文件内容,会覆盖前面的。
比如:在struts.xml中覆盖default.properties中的内容,可以这么办:
<code class="hljs livecodeserver has-numbering"><<span class="hljs-built_in">constant</span> name=<span class="hljs-string">"struts.action.extension"</span> <span class="hljs-built_in">value</span>=<span class="hljs-string">"do"</span>></<span class="hljs-built_in">constant</span>> </code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>
比如:在web.xml中把访问的扩展名改为xgp
<code class="hljs livecodeserver has-numbering"><<span class="hljs-built_in">filter</span>> <<span class="hljs-built_in">filter</span>-name>struts2</<span class="hljs-built_in">filter</span>-name> <<span class="hljs-built_in">filter</span>-class>org.apache.struts2.dispatcher.ng.<span class="hljs-built_in">filter</span>.StrutsPrepareAndExecuteFilter</<span class="hljs-built_in">filter</span>-class> <init-<span class="hljs-built_in">param</span>> <<span class="hljs-built_in">param</span>-name>struts.action.extension</<span class="hljs-built_in">param</span>-name> <<span class="hljs-built_in">param</span>-<span class="hljs-built_in">value</span>>xgp</<span class="hljs-built_in">param</span>-<span class="hljs-built_in">value</span>> </init-<span class="hljs-built_in">param</span>> </<span class="hljs-built_in">filter</span>> </code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul>
<code class="hljs livecodeserver has-numbering"><<span class="hljs-built_in">constant</span> name=<span class="hljs-string">"struts.devMode"</span> <span class="hljs-built_in">value</span>=<span class="hljs-string">"true"</span> /> <!<span class="hljs-comment">-- Struts2中的一个常量,表示开发模式,当其值为true,如果配置文件内容改变,框架会重新加载而不需重新启动服务器!--></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li></ul>
6.1struts.xml中的package元素:
Struts-default.xml—–中有这么个包——<package name="struts-default" abstract="true"></package>
package:方便管理动作,作用:对应用中的动作进行模块化管理,就如同把类放在不同包中管理一样。
属性:
name:配置文件中保证package的唯一
namespace:取值一般以”/”开头,它与动作名称组成完成的访问路径。默认值是””。
http://域名+动作名称.action
如果配置了namespace那么访问资源时就要加上namespace:http://域名+namespace+动作名称.action
extends:父包名称。把父包中定义的内容完全集成下来。一般情况下,在struts2开发中需要继承(直接或间接)struts-default(struts-default.xml)
abstract:抽象包。抽象的东西就是设计被别人继承的。没有任何action子元素的packkage就可以定义为抽象的。
package的namespace和动作访问专题:(小难点)
区分:namespace=”/”,实实在在的一个名称空间。绝对不是默认的:namespace=””或者不写,下面是具体的访问流程图
6.2 struts.xml中action元素的配置
作用:定义动作类属性:
name:动作的名称,同一个包中的name必须唯一。
class:动作类的全名。可选属性。如果没有配置,则使用默认的class;默认值是ActionSupport Crtl+Shift+H搜索可得:com.opensymphony.xwork2.ActionSupport(可在源码中找到)
因为struts-default.xml有指定。
<code class="hljs d has-numbering"><<span class="hljs-keyword">default</span>-<span class="hljs-keyword">class</span>-<span class="hljs-keyword">ref</span> <span class="hljs-keyword">class</span>=<span class="hljs-string">"com.opensymphony.xwork2.ActionSupport"</span> /></code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>
method:指定动作类中的哪个方法,可选的。默认值是execute
小知识:
可以在自己的package中通过以下标签,指定默认的动作类
<code class="hljs d has-numbering"><<span class="hljs-keyword">default</span>-<span class="hljs-keyword">class</span>-<span class="hljs-keyword">ref</span> <span class="hljs-keyword">class</span>=<span class="hljs-string">"com.itheima.action.HelloAction"</span>></<span class="hljs-keyword">default</span>-<span class="hljs-keyword">class</span>-<span class="hljs-keyword">ref</span>></code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>
6.3strutx.xml中的result元素的默认配置
作用:定义动作类执行完毕后转向的结果视图属性:
name:结果视图的名称。与当前的动作类的动作方法返回值对应。默认值是success
type:结果视图的类型。默认是dispatcher(转发)
来自:struts-default.xml中的结果视图的定义。
6.4 struts2的一些常量含义及配置
如果你要改变这些常量,则在外面的配置文件struts.xml(或者别的配置文件中)修改,覆盖这些框架的默认值:比如框架中
struts.action.extension=action, 框架要处理的后缀名称。如果需要改成以
*.do或者
*.doo结尾,则可以在Struts.xml中配置:
<code class="hljs livecodeserver has-numbering"><<span class="hljs-built_in">constant</span> name=<span class="hljs-string">"struts.action.extension"</span> <span class="hljs-built_in">value</span>=<span class="hljs-string">"do,doo"</span>></<span class="hljs-built_in">constant</span>></code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>
在struts.properties中配置如下
<code class="hljs avrasm has-numbering">struts<span class="hljs-preprocessor">.action</span><span class="hljs-preprocessor">.extension</span>=do</code><ul style="display: block;" class="pre-numbering"><li>1</li></ul>
在web.xml中配置如下
<code class="hljs livecodeserver has-numbering"><<span class="hljs-built_in">filter</span>> <<span class="hljs-built_in">filter</span>-name>struct01</<span class="hljs-built_in">filter</span>-name> <<span class="hljs-built_in">filter</span>-class>org.apache.struts2.dispatcher.ng.<span class="hljs-built_in">filter</span>.StrutsPrepareAndExecuteFilter</<span class="hljs-built_in">filter</span>-class> <init-<span class="hljs-built_in">param</span>> <<span class="hljs-built_in">param</span>-name>struts.action.extension</<span class="hljs-built_in">param</span>-name> <<span class="hljs-built_in">param</span>-<span class="hljs-built_in">value</span>><span class="hljs-built_in">do</span></<span class="hljs-built_in">param</span>-<span class="hljs-built_in">value</span>> </init-<span class="hljs-built_in">param</span>> </<span class="hljs-built_in">filter</span>> </code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul>
这里要注意配置文件的优先级.
常量
struts.i18n.encoding=UTF-8 框架使用的编码
struts.action.extension=action, 动作的访问后缀。多个可以使用逗号分隔
struts.serve.static.browserCache=true 指示浏览器是否缓存资源
(原理:三个响应消息头:response.setHeader():Expires Cache-Control Pragma)
struts.configuration.xml.reload = true 是否在更改了struts.xml后自动重新加载。开发阶段有用。
struts.devMode = false 是否是开发模式。开发阶段建议为true。如果为true,struts.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.4配置文件分模块化
在项目开发中,为了更好的进行版本控制,经常引入外部的配置文件(比如在struts.xml同级目录下建立一个user.xml,则只需在<code class="hljs livecodeserver has-numbering"><<span class="hljs-built_in">include</span> <span class="hljs-built_in">file</span>=<span class="hljs-string">"user.xml"</span>></<span class="hljs-built_in">include</span>></code>
相关文章推荐
- Java for Web学习笔记(十二):JSP(2)Tag:directive,declaration,scriptlet,expression
- Java 数据类型总结
- Eclipse常用小知识汇总
- java.sql.SQLException: Io exception: Connection reset
- Java中对List集合排序的两种方法
- java中使用XStream实现将对象转为xml格式字符串或者将xml格式的字符串转换为对象
- eclipse配置springloaded实现热部署
- java虚拟机简介
- Java20: 俄罗斯方块
- Spring事务管理高级应用难点剖析之多线程的困惑
- jenkins的配置(安全 maven git jdk)
- java中的 FileWriter类 和 FileReader类的一些基本用法包括对于异常的处理
- 25个Java机器学习工具&库
- 配置ant编译时的jdk版本
- Java 基础数据类型 和 深度克隆对象的2种方法(实现Cloneable接口或者实现对象序列化)
- Java——形参和实参的区别
- Java中匿名对象的使用
- MyEclipse安装Freemarker插件
- Java SE 第十六讲----面向对象特征之继承
- Java SE 第十六讲----方法重载