尚学堂科技马士兵Struts2学习小结v10Word格式文档下载.docx
《尚学堂科技马士兵Struts2学习小结v10Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《尚学堂科技马士兵Struts2学习小结v10Word格式文档下载.docx(32页珍藏版)》请在冰豆网上搜索。
2)必须勾选“Copyprojectsintoworkspace”
3)唯一可能出现的问题:
拷贝项目的JRESystemLibrary的存储路径,重新ConfigureBuildPath即可
建立第3个Struts2小项目:
Struts2_0300_Action
1、关于Action的详述
1)<
action>
如果不包含class属性,则会自动默认调用
-xwork-core-2.1.6.jar
-com.opensymphony.xwork2.ActionSupport
●ActionSupportimplementsAction
●Action是一个含publicStringexecute()方法的接口
-这个class必须含publicStringexecute()方法
2)<
result>
如果不包含name属性,则会自动默认设置name="
success"
;
否则name等于execute()方法的返回值
3)如何编写一个Action的类?
-含execute()方法的普通类
-implementsAction接口的类,则必须实现execute()方法
-extendsActionSupport的类
2、重申Struts2的工作原理
1)client提交一个客户端请求
2)服务器接收到这个请求后,会根据web.xml中的<
filter>
寻找<
filter-class>
,调用doFilter()方法
3)strtus2filter根据struts2.xml检查
-namespace
-action:
根据class来处理
-result:
根据name来处理
4)读出result中的.jsp页面,并返回给客户端
建立第4个Struts2小项目:
Struts2_0400_Path
1、struts2中的路径问题是根据action的路径而不是JSP的路径来确定,所以尽量不要使用相对路径,统一使用绝对路径
2、可以由如下生成绝对路径
<
!
--request.getContextPath():
获得工程名-->
--request.getScheme():
http-->
--request.getServerName():
localhost-->
--request.getServerPort():
8080,端口号-->
%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+"
:
//"
+request.getServerName()+"
"
+request.getServerPort()+path+"
/"
;
%>
head>
--设置base标签,当前页面的所有超链接前面都会自动加上basePath-->
basehref="
%=basePath%>
/>
/head>
body>
ahref="
index.jsp"
>
index.jsp<
/a>
/body>
建立第5个Struts2小项目:
Struts2_0500_ActionMethod
1、可以为Action指定method属性,而class属性的类UserAction中只有一个add()方法
1)输入http:
8080/Struts2_0500_ActionMethod/user/userAdd,则根据userAdd的method方法调用class属性类中相应方法
2)输入http:
8080/Struts2_0500_ActionMethod/user/user!
add,则根据user!
add调用相应class属性类中的法中
2、总结
1)Action执行的时候并不一定要执行execute方法
2)可以在配置文件中配置Action的时候用method=来指定执行哪个方法,也可以在url地址中动态指定(动态方法调用DMI)(推荐),而前者会产生太多的action,所以不推荐使用
建立第6个Struts2小项目:
Struts2_0600_ActionWildcard
1、关于通配符(Wildcard),请先看struts2的配置文件,其中包com.struts2.action中存在两个类:
StudentAction,TeacherAction,均含add()和delete()方法
输入http:
8080/Struts2_0600_ActionWildcard/actions/Studentadd,*会匹配add,而{1}则匹配出现的第一个*
8080/Struts2_0600_ActionWildcard/actions/Teacher_add,*_*会一次匹配为Teacher和add,{1}{2}则匹配相对应的*
2、使用通配符,将配置量降到最低;
不过,一定要遵守"
约定优于配置"
的原则:
类名相似,且方法同名,如StudentAction,TeacherAction,均含add()和delete()方法
建立第7个Struts2小项目:
Struts2_0700_ActionAttrParamInput
建立第8个Struts2小项目:
Struts2_0800_DomainModelParamInput
建立第9个Struts2小项目:
Struts2_0900_ModelDrivenParamInput
1、用Action的属性接收参数
-在自定义的Action中设置属性,以及Setters和Getters方法
-先看struts.xml文件,其中class属性的类UserAction含有add方法,两个私有属性:
privateStringname;
privateintage;
以及get和set方法:
publicStringgetName()
publicvoidsetName(Stringname)
publicintgetAge()
publicvoidsetAge(intage)
-在浏览器中输入:
8080/Struts2_0700_ActionAttrParamInput/user/user!
add?
name=a&
age=8,将会调用user下的add方法,并传递name和age两个参数,这里有一个好处,就是不需要再对接受到的int参数转型。
-接收参数赋值时,调用的是属性的setUser、getUser方法,而不是直接调用属性
2、使用用DomainModel(域模型)接收参数
-实际上就是先封装成一个类,即域,然后作为一个属性传递给自定义的Action类
-如下struts.xml,其中class属性类中存在一个add方法以及一个私有属性和对应setUser、getUser方法:
privateUseruser;
而User是包com.struts2.user.model中的一个类,含有同1中的属性和方法
8080/Struts2_0800_DomainModelParamInput/user/user!
user.name=a&
user.age=8,会自动将参数赋给域User
-想初始化DomainModel,可以自己new,也可以参数传值,但这时候需要保持参数为空的构造方法。
-如果传递的参数和域不匹配,则需要借助DTO(DateTransferObject)或者VO(ValueObject)进行中转,如注册界面,用户只需要用户名和密码,但是注册界面肯定还有个密码确认,这就需要进行中转匹配了。
3、使用ModelDriven(模型驱动)传递参数
1)分析自定义的Action类
-实现了ModelDriven接口,而ModelDriven一个接口,仅含一个TgetModel()方法,则自定义Action必须实现这个getModel()方法
-此时,User对象必须自己去new一个
2)Struts2重点在MVC的M层,即编写自定义的Action去协同Model和View的衔接
3)工作原理:
-Filter类接收到Client传递的参数,然后首先会new一个User对象
-检查Action,发现已实现了ModelDriven接口,然后调用getModel()方法,为返回的Model调用set和get进行封装
-得到User对象的值
4)在浏览器输入:
8080/Struts2_0900_ModelDrivenParamInput/user/user!
age=8,则可跟第一种使用Action属性传参方式的输入形式一样,不再赘述
建立第10个Struts2小项目:
Struts2_1000_CharacterEncoding
1、观察web.xml中的<
的配置
2、观察Struts.xml的配置
说明:
constantname="
struts.i18n.encoding"
value="
GBK"
,即可解决中文乱码问题,但是,Struts2.1.6中存在Bug,所以,在web.xml将filter改为Struts2.0的Filter,即可重新解决中文乱码问题,而使用新的版本Struts2.1.8,则可以顺利修正Struts2.1.6中的Bug,此时web.xml中的<
配置又可以改过来了!
建立第11个Struts2小项目:
Struts2_1100_SimpleDataValiation
1、首先查看struts.xml的文件配置信息
2、直接在自定义的Action内编写验证,如下所示:
因为Action里面不存在request来设置错误信息传递给前台,可以使用如下的方式this.addFieldError(StringfieldName,StringerrorMessage)进行传值
3、查看前台处理错误信息的文件user_add_error.jsp
1)查看源代码
1.<
%@tagliburi="
/struts-tags"
prefix="
s"
%>
可以在对应的Jar包中查找:
struts-2.1.8.1\lib\struts2-core-2.1.8.1\META-INF\struts-tags.tld
2.关于<
s:
debug>
/s:
,以下显示的是ValueContext
建立第12个Struts2小项目:
Struts2_1200_AccessWebElements
如何获取Web元素?
-包括Map类型:
request、ession、application,真实类型:
HttpServletRequest、HttpSession、ServletContext
1、依赖于容器,如以下LoginAction1的源代码:
2、依赖于IoC,最常用的,如以下LoginAction2的源代码:
3、依赖于容器,如以下LoginAction3的源代码:
4、依赖于IoC,如以下LoginAction4的源代码:
5、如何在页面获取request、ession、application?
-这些对象属于ActionContext的内容,访问需要在前面加上“#”
说明:
关于<
,以下显示的ActionContext
6、工作原理(关于LoginAction2)
-Struts2接收来自客户端的请求,然后根据struts.xml文件的Action配置,先new一个LoginAction对象
-检查该LoginAction是否实现了RequestAware接口?
-若实现,则调用setRequest(Map<
String,Object>
request)方法从Filter中读取预先配置的request的,并映射给一个Map类型的request对象
-则execute()即可直接调用得到的Map类型的request
建立第13个Struts2小项目:
Struts2_1300_IncludeModules
1、模块包含,简单的说,就是struts.xml文件的嵌套
-struts.xml如下所示
-login.xml如下所示
建立第14个Struts2小项目:
Struts2_1400_DefaultAction
1、建立默认的Action,可以在浏览器输入访问时不指定Action,或者当访问的Action不存在的时候,均可调用默认的Action,如下图struts.xml的配置:
-浏览器输入:
8080/Struts2_1400_DefaultAction/index,可访问
8080/Struts2_1400_DefaultAction/,可访问
8080/Struts2_1400_DefaultAction/login,可访问
建立第15个Struts2小项目:
Struts2_1500_ResultType
1、Result的类型Type:
包括dispatcher、redirect、chain、redirectAction、freemarker、httpheader、stream(上传下载)、velocity、xslt、plaintext、tiles,参考如下struts.xml的配置:
建立第16个Struts2小项目:
Struts2_1600_GlobalResult
1、关于struts.xml文件的配置:
-<
global-results>
用来配置全局的Result
-extends的作用
建立第17个Struts2小项目:
Struts2_1700_DynamicResult
2、关于UserAction的源代码:
3、在浏览器输入:
8080/Struts2_1700_DynamicResult/user/user?
type=1,返回的Result的结果则是则是/user_success.jsp,即${r}=/user_success.jsp
在浏览器输入:
type=2,返回的Result的结果则是则是/user_error.jsp,即${r}=/user_error.jsp
建立第18个Struts2小项目:
Struts2_1800_ResultWithParams
1、在Action之间forward的时候,不需要重新传递参数,但是,当客户端跳转到jsp页面的时候,就需要重新传递参数,此时,valueStack中因为没有Action,所以没有值的保存;
但是,可以从ActionContext的parameters参数获取传递的值。
2、关于struts.xml文件的配置:
3、关于UserAction的源代码:
3、如何读取?
使用ActionStack的parameters参数读取。
关于user_success.jsp的源代码如下:
建立第19个Struts2小项目:
Struts2_1900_OGNL
1、ObjectGraphNavigationLanguage
2、关于struts.xml配置如下:
3、关于ongl.xml配置如下:
4、如何使用OGNL?
ol>
<
--输出的内容就可以理解为OGNL表达式,如username-->
<
li>
访问值栈中的action的普通属性:
username:
<
propertyvalue="
username"
/>
/li>
访问值栈中的对象的普通属性(getset方法):
user.age:
user.age"
|<
user['
age'
]"
user[\"
age\"
cat.friend.name:
cat.friend.name"
访问值栈中对象的普通方法:
password.length()"
cat.miaomiao()"
访问值栈中action的普通方法:
m()"
hr/>
访问静态方法:
@com.tim.struts2.ognl.S@s()"
访问静态属性:
@com.tim.struts2.ognl.S@STR"
访问Math类的静态方法:
@@max(2,3)"
hr/>
访问普通类的构造方法:
newcom.tim.struts2.ognl.User(8)"
访问List:
users"
访问List中某个元素:
users[1]"
访问List中元素某个属性的集合:
users.{age}"
访问List中元素某个属性的集合中的特定值:
users.{age}[0]"
users[0].age"
访问Set:
dogs"
访问Set中某个元素:
dogs[1]"
访问Map:
dogMap"
访问Map中某个元素:
dogMap.dog101"
dogMap['
dog101'
dogMap[\"
dog101\"
访问Map中所有的key:
dogMap.keys"
访问Map中所有的value:
dogMap.values"
访问容器的大小:
dogMap.size()"
users.size"
--?
表示条件,^表示满足条件的集合中开头的第一个,$表示满足条件的集合中的最后一个-->
投影(过滤):
users.{?
#this.age==1}[0]"
投影:
users.{^#this.age>
1}.{age}"
users.{$#this.age>
1}.{age}==null"
--[]可以从上到下读出valuestack里面存的对象-->