Struts2学习——1100GlobalResult

背景

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自定义的,这个包有很多比较复杂的设置,轻易不要去修改这个包的设置。

本小节的内容到此结束

若有不足之处,请不吝赐教

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值