zoukankan      html  css  js  c++  java
  • 开发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,"");
        }
    };
    
  • 相关阅读:
    7月15日考试 题解(链表+状压DP+思维题)
    暑假集训日记
    C# .NET 使用 NPOI 生成 .xlsx 格式 Excel
    JavaSE 基础 第42节 局部内部类
    JavaSE 基础 第41节 匿名内部类
    JavaSE 基础 第40节 内部类概述
    JavaSE 基础 第39节 接口的应用
    JavaSE 基础 第38节 接口的实现
    JavaSE 基础 第37节 接口概述
    JavaSE 基础 第36节 抽象类概述与使用
  • 原文地址:https://www.cnblogs.com/nimeiz/p/3427388.html
Copyright © 2011-2022 走看看