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

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

实现原理也很简单,就是将一个属性设置在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. Lua 基本语法

    学习Unity的ulua热更新插件就必须先学习lua的基本语法. 我们一起来学习Lua吧O(∩_∩)O. 首先搭建Lua运行环境Lua for windows 下载地址: http://www.cr1 ...

  2. python threading基础学习

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' """ python是支持多线程的,并 ...

  3. 苹果拒绝App内部使用版本检测功能

    10.6 - Apple and our customers place a high value on simple, refined, creative, well thought through ...

  4. sql执行顺序整理

    sql的执行顺序,是优化sql语句执行效率必须要掌握的.各个数据库可能有细小的差别,但大体顺序是相同的,这里只做大致说明. 一.总体执行顺序 在sql语句执行之前,还有SQL语句准备执行阶段,这里不做 ...

  5. POJ 3254 炮兵阵地(状态压缩DP)

    题意:由方格组成的矩阵,每个方格可以放大炮用P表示,不可以放大炮用H表示,求放最多的大炮,大炮与大炮间不会互相攻击.大炮的攻击范围为两个方格. 分析:这次当前行的状态不仅和上一行有关,还和上上行有关, ...

  6. windows下常用的操作命令及dos命令

    常用windows运行命令mstsc---远程桌面连接regedit.exe---打开注册表services.msc---打开服务管理器rsop.msc---组策略结果集taskmgr---任务管理器 ...

  7. js对象克隆, 深复制.

    亲测有效: //对象克隆 function clone(obj) { // Handle the 3 simple types, and null or undefined if (null == o ...

  8. css-文字

    <!DOCTYPE html>CSS2-文字 <style>div{ /*文字*/ font-size:120px; /*文字大小*/ font-family:Arial,'方 ...

  9. gdal_merge.py

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

  10. oracle索引学习

    查看执行状态: 选中代码直接按F5,或者点击Tools===>>Explain Plan 一.索引的注意事项: 当任何单个查询要检索的行少于或者等于整个表行数的10%时,索引就非常有用.这 ...