struts2自学完全文档.docx
《struts2自学完全文档.docx》由会员分享,可在线阅读,更多相关《struts2自学完全文档.docx(47页珍藏版)》请在冰点文库上搜索。
struts2自学完全文档
一.Struts2基础知识
1.struts2的特点及配置
1.1struts2与struts1的比较
1)在软件设计上struts2没有struts1那样跟ServletApi和StrutsApi有着紧密的耦合,Struts2的应用可以不因爱ServletApi和StrutsApi.struts2的这种设计属于无侵入式设计,而Struts1却属于侵入式设计
publicclassOrderListActionectendsAction//struts依赖于java
2)Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能
3)Struts2提供了类型转换器,我们可以把特殊的请求参数转换成我们需要的类型,在struts1中,如果我们实现同样的功能,就必须向struts1的底层实现BeanUtil注册类型转换器
4)Struts2提供了支持多种表现层技术,如JSp,freeMarker等
5)Struts2的输入校验可以对指定方法进行校验,解决了Struts的长久之疼
6)提供了全局范围,包范围和Action范围的国际化资源文件管理实现
1.2搭建struts2的开发环境
1)新建web项目
2)导入必要的包
3)写配置文件
Struts2默认的配置文件为Struts.xml,该文件需要存放在WEB-INF/classes下,该文件的配置模板如下(在myeclipse中放在src目录下就可以了)模板在
D:
\ProgramFiles\struts-2.3.4.1-all\struts-2.3.4.1\apps解压struts2-blank.var再打开web-info/classes中的struts.xml文件即可
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.3//EN"
"http:
//struts.apache.org/dtds/struts-2.3.dtd">
4)在web.xml中加入Struts2MVC框架启动配置
在struts1.x中struts框架是通过Servlet启动的,在struts2中,struts框架式通过Filter启动的,他在web.xml中的配置如下:
(D:
\ProgramFiles\struts-2.3.4.1-all\struts-2.3.4.1\apps解压struts2-blank.var再打开Web-Info\web.xml即可)
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
—自从struts2.1.3以后,下面的FilterDispatcher已经标注为过时org.apache.struts2.dispatcher.ng.filter.FilterDispather-->
struts2
/*
在StrutsPrepareAndEXecuteFilter()方法中将会读取类路径下的默认文件struts.xml完成初始化操作。
(注意:
struts2读取到struts.xml的内容后,以javabean形式存放在内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次读取struts.xml文件)
2第一个strut2应用及属性分析
/WEB-INF/page/hello.jsp
2.1Struts.xml中的属性
1)在struts2框架中使用包来管理Action,包的作用和java中的类包是非常的类似的,它主要管理一组业务功能相关的action,在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。
2)配置包时必须指定name属性,该name属性值可以任意的取名,但是必须是唯一的它不对应java的类包,如果其他包要继承该包,必须通过该属性进行引用。
包的namespace属性用于定义该包的命名空间,命名空间作为访问该包下Action的路径的一部分,如访问上面的例子Action,访问路径为/test/helloworld.action.
namespace属性可以不配置,对本例而言,如果不指定该属性,默认命名空间为“”(空字符串)
3)通常每个包都应该继承Struts-default包,因为struts2很多核心的功能都是拦截器实现的。
如:
从请求中把请求参数封装的action,文件上传和数据验证等等都是通过拦截器实现的,struts-default定义了这些拦截器和Result类型.可以这么说:
当包继承了struts-default才能使用struts2提供的核心的功能。
(在struts2-core-2.X.X.jar文件中的struts-default.xml中定义)
4)包还可以通过abstract=“true”定义为抽象包,抽象包中只能被继承不能包含action
5)method为交给谁处理,result用来定义视图的(类似forward)
2.2第一个程序
实现的类
package.hewei.action;
publicclassHellowWorldAction{
privateStringmessage;
publicStringgetMessage(){
//这里一定注意el表达式,是读取的getMessage()中的message
returnmessage;
}
publicStringexecute(){
message="我的第一个struts程序";
return"success";
}
}
struts.xml文件
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.3//EN"
"http:
//struts.apache.org/dtds/struts-2.3.dtd">
/WEB-INF/page/hellow.jsp
hellow.jsp
<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%>
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
MyJSP'hellow.jsp'startingpage${message}
—el表达式根据get方法得到值-->
访问:
http:
//localhost:
8081/MyStruts2/test/helloworld
2.3开发时的一些细节
1)如果在myeclipse中按下alt+/没有提示怎么办
原因:
没有提示是因为/struts-2.3.dtd文件是在网络上的,不连网无法获得
解决方法:
联网或者
●搜索到这个文件的位置
●在myeclipse中点击window/proference/MyEclipce/FilesandEditors/xml/xmlCatalog
●点击add加入location选择dtd的位置,keytype选择url,key输入
http:
//struts.apache.org/dtds/struts-2.3.dtd(structs.xml中)
2.4action名称的搜索顺序
1)获得请求url,例如url是:
http:
//servlet/struts2/path1/path2/path3/test.action
2)首先寻找namespace为/path1/path2/path3的package,如果不存在这个package则执行步骤3;如果存在这个package,则在这个package中寻找名字为test的action,当这个package下寻找不到action时就会直接跑到默认的namespace的package里面去寻找action(默认的命名空间为空的字符串“”),如果在默认的namespace的package里面还寻找不到该action,页面提示找不到action
3)寻找namespace为/path1/path2的package,如果不存在这个package,则到步骤4;如果存在这个package,则在这个package中寻找名字为test的action,当这个package下寻找不到action时就会直接跑到默认的namespace的package里面去寻找action(默认的命名空间为空的字符串“”),如果在默认的namespace的package里面还寻找不到该action,页面提示找不到action
4)寻找namespace为/path1的package,如果不存在这个package,则到步骤4;如果存在这个package,则在这个package中寻找名字为test的action,当这个package下寻找不到action时就会直接跑到默认的namespace的package里面去寻找action(默认的命名空间为空的字符串“”),如果在默认的namespace的package里面还寻找不到该action,页面提示找不到action
5)寻找namespace为/的package,如果不存在这个package,则到步骤4;如果存在这个package,则在这个package中寻找名字为test的action,当这个package下寻找不到action时就会直接跑到默认的namespace的package里面去寻找action(默认的命名空间为空的字符串“”),如果在默认的namespace的package里面还寻找不到该action,页面提示找不到action
2.5action配置的各项默认值
/WEB-INF/page/hellow.jsp
1)
如果没有为action指定的class,默认是ActionSupport
2)如果没有为action指定method,默认执行action中execute()方法。
3)如果没有指定result的那么属性,默认值为“success“
/index.jsp
4)以上代码,访问http:
//localhost:
8081/structs2/test/st会自动转发到index.jsp;
二struts2的视图与常量
1Action中result的各种转发类型
result配置类似于struts2中提供了多种结果类型,常用的类型有:
dispatcher(默认值),redirect,redirectAction,plainText(前面我们的例子是dispatcher)
1.1redirect重定向
1)实现重定向
/index.jsp
//当打开localhost:
8081\test\redirect就会自动重定向到index.jsp
2)实现一个功能,用户注册信息,如果注册失败,就返回到注册页面但是正确的信息任然存在(ognl表达式)
struts2的配置文件为
/regist.jsp?
username=${username}
class为
package.hewei.action;
publicclassRedirectDemo{
privateStringusername;
publicStringgetUsername(){
returnusername;
}
publicStringexecute()
{
this.username="hewei";
return"success";
}
}
注意如果是中文需要:
this.username=URLEncoder.encode("何伟","UTF-8");
在jsp中
<%Strings=request.getParameter("username");
s=newString(s.getBytes("ISO-8859-1"),"UTF-8");
%>
1.2redirectAction
1)转发给action
redirectdemo
2)redirectAction对应类中的方法
setActionName(StringactionName)setNamespace(StringnameSpace)
3)加属性的action重定向
helloworld
test2
//这里重定向到test2/helloworld下,默认在自己的命名空间下
1.3plainText
这个视图可以原样的输出重定向的文件的原有内容
/index.jsp
UTF-8
2.共用视图(全视图)及action注值
2.1全视图的使用
定义全视图:
/index.jsp
调用:
publicclassHellowWorldAction{
privateStringmessage;
publicStringgetMessage(){
returnmessage;
}
publicStringexecute(){
return"message";
}
}
2.2全局视图在整个xml可用
在默认情况下只在同一个包中才可以重定向到全视图,那怎么让所有包都可用全局视图呢
定义:
/index.jsp
使用:
//只要继承包即可
2.3为action的属性注值
/hewei为message属性注入值
/WEB-INF/page/hellow.jsp
package.hewei.action;
publicclassActionDemo{
privateStringmessage;
publicStringgetMessage(){
returnmessage;
}
publicvoidsetMessage(Stringmessage){
this.message=message;
}
publicStringexecute(){
return"success";
}
}
//这里的setMessage必须要有,因为param中的信息是通过set方法存入的
3.struts中的常量和常用信息
3.1修改struts2请求处理后缀
在标签下加入以下代码
//这样后缀hewei,do,action都可以
常量的定义可以定义在:
✓在xml中配置常量如上图:
✓在struts.xml中配置常量
struts.action.extension=do
✓struts2加载常量的顺序
struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml
如果在多个配置文件中配置了同一个常量,那么后面配置的常量会覆盖前面的常量
3.2较常用的常量
3.3struts2的处理流程
3.4为应用指定多个struts文件
在大部分的应用中随着应用规模的增加,系统中的Action的数量也会大量的增加,导致struts.xml配置文件变得非常的臃肿,为了避免struts.xml文件的过于强大,臃肿,提高了struts.xml文件的可读性,我们可以将一个struts.xml配置成对个配置文件,然后在struts、
.xml文件中包含其他的配置文件。
下面的struts.xml通过元素指定多个配置文件
//一般在struts.xml文件中值存放一些配置信息
3.5动态方法调用action(不推荐)
如果action中存放在多个方法时,我们可以使用!
+方法名调用指定的方法
✓类中
package.hewei.action;
publicclassActionDemo2{
privateStringmsg;
publicStringgetMsg(){
returnmsg;
}
publicvoidsetMsg(Stringmsg){
this.msg=msg;
}
publicStringaddUI(){
msg="addUI";
return"success";
}
publicStringexecute(){
msg="execute";
return"success";
}
}
✓配置文件
/WEB-INF/page/hellow.jsp
✓调用
${msg}
✓查看:
http:
//localhost:
8081/MyStr