我们想要访问Map类型request,session,application。真实类型HttpServletRequest,HttpSession,ServletContext的引用,并对它们进行操作。

这是我们的主页文件。

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head> <body>
取得Map类型request,session,application。真实类型HttpServletRequest,HttpSession,ServletContext的引用 <br>
<ol>
<li>前三者依赖于容器</li>
<li>前三者,IOC</li>
<li>后三者,依赖于容器</li>
<li>后三者,IOC</li> </ol>
<form action="" name="f" method="post">
用户名:<input type="text" name="name"/>
密码:<input type="text" name="password"/>
<br>
<input type="button" value="submit1" onclick="javascript:document.f.action='login/login1';document:f.submit();">
<input type="button" value="submit2" onclick="javascript:document.f.action='login/login2';document:f.submit();">
<input type="button" value="submit3" onclick="javascript:document.f.action='login/login3';document:f.submit();">
<input type="button" value="submit4" onclick="javascript:document.f.action='login/login4';document:f.submit();">
</form>
</body>
</html>

页面有四个按钮,单击后动态调用login/login*,然后提交。submit1 会调用Login1Action.java.

Login1Action.java

package com.tfj.struts2.action;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; public class Login1Action extends ActionSupport{
private Map request;
private Map session;
private Map application; public Login1Action() {
request = (Map)ActionContext.getContext().get("request");
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
} public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
} }

在这个文件中,自己定义了Map类型的request,session,和application,通过ActionContext取得Action的上下文,在拿到request。在execute()方法对request赋值。在显示的页面loginsuccess.jsp显示出来。

loginsuccess.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'loginsuccess.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
<s:property value="#request.r1"/> | <%=request.getAttribute("r1") %><br />
<s:property value="#session.s1"/> | <%=session.getAttribute("s1") %><br />
<s:property value="#application.a1"/> | <%=application.getAttribute("a1") %><br/>
<br>
</body>
</html>

这里有两种调用方式<s:property value="#request.r1"/> 因为request是stack context里的内容 需要加#符号来调用里里面的内容(通过debug标签可以自己看),<%=request.getAttribute("r1") %>则是用javascript代码来调用。结果如图

接下来讲一种更为常用的,应该说最常用的方法,叫做DI(Dependeny Injection)依赖注入,也叫IoC(InversionofControl)控制反转。

单击submit2,调用Login2Action.java

Login2Action.java

package com.tfj.struts2.action;

import java.util.Map;

import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionSupport; public class Login2Action extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
private Map<String, Object> request;
private Map<String,Object> session;
private Map<String,Object> application;
@Override
public String execute() throws Exception {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
@Override
public void setApplication(Map<String, Object> application) {
this.application=application; } @Override
public void setSession(Map<String, Object> session) {
// TODO Auto-generated method stub
this.session=session; } @Override
public void setRequest(Map<String, Object> request) {
// TODO Auto-generated method stub
this.request=request;
} }

实现
RequestAware,SessionAware,ApplicationAware接口,实现对应的方法setRequest(Map<String, Object> request),setSession(Map<String, Object> session),setApplication(Map<String, Object> application)。为什么这种方法叫DI或IoC呢?

因为这种方法并不是request去取得一个值,而是询问request是否存在(requestAware接口),如果存在就调用setRequest()方法来给request初始化,叫做依赖注入。IoC反转控制也很好理解,本来的控制端被反转了。

这种方法最常用,要好好理解。

这是取得Map类型request,session,application。要取得真实类型HttpServletRequest,HttpSession,ServletContext的引用道理类似。submi3,是依赖容器的方法,submit4,是IoC,简单了解即可。

Login3Action.java

package com.tfj.struts2.action;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class Login3Action extends ActionSupport{
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
public Login3Action() {
request=ServletActionContext.getRequest();
session=request.getSession();
application=session.getServletContext();
}
@Override
public String execute() {
request.setAttribute("r1", "r1");
session.setAttribute("s1", "s1");
application.setAttribute("r1", "r1");
return SUCCESS;
} }

实现ServletRequestAware接口即可。

Login4Action.java

package com.tfj.struts2.action;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; public class Login4Action extends ActionSupport implements ServletRequestAware{
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
@Override public void setServletRequest(HttpServletRequest request) {
this.request=ServletActionContext.getRequest();
this.session=request.getSession();
this.application=session.getServletContext();
}
@Override
public String execute() {
request.setAttribute("r1", "r1");
session.setAttribute("s1", "s1");
application.setAttribute("r1", "r1");
return SUCCESS;
}

Struts2 学习笔记 09 访问Web元素的更多相关文章

  1. Struts2学习笔记三 访问servlet

    结果跳转方式 转发 <!-- 转发 --> <action name="Demo1Action" class="cn.itheima.a_result. ...

  2. Struts2学习---简单的数据校验、访问Web元素

    1.简单的数据校验 在action里面我们已经给出了一个数据校验: public String execute() { if(user.getUsername().equals("usern ...

  3. Struts2 访问web元素

    访问web元素的四种方法(耦合,依赖注入).(耦合,非依赖注入).(非耦合,依赖注入).(非耦合,非依赖注入) 耦合:可以得到HttpServletResponse,HttpServletReques ...

  4. Struts2中访问web元素的四种方式

    Struts2中访问web元素的四种方式如下: 通过ActionContext来访问Map类型的request.session.application对象. 通过实现RequestAware.Sess ...

  5. Struts2 学习笔记(概述)

    Struts2 学习笔记 2015年3月7日11:02:55 MVC思想 Strust2的MVC对应关系如下: 在MVC三个模块当中,struts2对应关系如下: Model: 负责封装应用的状态,并 ...

  6. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  7. Struts2学习笔记①

    Struts2 学习笔记① 所有的程序学习都从Hello World开始,今天先跟着书做一个HW的示例. Struts2是一套MVC框架,使用起来非常方便,接触到现在觉得最麻烦的地方是配置文件.我的一 ...

  8. Spring实战第八章学习笔记————使用Spring Web Flow

    Spring实战第八章学习笔记----使用Spring Web Flow Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序. 其实我们可以使用任何WEB框架写流程化的应 ...

  9. Spring实战第五章学习笔记————构建Spring Web应用程序

    Spring实战第五章学习笔记----构建Spring Web应用程序 Spring MVC基于模型-视图-控制器(Model-View-Controller)模式实现,它能够构建像Spring框架那 ...

随机推荐

  1. skb_reserve(skb,2)中的2的意义

    skb_reserve() skb_reserve()在数据缓存区头部预留一定的空间,通常被用来在数据缓存区中插入协议首部或者在某个边界上对齐.它并没有把数据移出或移入数据缓存区,而只是简单地更新了数 ...

  2. grep 中的正则表达式【转】

    正则表达式 正则表达式就是用于匹配每行输入的一种模式,模式是指一串字符序列.下面是范例: ^w1 w1|w2 [^ ] grep 正则表达式示例 在 /etc/passswd 目录中搜索 'vivek ...

  3. 008 BlockingQueue理解

    原文https://www.cnblogs.com/WangHaiMing/p/8798709.html 本篇将详细介绍BlockingQueue,以下是涉及的主要内容: BlockingQueue的 ...

  4. html---规范、细节积累-01

    语义错误 块级元素可以包含内联元素和某些块级元素,内联元素不能包含块级元素,只能包含内联元素 页面可能正常解析,但不符合语义.浏览器自带容错机制,对于不规范的写法也能够正确解析,各浏览器的容错机制不同 ...

  5. 设置NGINX进程分配至多核CPU提升性能

    Nginx 配置文件 nginx.conf 首先需要找到 Nginx 的配置文件 nginx.conf 才能进行下面的操作,在LNMP一键安装包默认配置下,nginx.conf 存放在/usr/loc ...

  6. Nginx 原理篇

    前言 在学习 Nginx 之前,我们首先有必要搞清楚下面几个问题: 1. Web服务器是怎么工作的? 2. Apache 与 Nginx 有何异同? 3. Nginx 工作模式是怎样的? 下面就围绕这 ...

  7. WP SMTP插件为啥我一直设置的不对?

    我也是摸索好久才搞定的,如果你是万网空间先去修改一下参数在万网后台设置PHP.ini参数设置,因为万网阿里云免费虚拟主机禁用了WordPress默认使用的PHP mail()发信函数,而 stream ...

  8. TEC-2几条微指令的微码说明 & TEC-2微程序运行测试步骤

    个人理解,不保证完全正确…… 给正在被何朝东虐的,以及将来会被何朝东虐的同胞们………… 祈祷软院赶快更新课程让下一代逃脱TEC-2魔爪,monitor里那1994的年份真是看得人一口老血…… 微码说明 ...

  9. MINIBASE源代码阅读笔记之heapfile

    Heapfile 用来管理heap file里的dir page们 成员 _firstDirPageId:这个文件的第一个dir page _ftype:文件类型 _file_deleted:删除的时 ...

  10. 【LOJ】#2586. 「APIO2018」选圆圈

    题解 不旋转坐标系,TLE,旋转坐标系,最慢一个点0.5s--maya,出题人数据水平很高了-- 好吧,如果你不旋转坐标系,写一个正确性和复杂度未知的K - D树,没有优化,你可以得到87分的好成绩 ...