zoukankan      html  css  js  c++  java
  • Struts2与ServletAPI解耦

    什么是与Servlet API解耦?

    为了避免与servlet API耦合在一起,方便Action做单元测试,

    Struts2对HttpServletRequest,HttpSession,和ServletContext进行了封装,构造了3个Map对象来替代这三个对象,在Action中可以直接使用HttpServletRequest,HttpSession,ServletContext对应的Map对象来保存和读取数据。

    两种解耦方式:

    1、    使用Struts2提供的工具类中提供的静态方法,得到对用的封装后对象。

      

    package cn.itcast.context;
    
    import java.util.Map;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class ContextAction extends ActionSupport {
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        public String test() throws Exception{
            System.out.println("ContextAction ****** test()");
            
            HttpServletRequest request=ServletActionContext.getRequest();
            request.setAttribute("username","username_request");
            
            HttpServletResponse response=ServletActionContext.getResponse();
            
            Map sessionMap=ServletActionContext.getContext().getSession();
            sessionMap.put("username", "username_session");
            
            ServletContext sc=ServletActionContext.getServletContext();
            sc.setAttribute("username", "username_application");
            
            return "attr";
        }
    }

    2、    Action实现ServletRequestAware,ServletResponseAware,ServletContextAware,SessionAware四个接口,分别重写对应的set方法,达到操作该4个封装后对象。

    package cn.itcast.context;
    
    import java.util.Map;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import org.apache.struts2.ServletActionContext;
    import org.apache.struts2.interceptor.ServletRequestAware;
    import org.apache.struts2.interceptor.ServletResponseAware;
    import org.apache.struts2.interceptor.SessionAware;
    import org.apache.struts2.util.ServletContextAware;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class Context02Action extends ActionSupport 
        implements ServletRequestAware,ServletResponseAware,ServletContextAware,SessionAware{
    
        HttpServletRequest request;
        HttpServletResponse response;
        ServletContext context;
        Map<String, Object> sessionMap;
        
        private static final long serialVersionUID = 1L;
    
        public String test() throws Exception{
            System.out.println("ContextAction ****** test()");
            
            HttpServletRequest request=ServletActionContext.getRequest();
            request.setAttribute("username","username_request");
            
            HttpServletResponse response=ServletActionContext.getResponse();
            
            Map sessionMap=ServletActionContext.getContext().getSession();
            sessionMap.put("username", "username_session");
            
            ServletContext sc=ServletActionContext.getServletContext();
            sc.setAttribute("username", "username_application");
            
            return "attr";
        }
    
        public void setSession(Map<String, Object> session) {
            this.sessionMap=session;
        }
    
        public void setServletContext(ServletContext context) {
            this.context=context;
            
        }
    
        public void setServletResponse(HttpServletResponse response) {
            this.response=response;
        }
    
        public void setServletRequest(HttpServletRequest request) {
            this.request=request;
            
        }
    }

    两种方式没有好坏之分,全凭个人喜好!

    其他代码:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
    
         <package name="context" namespace="/context" extends="struts-default">
             <action name="contextAction_test" class="cn.itcast.context.ContextAction" method="test">
                 <result name="success">/context/success.jsp</result>
                 <result name="attr">/context/attr.jsp</result>
             </action>
             <action name="contextAction02_test" class="cn.itcast.context.Context02Action" method="test">
                 <result name="success">/context/success.jsp</result>
                 <result name="attr">/context/attr.jsp</result>
             </action>
         </package>
        
    </struts>
    struts_context.xml
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <%
    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 'test.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>
        <a href="${pageContext.request.contextPath }/context/contextAction_test.do">textContext</a><br/>
        <a href="${pageContext.request.contextPath }/context/contextAction02_test.do">testContext</a><br/>
      </body>
    </html>
    context/test.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <%
    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 'success.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>
        xxxxxxxxxxxxxx<br/>
      </body>
    </html>
    context/success.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <%
    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 'attr.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>
        ${requestScope.username }<br/>
        ${sessionScope.username }<br/>
        ${applicationScope.username }
      </body>
    </html>
    context/attr.jsp

      

  • 相关阅读:
    CSS日食与太阳碰撞
    CSS日食与太阳碰撞
    CSS日食与太阳碰撞
    CSS日食与太阳碰撞
    CSS日食与太阳碰撞
    CSS日食与太阳碰撞
    CSS日食与太阳碰撞
    页面的禁止事件(如:禁止鼠标右键)
    如何让checkbox复选框只能单选
    动态表单模块生成器参考
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5890167.html
Copyright © 2011-2022 走看看