一、对struts.xml的进一步说明:
1. package不是action对应的包名,只是区分action,防止重名,一般以模块来命名。
2. namespace决定了action的访问路径,默认为"",可以接收所有路径的action。
namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action,xxx/index.action,/xxx/yyy/index.action ,namespace最好也用模块来命名。
namespace不写,默认代表namespace="",一个请求,只要namespace从struts.xml匹配不到的,但action能匹配到,都会用该默认的namespace对应的action来处理。
一般用下面这个package来处理其他package处理不了的action:
<package name="main" namespace="" extends="struts-default"> <action name="index"> <result> /xxx.jsp </result> </action> </package>
这里http://host:8080/projectName/xxxx/hello ,http://host:8080/projectName/xxxx/fdaf/hello等写法都可以跳转到xxx.jsp,只要对应action正确匹配。
3.result节点name属性不写,默认代表name="success"。
二、第二个程序strtus_Action示例:
1.jsp默认编码格式改为chinese, National Standard (window > perference > jsp >...),编码格式GB18030.
2.新建一个UserAction.java:
public class UserAction extends ActionSupport{ //org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter f; public String add() throws Exception { return "add_success"; } public String del() throws Exception { return "del_success"; } public String modify() throws Exception { return "modify_success"; } }
2.sturts.xml:
<!-- Add packages here --> <constant name="struts.devMode" value="true" /> <constant name="struts.i18n.encoding" value="GBK" /> <package name="user" namespace="/action" extends="struts-default"> <action name="*_*" class="com.wyx.user.action.{1}Action" method="{2}"> <result name="{2}_success"> /{1}_{2}_success.jsp </result> </action> </package>
action标签下的class是action对应的类,包名下的完整路径,这里用到的{1}{2}为占位符、*为通配符,这样做的好处很明显,所有这个模块下的action都可以用着一个package来管理,很方便。但是一定要注意action和jsp文件的命名规范,{1}指的是action的类,类名首字母都是要大写,{2}指的是方法名,配置后,所有.../projectName/action/*_*格式的请求都会被这个action标签匹配到。所以action中所有方法的返回值、所有jsp页面的名字,都是根据action的名字和方法名为依据命名的,观察UserAction中的方法名字及其返回值与工程目录的关系,就明白了。
客户端请求示例:
<body> <a href="<%=basePath%>action/User_add.action">添加好友</a> <a href="<%=basePath%>action/User_del.action">删除好友</a> <a href="<%=basePath%>action/User_modify.action">修改好友</a> </body>