背景
GlobalResult要实现的情况是不同的action之间都能使用一个公共result的问题。在现实项目中不仅于此。例如,实际的用户登录系统,有很多个模块,但是这样模块其实可能是有公共的result的,如果发生错误是的error.jsp。在servlet中,我们一般都是每遇到一次错误就写一句错误跳转。这样会使得代码有些冗余,这个GlobalResult就可以解决这个问题。除了GlobalResult,本小节还要解决一个package属性,extends的问题。
GlobalResult
1. 分析与结果
本文是以结果导向分析的方式进行的。
首先先看index.jsp的页面及代码
index.jsp
<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<% String context = request.getContextPath(); %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>Insert title here</title>
</head>
<body>
Result类型
<ol>
<li><a href="user/user?type=1">返回success</a></li>
<li><a href="user/user?type=2">返回error</a></li>
<li><a href="user/user?type=3">返回global result</a></li>
<li><a href="admin/admin">admin,继承user包</a></li>
</ol>
</body>
</html>
从代码分析可以看出
<li><a href="user/user?type=1">返回success</a></li>
<li><a href="user/user?type=2">返回error</a></li>
<li><a href="user/user?type=3">返回global result</a></li>
这三行超链接的名称空间为/user,action也是user。参数名称type,参数值是1,2,3。
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>
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<global-results>
<result name="mainpage">/main.jsp</result>
</global-results>
<action name="index">
<result>/index.jsp</result>
</action>
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_success.jsp</result>
<result name="error">/user_error.jsp</result>
</action>
</package>
<package name="admin" namespace="/admin" extends="user">
<action name="admin" class="com.bjsxt.struts2.user.action.AdminAction">
<result>/admin.jsp</result>
</action>
</package>
</struts>
从下面这段代码,
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_success.jsp</result>
<result name="error">/user_error.jsp</result>
</action>
可以得到,这个名称空间为/user,action为user的Action为UserAction,其中有两个result一个是success,跳转到user_success.jsp。一个是error,跳转到user_error.jsp。
UserAction
package com.bjsxt.struts2.user.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private int type;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String execute() throws Exception {
if(type == 1) return "success";
else if (type == 2) return "error";
else return "mainpage";
}
}
分析代码易得,前面index.jsp页面中超链接后面的参数type,用第一种Action的方式接收到,并由execute方法处理,当type=1时,返回success,当type=2时,返回error,其他的情况,返回mainpage。但是在struts中,我们可以清楚的看到,并没有mainpage这个result。这就引出了本小节要讲的内容GlobalResult。
result.xml(节选)
<global-results>
<result name="mainpage">/main.jsp</result>
</global-results>
可以看到,在/user这个名称空间下有一个global-result叫mainpage,这也就意味着,当前package下的所有action都可以用这个result,从而跳转到main.jsp页面。因此,UserAction这么写是没有错的。也是可以实现的。
-点击返回success超链接,得到
-点击返回error超链接,得到
-点击返回global result超链接,得到
三个页面代码如下,可供参考
user_success.jsp
<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>UserSuccess</title>
</head>
<body>
User Success!
</body>
</html>
user_error.jsp
<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>UserError</title>
</head>
<body>
User Error!
</body>
</html>
main.jsp
<?xml version="1.0" encoding="GB18030" ?>
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
<title>Main</title>
</head>
<body>
MainPage
</body>
</html>
Extends的问题
1. 问题描述
在struts.xml文件中的各个标签解释的也差不多了,但是有一个标签选项一直没有涉及,一直都是默认带过,这就是extends。
<package name="user" namespace="/user" extends="struts-default">
我们一直用的都是默认的extends设置。今天结合实际问题,说一下extends的用处。
2.案例背景
现在,还是针对上述struts.xml文件,留意到index.jsp中还有一个超链接。
<li><a href="admin/admin">admin,继承user包</a></li>
易得,名称空间是/admin,action名字是admin,由struts.xml文件可得:
<package name="admin" namespace="/admin" extends="user">
<action name="admin" class="com.bjsxt.struts2.user.action.AdminAction">
<result>/admin.jsp</result>
</action>
</package>
package和user不是一个package,这个时候,其实并不能直接用user那个package中的global result。但是看结果。
-点击admin,继承user包超链接后
结果到了mainpage,怎么回事?
3.分析
AdminAction
package com.bjsxt.struts2.user.action;
import com.opensymphony.xwork2.ActionSupport;
public class AdminAction extends ActionSupport {
@Override
public String execute() throws Exception {
return "mainpage";
}
}
返回的是mainpage,而该aciton对应result中,并没有mainpage,该action也没有写GlobalResult。原因是
<package name="admin" namespace="/admin" extends="user">
extends改成了user。这和java里面的继承差不多,指这个包继承了user那个包,当然user包里面的global result这个包也可以用了。
如果,平常我们不改这个默认的包的话,我们的包应该是struts自定义的,这个包有很多比较复杂的设置,轻易不要去修改这个包的设置。
本小节的内容到此结束
若有不足之处,请不吝赐教