一、只有登录才能显示的页面

这是一个很平常的问题,在访问某些网页的时候,只有登录才可以访问,以此保证安全。

实现原理也很简单,就是将一个属性设置在session中。在访问的时候进行判断即可。

例:request.getSession().setAttribute("user", username);

这样就可以根据session进行判断了

1.MustLoginAction.java

package com;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping; public class MustLoginAction extends Action { @Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception { if(request.getSession().getAttribute("user") == null) { return mapping.findForward("login");
}
return mapping.findForward("success");
} }

  

在转向时,如果没有做重定向,浏览器地址栏显示的地址会是“.do”的形式,如果要避免这种情况发生,则需要在struts-config.xml中的forward配置里做重定向。

例:<forward name="login" path="/login.jsp" redirect="true"/>

二、动态ActionForward

如果需要做很多转向,那么会在struts-config.xml里配置很多的forward,这样就会比较麻烦。为了防止这种情况的发生,需要使用动态的ActionForward。

1.DynaActionForwardTestAction.java

package com;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping; public class DynaActionForwardTestAction extends Action { @Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception { ActionForward af = new ActionForward();
af.setPath("/page"+request.getParameter("page")+".jsp");
return af;

如上所示,这个action在做转向的时候就使用了动态ActionForward

	 <global-forwards>
<forward name="login" path="/login.jsp" redirect="true"/>
</global-forwards>

redirect属性是指是否进行重定向。默认是false,即默认是转向而不重定向。转发的特点是共享request,并且地址栏不会改变,因为转发时在web容器内部进行的。重定向是不共享Session的,它的原理就是向客户端发送一个命令,通知客户端访问某个URL,因此不能共享request范围内的对象,并且浏览器地址栏里的地址也要发生变化。

global-forwards可以有效地解决一些基本的Forward共享问题。

ActionForwards的一个比较常用的用途就是根据不同的用户权限来进行不同的页面跳转,如:

if (request.getSession().getAttribute("user") == null) {

			ActionForward af = mapping.findForward("login");

			//struts-config.xml文件不能修改
//af.setRedirect(false);
return af; //重定向
//response.sendRedirect(request.getContextPath() + "/login.jsp");
//return null;
}
return mapping.findForward("success");

  

这段代码很有代表性,首先这个if{}()结构可以实现根据用户不同的权限来跳转到相应的页面,这也是比较常用的一种方法。

不能动态修改struts-config.xml文件。

struts-config.xml会在程序运行时一次性加载到内存中,它不是动态地装载的,所以不能动态修改。之所以这样是出于安全的原因。

在重定向时并不是非用ActionForward不可

因为在execute方法中有response,因此可以用response进行转向或重定向。用response重定向时,返回null即可

动态ActionForward

可以通过ActionForward的setPath();方法来动态设置ActionForward的转向路径,示例代码如下:

public class DynaActionForwardTestAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception { String page = request.getParameter("page");
// ActionForward af = null;
// if ("1".equals(page)) {
// af = mapping.findForward("page1");
// }else if ("2".equals(page)) {
// af = mapping.findForward("page2");
// }
// return af;
ActionForward af = new ActionForward();
af.setPath("/page" + page + ".jsp?name=Tom");
return af;
}
}

  

注释掉的语句和动态ActionForward实现的功能一致,从这儿可以明显的看出动态ActionForward的灵活性和高效率。

使用这种方法可以不必在<action>理配置Forward属性。

Forward中的classname属性

在forward标签中使用这个属性,就是将自己定义的一个ActionForward类完整路径写入到这个属性里。这样可以用用户自己定义的ActionForward类来代替系统自动生成的ActionForward。

struts控制器中使用new ActionForward和mapping.findForward的区别

request.setAttribute("list", new Integer(0));
return new ActionForward("/success.jsp");

request.setAttribute("list", new Integer(0));
return mapping.findForward("fail");

当使用 return new ActionForward("/success.jsp");的时候相当于还是同一个request请求,所以可以携带参数setAttribute过去。
无论 <forward
                    name="succ"
                    path="/success.jsp"
                    redirect="true" />//无论此处的redirect是true还是false。

当使用 return mapping.findForward("fail");的时候如果 redirect="true",相当于还是另外一个request请求,所以不能携带参数setAttribute过去。
要想还是使用同一个request,获取到参数,则把
        <forward
                    name="succ"
                    path="/success.jsp"
                    redirect="false" />//此处的redirect改为false。另外,此处不设置的话默认redirect="false"。

无论在任何情况下使用
request.getSession().setAttribute("a", "sssss");都可以传递参数。
在页面处获取 <%=request.getSession().getAttribute

request.getSession(true):若存在会话则返回该会话,否则新建一个会话。

request.getSession(false):若存在会话则返回该会话,否则返回NULL

ActionForward的更多相关文章

  1. Struts1中ActionForward的技巧介绍

    ActionForward是做什么的?他是用来封装转发和重定向路径的. 在struts- config.xml中<forward name="error" path=&quo ...

  2. Struts旅程(六)Struts页面转发控制ActionForward和ActionMapping

    转自:https://blog.csdn.net/lovesummerforever/article/details/19125933

  3. ajax基础学习

    AJAX即"Asynchronous JavaScript and XML",意思是异步JavaScript和XML,是指一种创建交互式网页的网页开发技术. 虽然现在很少有人去自己 ...

  4. SSH面试题(struts2+Spring+hibernate)

    struts2 + Spring +hibernate Hibernate工作原理及为什么要用?   原理:   1.读取并解析配置文件   2.读取并解析映射信息,创建SessionFactory ...

  5. 【转】JAVA自学之路

    JAVA自学之路 一: 学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向 ...

  6. java面试题总汇

    coreJava部分 7 1.面向对象的特征有哪些方面? 7 2.作用域public,private,protected,以及不写时的区别? 7 3.String 是最基本的数据类型吗? 7 4.fl ...

  7. Java面试常见知识点总结(三)

    21.volatile关键字: 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:   (1) 保证了不同线程对这个变量进行操作时的可见性,即一个线程 ...

  8. 快速理解-Ajax

    AJAX即“Asynchronous JavaScript and XML”,意思是异步JavaScript和XML,是指一种创建交互式网页的网页开发技术. 虽然现在很少有人去自己手动写AJAX,大多 ...

  9. jquery.ajax

    var params = {};//定义一个数组 var USERNAME= $("#USERNAME").val(); params["USERNAME"]= ...

随机推荐

  1. Linux usb子系统(二):USB设备驱动usb-skeleton.c

    usb驱动分为通过usbfs操作设备的用户空间驱动,内核空间的内核驱动.两者不能同时进行,否则容易引发对共享资源访问的问题,死锁!使用了内核驱动,就不能在usbfs里驱动该设备. 下面转载的一篇分析u ...

  2. UILabel+Create

    #import <UIKit/UIKit.h> @interface UILabel (Create) /** * 创建普通Label * * @param frame frame * @ ...

  3. Visual Studio 2015 使用ODP.net进行EF开发

    刚转了新公司,以前公司都是用VS+MSSQL作为开发工具的 现在新公司由于数据库是Oracle,而且新公司比较小规模,开发团队也没有什么规范 访问数据库的方式一直使用ADO.net的DataTable ...

  4. [重磅] 让HTML5达到原生的体验 系列之中的一个 避免切页白屏

    非常多人都想.甚至曾使用HTML5开发跨平台App.而且想达到原生App的体验. 最后的结果都是无奈的放弃.HTML5貌似美好,但坑太多.想做到原生App的体验差点儿不可为. 也曾有过著名的faceb ...

  5. Coding.net代码托管空间申请与使用-安装并运行WordPress博客

    参考: http://www.freehao123.com/coding-net/ Coding.net这是一个国内新兴的代码托管平台,功能主要包括:代码托管.在线运行环境.监控代码质量,兼有一定的社 ...

  6. [Firmware Warn]: GHES: Failed to read error status block address for hardware error source

    Firmware Warn 问题描述: 系统版本:Ubuntu 12.04 LTS. 系统启动后dmesg打印大量Firmware Warn告警信息到syslog文件中.信息如下: [Firmware ...

  7. mysql免安装版配置与使用方法

    mysql免安装版配置与使用方法      以mysql-noinstall-5.1.6(win32)为例 1>把压缩文件mysql-noinstall-5.1.6-alpha-win32.zi ...

  8. CSS基础知识笔记(四)

    元素分类 标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素. 常用的块状元素有: <div>.<p>.<h1>...<h6& ...

  9. gdal_merge.py

    1 gdal_merge.py: 合并(Merge)/镶嵌(Mosaic)工具.要求图像必须是相同坐标系统.具有相同的波段数:可以不同分辨率,可以有重叠区域(后加入图像覆盖先加入的图像). 注意:只能 ...

  10. HTML5 Canvas 的事件处理---转

    DOM是Web前端领域非常重要的组成部分,不仅在处理HTML元素时会用到DOM,图形编程也同样会用到.比如SVG绘图,各种图形都是以DOM节点的形式插入到页面中,这就意味着可以使用DOM方法对图形进行 ...