本文需要读者对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>
分享到:
相关推荐
- 为了更好地管理和维护大型项目,可以将Struts2的配置文件分割成多个小文件,并通过`include`标签进行合并。 ```xml <include file="sub-config.xml"/> ``` ### Result类型 - Struts2支持多种Result类型,包括...
- **include和<jsp:include/>的区别**:`include`指令在编译时包含文件,`<jsp:include/>`在运行时包含文件。 - **forward和sendRedirect的区别**:`forward`是服务器端跳转,不改变URL;`sendRedirect`是客户端...
Struts Tiles是Apache Struts项目的一个子项目,它基于JSP的Include指令扩展而来。Tiles通过定义模板(Template)和组件(Component)来组织页面,模板是页面的基本结构,而组件则是页面上的具体内容。Tiles框架的...
- **配置方式**:Struts2支持XML和注解两种配置方式,而Struts1仅支持XML配置。 - **性能优化**:Struts2在性能方面进行了优化,尤其是在高并发场景下的表现优于Struts1。 **12. Struts的常用标签库及用法** - **...
- **丰富的指令集**:FreeMarker提供了诸如`include`、`if/elseif/else`、循环结构等常见指令,以及支持在模板中创建和修改变量。 - **复杂表达式的使用**:开发者可以在模板的任意位置使用复杂的表达式来指定变量...
4. **JSP动作标签**:如`<jsp:include>`、`<jsp:forward>`、`<jsp:useBean>`等,它们用于在页面间传递数据、执行控制逻辑或者实例化JavaBean。 5. **EL(Expression Language)**:EL是一种轻量级的表达式语言,...
2. **强大的模板语言**:Freemarker的模板语言强大且直观,支持常见的控制结构,如`include`、`if/elseif/else`、循环语句等,允许在模板中创建和修改变量,使用复杂表达式定义值,以及定义带有位置参数和嵌套内容的...
2:继承:子类继承父类,子类可以拥有父类中已定义的方法,并且子类可以修改父类中的方法使其更适合特殊需求。 3:多台:不同对象对统一消息作出不同响应称之为多态 4:抽象:忽略与当前主题无关的那些方面,将...
- **易于维护**:布局更改只需修改一个布局文件,所有引用该布局的页面都会自动更新。 - **良好的扩展性**:SiteMesh允许自定义过滤器和装饰器,以适应不同的需求。 总的来说,SiteMesh是一个强大的工具,能够帮助...
2. **继承性**:继承是一种代码复用形式,它使一个类可以继承另一个类的属性和方法,从而减少重复代码的编写,提高代码的重用性。 3. **多态性**:多态是指允许不同子类型的对象对同一消息作出响应;即同一消息可以...
3. **Struts标签库的使用** - ****:文本输入框。 - ****:提交按钮。 - ****:显示属性值。 4. **Struts生命周期** - 请求到达`ActionServlet`。 - 调用相应的`Action`。 - 执行业务逻辑。 - 返回视图...
- Portlet与常见的Web框架(如Spring MVC、Struts等)有所不同,因为它专注于在Portal环境中提供服务。 - 开发Portlet时可能会使用到某些Web框架的部分功能,但总体上来说,Portlet遵循的是自己的一套规范和标准。 ...
- **使用<jsp:include>标签**:动态包含文件。 - **使用标签**:静态包含文件。 #### 6. Jsp中的errorPage - **errorPage**:用于指定当出现异常时,跳转到哪个页面进行错误处理。 #### 7. 在JSP中使用JavaBeans ...
派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,...
JAVA模版引擎Freemarker常用标签(一) 1. if指令 这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: <#if condition>... <#elseif condition>... <#elseif condition>......