zoukankan      html  css  js  c++  java
  • struts2进阶篇(3)

    一、struts.xml中<package>的namespace属性的用法

    在实际的开发中常会遇到name相同的<action>,如下代码:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
    	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    	"http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
        <package name="default" namespace="/" extends="struts-default">
    		
    	<action name="add" class="action.UserAction" method="add">
    		<result >addUser.jsp</result>
    	</action>
    	<action name="add" class="action.HouseAction" method="add">
    		<result>addHouse.jsp</result>
    	</action>
        </package>
    </struts>
    

      以上的配置中在同一个namespace下有两个相同name为add的<action>,这样就不能区别了,为了解决这个问题,我们可以把两个<action>放在不同的namespace下,代码如下:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
    	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    	"http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
        <package name="user" namespace="/user" extends="struts-default">
    		
    	<action name="add" class="action.UserAction" method="add">
    		<result >addUser.jsp</result>
    	</action>
        </package>
        <package name="house" namespace="/house" extends="struts-default">
    	<action name="add" class="action.HouseAction" method="add">
    		<result>addHouse.jsp</result>
    	</action>
        </package>
    </struts>

     这样将不同模块放在不同的namespace下就可以区分了,但是在请求action时要URL中的action名前加相应的namespace名,如请求第一个使用:http:localhost:8080/Struts2Demo/user/add

    二、使用<include>包含拆分的struts.xml配置文件

    在大型项目中往往一个struts.xml配置过于庞大,难于维护,需要将struts.xml进行拆分.

    拆分后的struts.xml文件:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
    	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    	"http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
        <include file="struts-house.xml"/>
         <include file="struts-add.xml"/>
    </struts>
    

    拆分后的struts-house.xml文件:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
    	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    	"http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
        <package name="house" namespace="/house" extends="struts-default">
    	<action name="add" class="action.HouseAction" method="add">
    		<result>addHouse.jsp</result>
    	</action>
        </package>
    </struts>
    

    拆分后的struts-user.xml文件:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
    	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    	"http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
        <package name="user" namespace="/user" extends="struts-default">
    		
    	<action name="add" class="action.UserAction" method="add">
    		<result >addUser.jsp</result>
    	</action>
        </package>
    </struts>
    

    三、<result>的配置

    1.<result>标签中的name属性用法

    我们定义的action类继承的Action接口中定义了几种action方法的返回值的静态常量字符串。

    1.SUCCESS:表示Action执行成功,显示结果视图给用户。

    2.NONE:表示Action执行成功,不显示视图给用户。

    3.ERROR:表示Action执行失败,显示错误页面给用户。

    4.INPUT:表示Action需要更多的输入信息,回到INPUT对应的页面。

    5.LOGIN:表示用户没有正确登陆而没有正确执行,将返回该登陆视图。

    当然我们也可以自定义Action方法返回值的类型。会根据返回值寻找不同的result标签。

    2.<result>标签中的type属性的用法

    使用<result>中的type属性就可以定义以不同的方式输出结果,它默认是"dispatcher",下面是type属性的一些常用配置:

    1.dispatcher:请求转发到指定的URL

    2.redirect:请求重定向到指定的URL

    3.redirectAction:请求重定向到指定的Action

    4.chain:Action链式处理,将请求转发到指定的Action

    5.json:实现Ajsx时,返回JSON对象。

    四、动态结果的配置

    现在大家来考虑一个问题:例如在一个项目中分为管理员和普通用户两类,如果管理员登陆成功后跳转到后台管理页面,普通用户登陆成功后跳转到首页,像这种在配置<result>时,结果页面不能确定,需要运行时才能确定该怎么办呢?

    下面看这个方法来解决这个问题:

    package action;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    import entity.User;
    
    public class DynamicAction extends ActionSupport {
    	private User user;
    	// 下一个跳转到的Action
    	private String nextDispatch;
    	
    	public String login(){
    		if (user.getPassword().equals("common")) {
    			nextDispatch="common";
    			return SUCCESS;
    		} else if (user.getUsername().equals("admin")) {
    			nextDispatch="admin";
    			return SUCCESS;
    		} else {
    			return INPUT;
    		}
    	}
    	
    	public User getUser() {
    		return user;
    	}
    	public void setUser(User user) {
    		this.user = user;
    	}
    	public String getNextDispatch() {
    		return nextDispatch;
    	}
    	public void setNextDispatch(String nextDispatch) {
    		this.nextDispatch = nextDispatch;
    	}
    	
    
    }
    

      在web.xml中的配置:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
    	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    	"http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
        <package name="user" namespace="/user" extends="struts-default">
    		
    	<action name="login" class="action.UserAction" method="login">
    		<result name="success" type="redirectAction">${nextDispatch}</result>
    	</action>
              
             <action name="common" class="action.CommonAction">
                   <result  name="success">common.jsp</result>
               </action>
               <action name="admin" class ="action.AdminAction">
                    <result name="success">admin.jsp</result>
                </action>
        </package>
    </struts>
    

    在这个配置文件中,使用${nextDispatch}取出了存储在UserAction中的nextDispatch变量的值,然后再根据它的值,使用redirectAction方式重定向到name为common或admin的<action>.

    五、struts.xml中全局结果的配置

    配置跳转公共错误页面的<result>

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
    	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    	"http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
        <package name="user" namespace="/user" extends="struts-default">
    	
              <global-results>
                       <result name="error">/error.jsp</result>
               </global-results>
    
    	
    	<action name="add" class="action.UserAction" method="add">
    		<result >addUser.jsp</result>
    	</action>
        </package>
    </struts>
    

      

  • 相关阅读:
    利用JasperReport+iReport进行Web报表开发
    EEPlat PaaS VS Saleforce force.com
    Python用subprocess的Popen来调用系统命令
    最短路径A*算法原理及java代码实现(看不懂是我的失败)
    Java抓取网页数据(原网页+Javascript返回数据)
    Atitit.dwr3 不能显示错误具体信息的解决方式,控件显示错误具体信息的解决方式 java .net php
    白话经典算法系列之五 归并排序的实现
    poj 百练 2765 八进制小数(精度问题)
    winzip15.0注冊码
    Python:渗透测试开源项目
  • 原文地址:https://www.cnblogs.com/ablejava/p/5656326.html
Copyright © 2011-2022 走看看