• struts2访问servlet API


    搭建环境:

    引入jar包,src下建立struts.xml文件

    项目配置文件web.xml.

    web.xml:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
     3   <display-name>struts2Test</display-name>
     4   <welcome-file-list>
     5     <welcome-file>index.html</welcome-file>
     6     <welcome-file>index.htm</welcome-file>
     7     <welcome-file>index.jsp</welcome-file>
     8     <welcome-file>default.html</welcome-file>
     9     <welcome-file>default.htm</welcome-file>
    10     <welcome-file>default.jsp</welcome-file>
    11   </welcome-file-list>  
    12   
    13   <filter>
    14         <filter-name>struts2</filter-name>
    15         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    16     </filter>
    17 
    18     <filter-mapping>
    19         <filter-name>struts2</filter-name>
    20         <url-pattern>*.action</url-pattern>
    21     </filter-mapping>
    22   
    23 </web-app>

    struts.xml:

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE struts PUBLIC
     3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
     4     "http://struts.apache.org/dtds/struts-2.3.dtd">
     5 
     6 <struts>
     7     <constant name="struts.enable.DynamicMethodInvocation" value="false" />
     8     <constant name="struts.devMode" value="true" />
     9 
    10     <package name="default" namespace="/gys" extends="struts-default">
    11         <action name="test" class="action.GetServletAPIAction">
    12             <result name="api">/servletApi.jsp</result>
    13         </action>
    14     </package>
    15 </struts>

    Struts2的Action类并不直接与任何Servlet API耦合,这是Struts2的一个改良之处,因为Action类不在于Servlet API耦合,从而能更轻松地测试该Action.

    Web中通常访问Servlet API就是HttpServletRequest,HttpSession和ServletContext,这3个类分别代表JSP内置对象中的request,session,application.

    Struts2提供了一个ActionContext类来访问API,

    该类提供了几个常用的方法:

    Object get(Object key):该方法类似于调用HttpServletRequest的getAttribute(String name)方法.

    Map getApplication():返回一个Map对象,该对象模拟了ServletContext实例.

    static ActionContext getContext():静态方法,获取系统的ActionContext实例.

    Map getParameters():获取所有的请求参数.类似于调用HttpServletRequest对象的getParameterMap方法.

    Map getSession()返回一个Map对象,模拟了HttpSession实例.

    void setApplication(Map application)直接传入一个Map实例,将该Map实例里的key-value转换成application的属性名,属性值.

    void setSession(Map session)直接传入一个Map实例,将该Map实例里的key-value转换成session的属性名,属性值.

    建立action类:

     1 package action;
     2 
     3 import com.opensymphony.xwork2.ActionContext;
     4 
     5 public class GetServletAPIAction {
     6     private String name;
     7     private String pass;
     8     public String getName() {
     9         return name;
    10     }
    11     public void setName(String name) {
    12         this.name = name;
    13     }
    14     public String getPass() {
    15         return pass;
    16     }
    17     public void setPass(String pass) {
    18         this.pass = pass;
    19     }
    20     
    21     public void getServletAPI1(){
    22         //获取ActionContext实例,通过该实例访问Servlet API
    23         ActionContext ctx=ActionContext.getContext();
    24         //获取ServletContext里的count属性
    25         Integer count=(Integer)ctx.getApplication().get("count");
    26         if(count==null){
    27             count=1;
    28         }
    29         else {
    30             count++;
    31         }
    32         //将访问人数设置成application的一个属性
    33         ctx.getApplication().put("count", count);
    34         ctx.getSession().put("username", "思思博士");
    35         
    36     }
    37     
    38     public String execute(){
    39         getServletAPI1();
    40         return "api";
    41     }
    42     
    43 }

    建立页面servletApi.jsp:

     1 <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
     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     <h1>访问次数:${applicationScope.count }</h1>
    25     <h1>登陆人:${sessionScope.username }</h1>
    26   </body>
    27 </html>

    测试一下:

    虽然Struts2提供了ActionCotext来访问Servlet API,但这种访问毕竟不能直接获得Servlet API实例,为了在Action中直接访问Servlet API,struts2还提供了如下系统接口.

    ServletContextAware:实现该接口的Action可以直接访问web应用的ServletContext实例.

    ServletRequestAwart:实现该接口的Action可以直接访问用户请求的HttpServletRequest实例

    ServletResponseAware:实现该接口的Action可以直接访问服务器响应的HttpServletResponse实例.

    下面以ServletRequestAware为例,介绍如何在Action中访问HttpServletRequest对象.

    修改上面的代码:

    ServletApi.jsp

     1 <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
     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    <%--  <h1>访问次数:${applicationScope.count }</h1>
    25     <h1>登陆人:${sessionScope.username }</h1> --%>
    26     <h3>${requestScope.API }</h3>
    27   </body>
    28 </html>

    GetServletAPIAction.java

    package action;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.struts2.interceptor.ServletRequestAware;
    import org.apache.struts2.interceptor.ServletResponseAware;
    
    import com.opensymphony.xwork2.ActionContext;
    
    public class GetServletAPIAction implements ServletRequestAware{
        private HttpServletRequest request;
        
        
        private String name;
        private String pass;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getPass() {
            return pass;
        }
        public void setPass(String pass) {
            this.pass = pass;
        }
        
        public void getServletAPI1(){
            //获取ActionContext实例,通过该实例访问Servlet API
            ActionContext ctx=ActionContext.getContext();
            //获取ServletContext里的count属性
            Integer count=(Integer)ctx.getApplication().get("count");
            if(count==null){
                count=1;
            }
            else {
                count++;
            }
            //将访问人数设置成application的一个属性
            ctx.getApplication().put("count", count);
            ctx.getSession().put("username", "思思博士");
            
        }
        public void getServletAPI2(){
            request.setAttribute("API","我来自于struts2中直接访问servletAPI的request");
        }
    
        @Override
        public void setServletRequest(HttpServletRequest request) {
            this.request=request;
        }
        public String execute(){
            //getServletAPI1();
            getServletAPI2();
            return "api";
        }
        
    }

    测试结果:

  • 相关阅读:
    2016年终总结
    cocos2dx-3.x 导出自定义类到 lua 过程详解
    Direct3D11学习:(九)绘制基本几何体
    Direct3D11学习:(八)Effects介绍
    Direct3D11学习:(七)绘图基础——彩色立方体的绘制
    Direct3D11学习:(六)渲染管线
    Direct3D11学习:(五)演示程序框架
    Direct3D11学习:(四)计时和动画
    常见 Windows 函数列表
    驱动下通过进程PID获得进程名 (动态获取ImageFileName在EPROCESS结构体中的相对偏移)
  • 原文地址:https://www.cnblogs.com/guoyansi19900907/p/4482612.html
Copyright © 2020-2023  润新知