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

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

实现原理也很简单,就是将一个属性设置在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. UILabel+Create

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

  2. 创建一个jQuery UI的垂直进度条效果

    日期:2013-9-24  来源:GBin1.com 在线演示 缺省的jQuery UI只有水平的进度条效果,没有垂直的进度条效果,仅仅重新定义JQuery UI的CSS不能解决这个问题. 这里我们扩 ...

  3. ASP.NET中时间的绑定和格式化

    1.Eval和Bind的区别  绑定表达式  <%# Eval("字段名") %>  <%# Bind("字段名") %> 区别 1.e ...

  4. Oracle静默安装-简单记录

    一.与图形界面安装一样,检查如下条件:新建用户.组创建安装目录配置环境变量检查安装依赖包修改内核参数……前面这些操作都属于常规操作,不管是图形还是静默都需要处理. 二./home/oracle/dat ...

  5. [HeadFrist-HTMLCSS学习笔记][认识HTML中的“HT”]

    学习超链接 超链接 使用\元素创建一个超文本链接,链接到另一个Web 页面. \元素的内容会变成为Web页面中可单击的文本.href属性告诉浏览器链接的目标文件 <a href="el ...

  6. 适用于CSS2的各种运动的javascript运动框架

    <script> window.onload = function() { //var oDiv1 = document.getElementById('box1'); //var oDi ...

  7. overflow:hidden

    原来以为overflow:hidden能隐藏所有溢出的子元素,但今天发现我错了. 对于overflow:hidden的最大误解时:当一个具有高度和宽度中至少一项的容器应用了overflow:hidde ...

  8. Android adb不是内部或外部命令 (转)

    dos窗口运行adb命令出现错误:adb不是内部或外部命令…. 出现问题原因及解决办法: 1.没有配置相关环境变量. 只要将android 的sdk安装路径添加到系统变量Path中即可. (以win7 ...

  9. Spring MVC中数据绑定(转)

    Spring MVC中数据绑定 比如Product有一个createTime属性,是java.util.Date类型.那么最简单的转型处理是,在SimpleFormController中覆盖initB ...

  10. Spark IDEA开发环境构建

    本文档基于IEDA构建spark maven应用. date: 2016/8/1 author: wangxl 1.下载IDEA https://www.jetbrains.com/idea/ 2.安 ...