尚学堂科技马士兵Struts2学习小结v10.docx
《尚学堂科技马士兵Struts2学习小结v10.docx》由会员分享,可在线阅读,更多相关《尚学堂科技马士兵Struts2学习小结v10.docx(32页珍藏版)》请在冰豆网上搜索。
![尚学堂科技马士兵Struts2学习小结v10.docx](https://file1.bdocx.com/fileroot1/2022-12/11/490ecbb8-770c-48d9-a68c-979f1e8aa450/490ecbb8-770c-48d9-a68c-979f1e8aa4501.gif)
尚学堂科技马士兵Struts2学习小结v10
建立第1个Struts2小项目:
Struts2_0100_Introduction
1.拷贝struts-2.1.8.1\apps\struts2-blank-2.1.8.1\WEB-INF\classes\struts.xml至项目的源文件夹src目录下
2.拷贝struts-2.1.8.1\apps\struts2-blank-2.1.8.1\WEB-INF\lib下的所有jar文件至
/Struts2_0100_Introduction/WebRoot/WEB-INF/lib目录
3.修改web.xml文件如下(从struts-2.1.8.1\apps\struts2-blank-2.1.8.1\WEB-INF\web.xml拷贝的):
4.修改struts.xml文件如下:
5.在浏览器输入
http:
//localhost:
8080/Strtus2_0100_Introduction/hello.action,即可输出Hello.jsp的内容
6.如何为jar包中的class文件建立源码以及javadoc?
-选择jar包,右击选择Properties
-建立源代码目录
-建立javadoc目录
-建立一个java文件,选择其中的一个类,按F1键即可弹出对应类的javadoc
7.如何struts.xml自动提示?
-解压struts-2.1.8.1\lib\struts2-core-2.1.8.1.jar
-得到我们修改struts.xml的参照:
struts-2.1.8.1\lib\struts2-core-2.1.8.1\struts-2.0.dtd
-Key:
http:
//struts.apache.org/dtds/struts-2.0.dtd
-Window\Preferences
8.struts2工作原理:
将请求与显示相分离
建立第2个Struts2小项目:
Struts2_0200_Namespace
1、关于Namespace的小结,修改struts.xml如下:
2、copy项目的时候,如copy项目Struts2_0200_Namespace为项目T,则右键选择properties,需要修改:
3、如何导入项目?
1)右击选择Import…
2)必须勾选“Copyprojectsintoworkspace”
3)唯一可能出现的问题:
拷贝项目的JRESystemLibrary的存储路径,重新ConfigureBuildPath即可
建立第3个Struts2小项目:
Struts2_0300_Action
1、关于Action的详述
1)如果不包含class属性,则会自动默认调用
-xwork-core-2.1.6.jar
-com.opensymphony.xwork2.ActionSupport
●ActionSupportimplementsAction
●Action是一个含publicStringexecute()方法的接口
-这个class必须含publicStringexecute()方法
2)如果不包含name属性,则会自动默认设置name="success";否则name等于execute()方法的返回值
3)如何编写一个Action的类?
-含execute()方法的普通类
-implementsAction接口的类,则必须实现execute()方法
-extendsActionSupport的类
2、重申Struts2的工作原理
1)client提交一个客户端请求
2)服务器接收到这个请求后,会根据web.xml中的寻找,调用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+"/";
%>
--设置base标签,当前页面的所有超链接前面都会自动加上basePath-->
"/>
index.jsp
建立第5个Struts2小项目:
Struts2_0500_ActionMethod
1、可以为Action指定method属性,而class属性的类UserAction中只有一个add()方法
1)输入http:
//localhost:
8080/Struts2_0500_ActionMethod/user/userAdd,则根据userAdd的method方法调用class属性类中相应方法
2)输入http:
//localhost:
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:
//localhost:
8080/Struts2_0600_ActionWildcard/actions/Studentadd,*会匹配add,而{1}则匹配出现的第一个*
输入http:
//localhost:
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)
-在浏览器中输入:
http:
//localhost:
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中的属性和方法
-在浏览器中输入:
http:
//localhost:
8080/Struts2_0800_DomainModelParamInput/user/user!
add?
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)在浏览器输入:
http:
//localhost:
8080/Struts2_0900_ModelDrivenParamInput/user/user!
add?
name=a&age=8,则可跟第一种使用Action属性传参方式的输入形式一样,不再赘述
建立第10个Struts2小项目:
Struts2_1000_CharacterEncoding
1、观察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_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.关于debug>
debug>,以下显示的是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的内容,访问需要在前面加上“#”
说明:
关于debug>
debug>,以下显示的ActionContext
6、工作原理(关于LoginAction2)
-Struts2接收来自客户端的请求,然后根据struts.xml文件的Action配置,先new一个LoginAction对象
-检查该LoginAction是否实现了RequestAware接口?
-若实现,则调用setRequest(Maprequest)方法从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的配置:
-浏览器输入:
http:
//localhost:
8080/Struts2_1400_DefaultAction/index,可访问
-浏览器输入:
http:
//localhost:
8080/Struts2_1400_DefaultAction/,可访问
-浏览器输入:
http:
//localhost:
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文件的配置:
说明:
-用来配置全局的Result
-extends的作用
建立第17个Struts2小项目:
Struts2_1700_DynamicResult
1、关于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_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?
--输出的内容就可以理解为OGNL表达式,如username-->
- 访问值栈中的action的普通属性:
username:
propertyvalue="username"/>
- 访问值栈中的对象的普通属性(getset方法):
user.age:
propertyvalue="user.age"/>|propertyvalue="user['age']"/>|propertyvalue="user[\"age\"]"/>
- 访问值栈中的对象的普通属性(getset方法):
cat.friend.name:
propertyvalue="cat.friend.name"/>
- 访问值栈中对象的普通方法:
propertyvalue="password.length()"/>
- 访问值栈中对象的普通方法:
propertyvalue="cat.miaomiao()"/>
- 访问值栈中action的普通方法:
propertyvalue="m()"/>
- 访问静态方法:
propertyvalue="@com.tim.struts2.ognl.S@s()"/>
- 访问静态属性:
propertyvalue="@com.tim.struts2.ognl.S@STR"/>
- 访问Math类的静态方法:
propertyvalue="@@max(2,3)"/>
- 访问普通类的构造方法:
propertyvalue="newcom.tim.struts2.ognl.User(8)"/>
- 访问List:
propertyvalue="users"/>
- 访问List中某个元素:
propertyvalue="users[1]"/>
- 访问List中元素某个属性的集合:
propertyvalue="users.{age}"/>
- 访问List中元素某个属性的集合中的特定值:
propertyvalue="users.{age}[0]"/>|propertyvalue="users[0].age"/>
- 访问Set:
propertyvalue="dogs"/>
- 访问Set中某个元素:
propertyvalue="dogs[1]"/>
- 访问Map:
propertyvalue="dogMap"/>
- 访问Map中某个元素:
propertyvalue="dogMap.dog101"/>|propertyvalue="dogMap['dog101']"/>|propertyvalue="dogMap[\"dog101\"]"/>
- 访问Map中所有的key:
propertyvalue="dogMap.keys"/>
- 访问Map中所有的value:
propertyvalue="dogMap.values"/>
- 访问容器的大小:
propertyvalue="dogMap.size()"/>|propertyvalue="users.size"/>
--?
表示条件,^表示满足条件的集合中开头的第一个,$表示满足条件的集合中的最后一个-->
- 投影(过滤):
propertyvalue="users.{?
#this.age==1}[0]"/>
- 投影:
propertyvalue="users.{^#this.age>1}.{age}"/>
- 投影:
propertyvalue="users.{$#this.age>1}.{age}"/>
- 投影:
propertyvalue="users.{$#this.age>1}.{age}==null"/>
--[]可以从上到下读出valuestack里面存的对象-->