js如何调用jsp自定义的标签?

这个是我继承TagSupport类自定义的标签:《my:privilege needPrivilegepath=""》《/my:privilege 》
我后台查询到的数据通过json数据传给前台,js拼接了jsp代码:var cabtn = $("《my:privilege needPrivilegepath=“/privilege_add”'》《/my:privilege》").append(abtn);

但是结果jsp自定义的标签并有起到作用,网上说js是前台编译,自定义标签是通过后台处理过的,不能调用,有什么办法可以让js拼接的jsp代码执行自定义标签

2个回答

你这么写肯定是不行的,首先jQuery选择器里面怎么能识别你的标签呢?你可以换一种思路,比如你这个标签是要把后台的数据传输过来,你可以在页面上用一个div包住你这个自定义的标签,然后在用jq选中这个div,然后再在这个div后面append

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
JSP include的自定义标签参数传递

我有这么个事情要做: 原来的系统中有很多jsp:include,例如: ``` <jsp:include page="/a/b/c.jsp" > <jsp:param name="paramxx1" value="yy1"/> <jsp:param name="paramxxx" value="yyy"/> </jsp:include> ``` 参数名称和个数不定。 现在要把这个include行为修改一下,先找/a/b/c.jsp, 如果找不到,就找 newfolder/a/b/c.jsp 我想用JSP自定义tag来做,现在卡在参数传递这了。 我是做后台开发的,jsp tag的资料不是很熟。 现在我写的tag文件如下 `<%@ tag body-content="scriptless" dynamic-attributes="dynParameters" import="java.net.URL" %> <%@ attribute name="page" type="java.lang.String" required="true" %> <%! public URL fileURL;%> <% String filePath = (String)pageContext.getAttribute("page"); //should be replaced with some mechanism of getting the name;perhaps as a request attribute fileURL = pageContext.getServletContext().getResource(filePath); %> <% if(fileURL==null) { // cannot found orignal file filePath = "newFolder/" + filePath; } else { // already prevent jsp files } %> <jsp:include page="<%=filePath%>" flush="true"> // how to pass jsp:parameter here? </jsp:include> ``` 然后使用的地方改成 ``` <my:include page="/a/b/c.jsp" > <jsp:param name="paramxx1" value="yy1"/> <jsp:param name="paramxxx" value="yyy"/> </my:include> ``` 该怎么处理jsp:param的动态参数传递呢?

js数据模板与自定义标签

问题背景:想用自定义标签控制jsp,不同的人页面上显示不同的内容。 问题:如果JSP页面上事先已经画好的例如按钮等,加上标签控制没有问题,但是有一些要控制table里面的内容,这些内容是页面上点击按钮调用AJEX访问后台,用JS模板绑定数据实现的。这种的就不会调用自己写的TagSupport继承类了,如何做? 或者是有没有调用AJEX后再让它去调用自己写的TagSupport继承类的方法?

javascript 中标签调用js变量问题

<script> fuction f(name) { if('<View:ViewTag field="value"/>'=='<DM:DocumentTag field="变量name"/>') { alert('<DM:DocumentTag field="变量name"/>'); } } </script> 这段代码中<View:ViewTag>是自定义标签。我现在要问的是 这个函数的参数name怎么样在field=“变量name”这里调用name,大家给个解决方法啊,急,挠破头皮了也没办法。

求助关于自定义标签!

想学习自定义标签方面的只是 谁有相关的资料吗 本人新手一枚 想问下是不是自定义标签就是定义好的jsp代码段???

js中怎么调用自定义jstl分页标签,急等,感谢

项目中有一个jstl分页标签模板,在jsp中直接调用,现在要实现 通过ajax异步刷新表格和分页,应该怎么调用jstl分页标签

javascript onclick 无法触发其引用的自定义函数

``` <!DOCTYPE html> <html> <head> <title>文章管理</title> <link href="/blog/css/bootstrap.min.css" rel="stylesheet"> <style> body { font-family: Georgia, "Times New Roman", Times, serif; color: #555; background-color: #f9f9f9; } h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 { margin-top: 0; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: normal; color: #333; } header { background-color: #428bca; -webkit-box-shadow: inset 0 -2px 5px rgba(0, 0, 0, .1); box-shadow: inset 0 -2px 5px rgba(0, 0, 0, .1); } .resume-navbar-brand { font-weight: 500; color: #cdddeb; background-color: #428bca; } .resume-navbar-brand:hover, .resume-navbar-brand:focus { color: #fff; } .resume-navbar-right li a { color: #cdddeb; } .resume-navbar-right li a:hover, .resume-navbar-right li a:focus { background-color: #cdddeb; color: #428bca; } .resume-button { background-color: #428bca; color: #cdddeb; } .resume-button:hover, .resume-button:focus { background-color: #f9f9f9; color: #555; } .resume-after-icon { margin-right: 5px; } .resume-techpercent { height: 30px; } .well { background-color: #cdddeb; } .resume-subtitle { background-color: #428bca; color: #cdddeb; } footer { padding: 16px 0; color: #cdddeb; text-align: center; background-color: #428bca; border-top: 1px solid #e5e5e5; } footer a { color: #cdddeb; } /*导航样式控制*/ .navbar-default { background-color: #428bca; border-color: #cdddeb; } .navbar-default .navbar-brand { color: #cdddeb; } .navbar-default .navbar-nav>li>a { color: #cdddeb; } .navbar-default .navbar-nav>li>a:hover, .navbar-default .navbar-nav>li>a:focus { background-color: #cdddeb; color: #555; } /*右上侧小button样式控制*/ .navbar-default .navbar-toggle { background-color: #cdddeb; } .navbar-default .navbar-toggle:visited { background-color: #cdddeb; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #DFEAF8 } .navbar-default .navbar-toggle .icon-bar { background-color: #428bca; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #cdddeb; } .navbar-default .navbar-toggle { border-color: #cdddeb; } </style> <script type="text/javascript" src="/blog/script/jquery-1.12.1.min.js"></script> <script type="text/javascript" src="/blog/script/bootstrap.min.js"></script> <script> function testButton(){ alert("click"); } function editArticle(articleId){ window.location.href="/blog/article/editArticle.do?articleId="+articleId+"&randomCode="Math.random(); } function deleteArticle(elem, articleId) { $.ajax({ type:"POST", url:"/blog/article/deleteArticle.do", data:"articleId="+articleId, success:function(data){ if(data==true){ $(elem).parent().parent().remove(); alert("文章删除成功"); } } }) } $(function(){ $("#articleCatalog_createArticle").click(function(){ window.location.href = "/blog/article/addArticle.do"; }) }); </script> </head> <body> <nav class="navbar navbar-default" role="navigation"> <div class="container-fluid"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#">切换英文</a> </div> <div id="navbar" class="navbar-collapse collapse"> <ul class="nav navbar-nav navbar-right"> <li><a href="javascript:void(0)">测试1</a></li> <li><a href="javascript:void(0)">测试2</a></li> <li><a href="javascript:void(0)">测试3</a></li> </ul> </div> </div> <!--/.nav-collapse --> </nav> <div class="container"> <div class="row"> <div class="col-lg-7 col-md-7 col-sm-7"> <nav class="navbar navbar-default" role="navigation"> <div class="btn-group pull-right"> <button id="articleCatalog_createArticle" type="button" class="btn btn-success">新建</button> </div> </nav> <button onclick="testButton()">test</button> <ul class="list-group"> <li class="list-group-item"><a href="/blog/article?action=showArticle&articleId=3822ff5c60d1428eb01f0bc9166bed9b">y</a> <div class="pull-right"> <button onclick="testButton()">test</button> <button onclick="alert('click');">编辑</button> <button onclick="deleteArticle(this,'3822ff5c60d1428eb01f0bc9166bed9b')">删除</button> </div></li> <li class="list-group-item"><a href="/blog/article?action=showArticle&articleId=42cd043b183c4454844544733ea23104">i</a> <div class="pull-right"> <button onclick="testButton()">test</button> <button onclick="alert('click');">编辑</button> <button onclick="deleteArticle(this,'42cd043b183c4454844544733ea23104')">删除</button> </div></li> <li class="list-group-item"><a href="/blog/article?action=showArticle&articleId=5ad13b9e06fb459189142352d03f4f98">o</a> <div class="pull-right"> <button onclick="testButton()">test</button> <button onclick="alert('click');">编辑</button> <button onclick="deleteArticle(this,'5ad13b9e06fb459189142352d03f4f98')">删除</button> </div></li> <li class="list-group-item"><a href="/blog/article?action=showArticle&articleId=60b719bdf82444ce873f13182445ad10">x</a> <div class="pull-right"> <button onclick="testButton()">test</button> <button onclick="alert('click');">编辑</button> <button onclick="deleteArticle(this,'60b719bdf82444ce873f13182445ad10')">删除</button> </div></li> <li class="list-group-item"><a href="/blog/article?action=showArticle&articleId=6db4a5087a46425eb301522c6f76137c">w</a> <div class="pull-right"> <button onclick="testButton()">test</button> <button onclick="alert('click');">编辑</button> <button onclick="deleteArticle(this,'6db4a5087a46425eb301522c6f76137c')">删除</button> </div></li> <li class="list-group-item"><a href="/blog/article?action=showArticle&articleId=74fa5fc2dfee4290986a3397a7f1d397">f</a> <div class="pull-right"> <button onclick="testButton()">test</button> <button onclick="alert('click');">编辑</button> <button onclick="deleteArticle(this,'74fa5fc2dfee4290986a3397a7f1d397')">删除</button> </div></li> <li class="list-group-item"><a href="/blog/article?action=showArticle&articleId=85b0a832f3564ef388c817e509098578">l</a> <div class="pull-right"> <button onclick="testButton()">test</button> <button onclick="alert('click');">编辑</button> <button onclick="deleteArticle(this,'85b0a832f3564ef388c817e509098578')">删除</button> </div></li> <li class="list-group-item"><a href="/blog/article?action=showArticle&articleId=8a9cb5a0196f4cc0a562067ceb80be4d">j</a> <div class="pull-right"> <button onclick="testButton()">test</button> <button onclick="alert('click');">编辑</button> <button onclick="deleteArticle(this,'8a9cb5a0196f4cc0a562067ceb80be4d')">删除</button> </div></li> <li class="list-group-item"><a href="/blog/article?action=showArticle&articleId=92624b6422fa423490aa179e562f97a3">v</a> <div class="pull-right"> <button onclick="testButton()">test</button> <button onclick="alert('click');">编辑</button> <button onclick="deleteArticle(this,'92624b6422fa423490aa179e562f97a3')">删除</button> </div></li> <li class="list-group-item"><a href="/blog/article?action=showArticle&articleId=9789a998ff894e48a080b86965837d98">c</a> <div class="pull-right"> <button onclick="testButton()">test</button> <button onclick="alert('click');">编辑</button> <button onclick="deleteArticle(this,'9789a998ff894e48a080b86965837d98')">删除</button> </div></li> </ul> <nav> <ul class="pagination"> <li><a href="/blog/article/showCatalogue.do?pageNum=1">首页</a> </li> <li><a href="/blog/article/showCatalogue.do?pageNum=1">上一页</a> </li> <li><a href="/blog/article/showCatalogue.do?pageNum=1">1</a> </li> <li><a href="/blog/article/showCatalogue.do?pageNum=2">2</a> </li> <li><a href="/blog/article/showCatalogue.do?pageNum=2">下一页</a> </li> <li><a href="/blog/article/showCatalogue.do?pageNum=2">末页</a> </li> </ul> </nav> </div> <div class="col-lg-5 col-md-5 col-sm-5"> <div class="well"> </div> </div> </div> </div> <footer> </footer> <script type="text/javascript"> </script> </body> </html> ``` 此处onclick="testButton()"无法执行

java后台拼接html和js,js没执行

![图片说明](https://img-ask.csdn.net/upload/201909/05/1567687262_258968.jpg) ![图片说明](https://img-ask.csdn.net/upload/201909/05/1567687274_775677.jpg)![图片说明](https://img-ask.csdn.net/upload/201909/05/1567687290_463762.jpg) 拼写了一个post的form表单提交,可是response.getWriter().print()输出的js代码无法执行,拼写的代码单独放到一个网页中是可以执行的,是需要前台进行接收吗?

前端embed标签支持js控制打印吗?

用embed预览了PDF文件但是好像js不支持打印,把embed嵌套到iframe中打印但是打印出来没有embed的内容

JS调用confirm,返回undefined!

小弟我也是第一次出现这个问题,由于html标签是在PHP代码中生成的,由onclick触发一个自定义的function,并向function传参,根据参数值再弹出confirm对话框,但是在console.log这个confirm的返回值的时候发现是undefined,所以无法进行下一步动作,求解答! 使用的框架是基于ThinkPHP改的 PHP生成标签的代码如下: ``` $str_ .= '<li id="lis_'.$n.'"><span class="'.$cls.'"></span><span class="lietext">'.$detailName.'</span>'; $str_ .= '<a href="javascript:void(0)" rel="" title="删除" onclick="buttonStatus(\'Del\',\''.$ke.'\',\''.$noteUrl.'\',\''.$kt.'\',\''.$n.'\',\''.$noteName.'\')" class="btn">删除</a>'; $str_ .= '<span class="liesu"></span><a rel="" href="javascript:void(0)" title="预览" onclick="buttonStatus(\'Check\',\''.$ke.'\',\''.$noteUrl.'\',\''.$kt.'\',\''.$n.'\',\''.$noteName.'\')" class="btn">预览</a></li>'; 前端js的自定义function如下: /************协议展示 删除与预览*************/ function buttonStatus(where,target,url,num,id,tarName,attachID){ var btn = '#lis_'+id; $(btn).addClass('lis_'); $('.lis_').attr('style','background:#22A460'); $(btn).attr('style','background:#357618'); if(where == 'Check'){ $('#whichTitle').html(tarName+" 预览"); $('#ifram').attr('src',url); } var mes = confirm("确认删除这条信息?"); if(mes==true && where == 'Del'){ console.log('123');return; $.post("{:Helper::createLink('sale/sign/sessionDel')}",{"tar":target,"path":url,"number":num,"attachID":attachID},function(res){ $(btn).remove(); }); }else{ return false; } } /************协议展示删除与预览 结束*************/ ```

导出excel,如何在下方弹出是否打开或保存

/***导出勾选列内容生成excel***/ function exportToExcel(tableid,chkname) //读取表格中每个单元到EXCEL中 { var curTbl = document.getElementById(tableid); if(chkname==undefined) chkname=""; var curChk = $("[name='"+chkname+"']"); var oXL; try{ oXL = new ActiveXObject("Excel.Application"); //创建AX对象excel }catch(e){ dalert("无法启动Excel!\n\n如果您确信您的电脑中已经安装了Excel,"+"那么请调整IE的安全级别。\n\n具体操作:\n\n"+"工具 → Internet选项 → 安全 → 自定义级别 → 对没有标记为安全的ActiveX进行初始化和脚本运行 → 启用"); return false; } var oWB = oXL.Workbooks.Add();//获取workbook对象 var oSheet = oWB.ActiveSheet;//激活当前sheet var hang = curTbl.rows.length;//取得表格行数 var lie =curTbl.rows(0).cells.length;//取得数据源列数 for(var i=0;i<hang;i++){//i为表单对应的行,j为表单对应的列 for(var j=0,k=0;j<lie-1;j++,k++){//k为生成EXCEL对应的列 if(curChk[j].checked){//当勾选上时记录相应的数据 oSheet.Cells(i+1,k+1).NumberFormatLocal = "@";//设置单元格数字格式为文本 oSheet.Cells(i+1,k+1).value=curTbl.rows(i).cells(j).innerText; }else{ k--;//当未勾选时,EXCEL列回退 } } } oXL.Visible = true;//设置excel可见属性 try{ var fname = oXL.Application.GetSaveAsFilename("用户导出结果.xls", "Excel Spreadsheets (*.xls), *.xls"); }catch(e){ print("Nested catch caught " + e); }finally{ location.href='用户导出结果.xls'; oWB.SaveAs(fname); oWB.Close(savechanges=false); //xls.visible = false; oXL.Quit(); oXL=null; //结束excel进程,退出完成 //window.setInterval("Cleanup();",1); idTmr = window.setInterval("Cleanup();",1); } } IE浏览器 1.我想要的是这种展示:(这是用jsp中java代码写的输出流) ![图片说明](https://img-ask.csdn.net/upload/201905/13/1557730691_867688.png) 2.目前js导出的,就直接把excel打开了,又弹出了另存为。是这样的:(现在只用js,不能像之前那样) ![图片说明](https://img-ask.csdn.net/upload/201905/13/1557730708_914458.png) 想问下大神们,创建ActiveXObject的方式能不能实现第一种 (查了很久,貌似用a标签路径下载可以,但我是ajax查询返回的数据,在调用 exportToExcel方法,如何实现)

spring mvc+shiro+cas 实现cas client功能 跳转回来404

http://securitycenter.com:8080/gtsys/cas?ticket=ST-14-HEDhc1GVQt0UYdiZpi7R-cas 返回这个地址 404 ![图片说明](https://img-ask.csdn.net/upload/201510/09/1444404164_27274.png) ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd" > <!-- 定时器开关 开始 --> <task:annotation-driven /> <!-- 标注类型 的事务配置 如果使用注解事务。就放开 <tx:annotation-driven />--> <!-- 统一异常处理方式 --> <bean id="exceptionHandler" class="com.lanyuan.exception.MyExceptionHandler"/> <!-- 初始化数据 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > <property name ="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="driverClassName" value="${jdbc.driverClass}" /> </bean> <bean id="pagePlugin" class="com.lanyuan.plugin.PagePlugin"> <property name="properties"> <props> <prop key="dialect">mysql</prop> <prop key="pageSqlId">.*query.*</prop> </props> </property> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自动匹配Mapper映射文件 --> <property name="mapperLocations" value="classpath:mappings/*-mapper.xml"/> <property name="typeAliasesPackage" value="com.lanyuan.entity"/> <property name="plugins"> <array> <ref bean="pagePlugin" /> </array> </property> </bean> <!-- 通过扫描的模式,扫描目录在com.lanyuan.mapper目录下,所有的mapper都继承SqlMapper接口的接口, 这样一个bean就可以了 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.lanyuan.mapper" /> </bean> <!-- 事务配置 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- <aop:config> <aop:pointcut expression="execution(public * com.lanyuan.controller.*(..))" id="pointcut" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" /> </aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="query*" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" read-only="true" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="modify*" propagation="REQUIRED" /> <tx:method name="logicDelById" propagation="REQUIRED" /> </tx:attributes> </tx:advice> --> <!-- <aop:aspectj-autoproxy proxy-target-class="true"/> <bean id="log4jHandlerAOP" class="com.lanyuan.logAop.LogAopAction"></bean> <aop:config proxy-target-class="true"> <aop:aspect id="logAspect" ref="log4jHandlerAOP"> <aop:pointcut id="logPointCut" expression="execution(* org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(..))" /> <aop:around method="logAll" pointcut-ref="logPointCut" /> </aop:aspect> </aop:config> --> <!-- 使用Spring组件扫描的方式来实现自动注入bean --> <context:component-scan base-package="com.lanyuan.task" /> <!-- 隐式地向 Spring 容器注册 --> <context:annotation-config /> </beans> spring-application.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd" > <tx:annotation-driven /> <context:component-scan base-package="com.lanyuan.controller" /> <context:component-scan base-package="com.lanyuan.logAop" /> <!-- 启动对@AspectJ注解的支持 --> <!--通知spring使用cglib而不是jdk的来生成代理方法 AOP可以拦截到Controller--> <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 注解支持 --> <context:annotation-config/> <!--避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>text/json;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> <!-- 采用SpringMVC自带的JSON转换工具,支持@ResponseBody注解 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJackson2HttpMessageConverter" /> <!-- JSON转换器 --> </list> </property> </bean> <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean> <mvc:annotation-driven> <!-- 处理responseBody 里面日期类型 --> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" /> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默认编码 --> <property name="defaultEncoding" value="utf-8" /> <!-- 文件大小最大值 --> <property name="maxUploadSize" value="10485760000" /> <!-- 内存中的最大值 --> <property name="maxInMemorySize" value="40960" /> </bean> <import resource="spring-mvc-shiro.xml"/> </beans> spring-mvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd" > <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > <property name ="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean> <bean id="credentialsMatcher" class="com.lanyuan.shiro.credentials.RetryLimitHashedCredentialsMatcher"> <!-- hashAlgorithmName必须的,没有默认值。可以有MD5或者SHA-1,如果对密码安全有更高要求可以用SHA-256或者更高。 这里使用MD5 storedCredentialsHexEncoded默认是true,此时用的是密码加密用的是Hex编码;false时用Base64编码 hashIterations迭代次数,默认值是1。 --> <constructor-arg ref="cacheManager" /> <property name="hashAlgorithmName" value="md5" /> <!--<property name="hashIterations" value="2" />--> <!--<property name="storedCredentialsHexEncoded" value="true" />--> </bean> <!-- 会话Cookie模板 --> <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <!-- sid如果改为JSESSIONID会导致重定向循环 --> <constructor-arg value="sid"/> <property name="httpOnly" value="true"/> <property name="maxAge" value="-1"/> </bean> <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <constructor-arg value="rememberMe"/> <property name="httpOnly" value="true"/> <property name="maxAge" value="2592000"/><!-- 30天 --> </bean> <!-- rememberMe管理器 --> <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager"> <!-- rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)--> <property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/> <property name="cookie" ref="rememberMeCookie"/> </bean> <bean id="casSubjectFactory" class="org.apache.shiro.cas.CasSubjectFactory"/> <!-- 凭证匹配器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="casRealm" /> <property name="sessionManager" ref="sessionManager"/> <!-- 使用下面配置的缓存管理器 --> <property name="cacheManager" ref="cacheManager" /> <property name="rememberMeManager" ref="rememberMeManager"/> <property name="subjectFactory" ref="casSubjectFactory"/> </bean> <!-- 相当于调用SecurityUtils.setSecurityManager(securityManager) --> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/> <property name="arguments" ref="securityManager"/> </bean> <!--自定义Realm --> <!-- <bean id="myRealm" class="com.lanyuan.shiro.MyRealm"> <property name="credentialsMatcher" ref="credentialsMatcher" /> <property name="cachingEnabled" value="false" /> --> <!-- 如需要自定义缓存时间放开以下.修改 ehcache.xml--> <!--<property name="authenticationCachingEnabled" value="true"/>--> <!--<property name="authenticationCacheName" value="authenticationCache"/>--> <!--<property name="authorizationCachingEnabled" value="true"/>--> <!--<property name="authorizationCacheName" value="authorizationCache"/>--> <!-- </bean> --> <!-- <property name="userService" ref="userService"/> --> <bean id="casRealm" class="com.lanyuan.shiro.MyCasRealm"> <property name="cachingEnabled" value="true"/> <property name="authenticationCachingEnabled" value="true"/> <property name="authenticationCacheName" value="authenticationCache"/> <property name="authorizationCachingEnabled" value="true"/> <property name="authorizationCacheName" value="authorizationCache"/> <!--该地址为cas server地址 --> <property name="casServerUrlPrefix" value="${shiro.casServer.url}"/> <!-- 该地址为是当前应用 CAS 服务 URL,即用于接收并处理登录成功后的 Ticket 的, 必须和loginUrl中的service参数保持一致,否则服务器会判断service不匹配--> <property name="casService" value="${shiro.client.cas}"/> </bean> <bean id="sysUserFilter" class="com.lanyuan.shiro.filter.SysUserFilter"/> <bean id="kickoutSessionControlFilter" class="com.lanyuan.shiro.filter.KickoutSessionControlFilter"> <property name="cacheManager" ref="cacheManager"/> <property name="sessionManager" ref="sessionManager"/> <property name="kickoutAfter" value="false"/> <property name="maxSession" value="1"/> <property name="kickoutUrl" value="/login.shtml"/> </bean> <bean id="casFilter" class="org.apache.shiro.cas.CasFilter"> <!--配置验证错误时的失败页面(Ticket 校验不通过时展示的错误页面) --> <property name="failureUrl" value="${shiro.failureUrl}"/> </bean> <bean id="casLogoutFilter" class="io.github.howiefh.cas.session.CasLogoutFilter"> <property name="sessionManager" ref="sessionManager"/> </bean> <bean id="logoutFilter" class="org.apache.shiro.web.filter.authc.LogoutFilter"> <property name="redirectUrl" value="${shiro.logout.url}"/> </bean> <!-- 配置shiro的过滤器工厂类,id- shiroFilter要和我们在web.xml中配置的过滤器一致 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <!-- <property name="loginUrl" value="/login.shtml" /> <property name="successUrl" value="/index.shtml" /> --> <property name="loginUrl" value="${shiro.login.url}"/> <property name="successUrl" value="${shiro.login.success.url}"/> <property name="unauthorizedUrl" value="/denied.jsp" /> <!-- 自定义权限配置 --> <property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" /> <property name="filters"> <util:map> <entry key="cas" value-ref="casFilter"/> <entry key="logout" value-ref="logoutFilter" /> <entry key="casLogout" value-ref="casLogoutFilter" /> <entry key="sysUser" value-ref="sysUserFilter"/> <entry key="kickout" value-ref="kickoutSessionControlFilter"/> </util:map> </property> </bean> <!--自定义filterChainDefinitionMap --> <bean id="chainDefinitionSectionMetaSource" class="com.lanyuan.shiro.ChainDefinitionSectionMetaSource"> <property name="filterChainDefinitions"> <value> /casFailure.jsp = anon /cas = casLogout,cas /logout = logout /favicon.ico = anon /admin_files/** = anon /fonts/** = anon /404/** = anon /error.jsp = anon /js/** = anon /layer-v1.9.2/** = anon /notebook/** = anon /login.shtml = anon /denied.jsp = anon /install.shtml = anon /lanyuan.shtml = anon /** = casLogout,user </value> </property> </bean> <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/> <!-- 会话DAO --> <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO"> <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/> <property name="sessionIdGenerator" ref="sessionIdGenerator"/> </bean> <!-- 会话验证调度器 --> <!-- 全局的会话信息检测扫描信息间隔30分钟--> <bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler"> <property name="sessionValidationInterval" value="1800000"/> <property name="sessionManager" ref="sessionManager"/> </bean> <!-- 会话管理器 --> <!-- 全局的会话信息设置成30分钟,sessionValidationSchedulerEnabled参数就是是否开启扫描 --> <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <property name="globalSessionTimeout" value="1800000"/> <property name="deleteInvalidSessions" value="true"/> <property name="sessionValidationSchedulerEnabled" value="true"/> <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/> <property name="sessionDAO" ref="sessionDAO"/> <property name="sessionIdCookieEnabled" value="true"/> <property name="sessionIdCookie" ref="sessionIdCookie"/> </bean> <!--shiro缓存管理器 --> <bean id="cacheManager" class="com.lanyuan.shiro.spring.SpringCacheManagerWrapper" > <property name="cacheManager" ref="springCacheManager"/> </bean> <bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> <property name="cacheManager" ref="ehcacheManager"/> </bean> <!--ehcache--> <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:ehcache.xml"/> </bean> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" /> </beans> spring-shiro.xml <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="false"> <display-name>gtsys</display-name> <!-- 单点登出 --> <!-- <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <filter> <filter-name>CAS Single Sign Out Filter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-shiro.xml,classpath:spring-application.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <async-supported>true</async-supported> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.shtml</url-pattern> </servlet-mapping> <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> --> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.eot</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.ttf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.xml</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.swf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.zip</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.woff</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>login.shtml</welcome-file> </welcome-file-list> </web-app> web.xml ## shiro shiro.session.timeout=1800000 shiro.session.validate.timespan=1800000 # cas\u767B\u5F55URL shiro.login.url=https://localhost:8443/cas-server/login?service=http://securitycenter.com:8080/gtsys/cas # cas logout shiro.logout.url=https://localhost:8443/cas-server/logout?service=http://securitycenter.com:8080/gtsys # cas\u767B\u5F55\u6210\u529F\u8DF3\u8F6CURL shiro.login.success.url=http://securitycenter.com:8080/gtsys/index.shtml # cas\u670D\u52A1\u5668URL shiro.casServer.url=https://localhost:8443/cas-server # \u5BA2\u6237\u7AEFCAS\u767B\u5F55URL shiro.client.cas=http://securitycenter.com:8080/gtsys/cas # \u5BA2\u6237\u7AEFCAS\u9A8C\u8BC1\u5931\u8D25\u8DF3\u8F6CURL shiro.failureUrl=/casFailure.jsp ## dataSource dataSource.driver=com.mysql.jdbc.Driver dataSource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8 dataSource.username=root dataSource.password=1234 properties文件 <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" monitoring="autodetect" dynamicConfig="true"> <diskStore path="java.io.tmpdir"/> <!-- <diskStore>==========当内存缓存中对象数量超过maxElementsInMemory时,将缓存对象写到磁盘缓存中(需对象实现序列化接口) * <diskStore path="">==用来配置磁盘缓存使用的物理路径,Ehcache磁盘缓存使用的文件后缀名是*.data和*.index * name=================缓存名称,cache的唯一标识(ehcache会把这个cache放到HashMap里) * maxElementsOnDisk====磁盘缓存中最多可以存放的元素数量,0表示无穷大 * maxElementsInMemory==内存缓存中最多可以存放的元素数量,若放入Cache中的元素超过这个数值,则有以下两种情况 * 1)若overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中 * 2)若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素 * eternal==============缓存中对象是否永久有效,即是否永驻内存,true时将忽略timeToIdleSeconds和timeToLiveSeconds * timeToIdleSeconds====缓存数据在失效前的允许闲置时间(单位:秒),仅当eternal=false时使用,默认值是0表示可闲置时间无穷大,此为可选属性 * 即访问这个cache中元素的最大间隔时间,若超过这个时间没有访问此Cache中的某个元素,那么此元素将被从Cache中清除 * timeToLiveSeconds====缓存数据在失效前的允许存活时间(单位:秒),仅当eternal=false时使用,默认值是0表示可存活时间无穷大 * 即Cache中的某元素从创建到清楚的生存时间,也就是说从创建开始计时,当超过这个时间时,此元素将从Cache中清除 * overflowToDisk=======内存不足时,是否启用磁盘缓存(即内存中对象数量达到maxElementsInMemory时,Ehcache会将对象写到磁盘中) * 会根据标签中path值查找对应的属性值,写入磁盘的文件会放在path文件夹下,文件的名称是cache的名称,后缀名是data * diskPersistent=======是否持久化磁盘缓存,当这个属性的值为true时,系统在初始化时会在磁盘中查找文件名为cache名称,后缀名为index的文件 * 这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内存 * 要想把cache真正持久化到磁盘,写程序时注意执行net.sf.ehcache.Cache.put(Element element)后要调用flush()方法 * diskExpiryThreadIntervalSeconds==磁盘缓存的清理线程运行间隔,默认是120秒 * diskSpoolBufferSizeMB============设置DiskStore(磁盘缓存)的缓存区大小,默认是30MB * memoryStoreEvictionPolicy========内存存储与释放策略,即达到maxElementsInMemory限制时,Ehcache会根据指定策略清理内存 * 共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出) --> <!-- 注意,以下缓存是永久有效,是系统初始化数据到缓存中,如果不需要永久有效,请另写,或在 --> <cache name="cache" maxEntriesLocalHeap="10000" maxEntriesLocalDisk="1000" eternal="true" diskSpoolBufferSizeMB="20" timeToIdleSeconds="0" timeToLiveSeconds="0" memoryStoreEvictionPolicy="LFU" transactionalMode="off"> </cache> <!-- 登录记录缓存 锁定10分钟 --> <cache name="passwordRetryCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <!-- <cache name="authorizationCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cache name="authenticationCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> --> <cache name="shiro-activeSessionCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cache name="shiro-kickout-session" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> </ehcache> ehcache.xml package com.lanyuan.shiro; //import com.github.zhangkaitao.shiro.chapter15.service.UserService; import java.util.List; import javax.inject.Inject; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.cas.CasRealm; import org.apache.shiro.subject.PrincipalCollection; import com.lanyuan.entity.ResFormMap; import com.lanyuan.mapper.ResourcesMapper; import com.lanyuan.mapper.UserMapper; /** * <p>User: Zhang Kaitao * <p>Date: 14-2-13 * <p>Version: 1.0 */ public class MyCasRealm extends CasRealm { // private UserService userService; // // public void setUserService(UserService userService) { // this.userService = userService; // } @Inject private ResourcesMapper resourcesMapper; @Inject private UserMapper userMapper; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = (String)principals.getPrimaryPrincipal(); // PathMatchingFilterChainResolver SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); //authorizationInfo.setRoles(userService.findRoles(username)); // authorizationInfo.setStringPermissions(userService.findPermissions(username)); String userId = SecurityUtils.getSubject().getSession().getAttribute("userSessionId").toString(); List<ResFormMap> rs = resourcesMapper.findUserResourcess(userId); for (ResFormMap resources : rs) { authorizationInfo.addStringPermission(resources.get("resKey").toString()); } return authorizationInfo; } } MyCasRealm.java ``` ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:config proxy-target-class="true"></aop:config> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean> </beans> spring-mvc-shiro.xml ``` 这个是更改 网上的蓝缘系统的 cas server 和cas client参考的 http://howiefh.github.io/2015/05/19/shiro-cas-single-sign-on/?utm_source=tuicool 不知道为什么会返回404

ext editorGrid 问题

我从网上看到editorGrid的一个实例,就下了下来,想学习一下,结果出现以下问题 添加用户时,id先是和最后一个id一样后来又成了始终为1了 显示数据时,总有和数据条数相同书目的空白条 [img]http://dl.iteye.com/upload/attachment/175952/13b30933-c726-36ee-b3c4-57016d5dde4b.jpg[/img] [code="java"]/** * 在线通讯录制作: 刘长炯 beansoft@126.com http://beansoft.blogjava.net/ 2008年5月 */ // 定义一个用户对象,这样便于我们动态的添加记录,虽然也可以设置成匿名内置对象 var User = Ext.data.Record.create([ // 下面的 "username" 匹配读到的标签名称 { name : 'id', type : 'int' }, { name : 'user' }, { name : 'password' } ]); /** * 创建文本列模型. * * @param {ID} * _id * @param {列名显示文本} * _header * @param {数据ID} * _dataIndex * @param {宽度} * _width 可选 * @param {是否为空} * notBlank 可选 * @param {渲染器} * _renderer 可选 * @param {自定义修改器} * _editor 可选 */ function createTextColumn(_id, _header, _dataIndex, _width, notBlank, _renderer, _editor) { var object = { id : _id, header : _header, dataIndex : _dataIndex, width : _width }; if (_editor) { object.editor = _editor; } else if (notBlank == true) { object.editor = new Ext.form.TextField({ allowBlank : false // 不能为空 }); } else { object.editor = new Ext.form.TextField(); } if (_renderer) { object.renderer = _renderer; } return object; } /** * 快速创建文本列 * * @param {数据ID} * _dataIndex * @param {列名显示文本} * _header * @param {宽度} * _width 可选 * @return {列对象} */ function qCreateColumn(_dataIndex, _header, _width) { return createTextColumn(_dataIndex, _header, _dataIndex, _width); } Ext.onReady(function() { Ext.QuickTips.init(); // 格式化日期显示 function formatDate(value) { return value ? value.dateFormat('Y, M d') : ''; } // 格式化性别显示,这是个 renderer, 渲染器 function formatSex(value) { return value ? "男" : "女"; } // 弄个缩写的别名 var fm = Ext.form; // 列模型定义了表格所有列的信息, // dataIndex 将特定的列映射到数据源(Data Store)中的数据列(在后面创建) var cm = new Ext.grid.ColumnModel([ { id : 'id', header : "编号", dataIndex : 'id', width : 50 }, /* * { id : 'username', header : "姓名", dataIndex : 'username', width : * 250, editor : new fm.TextField({ allowBlank : false // 不能为空 }) } */ createTextColumn('username', '姓名', 'user', 50, true), createTextColumn('password', '密码', 'password', 50, true) ]); // 默认情况下列是可排序的 cm.defaultSortable = true; // 创建 Data Store var store = new Ext.data.Store({ // 使用 HTTP 加载 url : 'nb_xml.jsp', // 因为返回值是 XML, 所以我们创建一个解析器 reader : new Ext.data.XmlReader({ // 记录必须包含 "user" 标签 record : 'user' }, User), sortInfo : { field : 'username', direction : 'ASC' }// 排序信息 }); // 创建编辑器表格 var grid = new Ext.grid.EditorGridPanel({ store : store, cm : cm, renderTo : 'editor-grid', width : 500, height : 300, autoExpandColumn : 'username', title : '通讯录',// 标题 frame : true, clicksToEdit : 2,// 设置点击几次才可编辑 selModel : new Ext.grid.RowSelectionModel({ singleSelect : false }),// 设置单行选中模式, 否则将无法删除数据 // 顶部工具栏按钮 tbar : [ { text : '添加用户', iconCls : 'add',// 按钮图标的CSS名称 handler : function() {// 点击按钮执行的操作 var n = grid.getStore().getCount();// 获得总行数 // 显示等待对话框 Ext.Msg.wait("请等候", "添加用户", "操作进行中..."); // 调用 DWR 进行添加操作, 操作完成后调用方法来更新界面 JUserManagerNB.addUser('user' + n , function(data) { if (data) { Ext.Msg.hide();// 隐藏对话框 var p = new User({ id : data, username : 'user'+n , password:'user' }); grid.stopEditing();// 停止编辑 store.insert(n, p);// 插入到最后一行 grid.startEditing(n, 1);// 开始编辑1单元格 } }); } }, { text : '导出为Excel格式', iconCls : 'details', handler : function() { document.location = "nb_excel.jsp"; } }, { text : '删除所选', iconCls : 'remove', handler : function() { var record = grid.getSelectionModel().getSelected();// 返回值为 // Record 类型 if (!record) { Ext.Msg.alert("提示", "请先选择要删除的行!"); return; } // 弹出对话框警告 if (record) { Ext.MessageBox.confirm('确认删除', '你真的要删除所选用户吗?', function(btn) { if (btn == 'yes') {// 选中了是按钮 // 调用 DWR, 执行结果成功时方删除所有数据 // 显示等待对话框 Ext.Msg.wait("请等候", "删除用户", "操作进行中..."); JUserManagerNB.removeUser(record.get("id"), function(data) { if (data) { // 更新界面, 来真正删除数据 store.remove(record); Ext.Msg.hide();// 隐藏对话框 } else { Ext.Msg.alert("出错了!", "单个用户数据删除失败!"); } }); } }); } } } ] }); // 单元格编辑后事件处理 grid.on("afteredit", afterEdit, grid); // 事件处理函数 function afterEdit(e) { var record = e.record;// 被编辑的记录 // 显示等待对话框 Ext.Msg.wait("请等候", "修改中", "操作进行中..."); // 调用 DWR, 执行结果成功时方删除所有数据 JUserManagerNB.editUser(record.get("id"), e.field, e.value, function(data) { if (data) { // 更新界面, 来真正删除数据 // Ext.Msg.alert('您成功修改了用户信息', "被修改的用户是:" // + e.record.get("username") + "\n 修改的字段是:" // + e.field);// 取得用户名 Ext.Msg.hide();// 隐藏对话框 // // 更改最后更新的时间,同步到后台 // JUserManagerNB.editUser(record.get("id"), 'modified', // (new Date()).clearTime()); // 更新界面 record.set('modified', (new Date()).clearTime()); } else { Ext.Msg.alert("出错了!", "修改数据失败,将重置为修改前的值!", function() { record.set(e.field, e.originalValue); }); } }); }; // 触发数据加载 store.load(); }); [/code]

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

点沙成金:英特尔芯片制造全过程揭密

“亚马逊丛林里的蝴蝶扇动几下翅膀就可能引起两周后美国德州的一次飓风……” 这句人人皆知的话最初用来描述非线性系统中微小参数的变化所引起的系统极大变化。 而在更长的时间尺度内,我们所生活的这个世界就是这样一个异常复杂的非线性系统…… 水泥、穹顶、透视——关于时间与技艺的蝴蝶效应 公元前3000年,古埃及人将尼罗河中挖出的泥浆与纳特龙盐湖中的矿物盐混合,再掺入煅烧石灰石制成的石灰,由此得来了人...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你打算用Java 8一辈子都不打算升级到Java 14,真香

我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

一文带你入门Java Stream流,太强了

两个星期以前,就有读者强烈要求我写一篇 Java Stream 流的文章,我说市面上不是已经有很多了吗,结果你猜他怎么说:“就想看你写的啊!”你看你看,多么苍白的喜欢啊。那就“勉为其难”写一篇吧,嘻嘻。 单从“Stream”这个单词上来看,它似乎和 java.io 包下的 InputStream 和 OutputStream 有些关系。实际上呢,没毛关系。Java 8 新增的 Stream 是为...

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

文章目录1. 无状态登录1.1 什么是有状态1.2 什么是无状态1.3 如何实现无状态1.4 各自优缺点2. 登录交互2.1 前后端分离的数据交互2.2 登录成功2.3 登录失败3. 未认证处理方案4. 注销登录 这是本系列的第四篇,有小伙伴找不到之前文章,松哥给大家列一个索引出来: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密...

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

我说我懂多线程,面试官立马给我发了offer

不小心拿了几个offer,有点烦

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

代码注释如此沙雕,会玩还是你们程序员!

某站后端代码被“开源”,同时刷遍全网的,还有代码里的那些神注释。 我们这才知道,原来程序员个个都是段子手;这么多年来,我们也走过了他们的无数套路… 首先,产品经理,是永远永远吐槽不完的!网友的评论也非常扎心,说看这些代码就像在阅读程序员的日记,每一页都写满了对产品经理的恨。 然后,也要发出直击灵魂的质问:你是尊贵的付费大会员吗? 这不禁让人想起之前某音乐app的穷逼Vip,果然,穷逼在哪里都是...

2020春招面试了10多家大厂,我把问烂了的数据库事务知识点总结了一下

2020年截止目前,我面试了阿里巴巴、腾讯、美团、拼多多、京东、快手等互联网大厂。我发现数据库事务在面试中出现的次数非常多。

立即提问
相关内容推荐