• 开发portlet中的一些问题记录,portlet:resourceURL用法,portlet中通过processAction方法传值


    在portlet页面中引入js或者css,通过c或者s标签
    <!--jquery实际放的地方:/MyTask/WebContent/scripts/jquery-1.8.3.min.js-->
    <script type="text/javascript" src="<c:url value="/js/jquery-1.8.3.min.js"/>"></script>
    <script type="text/javascript" src='<s:url value="/scripts/jquery-1.8.3.min.js"/>'></script>
    
    <% String ctx = renderRequest.getContextPath(); %>
    <script type="text/javascript" src="<%=ctx%>/js/ylUtil.js"></script>
    
    portlet:resourceURL用法:

    可理解成直接指向serveResource()方法的一个url

    <!--使用resourceURL的时候需要把页面引入的portlet标签换成
        <%@taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>
    -->
    <portlet:resourceURL id="/WEB-INF/jsp/resource.jsp" var="resourceJsp">
        <portlet:param name="vFlag" value="addAppTask"/>
    </portlet:resourceURL>
    <!-- 或者直接写成下面的酱紫-->
    <portlet:resourceURL/>
    

    portlet类里面写:

    @Override
    public void serveResource(ResourceRequest request, ResourceResponse response)
            throws PortletException, IOException {
        if (request.getResourceID()!=null) {
            PortletRequestDispatcher prd =
                    getPortletContext().getRequestDispatcher(request.getResourceID());
            String hehe = request.getParameter("vFlag");
            System.out.println(hehe);
            if (prd != null) {
                prd.forward(request, response);
            }
        }
    }
    
    ajax乱码怎么办?
    function addToLinks1(taskId,taskName,taskUrl,appId) {
        var url = "<portlet:resourceURL />";
        //发送ajax请求,加入参数,在portlet类中处理
        alert(taskId+"\n"+taskName+"\n"+taskUrl+"]\n"+appId);
        var postData = "taskId="+taskId+"&taskName="+taskName+"&taskUrl="+taskUrl+"&appId="+appId;
        postData = encodeURI(postData);
        //alert(postData);
        yl.ajaxUtil.sendRequest(url, reqCallBack, postData);
    }
    function addToLinks(taskId,taskName,taskUrl,appId) {
        var url ="<portlet:resourceURL />";
        $.ajax({
            type:"post",
            url: url,
            cache: false,
            data: {taskId:taskId,
                taskName:taskName,
                taskUrl:taskUrl,
                appId:appId},
            dataType: "html",
            contentType:"application/x-www-form-urlencoded; charset=UTF-8", //声明编码
            success:function(data){    //提交表单
                alert(data);
            }
        });
    }
    function reqCallBack(data){
        alert(data.responseText);
    }
    
    //这样子的时候是在前面的页面上面encodeURI两次之后再解码
    //如果前后(提交表单的jsp与接受表单的servlet或者xxx)
    //都是utf-8的时候把要提交的表单数据只encodeURI一次就好了
    //System.out.println(URLDecoder.decode(request.getParameter("taskName"),"UTF-8"));
    System.out.println(request.getParameter("taskName"));
    
    自从有了<portlet:namespace />,妈妈再也不用担心我会在一个页面上面放很多一样portlet之后会有问题啦

    namespace生成一个和portletResponse.getNamespace方法返回一样的唯一字符串,这个字符串主要功能是在一个Portal页面中有很多个相同的portlet的时候用来唯一确定一些dom元素

    <a href="javascript:<portlet:namespace/>doFoo()">Foo</a>
    
    回调函数加参问题,用闭包?还是叫匿名函数?

    在调用sendRequest这个函数的时候,会有一个回调函数执行,sendRequest内部写法为:

    sendRequest : function(url,callback,postData) {
        var req = this.createXMLHTTPObject();
        if (!req) return;
        var method = (postData) ? "POST" : "GET";
        req.open(method,url,true);
        //req.setRequestHeader('User-Agent','XMLHTTP/1.0');
        if (postData)
            req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
        req.onreadystatechange = function () {
            if (req.readyState != 4) return;
            if (req.status != 200 && req.status != 304) {
                alert('HTTP error ' + req.status);
                return;
            }
            callback(req);
        }
        if (req.readyState == 4) return;
        req.send(postData);
    },

    是直接在自己本身内部生成的变量来作为回调函数的参数传入。然后呢,在自己函数(比如a)内部调用sendRequest的时候会为a传入我想要处理的dom对象作为参数,或者任意什么参数(比如b),在请求返回(执行回调函数的时机)时,如何把自己传入的b进行修改。但是sendRequest内部只为回调函数给了一个参数。 所以调用的时候只能自己写一个回调函数了,才能访问到当前a函数内部的一些东西。

    yl.ajaxUtil.sendRequest(url,
        function(data){
            //TODO 这里可以做成只请求一次,如果有ul就不ajax。但是,
            //但是,这样子之后在页面上加入链接之后不会即时显示出来
            var tmpUl = obj.getElementsByTagName("ul");
            if (tmpUl.length>0) {
                obj.removeChild(tmpUl[0]);
            }
            var s = document.createElement("div");
            s.innerHTML = data.responseText;
            //alert(s.getElementsByTagName("ul"));
            obj.appendChild(s.getElementsByTagName("ul")[0]);
            //alert(data.responseText);
            //alert(obj.id);
        },
        postData);
    ajax请求返回值设置变量的问题

    因为ajax的初衷之一就是不阻塞页面。所以,个人觉得用什么让sync为false完全是很xx。 但是这个问题要怎么解决才好呢。自己就亲手写过在一个页面上用for发送10条,然后sync为false。页面加载明显变慢4-5s。

    把html代码转换成dom对象
    var tmpUl = obj.getElementsByTagName("ul");
    if (tmpUl.length>0) {
        obj.removeChild(tmpUl[0]);
    }
    //通过innerhtml加入dom树之后则可以取到
    var s = document.createElement("div");
    //data.responseText 为 <ul><li>xxxxx</li>xxxxx</ul>
    s.innerHTML = data.responseText;
    //alert(s.getElementsByTagName("ul"));
    //s.getElementsByTagName("ul")[0]即为第一个ul的dom对象。在此处,只有一个ul。
    obj.appendChild(s.getElementsByTagName("ul")[0]);
    portlet中通过processAction方法传值

    在portlet类中的processAction方法中,可以通过参数ActionResponse调用setRenderParameter方法给render里面传值

    Action 和 Event 请求参数

    在action、event方法中接受到的参数不能传递到之后需要执行的render里面,在action方法中接受到的参数也不会传递到接下来执行的event方法中。如果确实需要在render中使用参数,需要在action、event的response调用setRenderParameter或者setRenderParameters方法。

    response.setRenderParameter("hehe", "hehehehe");
    

    在render里面取的时候(在jsp页面取,或者render方法中取)

    <%=renderRequest.getParameter("hehe")%>
    
    portlet中操作PortletPreferences
    String size = request.getParameter("Size");
    PortletPreferences pp = request.getPreferences();
    pp.setValue("size", size);
    pp.store();
    

    取的时候

    <%=renderRequest.getPreferences().getValue("size",null) %>
    
    ylUtil.js加入trim函数
    yl.str= {
        /**
         * 换掉字符串的前后空格
         * @param str
         * @returns str
         */
        trim : function(str) {
            /*  复习一下正则
                正则在js中字面量定义的方式是:用 “/”和“/”包围起来的。
                所以呢。/(^\s*)|(\s*$)/ 就表示一个正则
                然后呢,后面加个g表示全局,TODO: 有什么意义
                在呢,^ 这个东西代表一个字符串的开始
                $ 代表一个字符串的结束
                * 表示重复前边的表达式0-n次
                () 用来分组
                | 意思是或, 比如"z|food"能匹配z或者food,"(z|f)ood"可匹配zood或者food
                \s 表示空 包括空格,制表符,换页,换行等等。等价于 [ \f\n\r\t\v] 。
            */
            return str.replace(/(^\s*)|(\s*$)/g, "");
        },
        /**
         * 包含trim,同时将&nbsp ;替掉
         */
        //innerText总是支持的不够好,有时候innerHTML取到的会有&nbsp;
        //写这个东西会不会有点多余呢。
        trimNbsp : function(str) {
            /* 
                下面的就是在全局把&nbsp; 这个东东换成 没有
                要不要写成这样呢?
                /(^\&nbsp\;*)|(\&nbsp\;*$)/g
                试试之后上面的是在取头取尾
                下面的会把字符串里所有的&nbsp;全给干掉
                还是用上面的吧。
            */
            return this.trim(str).replace(/(\&nbsp\;)*/g,"");
        }
    };
    
  • 相关阅读:
    The Game
    棋盘问题(dfs)(类似8皇后)
    dfs---之全排列
    Dijkstra算法(求单源最短路径)
    四点共面 (简单题)
    最长递增子序列
    线段的重叠
    kruskal
    hdu 1232 畅通工程
    无限对拍程序
  • 原文地址:https://www.cnblogs.com/nimeiz/p/3427388.html
Copyright © 2020-2023  润新知