一、result
1). result 是 action 节点的子节点
2). result 代表 action 方法执行后, 可能去的一个目的地
3). 一个 action 节点可以配置多个 result 子节点.
4). result 的 name 属性值对应着 action 方法可能有的一个返回值.
<result name="index">/index.jsp</result>
5). result 一共有 2 个属性, 还有一个是 type: 表示结果的响应类型
6). result 的 type 属性值在 struts-default 包的 result-types 节点的 name 属性中定义.
常用的有
- dispatcher(默认的): 转发. 同 Servlet 中的转发.
- redirect: 重定向
- redirectAction: 重定向到一个 Action
<result name="index" type="redirectAction">
<param name="actionName">testAction</param>
<param name="namespace">/test</param>
</result>
或者<result name="index" type="redirect">/test/testAction.do</result>
<ul><li><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">chain: 转发到一个 Action</span></li></ul>
注意: 不能通过 type=dispatcher 的方式转发到一个 Action只能是:
<result name="test" type="chain">
<param name="actionName">testAction</param>
<param name="namespace">/test</param>
</result>
不能是:
<result name="test">/atguigu/testAction.do</result>
<action name="testResult" class="com.weixuan.structs2.TestResult">
<result name="success" type="dispatcher">/login-success.jsp</result>
<result name="login" type="redirect">/Login.jsp</result>
</action>
二、通配符
这个通配符是指通配符映射
一个 Web 应用可能有成百上千个 action 声明. 可以利用 struts 提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系
通配符映射规则
- 若找到多个匹配, 没有通配符的那个将胜出
- 若指定的动作不存在, Struts 将会尝试把这个 URI 与任何一个包含着通配符 * 的动作名及进行匹配
- 被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 来引用. {1} 匹配第一个子串, {2} 匹配第二个子串…
- {0} 匹配整个 URI
- 若 Struts 找到的带有通配符的匹配不止一个, 则按先后顺序进行匹配
- * 可以匹配零个或多个字符, 但不包括 / 字符. 如果想把 / 字符包括在内, 需要使用 **. 如果需要对某个字符进行转义, 需要使用 \.
三、项目代码
structs.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 配置structs2 可以受理的请求的扩展名 使用constant来设置 -->
<constant name="structs.action.extension" value="action,do,"></constant>
<package name="loginUI" namespace="/" extends="struts-default">
<action name="login-ui">
<result>/Login.jsp</result>
</action>
<action name="userlogin" class="com.weixuan.structs2.UserLogin">
<result name="login-success">/login-success.jsp</result>
</action>
<action name="logout" class="com.weixuan.structs2.UserLogin"
method="logout">
<result name="logout-success">/Login.jsp</result>
</action>
<action name="testResult" class="com.weixuan.structs2.TestResult">
<result name="success" type="dispatcher">/login-success.jsp</result>
<result name="login" type="redirect">/Login.jsp</result>
</action>
<!-- 普通的写法 ,为每一个action注册 -->
<!--
<action name="userAction-save" class="com.weixuan.structs2.UserAction"
method="save">
<result name="savesuccess">/save.jsp</result>
</action>
<action name="userAction-delete" class="com.weixuan.structs2.UserAction"
method="delete">
<result name="deletesuccess">/delete.jsp</result>
</action>
<action name="userAction-update" class="com.weixuan.structs2.UserAction"
method="update">
<result name="updatesuccess">/update.jsp</result>
</action>
<action name="userAction-query" class="com.weixuan.structs2.UserAction"
method="query">
<result name="querysuccess">/query.jsp</result>
</action> -->
<!-- 通配符的写法 -->
<action name="userAction-*" class="com.weixuan.structs2.UserAction" method="{1}">
<result name="{1}success">/{1}.jsp</result>
</action>
</package>
</struts>
action类package com.weixuan.structs2;
public class UserAction {
//这是一个action类
//普通情况下,需要在structs.xml中注册四个action结点
public String save() {
System.out.println("save");
return "savesuccess";
}
public String delete() {
System.out.println("delete");
return "deletesuccess";
}
public String update() {
System.out.println("update");
return "updatesuccess";
}
public String query() {
System.out.println("query");
return "querysuccess";
}
}
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<a href="login-ui.action">Login in</a>
<br>
<br>
<br>
<br>
<a href="userAction-save.action">user save</a>
<br>
<br>
<br>
<br>
<a href="userAction-delete.action">user delete</a>
<br>
<br>
<br>
<br>
<a href="userAction-update.action">user update</a>
<br>
<br>
<br>
<br>
<a href="userAction-query.action">user query</a>
<br>
<br>
<br>
<br>
</body>
</html>