2. 调用逻辑处理
3. 搜集数据,并返回到视图
Struts2把执行结果抽象成一个层次,使得开发人员可以不再关注许多视图整合上面的细节,只需要考虑视图的类型和数据的准备,这样,开发人员就不必在沉浸在杂乱的构造视图的代码中。
Action名称的搜索顺序
1.获得请求路径的URI,例如url是:http://server/struts2/path1/path2/path3/test.action
2.首先寻找namespace为/path1/path2/path3的package,如果不存在这个package则执行步骤3;如果存在这个package,则在这
个package中寻找名字为test的action,当在该package下寻找不到action时就会直接跑到默认namaspace的package里面去寻找
action(默认的命名空间为空字符串“” ),如果在默认namaspace的package里面还寻找不到该action,页面提示找不到action
3.寻找namespace为/path1/path2的package,如果不存在这个package,则转至步骤4;如果存在这个package,则在这
个package中寻找名字为test的action,当在该package中寻找不到action时就会直接跑到默认namaspace的package里面去找名字
为test的action,在默认namaspace的package里面还寻找不到该action,页面提示找不到action
4.寻找namespace为/path1的package,如果不存在这个package则执行步骤5;如果存在这个package,则在这个package中寻找
名字为test的action,当在该package中寻找不到action时就会直接跑到默认namaspace的package里面去找名字为test的action,在
默认namaspace的package里面还寻找不到该action,页面提示找不到action
5.寻找namespace为/的package,如果存在这个package,则在这个package中寻找名字为test的action,当在package中寻找不
到action或者不存在这个package时,都会去默认namaspace的package里面寻找action,如果还是找不到,页面提示找不到action。
Action配置中的各项默认值
<packagename="itcast"namespace="/test"extends="struts-default">
<action name="helloworld"class="cn.itcast.action.HelloWorldAction"method="execute" >
<resultname="success">/WEB-INF/page/hello.jsp</result>
</action>
</package>
1>如果没有为action指定class,默认是ActionSupport。
2>如果没有为action指定method,默认执行action中的execute()方法。
3>如果没有指定result的name属性,默认值为success。
String SUCCESS ="success"; //默认是 SUCCESS 类型
String NONE ="none";
String ERROR ="error";
String INPUT ="input";
String LOGIN ="login";
ActionSupport常用方法:
getText(String aTextName);//国际化用到
...//getText(String aTextName)的重载方法
addActionMessage(String aMessage);
addFieldError(String fieldName, String errorMessage);
//校验失败后返回给客户端的信息,struts2标签<s:fielderror key=/>可以取得
addActionError(String anErrorMessage);
<action name="r1"class="R1">
<result name="success"type="chain">r2</result>
</action>
<action name="r2" class="R2">
<result name="success"type="dispatcher">/1.jsp</result>
</action>
<result type="redirectAction">
<param name="actionName">helloworld</param>
<paramname="namespace">/test</param>
<paramname="method">method123</param>
</result>
多个Action共享一个视图--全局result配置
当多个action中都使用到了相同视图,这时我们应该把result定义为全局视图。struts1中提供了全局forward,struts2中也提供了相似功能:
<package....>
<global-results>
<result name="message">/message.jsp</result>
</global-results>
</package>
为Action的属性注入值(配置参数)
Struts2为Action中的属性提供了依赖注入(DI)功能,在struts2的配置文件中,我们可以很方便地为Action中的属
性注入值。注意:属性必须提供setter方法。
public class HelloWorldAction{
private String savePath;
public String getSavePath() {
return savePath;
}
public void setSavePath(StringsavePath) {
this.savePath =savePath;
}
......
}
<packagename="itcast"namespace="/test" extends="struts-default">
<action name="helloworld"class="cn.itcast.action.HelloWorldAction" >
<param name="savePath">/images</param>
<resultname="success">/WEB-INF/page/hello.jsp</result>
</action>
</package>
上面通过<param>节点为action的savePath属性注入“/images”
Struts 2处理的请求后缀
前面我们都是默认使用.action后缀访问Action。其实默认后缀是可以通过常量”struts.action.extension“进行修改的,例如:我们可以配
置Struts 2只处理以.do为后缀的请求路径:
<?xmlversion="1.0" encoding="UTF-8"?>
<!DOCTYPEstruts PUBLIC
"-//Apache Software Foundation//DTDStruts 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.xml或struts.properties中配置,建议在struts.xml中配置,两种配置方式如下:
在struts.xml文件中配置常量
<struts>
<constant name="struts.action.extension" value="do"/>
</struts>
在struts.properties中配置常量
struts.action.extension=do
因为常量可以在下面多个配置文件中进行定义,所以我们需要了解struts2加载常量的搜索顺序:
struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml
如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值.
常用的常量介绍
<!-- 指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出 -->
<constantname="struts.i18n.encoding" value="UTF-8"/>
<!-- 该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理
struts.action.extension
如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。-->
<constant name="struts.action.extension"value="do"/>
<!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭-->
<constant name="struts.serve.static.browserCache"value="false"/>
<!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开-->
<constant name="struts.configuration.xml.reload"value="true"/>
<!-- 开发模式下使用,这样可以打印出更详细的错误信息-->
<constant name="struts.devMode"value="true" />
<!-- 默认的视图主题-->
<constant name="struts.ui.theme"value="simple" />
<!– 与spring集成时,指定由spring负责action对象的创建-->
<constant name="struts.objectFactory"value="spring" />
<!–该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。-->
<constantname="struts.enable.DynamicMethodInvocation"value="false"/>
<!--上传文件的大小限制-->
<constantname="struts.multipart.maxSize"value=“10701096"/>
为应用指定多个struts配置文件
在大部分应用里,随着应用规模的增加,系统中Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿。为了避
免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后
在struts.xml文件中包含其他配置文件。下面的struts.xml通过<include>元素指定多个配置文件:
<?xmlversion="1.0" encoding="UTF-8"?>
<!DOCTYPEstruts PUBLIC
"-//Apache Software Foundation//DTDStruts 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>
通过这种方式,我们就可以将Struts 2的Action按模块添加在多个配置文件中。
注意:用<include>引用的xml文件也必须是完整的struts2的配置。实际上<include>在引用时是单独解析的xml文件,而不是将被引用的文件插入到struts.xml文件中
<actionname="test" class="action.MyAction">
</action>
<actionname="my" class="action. MyAction" method="my">
</action>
动态方法调用
如果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"/>
使用通配符定义action
<packagename="itcast"namespace="/test" extends="struts-default">
<action name="helloworld_*"class="cn.itcast.action.HelloWorldAction"method="{1}">
<resultname="success">/WEB-INF/page/hello.jsp</result>
</action>
</package>
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";
}
}
要访问other()方法,可以通过这样的URL访问:/test/helloworld_other.action