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>

  

时间: 2024-10-22 08:46:04

struts2进阶篇(3)的相关文章

struts2进阶篇(4)

一.使用ActionContext访问Servlet API strtus2提供了一个ActionContext类,该类别称为Action上下文或者Action环境,Action可以通过该类来访问最常用的Servlet API,该类提供了常用的方法在这做简单介绍: >getContext();静态方法,获取当前对象的ActionContext实例. >getSession();返回一个Map对象,该对象模拟了session作用域. >getApplication();返回一个Map(),

struts2进阶篇(2)

一.Action与MVC struts2是一个基于MVC的web应用框架,它将应用程序分为三个组件:模型,视图,控制器. 模型:包含了应用程序的业务逻辑和业务数据,由封装数据和处理业务的javaBean组成. 视图:封装了应用程序的输出形式,也就是页面,如jsp,html. 控制器:负责接收用户的http请求,再调用模型中响应的方法来处理业务,然后调用响应的视图作为显示. 三者共同协同处理响应客户端的请求. 在struts2中控制器分为两部分: 1.核心控制器:它就是在web.xml中配置的St

SSH开发模式——Struts2进阶

在之前我有写过关于struts2框架的博客,好像是写了三篇,但是之前写的内容仅仅是struts2的一些基础知识而已,struts2还有很多有趣的内容等待着我们去发掘.我准备再写几篇关于struts2的高级内容,之前的一些基础知识我就不会再提了,所以,在看进阶篇的struts2时,我希望你有一定的struts2框架的基础,没有的话也不要紧,因为入门struts2非常简单,随手看几篇博客就算入门了,但要想灵活运用它,我们就得付出大量的时间和精力,让我们为了共同的目标奋进吧. 那就先补充一些知识点,这

Python之路【第十七篇】:Django【进阶篇 】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

Maya基础与建模教程 AE教程进阶篇 3DS MAX影视特效教程 Flash CS4案例教程

热门推荐电脑办公计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程 Excel函数应用教程 Excel VBA基础教程 WPS2013表格教程 更多>平面设计PhotoshopCS5教程 CorelDRAW X5视频教程 Photoshop商业修图教程 Illustrator CS6视频教程 更多>室内设计3Dsmax2012教程 效果图实例提高教程 室内设计实战教程 欧式效果图制作实例教程 AutoCAD2014室内设计 Aut

在Horizon Workspace中配置Windows单点登录-进阶篇

在上一篇基础篇里面,简单介绍了在Horizon Workspace 1.8中如何配置Windows单点登录.在这篇博客中,会继续介绍一些针对大规模虚机或者虚拟桌面部署的配置方式.这些配置方式可以保证用模板部署出来的虚机或虚拟桌面在Workspace服务器端配置完成的情况下,不再需要用户进行手动配置就能实现HorizonWorkspace的单点登录. 1. 在模板机组策略中配置IE浏览器的设置 通过在模板虚拟机上的管理控制台中设置相应的策略,可以使后续使用模板机克隆出来的虚拟机自动使用Window

java web进阶篇(四) Tomcat数据源

动态web开发的最大特点是可以进行数据库的操作,传统的jdbc操作由于步骤重复性造成程序性能下降. 先来回顾JDBC的操作原理 1.加载数据库驱动程序,数据库驱动程序通过classpath配置. 2.通过DirverManager类取得数据库连接对象. 3.通过Connection实例化PreparedStatement对象,编写sql语句命令操作数据库. 4.数据库属于资源操作,操作完成后要关闭数据库以释放资源. 其实以上操作,1.2.4步骤是重复的,保留3,实际上就是数据源产生的原因. 数据

Python之路【第十七篇】:Django之【进阶篇】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

Python基础—面向对象(进阶篇)

通过上一篇博客我们已经对面向对象有所了解,下面我们先回顾一下上篇文章介绍的内容: 上篇博客地址:http://www.cnblogs.com/phennry/p/5606718.html 面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用: 类是一个模版,模板中包装了多个方法供使用(这里方法就是函数): 对象,根据模板创建的实例,实例用于调用被包装在类中的函数: 面向对象的三大特性:封装.继承.多态. 今天博客的内容主要介绍:Python类的成员.成员修饰符.类的特殊成员.异常处理和