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

这是我们的主页文件。

index.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6.  
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11.  
  12. <title>My JSP 'index.jsp' starting page</title>
  13. <meta http-equiv="pragma" content="no-cache">
  14. <meta http-equiv="cache-control" content="no-cache">
  15. <meta http-equiv="expires" content="0">
  16. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  17. <meta http-equiv="description" content="This is my page">
  18. <!--
  19. <link rel="stylesheet" type="text/css" href="styles.css">
  20. -->
  21. </head>
  22.  
  23. <body>
  24. 取得Map类型request,session,application。真实类型HttpServletRequest,HttpSession,ServletContext的引用 <br>
  25. <ol>
  26. <li>前三者依赖于容器</li>
  27. <li>前三者,IOC</li>
  28. <li>后三者,依赖于容器</li>
  29. <li>后三者,IOC</li>
  30.  
  31. </ol>
  32. <form action="" name="f" method="post">
  33. 用户名:<input type="text" name="name"/>
  34. 密码:<input type="text" name="password"/>
  35. <br>
  36. <input type="button" value="submit1" onclick="javascript:document.f.action='login/login1';document:f.submit();">
  37. <input type="button" value="submit2" onclick="javascript:document.f.action='login/login2';document:f.submit();">
  38. <input type="button" value="submit3" onclick="javascript:document.f.action='login/login3';document:f.submit();">
  39. <input type="button" value="submit4" onclick="javascript:document.f.action='login/login4';document:f.submit();">
  40. </form>
  41. </body>
  42. </html>

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

Login1Action.java

  1. package com.tfj.struts2.action;
  2.  
  3. import java.util.Map;
  4.  
  5. import com.opensymphony.xwork2.ActionContext;
  6. import com.opensymphony.xwork2.ActionSupport;
  7.  
  8. public class Login1Action extends ActionSupport{
  9. private Map request;
  10. private Map session;
  11. private Map application;
  12.  
  13. public Login1Action() {
  14. request = (Map)ActionContext.getContext().get("request");
  15. session = ActionContext.getContext().getSession();
  16. application = ActionContext.getContext().getApplication();
  17. }
  18.  
  19. public String execute() {
  20. request.put("r1", "r1");
  21. session.put("s1", "s1");
  22. application.put("a1", "a1");
  23. return SUCCESS;
  24. }
  25.  
  26. }

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

loginsuccess.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <%@taglib uri="/struts-tags" prefix="s"%>
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11.  
  12. <title>My JSP 'loginsuccess.jsp' starting page</title>
  13.  
  14. <meta http-equiv="pragma" content="no-cache">
  15. <meta http-equiv="cache-control" content="no-cache">
  16. <meta http-equiv="expires" content="0">
  17. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  18. <meta http-equiv="description" content="This is my page">
  19. <!--
  20. <link rel="stylesheet" type="text/css" href="styles.css">
  21. -->
  22.  
  23. </head>
  24.  
  25. <body>
  26. <s:property value="#request.r1"/> | <%=request.getAttribute("r1") %><br />
  27. <s:property value="#session.s1"/> | <%=session.getAttribute("s1") %><br />
  28. <s:property value="#application.a1"/> | <%=application.getAttribute("a1") %><br/>
  29. <br>
  30. </body>
  31. </html>

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

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

单击submit2,调用Login2Action.java

Login2Action.java

  1. package com.tfj.struts2.action;
  2.  
  3. import java.util.Map;
  4.  
  5. import org.apache.struts2.interceptor.ApplicationAware;
  6. import org.apache.struts2.interceptor.RequestAware;
  7. import org.apache.struts2.interceptor.SessionAware;
  8.  
  9. import com.opensymphony.xwork2.ActionSupport;
  10.  
  11. public class Login2Action extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
  12. private Map<String, Object> request;
  13. private Map<String,Object> session;
  14. private Map<String,Object> application;
  15. @Override
  16. public String execute() throws Exception {
  17. request.put("r1", "r1");
  18. session.put("s1", "s1");
  19. application.put("a1", "a1");
  20. return SUCCESS;
  21. }
  22. @Override
  23. public void setApplication(Map<String, Object> application) {
  24. this.application=application;
  25.  
  26. }
  27.  
  28. @Override
  29. public void setSession(Map<String, Object> session) {
  30. // TODO Auto-generated method stub
  31. this.session=session;
  32.  
  33. }
  34.  
  35. @Override
  36. public void setRequest(Map<String, Object> request) {
  37. // TODO Auto-generated method stub
  38. this.request=request;
  39. }
  40.  
  41. }

实现
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

  1. package com.tfj.struts2.action;
  2. import javax.servlet.ServletContext;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpSession;
  5. import org.apache.struts2.ServletActionContext;
  6. import com.opensymphony.xwork2.ActionSupport;
  7. public class Login3Action extends ActionSupport{
  8. private HttpServletRequest request;
  9. private HttpSession session;
  10. private ServletContext application;
  11. public Login3Action() {
  12. request=ServletActionContext.getRequest();
  13. session=request.getSession();
  14. application=session.getServletContext();
  15. }
  16. @Override
  17. public String execute() {
  18. request.setAttribute("r1", "r1");
  19. session.setAttribute("s1", "s1");
  20. application.setAttribute("r1", "r1");
  21. return SUCCESS;
  22. }
  23. }

实现ServletRequestAware接口即可。

Login4Action.java

  1. package com.tfj.struts2.action;
  2. import javax.servlet.ServletContext;
  3. import javax.servlet.ServletRequest;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpSession;
  6. import org.apache.commons.fileupload.servlet.ServletRequestContext;
  7. import org.apache.struts2.ServletActionContext;
  8. import org.apache.struts2.interceptor.ServletRequestAware;
  9. import org.apache.struts2.util.ServletContextAware;
  10. import com.opensymphony.xwork2.ActionContext;
  11. import com.opensymphony.xwork2.ActionSupport;
  12. public class Login4Action extends ActionSupport implements ServletRequestAware{
  13. private HttpServletRequest request;
  14. private HttpSession session;
  15. private ServletContext application;
  16. @Override
  17. public void setServletRequest(HttpServletRequest request) {
  18. this.request=ServletActionContext.getRequest();
  19. this.session=request.getSession();
  20. this.application=session.getServletContext();
  21. }
  22. @Override
  23. public String execute() {
  24. request.setAttribute("r1", "r1");
  25. session.setAttribute("s1", "s1");
  26. application.setAttribute("r1", "r1");
  27. return SUCCESS;
  28. }

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. 增加Android模拟器空间(Internal Storage)

    转载 http://vase.iteye.com/blog/2114664   初学Android,发现模拟器上有不少限制,譬如标题中的存储限制,无论用ADT Manager如何设置,内部存储空间不会 ...

  2. 程序调试命令gdb

    锁定线程 set scheduler-locking 1.要使用此命令,先用gcc -g编译程序,如:  $gcc -g test.c -o test  编译test.c源程序,输入此程序的调试版本t ...

  3. ACM——【百练习题备忘录】

    1. 在做百练2807题:两倍时,错将判断语句写成 a/b ==2,正确写法是:a == b*2 因为C/C++int型做除法时自动舍入,如:5/2 == 2,但是 5 =/= 2*2. 2. 在做百 ...

  4. 如何优雅地使用vim编辑器

    如何优雅地使用vim编辑器大赞..原文链接:http://jackiekuo.com/code/2014/05/07/use-vim-the-pragmatic-way/ 接上篇如何优雅地使用Vim? ...

  5. CGIC函数说明

    CGIC函数说明 参考cgic函数说明_Embedded Resources Library Online (C)郝博士 cgiFormResultType cgiFormString( char * ...

  6. 一键去除网页BOM属性【解决乱码,头部空白,&#65279问题】

    几个常出现的问题: 1.网站打开空白 2.页面头部出现多余的空白 3.网站出现乱码,如“锘�” 解决方法可以是: 1.选用专业的编辑器,例如notepad++,sublime,editplus这样不会 ...

  7. ceph rgw java sdk 使用域名访问服务时需要设置s3client的配置项 PathStyleAccess 为true, 负责将报域名异常

    Caused by: java.net.UnknownHostException: my-new-bucket.s3.yyclouds.com at java.net.InetAddress.getA ...

  8. Python 一些 实用的包(持续更新)

    line_profiler:(代码性能分析) 使用方法:链接 codecs:(Python内置的编码库) 数据分析与挖掘领域: 引自博客:这里     因为他有很多这个领域相关的库可以用,而且很好用, ...

  9. css特效-一道闪光在图片上划过

    在百度音乐 http://music.baidu.com/ 看到这么一个图片效果,当鼠标移上去的时候,会有一道闪光在图片上划过,效果挺酷炫的.于是把这个效果再实现一下:大体思想是,设计一个透明层i,s ...

  10. angular4 监听input框输入值的改变

    angular中一般控件会有change事件,但是如果某些控件没有这个事件 我们如何监听值的变化呢? 对于双向绑定的值,当值改变后监听事件有如下写法: 1. 如果是ngModel可以用ngModelC ...