当前位置: 首页 > news >正文

wordpress 图片默认居中/杭州seo托管公司推荐

wordpress 图片默认居中,杭州seo托管公司推荐,wordpress转换成dede,基于web的旅游网站设计前言在这个答案中,我将假设如下:您对使用不感兴趣(我将在中间留下确切的原因,您至less对使用新的Java EE 7 / JSR356 WebSocket API感兴趣)。你想要一个应用程序范围的推送(即所有的用户一次获得相同的推送消息,因此你不感兴趣的一…

前言

在这个答案中,我将假设如下:

您对使用不感兴趣(我将在中间留下确切的原因,您至less对使用新的Java EE 7 / JSR356 WebSocket API感兴趣)。

你想要一个应用程序范围的推送(即所有的用户一次获得相同的推送消息,因此你不感兴趣的一个会议或查看范围推送)。

你想从(MySQL)数据库端直接调用push(因此你不希望使用实体监听器从JPA端调用push)。 编辑 :我会涵盖两个步骤。 步骤3a描述了DB触发器,步骤3b描述了JPA触发器。 使用它们,或者,而不是两个!

1.创build一个WebSocket端点

首先创build一个@ServerEndpoint类,它基本上将所有websocket会话收集到一个应用程序范围内。 请注意,在这个特定的例子中,这只能是static因为每个websocket会话基本上都有它自己的@ServerEndpoint实例(它们不像servlet是无状态的)。

@ServerEndpoint("/push") public class Push { private static final Set SESSIONS = ConcurrentHashMap.newKeySet(); @OnOpen public void onOpen(Session session) { SESSIONS.add(session); } @OnClose public void onClose(Session session) { SESSIONS.remove(session); } public static void sendAll(String text) { synchronized (SESSIONS) { for (Session session : SESSIONS) { if (session.isOpen()) { session.getAsyncRemote().sendText(text); } } } } }

上面的例子有一个额外的方法sendAll() ,它将给定的消息发送到所有打开的websocket会话(即应用程序范围的推送)。 请注意,这个消息也可以是一个JSONstring。

如果你打算明确地将它们存储在应用程序范围(或(HTTP)会话范围),那么你可以在这个答案中使用ServletAwareConfig示例。 您知道, ServletContext属性映射到JSF中的ExternalContext#getApplicationMap() (并且HttpSession属性映射到ExternalContext#getSessionMap() )。

2.打开客户端的WebSocket,并听取它

使用这段JavaScript打开一个websocket并听取它:

if (window.WebSocket) { var ws = new WebSocket("ws://example.com/contextname/push"); ws.onmessage = function(event) { var text = event.data; console.log(text); }; } else { // Bad luck. Browser doesn't support it. Consider falling back to long polling. // See http://caniuse.com/websockets for an overview of supported browsers. // There exist jQuery WebSocket plugins with transparent fallback. }

截至目前,它只是logging推送的文字。 我们想用这个文本作为更新菜单组件的指令。 为此,我们需要额外的 。

想象一下,您正在通过Push.sendAll("updateMenu")发送一个JS函数名称作为文本,然后您可以解释并触发它,如下所示:

ws.onmessage = function(event) { var functionName = event.data; if (window[functionName]) { window[functionName](); } };

再次,当使用JSONstring作为消息(您可以通过$.parseJSON(event.data)parsing)时,更多的dynamic是可能的。

3A。 从数据库端触发WebSocket推送

现在我们需要从DB端触发Push.sendAll("updateMenu")命令。 让数据库在Web服务上触发HTTP请求的最简单方法之一。 一个普通的香草servlet绰绰有余,就像一个Web服务:

@WebServlet("/push-update-menu") public class PushUpdateMenu extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Push.sendAll("updateMenu"); } }

如有必要,您当然有机会根据请求参数或path信息参数化推送消息。 如果允许调用者调用这个servlet,不要忘记执行安全检查,否则世界上除了DB之外的其他任何人都可以调用它。 您可以检查来电者的IP地址,例如,如果数据库服务器和networking服务器在同一台计算机上运行,​​这很方便。

为了让DB在这个servlet上激发一个HTTP请求,你需要创build一个可重用的存储过程,它主要调用特定于操作系统的命令来执行HTTP GET请求,例如curl 。 MySQL本身不支持执行特定于操作系统的命令,因此您需要首先安装用户定义的函数(UDF)。 在mysqludf.org你可以find一堆SYS是我们感兴趣的。 它包含我们需要的sys_exec()函数。 安装完成后,在MySQL中创build以下存储过程:

DELIMITER // CREATE PROCEDURE menu_push() BEGIN SET @result = sys_exec('curl http://example.com/contextname/push-update-menu'); END // DELIMITER ;

现在你可以创buildinsert / update / delete触发器来调用它(假设表名被命名为menu ):

CREATE TRIGGER after_menu_insert AFTER INSERT ON menu FOR EACH ROW CALL menu_push();

CREATE TRIGGER after_menu_update AFTER UPDATE ON menu FOR EACH ROW CALL menu_push();

CREATE TRIGGER after_menu_delete AFTER DELETE ON menu FOR EACH ROW CALL menu_push();

3B。 或从JPA端触发WebSocket推送

如果您的需求/情况只允许侦听JPA实体更改事件,并且因此不需要覆盖对数据库的外部更改,则可以使用JPA实体更改侦听器来代替步骤3a中所述的数据库触发器。 你可以在@Entity类中通过@EntityListeners注解来注册它:

@Entity @EntityListeners(MenuChangeListener.class) public class Menu { // ... }

如果你碰巧使用了一个web项目项目(EJB / JPA / JSF)在同一个项目中一起抛出,那么你可以直接调用Push.sendAll("updateMenu") 。

public class MenuChangeListener { @PostPersist @PostUpdate @PostRemove public void onChange(Menu menu) { Push.sendAll("updateMenu"); } }

但是,在“企业”项目中,EJB项目中的服务层代码(EJB / JPA / etc)通常是分开的,而Web层代码(JSF / Servlets / WebSocket / etc)则保存在Web项目中。 EJB项目不应该单独依赖Web项目。 在这种情况下,您最好启动CDI Event而不是Web项目可能@Observes 。

public class MenuChangeListener { // Outcommented because it's broken in current GF/WF versions. // @Inject // private Event event; @Inject private BeanManager beanManager; @PostPersist @PostUpdate @PostRemove public void onChange(Menu menu) { // Outcommented because it's broken in current GF/WF versions. // event.fire(new MenuChangeEvent(menu)); beanManager.fireEvent(new MenuChangeEvent(menu)); } }

(请注意注释;在当前版本(4.1 / 8.2)中GlassFish和WildFly都注入了注入CDI Event ;解决方法是通过BeanManager触发事件;如果仍然无效,则CDI 1.1替代为CDI.current().getBeanManager().fireEvent(new MenuChangeEvent(menu)) )

public class MenuChangeEvent { private Menu menu; public MenuChangeEvent(Menu menu) { this.menu = menu; } public Menu getMenu() { return menu; } }

然后在web项目中:

@ApplicationScoped public class Application { public void onMenuChange(@Observes MenuChangeEvent event) { Push.sendAll("updateMenu"); } }

更新 :2016年4月1日(上述答案后的半年), OmniFaces引入了2.3版本的 ,这应该使这一切都变得更加迂回。 即将到来的JSF 2.3 主要基于 。 另请参见服务器如何将asynchronous更改推送到由JSF创build的HTML页面?

http://www.lbrq.cn/news/1101925.html

相关文章:

  • 国外优秀企业网站模板/seo基础培训机构
  • 洛阳响应式网站建设/百度官方app下载
  • 网站建设 技术/百度首页推广
  • 内地公司 香港服务器 经营性网站/怎么找百度客服
  • 网站建设流程图/seo黑帽技术工具
  • 济南制作网站制作公司策划/自己做网站需要什么条件
  • 在线建网站/seo外包 靠谱
  • 你认为什么是网络营销/谷歌seo和百度seo
  • 怎么做自己的淘宝客推广网站/公司想建个网站怎么弄
  • 真人做的免费视频网站/济南百度竞价
  • 超级工程网站建设上海中心大厦/百度会员登录入口
  • 我做的网站在手机里滑动怎么这里卡/免费的关键词挖掘工具
  • 如何识别网站建设/深圳网站seo外包公司哪家好
  • 网上注册公司需要上传哪些资料/seo 优化案例
  • 建新建设集团有限公司网站/专业的网站建设公司
  • 科技公司网站制作模板/最新新闻事件今天疫情
  • 厦门公司做网站/数据分析师资格证书怎么考
  • wordpress国人cms/网页搜索优化
  • 网站与数据库的联系/网络推广是干什么的
  • 网页游戏网站排行/2023第二波疫情已经到来了吗
  • 成都青羊网站建设/淘宝宝贝排名查询
  • 网站标签怎么做/网页宣传
  • 襄阳做网站找哪家公司/seo搜狗排名点击
  • 手机网站设计建设/企业网站排名优化公司
  • 帮做论文网站吗/北京网站建设公司
  • 网站分享的功能怎么做/百度浏览器广告怎么投放
  • 杭州网站维护/引流推广怎么做
  • 国家建设材料检测网站/百度指数功能模块有哪些
  • 响应式网站设计企业/google chrome浏览器
  • 国际交流中心网站建设与管理制度/新业务在线软件下载
  • Effective Python 条款13:通过带星号的unpacking操作来捕获多个元素,不要用切片
  • 数据存储方案h5py
  • 从零开始学Tailwind CSS : 颜色配置原理与实践
  • 基于springboot的考研互助小程序
  • 用线性代数推导码分多址(CDMA)
  • uni-app 跳转页面传参