在src目录下创建一个struts.xml文件
<?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>
<!-- struts基本配置内容 -->
<!--
package:包,struts2使用package来组织模块。
package-name:必须,用于区别不同的package;必须是唯一的、可用的变量名;用于其它package来继承;
package-namespace:可选,如果它没有给出,则以/为默认值
若namespace有一个非默认值,则要想调用这个包里的Action,
就必选把这个属性所定义的命名空间添加到有关的URL字符串里
例:http:/localhost:8080/contextPath/namespace/actionName.action
package-extends:当前包继承哪个包,即可以继承其中的所有的配置。
通常情况下继承struts-default
struts-default这个包在struts-default.xml文件中定义
-->
<package name="struts" namespace="" extends="struts-default">
<!--
配置一个action:一个struts2的请求就是一个action
action-name:用于在一个package里区别不同的action;必须是唯一的、可用的变量名;
是调用action时输入路径的组成部分;
对应一个struts2的请求的名字(或对一个servletPath,但去除/和扩展名)不包含扩展名
action-class:action所在的路径(包名+类名);默认值为:com.opensymphony.xwork2.ActionSupport,可不写
action-method:action所调用的方法名; 默认执行execute,所以execute可以不写
result:结果
-->
<action name="product-input" class="com.opensymphony.xwork2.ActionSupport" method="execute">
<!--
result:结果。表示action方法执行后可能返回的一个结果,所以一个action结点可能会有多个result子节点,
多个result子节点使用name来区分
name:标识一个result和action方法的返回值对应,默认值为success(可不写)
type:表示结果的类型。默认值为dispatcher(转发到结果)
-->
<result name="success" type="dispatcher">/WEB-INF/pages/input.jsp</result>
</action>
<action name="product-save" class="actionbao.Product" method="save">
<result name="details">/WEB-INF/pages/details.jsp</result>
</action>
</package>
</struts>
详解:
- namespace属性
默认namespace=”“,所以在访问该Action时,直接http://localhost:8080/应用名称/login.action就可以请求到该Action。
当namespace=”/abc”时,再访问该Action时,其URL应为:http://localhost:8080/应用名称/abc/login.action。
这样在大型项目中有很多个Action时容易分类区分。
问题:如果namespace=”“,此时用http://localhost:8080/应用名称/abc/login.action访问该Action,会不会成功?
答案是:会。因为当程序找不到相应的namespace时,它会自动去默认的namespace中去找Action。 - ActionSupport 是默认的 Action 类
若某个 action 节点没有配置 class 属性, 则 ActionSupport 即为待执行的 Action 类. 而 execute 方法即为要默认执行的 action 方法,Action动作处理后返回值为success也是默认执行的路径,还有如下值
例:<action name="testActionSupport" class="com.opensymphony.xwork2.ActionSupport" method="execute"> <result name="success">/testActionSupport.jsp</result> </action> 等同于 <action name="testActionSupport"> <result>/testActionSupport.jsp</result> </action>
- struts2请求的扩展名问题
1.默认的请求扩展名为 action 或 为空。
即上面两种写法都会被struts.xml中对应的action所处理
Struts2请求的扩展名默认设置在:
2.如果是如下方式就会报错
解决方式:如果要修改Struts2请求的扩展名可以在struts.xml中配置,如下:
此时,struts2请求的扩展名就只能是action 或者 do 了,修改其他常量值,于此类似。 - 通配符映射
一个 Web 应用可能有成百上千个 action 声明. 可以利用 struts 提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系- 实例
如:<action name="czy_save" class="com.test.struts2Test" method="save"> <result name="save">/WEB-INF/page/save.jsp</result> </action> <action name="czy_update" class="com.test.struts2Test" method="update"> <result name="update">/WEB-INF/page/update.jsp</result> </action> <action name="czy_delete" class="com.test.struts2Test" method="delete"> <result name="delete">/WEB-INF/page/delete.jsp</result> </action> <action name="czy_get" class="com.test.struts2Test" method="get"> <result name="get">/WEB-INF/page/get.jsp</result> </action>
下面和上面配置的效果相同
<action name="czy_*" class="com.test.struts2Test" method="{1}"> <result name="{1}">/WEB-INF/page/{1}.jsp</result> </action>
- 通配符映射规则
- 若找到多个匹配, 没有通配符的那个将胜出
<action name="czy_*" class="com.test.struts2Test" method="{1}"> <result name="{1}">/WEB-INF/page/{1}.jsp</result> </action> <!-- 如果请求 /czy_get.action 将会执行没有通配符的 name="czy_get" 的action --> <action name="czy_get" class="com.test.struts2Test" method="get"> <result name="get">/WEB-INF/page/get.jsp</result> </action>
- 若指定的动作不存在, Struts 将会尝试把这个 URI 与任何一个包含着通配符 * 的动作名及进行匹配
可见,uri匹配时是先精确匹配的,精确匹配不上时,再来对包含有通配符*的action进行匹配。 - 被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 来引用. {1} 匹配第一个子串, {2} 匹配第二个子串....
<!-- 当请求是 /czy_save_show.action 时,就会调用struts2Ttest.java 中的save方法,当返回值为"save"时,会转发到 /WEB-INF/page/show.jsp--> <action name="czy_*_*" class="com.test.struts2Ttest" method="{1}"> <result name="{1}">/WEB-INF/page/{2}.jsp</result> </action>
- {0} 匹配整个 URI
<!-- 若请求是 /czy_save 时,将会调用 Struts2Test.java 的czy_save方法 --> <action name="czy_*" class="com.test.Struts2Test" method="{0}"> <result name="ok">/WEB-INF/page/Show.jsp</result> </action>
- 若 Struts 找到的带有通配符的匹配不止一个, 则按先后顺序进行匹配
<!-- 若请求是 /czy_save_show 将会调用 name="czy_*" 的action --> <action name="czy_*" class="com.test.Struts2Test" method="{1}"> <result name="{1}">/WEB-INF/page/{1}.jsp</result> </action> <action name="czy_*_*" class="com.test.Struts2Test" method="{1}"> <result name="{1}">/WEB-INF/page/{2}.jsp</result> </action>
<!-- 若请求是 /czy_save_show 将会调用 name="czy_*_*" 的action --> <action name="czy_*_*" class="com.test.Struts2Test" method="{1}"> <result name="{1}">/WEB-INF/page/{2}.jsp</result> </action> <action name="czy_*" class="com.test.Struts2Test" method="{1}"> <result name="{1}">/WEB-INF/page/{1}.jsp</result> </action>
- 可以匹配零个或多个字符, 但不包括 / 字符. 如果想把 / 字符包括在内, 需要使用 **. 如果需要对某个字符进行转义, 需要使用\.**
- 若找到多个匹配, 没有通配符的那个将胜出
- 实例
- result
- result 是 action 节点的子节点
- result 代表 action 方法执行后, 可能去的一个目的地
- 一个 action 节点可以配置多个 result 子节点.
- result 的 name 属性值对应着 action 方法可能有的一个返回值.
- result 一共有 2 个属性, 还有一个是 type: 表示结果的响应类型
- type常用的有值有:
- dispatcher(默认的): 转发. 同 Servlet 中的转发
注意:注意: 不能通过 type=dispatcher 的方式转发到一个 Action<!-- 会报 404 异常 --> <result name="test">/user/testAction.do</result>
- redirect: 重定向
<result name="index" type="redirect">/atguigu/testAction.action</result>
注意:通过 redirect 的响应类型也可以便捷的实现 redirectAction 的功能!
- redirectAction: 重定向到一个 Action
<!-- 结果返回"index"之后,将会重定向到 package中 namespace="/user" 且其中的 action的 name="testAction" --> <result name="index" type="redirectAction"> <param name="namespace">/user</param> <param name="actionName">testAction</param> </result>
- chain: 转发到一个 Action
<result name="test" type="chain"> <param name="namespace">/user</param> <param name="actionName">testAction</param> </result>
- dispatcher(默认的): 转发. 同 Servlet 中的转发
- type常用的有值有:
- result 的 type 属性值在 struts-default 包的 result-types 节点的 name 属性中定义.