1原生Portlet开发

这是最简单、最本质的开发方式,直接基于Portlet规范定义的接口开发Portlet。优点是贴近底层比较灵活,
缺点当然就是所有事情都要自己去做。就好比不用SpringMVC、Struts,直接基于Servlet开发一样。
这种方式比较适合自己开发Portlet框架。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public class NativePortlet implements Portlet {
 
    private Logger logger = LoggerFactory.getLogger(NativePortlet.class);
 
    private PortletConfig config;
 
    @Override
    public void init(PortletConfig portletConfig) throws PortletException {
        logger.info("初始化Portlet");
        this.config = portletConfig;
    }
 
    @Override
    public void processAction(ActionRequest actionRequest, ActionResponse actionResponse) throws PortletException, IOException {
        logger.info("处理Action动作");
 
        logger.info("接收到POST请求,用户名为[{}]", actionRequest.getParameter("userName"));
    }
 
    @Override
    public void render(RenderRequest renderRequest, RenderResponse renderResponse) throws PortletException, IOException {
        logger.info("处理Render动作");
 
        WindowState state = renderRequest.getWindowState();
        if (state.equals(WindowState.MINIMIZED)) {
            return;
        }
 
        // doDispatch();
        PortletMode mode = renderRequest.getPortletMode();
        if (PortletMode.VIEW.equals(mode)) {
            // doView();
            String normalPage = config.getInitParameter("ViewPage");
            if (WindowState.NORMAL.equals(state)) {
                this.include(renderRequest, renderResponse, normalPage);
            else {
                this.include(renderRequest, renderResponse, "");
            }
        else if (PortletMode.EDIT.equals(mode)) {
            // doEdit();
        else if (PortletMode.HELP.equals(mode)) {
            // doHelp();
        else {
            throw new PortletException("unknown portlet mode: " + mode);
        }
    }
 
    @Override
    public void destroy() {
        logger.info("销毁Portlet");
    }
 
    private void include(RenderRequest request, RenderResponse response, String viewPage) throws PortletException, IOException {
        response.setContentType("text/html");
        PortletContext context = config.getPortletContext();
        PortletRequestDispatcher requestDispatcher = context.getRequestDispatcher(viewPage);
        requestDispatcher.include(request, response);
    }
 
}

可以看到,在render()方法中,我们要自己处理不同Portlet模式(View,Edit,Help等)的渲染,根据需要做分发。
诸如此类的各种细节都需要我们自己去制定规则,自己处理。

2注解Portlet开发

Portlet规范也提供了注解的方式来开发Portlet。这样不用依赖SpringMVC Portlet等第三方框架,
也能比较方便的开发Portlet,又不用处理特别底层的实现细节。来看一个例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class AnnotatedPortlet extends GenericPortlet {
 
    private Logger logger = LoggerFactory.getLogger(AnnotatedPortlet.class);
 
    /**
     * 进入主页面(View模式)
     * @param request
     * @param response
     * @throws Exception
     */
    @RenderMode(name = "view")
    public void toIndexPage(RenderRequest request, RenderResponse response) throws Exception {
        getPortletContext().
                getRequestDispatcher(getInitParameter("ViewPage")).
                    include(request, response);
    }
 
    /**
     * 保存用户名
     * @param request
     * @param response
     */
    @ProcessAction(name = "saveUsername")
    public void saveUsername(ActionRequest request, ActionResponse response) {
        String userName = request.getParameter("userName");
 
        logger.info("保存用户名[{}]", userName);
    }
 
    /**
     * 保存电子邮件地址
     * @param request
     * @param response
     */
    @ProcessAction(name = "saveEmail")
    public void saveEmail(ActionRequest request, ActionResponse response) {
        String email = request.getParameter("email");
 
        logger.info("保存Email[{}]", email);
    }
 
}

使用@RenderMode注解定义不同模式下,Portlet渲染的实现方法。@ProcessAction注解可以根据动作名称,
直接将请求交给标有注解的方法去处理,不用我们自己去实现根据注解分发请求的代码了。

附:其他代码

页面代码如下。使用Portlet规范中定义的标签产生ActionUrl。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>
<portlet:defineObjects />
 
<h3>这是一个演示FORM表单和AJAX提交的示例程序</h3>
 
<!-- FORM表单提交实例 -->
<form action='<portlet:actionURL name="saveUsername"/>' method="POST">
    <tr>
        <td>用户名:</td>
        <td><input name="userName" type="text" /></td>
    </tr>
    <tr>
        <td><input type="submit" value="表单提交" /></td>
    </tr>
</form>
 
<!-- AJAX提交实例 -->
<tr>
    <td>Email:</td>
    <td><input id="email" type="text"/></td>
</tr>
<tr>
    <input id="ajaxBtn" type="button" value="AJAX提交" />
</tr>
<script>
    $(".ajaxBtn").bind("click", function () {
        var email = $(".email").valueOf();
 
        jQuery.ajax({
            type: "GET",
            async: true,
            url: '<portlet:actionURL name="saveEmail" />',
            dataType: 'json',
            data: {
                "email": email
            },
            success: function (data) {
                alert(data);
            },
            error: function (data, status, e) {
                alert(e);
            },
            beforeSend: function () {
            },
            complete: function () {
            }
        });
    });
</script>

Portlet开发入门实例的更多相关文章

  1. IOS开发入门实例

    关于如何创建第一个 iOS 应用 本篇“第一个 iOS 应用”教程将向你介绍 iOS 应用开发中的“三个T”: Tools(工具)如何利用 Xcode 创建和管理工程. Technologies(技术 ...

  2. 【转】Android NDK开发入门实例

    写这个,目的就是记录一下我自己的NDK是怎么入门的.便于以后查看,而不会忘了又用搜索引擎一顿乱搜.然后希望能够帮助刚学的人入门. 先转一段别人说的话:“NDK全称:Native Development ...

  3. java web 开发入门实例

    学习是个技巧活,关键是要找到重点的地方,新手在这方面的坑尤其多.看别人的教程一步一步的跟着做,隔几步就遇到一个新知识点,忍不住就百度往深处了解,一晃半天就过去了. 有的知识点要深入学习的,有的是了解下 ...

  4. ArcgisAdd-In开发入门实例

    1.开发环境 Vs2012+Arcgis10.2+win7 64bit 2.实现代码 首先在VS2012中新建一个解决方案,命名AddInTest. 接着,给解决方案AddInTest新建一个项目: ...

  5. Android NDK开发入门实例

    AndroidNDK是能使Android应用开发者把从c/c++编译而来的本地代码嵌入到应用包中的一系列工具的组合. 注意: AndroidNDK只能用于Android1.5及以上版本中. I. An ...

  6. Arcgis Add-In开发入门实例

    作为一个本科侧重于应用,工作之后却做了开发的程序员来说,做GIS,开发应该是一门必修课,只是,苦于各种原因吧,做GIS应用的人会开发的很少,做GIS开发的大部分都是计算机出身,痛心疾首啊-- 不好意思 ...

  7. Eclipse_luna_J2EE_For_JS+tomcat8.0环境搭建、配置、开发入门

    一.所有需要的软件.插件等下载地址 J2SE的官方下载路径:http://www.oracle.com/technetwork/java/javase/downloads/index.html Ecl ...

  8. destoon入门实例与常见问题

    收集了一些destoon入门实例与常见问题,大家做个参考. 链接如下: destoon忘记后台密码怎么办?destoon找回管理员密码 忘记destoon管理员后台账号密码怎么办?解决方法 desto ...

  9. Spark+ECLIPSE+JAVA+MAVEN windows开发环境搭建及入门实例【附详细代码】

    http://blog.csdn.net/xiefu5hh/article/details/51707529 Spark+ECLIPSE+JAVA+MAVEN windows开发环境搭建及入门实例[附 ...

随机推荐

  1. 例10-9 uva1636简单概率问题

    题意:一个01串,0代表没子弹,1代表有子弹.在开一次空枪后,开下一枪没子弹概率大的方案 ①接着开枪    ②随机转一下再开枪 思路: 在情况一就是求00在0中占的比例,情况二则是0在整个串中的比例 ...

  2. 【转载】 HTTP 中 GET 与 POST 的区别

    HTTP 中 GET 与 POST 的区别   GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通 ...

  3. 使用Unity NGUI-InputField组件输入时发现显示为白色就是看不到字体

    今天在接入android支付宝 SDK时,打包运行时,发现使用Unity NGUI-InputField组件输入时发现显示为白色就是看不到字体,查找一下发现是与android交互存在的问题, 只需在A ...

  4. P2P技术详解(一):NAT详解——详细原理、P2P简介

    1. IPv4协议和NAT的由来 今天,无数快乐的互联网用户在尽情享受Internet带来的乐趣.他们浏览新闻,搜索资料,下载软件,广交新朋,分享信息,甚至于足不出户获取一切日用所需.企业利用互联网发 ...

  5. Zookeeper 快速入门(上)

    来源:holynull, blog.leanote.com/post/holynull/Zookeeper 如有好文章投稿,请点击 → 这里了解详情 Zookeeper是Hadoop分布式调度服务,用 ...

  6. 基于PHP的对接免费电子面单接口平台的案例-快宝开放平台

    一.电子面单对接平台 电子面单对接平台分为两类: 1 .各大快递公司自有的电子面单接口开放平台:对接起来麻烦,需要每个快递公司分别调试接口,费时费力. 2 .第三方快递开放平台:如快宝开放平台(htt ...

  7. C# 异步转同步

    当我们的程序运行时,调用了一段异步的逻辑A,这段异步的逻辑无法转化为同步(如动画.下载进度等) 而,我们又需要等待异步逻辑A处理完成,然后再执行其它逻辑B. 那就迫切需要将异步转同步了! //参数bo ...

  8. 62. Unique Paths(中等,我自己解出的第一道 DP 题^^)

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...

  9. Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题

    Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...

  10. Oracle中建库时报Exception in thread main

    Linux操作系统上安装oracle 10g,在启动dbca的时候报 Exception in thread "main" 错误,详细内容如下: [oracle@centos ~] ...