【Jsp精品源码栏目提醒】:网学会员为广大网友收集整理了,Struts2教学内容笔记 - 教育,希望对大家有所帮助!
Struts2 教学内容笔记前言 假如你的人生有理想,那么就一定要去追,不管你现在的理想在别人看来是多么的可笑,你也不用在乎,人生蹉跎几十年,如果年轻的时候计较得失,以至前怕狼来后怕虎而不去追逐,等到了 40,50 岁的时候,你唯一能做的就是感叹岁月的消逝和无情… 谨以此言献给 S107 班所有孜孜以求的同学们,hurry up第一次课内容一、准备工作1、解压 struts-2.3.4-all.zipapps 目录:struts2 自带的例子程序docs 目录:官方 API
文档。
lib 目录:存放所有 jar 文件。
Src 目录:源文件存放地2、12 个基本常用包asm-3.3.jar 操作 java 字节码的类库,spring 中支持 aop 就要加asm-commons-3.3.jar 同上asm-tree-3.3.jar 同上commons-fileupload-1.2.2.jar 文件上传组件,2.1.6 版本后必须加入此 jar 包commons-io-2.0.1.jar 处理 IO 操作的工作类库commons-lang3-3.1.jar 为 java.lang 包提供扩展freemarker-2.3.19.jar struts2 的 UI 标签的模板使用 freemarker 编写javassist-3.11.0.GA.jar 是一个分析、编辑和创建
Java 字节码的类库动态代理中使用。
ognl-3.0.5.jar 对象图
导航语言,通过它来读写对象属性struts2-core-2.3.4.jar 开发的核心类库xwork-core-2.3.4.jar xwork 类库,struts2 在其上进行构建struts2-convention-plugin-2.3.4.jar Struts2 采取注解需要的 Jar 特 别 要 注 意 导 入 commons-fileupload-1.2.1.jar 包 , 在 此 jar 包 中 包 含 了RequestContext 类,如果不导入该 jar 包将会报异常。
在 Struts2 中开始支持注解,并且这也是一种趋势。
在使用注解的 Struts2
程序中,记得要加入 struts2-convention-plugin-2.3.4.1.jar包才可以。
3.初识 struts2 配置文件(1)web.xml 文件 主 要 完 成 对 StrutsPrepareAndExecuteFilter 的 配 置 ( 在 以 前 的 版 本 中 是 对FilterDispatcher 配置,新版本同样支持用 FilterDispatcher 配置),它的实质是一个过滤器,它负责初始化整个 Struts 框架并且处理所有的请求。
这个过滤器可以包括一些初始化参数,有的参数指定了要加载哪些额外的 xml 配置文件,还有的会影响 struts 框架的行为。
除了 StrutsPrepareAndExecuteFilter 外, Struts 还提供了一个 ActionContexCleanUp类,它的主要任务是当有其它一些过滤器要访问一个初始化好了的 struts 框架的时候,负责处理一些特殊的清除任务。
(2) .struts.xml 文件 框架的核心配置文件就是这个默认的 struts.xml 文件,在这个默认的配置文件里面我们可以根据需要再包括其它一些配置文件。
在通常的应用开发中, 为了便于管理和维护我们还可以为每个不同的模块单独配置一个 struts.xml 文件。
这也是我们要配置的主要文件。
(3).struts.properties(参 default.properties) 在 Struts 框架使用了很多属性,我们可以通过改变这些属性来满足我们的需求。
要改变这些属性, 只需在 struts.properties 文件中指定属性的 key 和 value 即可。
属性文件可以放在任何一个包含在 classpath 中的路径上, 但是通常我们都把它放在/WEB-INF/classes目录下面。
我们可以在 struts-default.properties 文件中找到一个属性的列表。
(4)struts-default.xml 此文件是 struts2 框架默认加载的配置文件,它定义了 struts2 一些核心 bean 和拦截器 , 它 会 自 动 包 含 included 到 struts.xml 文 件 中 实 质 是 通 过 , 并 为 我 们 提 供 了 一 些 标 准 的 配 置 。
我 们 可 以 在struts2-core.jar 中找到这个文件。
(5)其它配置文件velocity.properties,struts-default.vm,struts-plugin.xml4、让 MyEclipse 自动提示 xml 信息 当我们在编写 struts.xml 时, 发现 eclipse 并不会给出帮助提示, 那是因为 MyEclipse默 认 并 不 支 持 struts2 , 所 以 我 们 需 要 手 工 导 入 dtd 以 支 持 提 示 。
步 骤 :windowpreferencesMyEclipseFiles and EditorsXML
xml Catelog然后在右边点 add 添加: - 解压 struts-2.3.4libstruts2-core-2.3.4.jar - 得到我们修改 struts.xml 的参照:struts-2.3.4libstruts2-core-2.3.4struts-2.3.dtd - Key Type:URI - Key:http://struts.apache.org/dtds/struts-2.3.dtd5、如何使用 alt/提示 在 MyEclipse6.5 中默认的提示为 CtrlSpace,而它会与我们的输入法切换冲突,使 提示失效。
找到 key,先取消 Content Assist 命令的绑定,再用“alt/”来绑定。
6、查看
源码和 API
文档 - 选择 jar 包,右击选择 Properties - 建立
源代码目录 - 在 Referenced Libraries 的 struts2-core- 2.3.4.jar 上右键 - 建立 javadoc 目录 - 建立一个 java 文件,选择其中的一个类,按 F1 键即可弹出对应类的 javadoc 7、struts2
工作原理:将请求与显示相分离 二、第一个应用实例 (一)开启 struts2 自带的开发模式常量 在以前的开发中,当修改一些配置时总是不能及时地更新到服务器, 我们总会重新部署或重 启来更新改变的内容,在 struts2 中可以通过一个常量来达到此目的。
(二)建立 Struts2_0100_Introduction 项目 1、拷贝 struts-2.3.4appsstruts2-blankWEB-INFclassesstruts.xml 至项目的源文件夹 src 目录 下 2 、 拷 贝 struts-2.3.4appsstruts2-blankWEB-INFlib 下 的 所 有 jar 文 件 至 /TestStruts /WebRoot/WEB-INF/lib 目录 3. 修改 web.xml 文件如下(从 struts-2.3.4appsstruts2-blankWEB-INF
web.xml 拷贝的) : struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilteractionPackagescom.talent struts2 / index.
jsp 4. 修改 struts.xml 文件如下: /hello.
jsp5. 在浏览器输入 http://localhost:8080/Struts2_0100_Introduction/hello.action,即可输出 Hello.
jsp 的内容(三)使用注解实现 Struts2_0100_Introduction 项目1、建一个名为 com.talent.annotation.action 包,并新建一个 TestAction 类 注意建立任何一个 action 类必须以 XxxAction 的形式命名2、使 TestAction 类继承 ActionSupport 类并重写 execute 方法3、使用注解将包、命名空间和跳转结果设置好ParentPackagestruts-defaultNamespace/Resultnamesuccesslocation/helloWorld.
jsp 注意:location 中的/不能省,并且 Action 类必须放在 action 包中4、整个注解的配置ParentPackagestruts-defaultNamespace/Results Resultname success location /helloWorld.
jsp Resultname error location /error.
jsp ExceptionMappings ExceptionMappingexception java.lang.RuntimeExceptionresult error public class TestAction extends ActionSupport private static final long serialVersionUID -3593827960555853110L Override Actionvaluehello public String execute throws Exception return SUCCESS 总结
常用的注解如下:Namespace:指定命名空间。
ParentPackage:指定父包。
(一个结果的映射)Result:提供了 Action 结果的映射。
Results:“Result”注解
列表ResultPath:指定结果页面的基路径。
Action:指定 Action 的访问 URL。
Actions:“Action”注解列表。
ExceptionMapping:指定异常映射。
(映射一个声明异常)ExceptionMappings:一级声明异常的数组。
InterceptorRef:拦截器引用。
InterceptorRefs:拦截器引用组。
第二次课内容建立第 2 个 Struts2_0200_Namespace 项目1、关于 Namespace 的小结,修改 struts.xml 如下:2、copy 项目的时候,如 copy 项目 TestNamespace 为项目 T,则右键选择 properties需要修改 web Context-root 的输入框信息,并设置值为 T:3、如何导入项目? 1)右击选择 Import… 2)必须勾选“Copy projects into workspace” 3) 唯一可能出现的问题:拷贝项目的 JRE System Library 的存储路径,重新 Configure Build Path 即可建立第 3 个 Struts2_0300_Action 项目1、关于 Action 的详述 1) 如果不包含 class 属性,则会自动默认调用 - xwork-core-2.3.4.jar - com.opensymphony.xwork2.ActionSupport ActionSupport implements Action Action 是一个含 public String execute方法的接口 - 这个 class 必须含 public String execute方法 2) 如果不包含 name 属性, 否 则会自动默认设置 namesuccess;则 name等于 execute方法的返回值 3)如何编写一个 Action 的类? - 含 execute方法的普通类 - implements Action 接口的类,则必须实现 execute方法 - extends ActionSupport 的类2、重申 Struts2 的工作原理 1)client 提交一个客户端请求 2)服务器接收到这个请求后,会根据 web.xml 中的寻找,调用 doFilter方法 3)strtus2filter 根据 struts2.xml 检查 - namespace - action:根据 class 来处理 - result:根据 name 来处理 4)读出 result 中的.
jsp 页面,并返回给客户端建立第 4 个 Struts2_0400_Path 项目1、struts2 中的路径
问题是根据 action 的路径而不是
JSP 的路径来确定,所以尽量不要使用相对路径,统一使用绝对路径2、可以由如下生成绝对路径index.
jsp建立第 5 个 Struts2_0500_ActionMethod 项目1、可以为 Action 指定 method 属性,而 class 属性的类 UserAction 中只有一个 add 方法 1)输入 http://localhost:8080/ TestActionMethod/user/userAdd,则根据名为 userAdd 的actionuserAdd 的 method 方法调用 class 属性类中相应方法。
忘掉 2)输入 http://localhost:8080/ TestActionMethod/user/useradd,则根 据 useradd 调用相应class 属性类中的法中 DMI 动态方法调用, 调 useradd: 用 user 下的 (名为 user 的 action)user 的方法 add,实现多个方法时,只需要配一个 action 就可以了2、总结 1)Action 执行的时候并不一定要执行 execute 方法 只要是返回值是 String 类型的方法,想调什么就调什么 2)可以在配置文件中配置 Action 的时候用 method来指定执行哪个方法,也可以在 url 地址中动态指定(动态方法调用 DMI) ,而前者会产生太多的 action,所以不推 (推荐) 荐使用建立第 6 个 Struts2_0600_ActionWildcard 项目1 、 关 于 通 配 符 ( Wildcard ), 请 先 看 struts2 的 配 置 文 件 , 其 中 包com.talent.struts2.action 中存在两个类:StudentAction,TeacherAction,均含 add和 delete方法输入 http://localhost:8080/ TestActionWildcard/actions/Studentadd,会匹配 add,而1则匹配出现的第一个输入 http://localhost:8080/ TestActionWildcard/actions/Teacher_add,_会一次匹配为 Teacher 和 add,12则匹配相对应的2、使用通配符,将配置量降到最低;不过,一定要遵守约定优于配置的原则:类名相似,且方法同名,如 StudentAction,TeacherAction,均含 add和 delete方法建立第 7 个 Struts2 小项目:Struts2_0700_ActionAttrParamInput 项目建立第 8 个 Struts2 小项目:Struts2_0800_DomainModelParamInput 项目建立第 9 个 Struts2 小项目:Struts2_0900_ModelDrivenParamInputt 项目1、用 Action 的属性接收参数 - 在自定义的 Action 中设置属性,以及 Setters 和 Getters 方法 - 先看 struts.xml 文件,其中 class 属性的类 UserAction 含有 add 方法,两个私有属性: private String name private int age以及 get 和 set 方法: public String getName public void setNameString name public int getAge public void setAgeint age - 在浏览器中输入: http://localhost:8080/ TestActionAttrParamInput/user/useraddnameaage8, 将会调用 user 下的 add 方法,并传递 name 和 age 两个参数,这里有一个好处,就是 不需要再对接受到的 int 参数转型。
- 接收参数赋值时,调用的是属性的 setUser、getUser 方法,而不是直接调用属性2、使用用 Domain Model(域模型)接收参数 - 实际上就是先封装成一个类,即域,然后作为一个属性传递给自定义的 Action 类 - 如下 struts.xml,其中 class 属性类中存在一个 add 方法以及一个私有属性和对应 setUser、getUser 方法: private User user 而 User 是包 com.talent.struts2.user.model 中的一个类,含有同 1 中的属性和方法 - 在浏览器中输入: http://localhost:8080/ TestDomainModelParamInput /user/useradduser.nameauser.age8,会自动将参数赋给域 User - 想初始化 Domain Model,可以自己 new,也可以参数传值,但这时候需要保持参数为 空的构造方法。
- 如果传递的参数和域不匹配, 则需要借助 DTO 或 (Date Transfer Object) 者 VO(Value Object)进行中转,如注册界面,用户只需要用户名和密码,但是
注册界面肯定还有个 密码确认,这就需要进行中转匹配了。
新建一个类 DTO 类用于中间匹配。
3、使用 ModelDriven(模型驱动)传递参数 1)分析自定义的 Action 类 而 - 实现了 ModelDriven 接口, ModelDriven 一个接口,仅含一个 getModel 方法,则自定义 Action 必须实现这个 getModel方法 - 此时,User 对象必须自己去 new 一个 2)Struts2 重点在 MVC 的 M 层,即编写自定义的 Action 去协同 Model 和 View 的衔接 3)工作原理: - Filter 类接收到 Client 传递的参数,然后首先会 new 一个 User 对象 - 检查 Action,发现已实现了 ModelDriven 接口,然后调用 getModel方法, 为返回的 Model 调用 set 和 get 进行封装 - 得到 User 对象的值 4)在浏览器输入:http://localhost:8080/ TestModelDrivenParamInput/user/useraddnameaage8,则可跟第一种使用 Action 属性传参方式的输入形式一样,不再赘述