extends="struts-default">
/WEB-INF/fanwan/hello.jsp
/WEB-INF/fanwan/fanwanAdd.jsp
在struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action。
在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。
配置包时必须指定name属性,该name属性值可以任意取名,但必须唯一,他不对应java的类包,如果其他包要继承该包,必须通过该属性进行引用。
包的namespace属性用于定义该包的命名空间,命名空间作为访问该包下的Action的路径的一部分,如访问上面例子的Action,访问路径为:
/test/helloworld.action。
namespace属性可以不配置,对本例而言,如果不指定该属性,默认的命名空间为“”(空字符串)。
通常每个包都应该继承struts-default包,因为Struts2很多核心的功能都是拦截器来实现。
如:
从请求中把请求参数封装到action、文件上传和数据验证等等都是通过拦截器实现的。
struts-default定义了这些拦截器和Result类型。
可以这么说:
当包继承了struts-default才能使用struts2提供的核心功能。
struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定义。
struts-default.xml也是Struts2默认配置文件。
Struts2每次都会自动加载struts-default.xml文件。
包还可以通过abstract=“true”定义为抽象包,抽象包中不能包含action。
将struts2.x放于WEB-INF/class目录下,在开发阶段可将其放在src目录下
3)在web.xml中加入Struts2MVC框架启动配置
在struts1.x中,struts框架是通过Servlet启动的。
在struts2中,struts框架是通过Filter启动的。
他在web.xml中的配置如下:
struts2org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
--自从Struts2.1.3以后,下面的FilterDispatcher已经标注为过时org.apache.struts2.dispatcher.FilterDispatcher-->
struts2
/*
在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。
注意:
struts2读取到struts.xml的内容后,以javabean形式存放在内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件
将Struts2-blank-2.1.2.war复制到tomcat的webapps中,重启Tomcat,系统会自动将其解压,类似地,其他****.war文件亦同。
三、访问struts2.x的Action
在struts1中,通过节点的path属性指定访问该action的URL路径。
在struts2中,情况就不是这样了,访问struts2中action的URL路径由两部份组成:
包的命名空间+action的名称,例如访问本例子HelloWorldAction的URL路径为:
/test/helloworld(注意:
完整路径为:
http:
//localhost:
端口/内容路径/test/helloworld)。
另外我们也可以加上.action后缀访问此Action。
四、Action访问的搜索顺序
1.获得请求路径的URI,例如url是:
http:
//server/struts2/path1/path2/path3/test.action
2.首先寻找namespace为/path1/path2/path3的package,如果存在这个package,则在这个package中寻找名字为test的action,如果不存在这个package则转步骤3;
3.寻找namespace为/path1/path2的package,如果存在这个package,则在这个package中寻找名字为test的action,如果不存在这个package,则转步骤4;
4.寻找namespace为/path1的package,如果存在这个package,则在这个package中寻找名字为test的action,如果仍然不存在这个package,就去默认的namaspace的package下面去找名字为test的action(默认的命名空间为空字符串""),如果还是找不到,页面提示找不到action。
五、Action配置中的各项默认值
/WEB-INF/page/hello.jsp
1>如果没有为action指定class,默认是ActionSupport。
2>如果没有为action指定method,默认执行action中的execute()方法。
3>如果没有指定result的name属性,默认值为success。
六、Action中result的各种转发类型
引言:
在strut1.x中Action转发有两种类型:
1、服务器内部请求转发
2、浏览器重定向
注:
在浏览器重定向不能访问到WEB-INF目录下的试图文件,只能访问WebRoot目录下的试图文件,即浏览器重定向相当于直接访问该路径。
如下案例:
--服务器内部请求转发-->
/index.jsp
--浏览器重定向-->
/index.jsp
在Struts2.x中,
/WEB-INF/page/hello.jsp
result配置类似于struts1中的forward,但struts2中提供了多种结果类型,常用的类型有:
dispatcher(默认值)【服务器内部转发】、redirect【浏览器重定向】、redirectAction【重定向Action】、plainText【显示原始文件内容】。
通过result的type进行指定。
说明:
①、下面是redirectAction结果类型的例子,如果重定向的action中同一个包下:
helloworld
如下例:
extends="struts-default">
class="com.efanwan.strutsdemo.HelloWorldAction"method="execute">
/AddFan.jsp?
username=${username}
/AddFan.jsp?
username=${username}
list
如果重定向的action在别的命名空间下(即不同包下):
重定向action的包1
helloxixi
/fanwan/department
被定向的action的包2
extends="struts-default">
/WEB-INF/fanwan/fanwanAdd.jsp
②、plainText:
显示原始文件内容,例如:
当我们需要原样显示jsp文件源代码的时候,我们可以使用此类型。
/xxx.jsp
UTF-8--指定读取文件的编码-->
③、在result中还可以使用${属性名}表达式访问action中的属性,表达式里的属性名对应action中的属性。
如下:
view.jsp?
id=${id}
如果在result转发传递中文(一般不在url中传递中文),故而需进行URL编码:
username=URLEncoder.encode(“西西稀饭”,”UTF-8”);再进行url传递,如需获取传递的参数可直接是用:
${param.username},但这样获取到的username是乱码的,如需获取显示传递过的中文,需使用:
<%=URLDecoder.decode(newString(request.getParameter(“username”).getBytes(“ISO8859-1”),”UTF-8”))%>(导包.URLDecoder)
注意:
通过EL表达式${}获取Action中属性值,{}中的参数与getXXX或setXXX的“XXX”相同,但第一个字母需要小写!
七、多个Action共享一个试图文件---全局result配置
/index.jsp
若有其他的package中的Action调用这个试图文件,需继承该package,即extends=”base”.
Result的调用是根据Action返回的String与result的name值匹配的。
八、为Action的属性注入值
Struts2为Action中的属性提供了依赖注入功能,在struts2的配置文件中,我们可以很方便地为Action中的属性注入值。
注意:
属性必须提供setter方法。
publicclassHelloWorldAction{
privateStringsavePath;
publicStringgetSavePath(){
returnsavePath;
}
publicvoidsetSavePath(StringsavePath){
this.savePath=savePath;
}
......
}
/images
/WEB-INF/page/hello.jsp
上面通过节点为action的savePath属性注入“/images”
九、指定需要Struts2处理的请求后缀
前面我们都是默认使用.action后缀访问Action。
其实默认后缀是可以通过常量”struts.action.extension“进行修改的,例如:
我们可以配置Struts2只处理以.do为后缀的请求路径:
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http:
//struts.apache.org/dtds/struts-2.0.dtd">
如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。
如:
细说常量定义
常量可以在struts.xml或struts.properties中配置,建议在struts.xml中配置,两种配置方式如下:
在struts.xml文件中配置常量
在struts.properties中配置常量
struts.action.extension=do
因为常量可以在下面多个配置文件中进行定义,所以我们需要了解struts2加载常量的搜索顺序:
struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml
如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值.
常用的常量介绍
--指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法和freemarker、velocity的输出-->
--该属性指定需要Struts2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。
如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。
-->
--设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭-->
--当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开,打开后,每次修改struts文件系统会自动重新加载,故而不需要再重启服务器-->
--开发模式下使用,这样可以打印出更详细的错误信息-->
--默认的视图主题-->
–与spring集成时,指定由spring负责action对象的创建-->
–该属性设置Struts2是否支持动态方法调用,该属性的默认值是true。
如果需要关闭动态方法调用,则可设置该属性为false。
-->