AEM Servlet

AEM Servlet实践
本文介绍了一个使用AEM Servlet实现的示例,展示了如何通过Servlet处理HTTP GET和POST请求,包括设置响应类型和字符编码,以及如何与外部服务交互,如Salesforce API调用。

AEM Servlet示例:

 

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;

import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.commons.json.JSONArray;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**************************************************************************************
 * Java Interface Name : TrialGuideServlet 
 * Version             : 1.0 
 * Created Date        : 8 January 2018 

 * Function            : This class is used for get trial guide message. 
 * Modification Log    :
 
 * *************************************************************************************/

@SuppressWarnings("serial")
@Component(immediate = true, description = "Controller", metatype = true)
@Service(value = javax.servlet.Servlet.class)
@Properties(value = {
        @Property(name = "sling.servlet.methods", value = { "GET", "POST" }),
        @Property(name = "sling.servlet.paths", value = { "/bin/trialguide" }) })
public class TrialGuideServlet extends SlingAllMethodsServlet {
    Logger log = LoggerFactory.getLogger(TrialGuideServlet.class);
    @Reference
    SCGenericMappingService mappingService;

    @SuppressWarnings("null")
    @Override
    protected void doGet(SlingHttpServletRequest req,
            SlingHttpServletResponse response) throws ServletException,
            IOException {
        Boolean isSuccessful = Boolean.TRUE;
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        JSONObject returnObject = new JSONObject();

        response.getWriter().println(returnObject);

}

}

注意:

必须指定:

 response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");

IE浏览器发出的请求,如不指定,获取不到Response.

另外:get请求会被客户端缓存,如涉及到修改后的获取,可以加时间作为参数刷新数据。

 

6.4更新:

 

import java.io.IOException;

 

import javax.servlet.Servlet;

import javax.servlet.ServletException;

 

import org.apache.sling.api.SlingHttpServletRequest;

import org.apache.sling.api.SlingHttpServletResponse;

import org.apache.sling.api.servlets.HttpConstants;

import org.apache.sling.api.servlets.SlingAllMethodsServlet;

import org.osgi.framework.Constants;

import org.osgi.service.component.annotations.Component;

import org.osgi.service.component.annotations.Reference;

 

import com.adobe.cq.mcm.salesforce.SalesforceResponse;

import SFDCConnectorService;

import SFDCConnectorServiceImpl;

 

 

@Component(service = Servlet.class, immediate = true,

property = {

"sling.servlet.methods=" + HttpConstants.METHOD_GET,

"sling.servlet.paths" + "=/bin/services/test",

        Constants.SERVICE_DESCRIPTION + "= AEM Service API"})

 

public class SFDCTest extends SlingAllMethodsServlet{

 

    /**

*/

private static final long serialVersionUID = 1L;

@Reference

SFDCConnectorService salesforceService;

 

final String SERVICE_PATH = "/services/data";

@Override

    protected void doGet(final SlingHttpServletRequest req,

            final SlingHttpServletResponse resp) throws ServletException, IOException {

//         final Resource resource = req.getResource();

//         resp.getWriter().write("Title = " + resource.adaptTo(ValueMap.class).get("jcr:title"));

        resp.setContentType("application/json"); 

resp.setCharacterEncoding("UTF-8");

String message = "Test";

resp.getWriter().println(message);

if(salesforceService == null){

message = "salesforceService is null before new it";

resp.getWriter().println(message);

salesforceService = new SFDCConnectorServiceImpl();

}

SalesforceResponse salesforceResponse = salesforceService.executeRequest(SERVICE_PATH,null, null, "GET");

if(salesforceResponse == null){

message = "Salesforce response is null.";

}else{

Integer status = salesforceResponse.getCode();

if(status == 200){

message = salesforceResponse.getBody();

}else{

message = "status: "+status;

}

}

resp.getWriter().println(message);

    }

}

configuration:

@ObjectClassDefinition(name="PWC salesforce connector",

description = "Properties configuration")

public static @interface Config {

@AttributeDefinition(name = "Cloud services path",

description = "This is the salesforce service path in AEM")

String cloudConfigPath() default "/etc/cloudservices/salesforce/connector";

}

@Activate

public void activate(final Config config) {

this.cloudConfigPath = config.cloudConfigPath();

}

转载于:https://my.oschina.net/slightScenery/blog/1865205

在 Adobe Experience Manager (AEM) 6.4 中安装 ClickHouse 数据库,通常不是直接在 AEM 应用程序内部进行操作,而是将 ClickHouse 部署为外部数据库服务,并与 AEM 进行集成。以下是部署和集成的基本流程: ### 部署 ClickHouse 数据库 1. **安装 ClickHouse** ClickHouse 是一个独立的列式数据库管理系统,支持多种部署方式。可以在 Linux、Docker 或云服务中安装 ClickHouse。以下是一个在 Ubuntu 系统上安装 ClickHouse 的基本命令: ```bash sudo apt-get install apt-transport-https sudo apt-get install clickhouse-server clickhouse-client ``` 安装完成后,启动 ClickHouse 服务并确保其正常运行: ```bash sudo service clickhouse-server start clickhouse-client ``` 2. **配置 ClickHouse** 配置文件通常位于 `/etc/clickhouse-server/` 目录下。可以配置监听地址、端口、用户权限等参数以满足安全性和性能需求。 ### 在 AEM 6.4 中集成 ClickHouse 1. **添加 JDBC 驱动** AEM 使用 Java Database Connectivity (JDBC) 来连接外部数据库。需要将 ClickHouse 的 JDBC 驱动程序添加到 AEM 的 OSGi 容器中。可以从 [ClickHouse JDBC GitHub](https://github.com/ClickHouse/clickhouse-jdbc) 获取驱动程序。 2. **配置 JDBC 连接池** 登录到 AEM 的 OSGi 控制台(`http://<aem-host>:<port>/system/console/configMgr`),找到 `Apache Sling JDBC Connection Pool` 配置项,并创建一个新的连接池配置。填写以下信息: - **JDBC URL**:`jdbc:clickhouse://<host>:<port>/<database>` - **Username**:数据库用户名 - **Password**:数据库密码 - **Driver Class**:`com.clickhouse.jdbc.ClickHouseDriver` 3. **在 AEM 组件中使用 ClickHouse** 创建自定义 OSGi 服务或 Sling 模型来访问 ClickHouse 数据库。例如,使用 JDBC 连接并查询数据: ```java @Component(service = DataSource.class) public class ClickHouseDataSource implements DataSource { private Connection connection; @Activate public void activate() throws SQLException { try { Class.forName("com.clickhouse.jdbc.ClickHouseDriver"); connection = DriverManager.getConnection("jdbc:clickhouse://localhost:8123/default", "user", "password"); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } @Override public Connection getConnection() throws SQLException { return connection; } @Override public Connection getConnection(String username, String password) throws SQLException { return DriverManager.getConnection("jdbc:clickhouse://localhost:8123/default", username, password); } // 其他方法实现... } ``` 4. **创建 AEM 服务或组件** 创建 Sling Servlet 或自定义服务来调用上述数据源,并实现数据的读写操作。例如,创建一个 Servlet 来查询 ClickHouse 数据库: ```java @Component(service = Servlet.class, property = { "sling.servlet.paths=/bin/clickhouse/query", "sling.servlet.methods=GET" }) public class ClickHouseQueryServlet extends SlingAllMethodsServlet { @Reference private DataSource clickHouseDataSource; @Override protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException { try (Connection conn = clickHouseDataSource.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM my_table")) { // 处理结果集并输出到响应 while (rs.next()) { response.getWriter().println(rs.getString("column_name")); } } catch (SQLException e) { response.getWriter().println("Error querying ClickHouse: " + e.getMessage()); } } } ``` 通过上述步骤,可以在 AEM 6.4 环境中成功部署并集成 ClickHouse 数据库,从而实现对大规模数据分析的支持。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值