关于Struts2原理的小结.docx_第1页
关于Struts2原理的小结.docx_第2页
关于Struts2原理的小结.docx_第3页
关于Struts2原理的小结.docx_第4页
关于Struts2原理的小结.docx_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

建立第1个Struts2小项目:Struts2_0100_Introduction1. 拷贝struts-appsstruts2-blank-WEB-INFclassesstruts.xml至项目的源文件夹src目录下2. 拷贝struts-appsstruts2-blank-WEB-INFlib下的所有jar文件至/Struts2_0100_Introduction/WebRoot/WEB-INF/lib目录3. 修改web.xml文件如下(从struts-appsstruts2-blank-WEB-INFweb.xml拷贝的):4. 修改struts.xml文件如下:5. 在浏览器输入 http:/localhost:8080/Strtus2_0100_Introduction/hello.action,即可输出Hello.jsp的内容6. 如何为jar包中的class文件建立源码以及javadoc? - 选择jar包,右击选择Properties- 建立源代码目录- 在Referenced Libraries的struts2-core-.jar上右键- 建立javadoc目录- 建立一个java文件,选择其中的一个类,按F1键即可弹出对应类的javadoc7. 如何struts.xml自动提示? - 解压struts-libstruts2-core-.jar- 得到我们修改struts.xml的参照:struts-libstruts2-core-struts-2.0.dtd- Key:/dtds/struts-2.0.dtd- WindowPreferences8. struts2工作原理:将请求与显示相分离建立第2个Struts2小项目:Struts2_0200_Namespace1、关于Namespace的小结,修改struts.xml如下:2、copy项目的时候,如copy项目Struts2_0200_Namespace为项目T,则右键选择properties,需要修改:3、如何导入项目?1)右击选择Import2)必须勾选“Copy projects into workspace”3) 唯一可能出现的问题:拷贝项目的 JRE System Library 的存储路径,重新Configure Build Path即可建立第3个Struts2小项目:Struts2_0300_Action1、关于Action的详述1) 如果不包含class属性,则会自动默认调用- xwork-core-2.1.6.jar- com.opensymphony.xwork2.ActionSupportl ActionSupport implements Actionl Action是一个含public String execute()方法的接口- 这个class必须含public String execute()方法2) 如果不包含name属性,则会自动默认设置name=success;否则 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小项目:Struts2_0400_Path1、struts2中的路径问题是根据action的路径而不是JSP的路径来确定,所以尽量不要使用相对路径,统一使用绝对路径2、可以由如下生成绝对路径base href= /index.jsp建立第5个Struts2小项目:Struts2_0500_ActionMethod1、 可以为Action指定method属性,而class属性的类UserAction中只有一个add ()方法1)输入 http:/localhost:8080/Struts2_0500_ActionMethod/user/userAdd,则根据(名为userAdd的action)userAdd的method方法调用class属性类中相应方法。忘掉2)输入 http:/localhost:8080/Struts2_0500_ActionMethod/user/user!add,则根据user!add调用相应class属性类中的法中DMI 动态方法调用,user!add:调用user下的(名为user的action)user的方法add,实现多个方法时,只需要配一个action就可以了2、总结1)Action执行的时候并不一定要执行execute方法 只要是返回值是String的方法,想调什么就调什么2)可以在配置文件中配置Action的时候用method=来指定执行哪个方法,也可以在url地址中动态指定(动态方法调用DMI)(推荐),而前者会产生太多的action,所以不推荐使用建立第6个Struts2小项目:Struts2_0600_ActionWildcard1、关于通配符(Wildcard),请先看struts2的配置文件,其中包com.struts2.action中存在两个类:StudentAction,TeacherAction,均含add()和delete()方法输入http:/localhost:8080/Struts2_0600_ActionWildcard/actions/Studentadd,*会匹配add,而1则匹配出现的第一个*输入http:/localhost:8080/Struts2_0600_ActionWildcard/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_ModelDrivenParamInput1、用Action的属性接收参数- 在自定义的Action中设置属性,以及Setters和Getters方法- 先看struts.xml文件,其中class属性的类UserAction含有add方法,两个私有属性:private String name;private int age;以及get和set方法:public String getName()public void setName(String name) public int getAge()public void setAge(int age) - 在浏览器中输入:http:/localhost:8080/Struts2_0700_ActionAttrParamInput/user/user!add?name=a&age=8,将会调用user下的add方法,并传递name和age两个参数,这里有一个好处,就是不需要再对接受到的int参数转型。- 接收参数赋值时,调用的是属性的setUser、getUser方法,而不是直接调用属性2、使用用Domain Model(域模型)接收参数- 实际上就是先封装成一个类,即域,然后作为一个属性传递给自定义的Action类- 如下struts.xml,其中class属性类中存在一个add方法以及一个私有属性和对应setUser、getUser方法:private User user;而User是包com.struts2.user.model中的一个类,含有同1中的属性和方法- 在浏览器中输入:http:/localhost:8080/Struts2_0800_DomainModelParamInput/user/user!add?=a&user.age=8,会自动将参数赋给域User- 想初始化Domain Model,可以自己new,也可以参数传值,但这时候需要保持参数为空的构造方法。- 如果传递的参数和域不匹配,则需要借助DTO(Date Transfer Object)或者VO(Value Object)进行中转,如注册界面,用户只需要用户名和密码,但是注册界面肯定还有个密码确认,这就需要进行中转匹配了。新建一个类DTO类用于中间匹配。3、使用ModelDriven(模型驱动)传递参数1)分析自定义的Action类 - 实现了ModelDriven接口,而ModelDriven一个接口,仅含一个T 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/Struts2_0900_ModelDrivenParamInput/user/user!add?name=a&age=8,则可跟第一种使用Action属性传参方式的输入形式一样,不再赘述建立第10个Struts2小项目:Struts2_1000_CharacterEncoding1、观察web.xml中的的配置2、观察Struts.xml的配置说明:,即可解决中文乱码问题,但是,Struts2.1.6中存在Bug,所以,在web.xml将filter改为Struts2.0的Filter,即可重新解决中文乱码问题,而使用新的版本Struts2.1.8,则可以顺利修正Struts2.1.6中的Bug,此时web.xml中的配置又可以改过来了!建立第11个Struts2小项目:Struts2_1100_SimpleDataValiation1、首先查看struts.xml的文件配置信息2、直接在自定义的Action内编写验证,如下所示:说明:因为Action里面不存在request来设置错误信息传递给前台,可以使用如下的方式this.addFieldError(String fieldName, String errorMessage)进行传值3、查看前台处理错误信息的文件user_add_error.jsp1)查看源代码说明:1. ,可以在对应的Jar包中查找: struts-libstruts2-core-META-INFstruts-tags.tld2.3.关于,以下显示的是Value Context 建立第12个Struts2小项目:Struts2_1200_AccessWebElements如何获取Web元素?- 包括Map类型:request、ession、application,真实类型:HttpServletRequest、HttpSession、ServletContext1、依赖于容器,如以下LoginAction1的源代码:2、依赖于IoC,最常用的,如以下LoginAction2的源代码:3、依赖于容器,如以下LoginAction3的源代码:4、依赖于IoC,如以下LoginAction4的源代码:5、如何在页面获取request、ession、application?- 这些对象属于Action Context的内容,访问需要在前面加上“#” 说明:关于,以下显示的Action Context 6、工作原理(关于LoginAction2)- Struts2接收来自客户端的请求,然后根据struts.xml文件的Action配置,先new一个LoginAction对象- 检查该LoginAction是否实现了RequestAware接口?- 若实现,则调用setRequest(Map request)方法从Filter中读取预先配置的request的,并映射给一个Map类型的request对象- 则execute()即可直接调用得到的Map类型的request建立第13个Struts2小项目:Struts2_1300_IncludeModules1、模块包含,简单的说,就是struts.xml文件的嵌套- struts.xml如下所示- login.xml如下所示建立第14个Struts2小项目:Struts2_1400_DefaultAction1、建立默认的Action,可以在浏览器输入访问时不指定Action,或者当访问的Action不存在的时候,均可调用默认的Action,如下图struts.xml的配置:- 浏览器输入:http:/localhost:8080/Struts2_1400_DefaultAction/index,可访问- 浏览器输入:http:/localhost:8080/Struts2_1400_DefaultAction/,可访问- 浏览器输入:http:/localhost:8080/Struts2_1400_DefaultAction/login,可访问建立第15个Struts2小项目:Struts2_1500_ResultType1、Result的类型Type:包括dispatcher、redirect 、chain 、redirectAction、freemarker、httpheader 、stream(上传下载) 、velocity、xslt、plaintext、tiles,参考如下struts.xml的配置:建立第16个Struts2小项目:Struts2_1600_GlobalResult1、关于struts.xml文件的配置:说明:- 用来配置全局的Result - extends的作用建立第17个Struts2小项目:Struts2_1700_DynamicResult1、关于struts.xml文件的配置:2、关于UserAction的源代码:3、在浏览器输入:http:/localhost:8080/Struts2_1700_DynamicResult/user/user?type=1,返回的Result的结果则是则是/user_success.jsp,即$r=/user_success.jsp在浏览器输入:http:/localhost:8080/Struts2_1700_DynamicResult/user/user?type=2,返回的Result的结果则是则是/user_error.jsp,即$r=/user_error.jsp建立第18个Struts2小项目:Struts2_1800_ResultWithParams1、在Action之间forward的时候,不需要重新传递参数,但是,当客户端跳转到jsp页面的时候,就需要重新传递参数,此时,value Stack中因为没有Action,所以没有值的保存;但是,可以从Action Context的parameters参数获取传递的值。2、关于struts.xml文件的配置:3、关于UserAction的源代码:3、如何读取?使用Action Stack的parameters参数读取。关于user_success.jsp的源代码如下:建立第19个Struts2小项目:Struts2_1900_OGNL1、Object Graph Navigation Language2、关于struts.xml配置如下:3、关于ongl.xml配置如下:4、如何使用OGNL? 访问值栈中的action的普通属性: username: 访问值栈中的对象的普通属性(get set方法): user.age: | | 访问值栈中的对象的普通属性(get set方法): :访问值栈中对象的普通方法:访问值栈中对象的普通方法:访问值栈中action的普通方法:访问静态方法:访问静态属性:访问Math类的静态方法:访问普通类的构造方法:访问List:访问List中某个元素:访问List中元素某个属性的集合:访问List中元素某个属性的集合中的特定值: | 访问Set:访问Set中某个元素:访问Map:访问Map中某个元素: | | 访问Map中所有的key:访问Map中所有的value:访问容器的大小: | 投影(过滤):投影:1.age/投影:1.age/投影:1.age = null/:5、在浏览器输入:http:/localhost:8080/Struts2_My_OGNL/test?username=a&password=b&user.age=10&=oudy,则显示的页面内容如下:6、更多详细,参考项目:Struts2_My_OGNL或Struts2_1900_OGNL建立第20个Struts2小项目:Struts2_2000_StrutsTags建立第21个Struts2小项目:Struts2_2100_Theme_1建立第22个Struts2小项目:Struts2_2100_Theme_2建立第23个Struts2小项目:Struts2_2100_Theme_3建立第24个Struts2小项目:Struts2_2100_Theme_41、如何使用Struts标签?property: property 取值为字符串: property 设定默认值: property 设定HTML: s:property value= escape=false/ set 设定adminName值(默认为request 和 ActionContext): set 从request取值: set 从ActionContext取值: %-set 设定范围: set 从相应范围取值: -%set 设定var,范围为ActionContext: set 使用#取值: set 从相应范围取值: %-push:push:push: -%bean 定义bean,并使用param来设定新的属性值:bean 查看debug情况:拿出值:include _include1.html 包含静态英文文件include _include2.html 包含静态中文文件include _include1.html 包含静态英文文件,说明%用法if elseif else: age = s:if test=#age wrong age!s:elseif test=#parameters.age0 too young!yeah!null遍历集合: |自定义变量: |使用status: | 遍历过的元素总数: |遍历过的元素索引: |当前是偶数?: |当前是奇数?: |是第一个元素吗?: |是最后一个元素吗?: | | 2、更多详细:查看项目Struts2_2000_StrutsTags3、小结1)通用标签a) propertyb) set- 属性scope默认为Action,会将值放入到request和ActionContext中- 其他scope值:page、request、session、applicationc) beand) include:对中文文件支持有问题,不建议使用,如需包含,改用jsp包含e) paramf) debug2) 控制标签a) if elseif elseb) iterator- 可以存放的类型:Collection、Map、Enumeration、Iterator、Arrayc) subset3) UI标签a) theme- simle、xhtml(默认)、css_xhtml、AJAXb) 如何更换和使用theme?- 在src目录下建立temple/主题名/*.ftl,如:template/simple/fielderror.ftl(覆盖simple主题下的fielderror样式)、template/mytheme/fielderror.ftl(自定义主题)- 在标签中加上如下,其中value可以指定定义的theme:- 可以查找:struts2-core-2.1.6.jar/ templatec) 如何定义自己的theme?- css(覆盖struts2原来的css,其中原css的名称可通过查看客户端的HTML源代码获得)- 覆盖单个文件- 定义自己的theme- 实战把所有主题定义为simplefielderror特殊处理自己控制其他标签的展现4) AJAX标签5) $、#、%的区别- $用于i18n和struts配置文件(用来读取Action的属性值)- #用于取得ActionContext的值,以及在s:iterator标签中存放Map类型的数据时,必须在前面加上#号- %用于将中的String文本转换为OGNL表达式,对于本来局势OGNL的属性不起作用,参考s:property标签和s:include标签建立第30个Struts2小项目:struts2_3000_BBS2009_061、运行、观察:struts2_3000_BBS2009_062、步骤:1)建立界面模型2)建立struts.xml- 确定namespace- 确定package- 确定Action的名称及其空的方法- 确定result- 将界面原型页面进行修改,匹配现有设置- 测试 - 做好规划3)建立数据库(或者实体类)4)建立Model层5)建立Service层- 此时可以使用Junit进行单元测试6)着手开发建立第31个Struts2小项目:struts2_3000_BBS2009_07_ExceptionHandling1、如何声明异常?在struts.xml的配置如下:说明:既可以在Actoin中进行异常映射,也可以在package中进行全局异常映射2、关于异常抛出,使用throws抛出方法的异常1)关于xxxAction的list()方法2)关于CategoryService的list()方法3、Struts2中异常处理由拦截器实现,在Filter本身在调用Action的时候,就对异常加以了拦截1)导航到struts2-core-.jarstruts-default.xml2)3)defaultStack4)exception5)erceptor.ExceptionMappingInterceptor6)public String intercept(ActionInvocation invocation) throws Exception建立第32个Struts2小项目:struts2_3100_I18N_Test1、观察.properties资源文件1)结构2)app_en_US.properties的内容:welcome.msg=hello,sir3)app_zh_CN.properties的内容:welcome.msg=u6b22u8fceu4f60uff014)测试国际化程序的Java程序Test.java源代码如下:2、如何转换资源文件的编码为UTF-8,以避免中文乱码问题?- 使用PropertiesEditor插件,只需将解压后的features文件、 plugin文件覆盖到myeclipse中的eclipse目录里即可- 使用命令:jdk1.6.0_17bin native2ascii 源_zh_CN_perties 目标_zh_CN.properties- MyEclipse 8.0已经自身集成了MyEclipse Properties Editor建立第33个Struts2小项目:struts2_3200_BBS2009_08_I18N1、Struts的资源文件,有3中级别1)Action级别的:必须与对应的Action名在同一目录下,且前缀要一致,如xxxAction对应的资源文件必须为xxxAction_zh_CN.properties2)Package级别的:必须以package为前缀,即package_zh_CN.properties3) 应用级别的,即全局的,前缀可以任意,但要注意两点- 要在src目录下,如建立srcbbs2009_zh_CN.properties- 需要配置struts.xml文件的一个用以指定资源文件前缀的常量值2、如何处理资源文件中的参数?- 如bbs2009_zh_CN.properties的source:- 如何设置参数?3、如何在页面读取资源文件的内容?建立第34个Struts2小项目:struts2_3300_interceptor建立第35个Struts2小项目:struts2_3400_interceptor_simulation建立第36个Struts2小项目:struts2_3500_my_interceptor建立第37个Struts2小项目:struts2_3600_token_interceptor1、 拦截器:主要配置属性2、 使用token拦截器控制重复提交:当第一次提交的时候,会在服务器端生成一个session保存一个token id,当重复提交的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论