`

struts的include标签的修改,使支持http形式

 
阅读更多
本文需要读者对struts的标签源码比较熟悉。

由于公司的web应用根据不同的业务形式采用的独立部署。使各个业务的耦合度降低。使业务更加的灵活。
但是面临的是业务WEB_A应用需要调用业务WEB_B应用的页面。
  • 1:ajax的形式。
  • 使用下来效果也不错,满足了要求。
    但是面临的问题也来了。最最重要的是SEO,由于这块是异步加载的。由于WEB_A的主体是WEB_B所以,所以WEB_A基本上是页面无变动的。
  • 2:action中用java拿到页面的IO流。输出到页面上。
  • 但是,这样的情况下,就会使开发要写多余的重复的代码。
  • 3:代码、页面写在WEB_A上。但是这样的话,就使的开发需要维护两个业务工程。
  • 4:如有其他方案请联系我:)


后来在研究struts的s:include标签的时候,感觉也可以用自定义标签来解决类似问题。
附上代码:
中间的标签的配置省略了。
/**
 * 获取http请求内容
 *
 * @author shanzhu
 * @version 1.0 2011-9-15
 */
package org.apache.struts2.views.jsp;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.components.Component;
import org.apache.struts2.components.IncludeHttp;

import com.opensymphony.xwork2.util.ValueStack;

public class IncludeHttpTag extends ComponentTagSupport{

    /**
     * 
     */
    private static final long serialVersionUID = 4811111257523224901L;
    protected String value;
    protected String charset;   //编码
    protected int conntimeout;
    protected int requtimeout;
    

    public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
        return new IncludeHttp(stack, req, res);
    }

    protected void populateParams() {
        super.populateParams();

        ((IncludeHttp) component).setValue(value);
        ((IncludeHttp) component).setCharset(charset);
        ((IncludeHttp) component).setConntimeout(conntimeout);
        ((IncludeHttp) component).setRequtimeout(requtimeout);
    }
    

    public void setValue(String value) {
        this.value = value;
    }

    public void setCharset(String charset) {
        this.charset = charset;
    }

    public void setConntimeout(int conntimeout) {
        this.conntimeout = conntimeout;
    }

    public void setRequtimeout(int requtimeout) {
        this.requtimeout = requtimeout;
    }
}


/**
 * includehttp的时候。处理value是http开头。
 * 当使用这个标签的时候,会根据标签内的值取得url的io,写在页面上
 *
 * @author shanzhu
 * @version 1.0 2011-9-15
 */
package org.apache.struts2.components;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.StrutsConstants;
import org.apache.struts2.components.Component;
import org.apache.struts2.views.annotations.StrutsTag;
import org.apache.struts2.views.annotations.StrutsTagAttribute;

import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.ValueStack;


@StrutsTag(name="IncludeHttp", tldTagClass="org.apache.struts2.components.IncludeHttp", description="Include a servlet's output " +
                "(result of http context)")
public class IncludeHttp extends Component {

    private final String URL_AND = "&";
    private final String URL_DENGYU = "=";
    private final String URL_WENHAO = "?";
    private final String STR_KONG = "";
    private static final Log _log = LogFactory.getLog(IncludeHttp.class);

    protected String value;     //url
    protected String charset;   //以charset编码去取得远程的io
    protected int conntimeout;  //超时时间
    protected int requtimeout;  //超时时间
    private String wenhao  ;
    private String strParmaeters = "";
    private HttpServletRequest req;
    private HttpServletResponse res;
    private static String defaultEncoding;
    
    
    public IncludeHttp(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
        super(stack);
        this.req = req;
        this.res = res;
    }

    @Inject(StrutsConstants.STRUTS_I18N_ENCODING)
    public static void setDefaultEncoding(String encoding) {
        defaultEncoding = encoding;
    }

    public boolean end(Writer writer, String body) { 
        checkURL();
        value = value + this.wenhao + strParmaeters;
        String webContext = GetWebContent(value,charset,conntimeout,requtimeout); 
        return super.end(writer, webContext);
    }
    /**
     * 对url进行检查拼装
     */
    private void checkURL(){
        checkUrlSameStatus();
        checkParmater();
    }

    /**
     * 对?进行检查
     */
    private void checkUrlSameStatus(){
        if (this.value.indexOf(this.URL_WENHAO)>-1) {
            wenhao = STR_KONG;
        }else {
            wenhao = this.URL_WENHAO;
        }
    }
    /**
     * 对参数进行检查
     */
    private void checkParmater(){
        if (this.parameters==null || this.parameters.size()<=0) {
            strParmaeters = STR_KONG;
        }else {
            Iterator<?> it = parameters.entrySet().iterator();  
                while (it.hasNext()) {  
                    Map.Entry entry = (Map.Entry) it.next();  
                    if (strParmaeters.indexOf("&")>-1) {
                        strParmaeters = strParmaeters + this.URL_AND+entry.getKey() + this.URL_DENGYU + ((List)entry.getValue()).get(0);  
                    }else {
                        strParmaeters = strParmaeters +entry.getKey() + this.URL_DENGYU + ((List)entry.getValue()).get(0);
                    }
                    
            }  
        }
    }
    
    
    
    
    @StrutsTagAttribute(description="The jsp/servlet output to include", required=true)
    public void setValue(String value) {
        this.value = value;
    }

    /**
     * 取得includehttp标签内使用的parameter标签的值
     */
    @SuppressWarnings("unchecked")
    public void addParameter(String key, Object value) {
        // don't use the default implementation of addParameter,
        // instead, include tag requires that each parameter be a list of objects,
        // just like the HTTP servlet interfaces are (String[])
        if (value != null) {
            List currentValues = (List) parameters.get(key);

            if (currentValues == null) {
                currentValues = new ArrayList();
                parameters.put(key, currentValues);
            }
            currentValues.add(value);
        }
    }

    public void setCharset(String charset) {
        if (isEmpty(charset)) {
            charset = "utf-8";
        }
        this.charset = charset;
    }

    public void setConntimeout(int conntimeout) {
        if (conntimeout<=0) {
            conntimeout = 3000;
        }
        this.conntimeout = conntimeout;
    }

    public void setRequtimeout(int requtimeout) {
        if (requtimeout<=0) {
            requtimeout = 3000;
        }
        this.requtimeout = requtimeout;
    }
    
    boolean isEmpty(String str){
        if (str == null || "".equals(str)) {
            return true;
        }
        return false;
    }
    
    
    
    /*
     * 取得指定URL的Web内容
     */
    public static String GetWebContent(final String theURL,final String charset,final int connTimeout,final int requTimeout) {
        String sTotalString = "";
        URL l_url = null;
        HttpURLConnection l_connection = null;
        java.io.InputStream l_urlStream = null;
        BufferedReader l_reader = null;
        try {
            l_url = new URL(theURL);
            l_connection = (HttpURLConnection) l_url.openConnection();
            l_connection.setConnectTimeout(connTimeout);
            // 加入取内容超时处理
            l_connection.setReadTimeout(requTimeout);
            l_connection.connect();
            l_urlStream = l_connection.getInputStream();
            l_reader = new BufferedReader(new InputStreamReader(l_urlStream,charset));
            int buffer_size = 1024;
            char[] buffer = new char[buffer_size];
            StringBuffer sb = new StringBuffer();
            int readcount = 0;
            while ((readcount = l_reader.read(buffer, 0, buffer_size)) > 0) {
                sb.append(buffer, 0, readcount);
            }
            sTotalString = sb.toString();
            l_reader.close();
            l_urlStream.close();
            l_connection.disconnect();
        } catch (Exception e) {
            System.out.println("error: exception in WebUtil: " + e.toString()
                    + ":" + theURL);
        } finally {
            if (l_reader != null) {
                try {
                    l_reader.close();
                } catch (Exception e) {
                }
            }
            if (l_urlStream != null) {
                try {
                    l_urlStream.close();
                } catch (Exception e) {
                }
            }
            if (l_connection != null) {
                try {
                    l_connection.disconnect();
                } catch (Exception e) {
                }
            }
        }
        
        if (sTotalString==null) {
            sTotalString = "";   
        }
        return sTotalString;
    }

   
}



这个时候。调用方仅仅需要使用标签即可。
举个例子:
<s:includehttp value="http://www.aaa.html?a=1">
   <s:param name="b" value="'b'"></s:param>
</s:includehttp>
分享到:
评论
5 楼 Sweblish 2011-09-18  
仔细拜读中。。。。
4 楼 jiangfangyuan 2011-09-16  
nb。。刚哥 顶起
3 楼 lwg2001s 2011-09-16  
牛B啊,山猪...
2 楼 mozhenghua 2011-09-16  
刚哥加油!!!!
1 楼 zhangyaoming2004 2011-09-16  
  

相关推荐

    Struts2.1+Spring3.0+JPA1.0 .pdf

    - 为了更好地管理和维护大型项目,可以将Struts2的配置文件分割成多个小文件,并通过`include`标签进行合并。 ```xml &lt;include file="sub-config.xml"/&gt; ``` ### Result类型 - Struts2支持多种Result类型,包括...

    自己动手写Struts.pdf

    - **include和&lt;jsp:include/&gt;的区别**:`include`指令在编译时包含文件,`&lt;jsp:include/&gt;`在运行时包含文件。 - **forward和sendRedirect的区别**:`forward`是服务器端跳转,不改变URL;`sendRedirect`是客户端...

    struts资料\Tiles框架--页面布局

    Struts Tiles是Apache Struts项目的一个子项目,它基于JSP的Include指令扩展而来。Tiles通过定义模板(Template)和组件(Component)来组织页面,模板是页面的基本结构,而组件则是页面上的具体内容。Tiles框架的...

    Java框架面试题总结

    - **配置方式**:Struts2支持XML和注解两种配置方式,而Struts1仅支持XML配置。 - **性能优化**:Struts2在性能方面进行了优化,尤其是在高并发场景下的表现优于Struts1。 **12. Struts的常用标签库及用法** - **...

    FreeMarker设计指南(PDF版)

    - **丰富的指令集**:FreeMarker提供了诸如`include`、`if/elseif/else`、循环结构等常见指令,以及支持在模板中创建和修改变量。 - **复杂表达式的使用**:开发者可以在模板的任意位置使用复杂的表达式来指定变量...

    JSP速成教程(PDG)

    4. **JSP动作标签**:如`&lt;jsp:include&gt;`、`&lt;jsp:forward&gt;`、`&lt;jsp:useBean&gt;`等,它们用于在页面间传递数据、执行控制逻辑或者实例化JavaBean。 5. **EL(Expression Language)**:EL是一种轻量级的表达式语言,...

    freemarker中文手册

    2. **强大的模板语言**:Freemarker的模板语言强大且直观,支持常见的控制结构,如`include`、`if/elseif/else`、循环语句等,允许在模板中创建和修改变量,使用复杂表达式定义值,以及定义带有位置参数和嵌套内容的...

    java面试题

    2:继承:子类继承父类,子类可以拥有父类中已定义的方法,并且子类可以修改父类中的方法使其更适合特殊需求。 3:多台:不同对象对统一消息作出不同响应称之为多态 4:抽象:忽略与当前主题无关的那些方面,将...

    SiteMesh简介一(图片不出来。请下附件看)

    - **易于维护**:布局更改只需修改一个布局文件,所有引用该布局的页面都会自动更新。 - **良好的扩展性**:SiteMesh允许自定义过滤器和装饰器,以适应不同的需求。 总的来说,SiteMesh是一个强大的工具,能够帮助...

    富基融通JAVA软件工程师面试题(2011.12)

    2. **继承性**:继承是一种代码复用形式,它使一个类可以继承另一个类的属性和方法,从而减少重复代码的编写,提高代码的重用性。 3. **多态性**:多态是指允许不同子类型的对象对同一消息作出响应;即同一消息可以...

    JavaEE技术面试常见问题.doc

    3. **Struts标签库的使用** - ****:文本输入框。 - ****:提交按钮。 - ****:显示属性值。 4. **Struts生命周期** - 请求到达`ActionServlet`。 - 调用相应的`Action`。 - 执行业务逻辑。 - 返回视图...

    最新Java面试大全

    - **使用&lt;jsp:include&gt;标签**:动态包含文件。 - **使用标签**:静态包含文件。 #### 6. Jsp中的errorPage - **errorPage**:用于指定当出现异常时,跳转到哪个页面进行错误处理。 #### 7. 在JSP中使用JavaBeans ...

    超级有影响力霸气的Java面试题大全文档

    派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装:  封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,...

    freemarker总结

    JAVA模版引擎Freemarker常用标签(一) 1. if指令 这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: &lt;#if condition&gt;... &lt;#elseif condition&gt;... &lt;#elseif condition&gt;......

Global site tag (gtag.js) - Google Analytics