您的位置:首页 > 编程语言 > Java开发

struts2基础(续)

2014-02-27 21:23 337 查看
昨天发表完第一篇博客之后就停电了,今天就让我赶紧把昨天学习的东西继续拿来分享。

闲话不多说,昨天只是演示了一个最基础的struts2框架的小知识,那么接下来就让我介绍一下关于struts2的细节。

首先让我们来看一个重要的属性:namespace

我们知道,这个属性是在struts.xml文件<package>中,其作用是定义该包的命名空间。命名空间可以用来区别同名的Action。在一个命名空间内Action名必须是唯一的。但是不同的命名空间中可以用同名的Action。

如果某个包没有指定namespace,则该包使用默认的命名空间,默认的命名空间总是“”。

namespace决定了action的访问路径,默认为“”,可以接受所有路径的action。

namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/(action的name值).aciton,/xxx/(action的name值).aciton,/xxx/yyy/ (action的name值).action

namespace最好用模块来进行命名(这样就是更好的为了确定模块的作用,更明确)

再来看看Action配置中的各项默认值:
代码示例:



解释:

1>如果没有为action指定class,默认是ActionSupport。

2>如果没有为action指定method,默认执行action中的execute()方法。
3>如果没有指定result的name属性,默认值为success
为了测试Action中存在的多个方法,我们程序员可以使用!+方法名调用指定方法,如下:
public class HelloWorldAction{
private String message;
....
public String execute() throws Exception{
this.message = "我的第一个struts2应用";
return "success";
}

public String other() throws Exception{
this.message = "第二个方法";
return "success";
}
注:

假设访问上面action的URL路径为:/struts/test/helloworld.action
要访问action的other() 方法,我们可以这样调用:
/struts/test/helloworld!other.action
如果不想使用动态方法调用,我们可以通过常量struts.enable.DynamicMethodInvocation关闭动态方法调用。
<constantname="struts.enable.DynamicMethodInvocation"value="false"/>
效果:
那么就会在页面上显示“第二个方法”
提示:
这种调用方式会带来安全隐患,所以在struts2版本2.3.15.2之后就不能使用DMI动态调用方法
默认的action
如果请求一个不存在的action,结果将是HTTP404错误,可以指定一个默认的action,如果一个请求没有其他的action匹配,那么默认的action将被执行。 默认的action使用default-action-ref元素来声明:
源代码:

<package name="defaultAction" namespace="/default“ extends="struts-default">
<default-action-ref name="error"></default-action-ref>
<action name="defaultaction“ class="org.lesson05.DefaultAction">
<result name="success">/defaultAction.jsp</result>
</action>
<action name="error">
<result>/error.jsp</result>
</action>
</package>
解释:

我来大致解释一下配置这个的作用,比如我们开发的系统可能正在维护或者升级,我们的客户访问不到他们想访问的页面,而我们不能把报404错误的页面反馈给用户,那样会给用户留下极差的印象。所以我们可以单独设计一个错误页面,里面设置我们想要反馈给用户的信息,这样就可以将用户的意见大大降低。
多个Action共享一个视图--全局result配置
当多个action中都使用到了相同视图,这是我们应该把result定义为全局视图。struts提供了全局forward,struts2中也提供了相似功能:
源代码:

<package ....>
<global-results>
<result name="message">/message.jsp</result>
</global-results>
</package>
解释:

这里就是简化代码的最经典的反映,多个action共享同一个视图。


为Action的属性注入值

Struts2为Action中的属性提供了依赖注入功能,在struts2的配置文件中,我们可以很方便地为Action中的属性注入值。注意:属性必须提供setter方法。如下:
源代码:
Java类
public class HelloWorldAction{
private String savePath;

public String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
......
}

struts.xml
<package name="itcast" namespace="/test" extends="struts-default">
<action name="helloworld" class="cn.itcast.action.HelloWorldAction" >
<param name="savePath">/images</param>
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</package>
解释:

上面通过<param>节点为action的savePath属性注入“/images”

指定需要Struts2处理的请求后缀

¨前面我们都是默认使用.action后缀访问Action。其实默认后缀是可以通过常量”struts.action.extension“进行修改的,例如:我们可以配置Struts2只处理以.do为后缀的请求路径:
源代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.action.extension" value="do"/>
</struts>
补充:

如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。如:

<constant name="struts.action.extension" value="do,go"/>


解释:
这样做更多的是让我们清楚每个模块的层次,更容易分清作用。
为应用指定多个struts配置文件

在大部分应用里,随着应用规模的增加,系统中Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿。为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。下面的struts.xml通过<include>元素指定多个配置文件:

源代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-user.xml"/>
<include file="struts-order.xml"/>
</struts>


解释:
通过这种方式,我们就可以将Struts2的Action按模块添加在多个配置文件中

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: