js如何判断指定的页面是否存在

[code="java"]


My JSP 'a.jsp' starting page
<br><br> var target = null;<br> function createTarget(){<br> if(window.ActiveXObject){<br> target = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;) ;<br> }else if(window.XMLHttpRequest){<br> target = new XMLHttpRequest();<br> }<br><br> }<br> function GetURL(url){<br><br> createTarget();<br> target.onreadystatechange = function(){<br> if(target.readyState==4){<br> if(target.status==200){<br> alert(&quot;页面存在&quot;);<br> }else {<br> alert(&quot;页面不存在&quot;);<br> }<br> }<br> }<br> target.open(&quot;GET&quot;,url,true);<br> target.send(null);<br> } </p> <p>
<body>
    <input type="button" onclick="GetURL('http://www.baidu.com')"
        value="该页面存在">
    <input type="button"
        onclick="GetURL('http://www.error.com/error.html')" value="该页面不存在"></input>
</body>


[/code]

如上代码,意思就是在点击一个连接时侯判断页面是否存在!
如果存在就打开,不存在就请求servlet!

上面代码在ie中没有问题!
但是在火狐或标准dom浏览器总是显示“页面不存在”
我试着添加测试代码,显示http返回的状态码!
在ie中可以显示200
但是在火狐中总是显示0!
火狐中会报target.send(null); 这行的错误!

在下不才,请各位朋友看下!

3个回答

不能用XMLHttpRequest去访问别的域的页面的,不能跨域访问

你只能用iframe来实现这个功能,或用后台去访问外域的页面,

默认, ajax是不能跨域访问的。

既然火狐下可以,ie下应该也是可以的。是不是哪里写的不兼容。仔细找找看。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
javascript生成的树形目录如何把读取的id传递给jsp页面
我用js读取数据库生成一个树形目录,树形目录做好了,可是不知道怎么把节点的id传到jsp页面或action里,最好action能通过request.getAttribute()得到所点节点的id,还有就是不知道如何像有些论坛上一个,点不同的节点,右面显示不同的jsp,小弟第一次做,请指教,谢谢,下面是我用的js代码: var Tree = new function() { this._url = "tree.jsp"; //用于请求数据的服务器页面地址 this._openMark = "<img src='images/nolines_minus.gif'/>"+"<img src='images/folderopen.gif'/>"; //目录节点处于展开状态时的标识 this._closeMark = "<img src='images/nolines_plus.gif'/>"+"<img src='images/folder.gif'/>"; //目录节点处于关闭状态时的标识 this._itemMark = "<img src='images/page.gif'/>"; //非目录节点标识 this._initId = "treeInit"; //树形目录初始div标识 this._rootData = "IS安全等级保护基础库"; //根节点文字信息 this._boxSuffix = "_childrenBox"; //子节点容器后缀 this._folderType = "folder"; //目录节点类型变量 this._itemType = "item"; //非目录节点类型变量 //初始化根节点 this.init = function() { var initNode = document.getElementById(this._initId); //获取初始div var _node = document.createElement("div"); //创建新div作为根节点 _node.id = "1"; //根节点id为0 _node.innerHTML = this.createItemHTML(_node.id, this._folderType, this._rootData); initNode.appendChild(_node); //将根节点加入初始div } //获取给定节点的子节点 this.getChildren = function(_parentId) { //获取页面子节点容器box var childBox = document.getElementById(_parentId + this._boxSuffix); //如果子节点容器已存在则直接设置显示状态,否则从服务器获取子节点信息 if (childBox) { var isHidden = (childBox.style.display == "none"); //判断当前状态是否隐藏 childBox.style.display = isHidden?"":"none"; //隐藏则显示,如果显示则变为隐藏 //根据子节点的显示状态修改父节点标识 var _parentNode = document.getElementById(_parentId); _parentNode.firstChild.innerHTML = isHidden?this._openMark:this._closeMark; } else { var xmlHttp=this.createXmlHttp(); //创建XmlHttpRequest对象 xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4) { //调用addChildren函数生成子节点 Tree.addChildren(_parentId, xmlHttp.responseXML); } } xmlHttp.open("GET", this._url + "?parentId=" + _parentId, true); xmlHttp.send(null); } } //根据获取的xmlTree信息,设置指定节点的子节点 this.addChildren = function(_parentId, _data) { var _parentNode = document.getElementById(_parentId); //获取父节点 _parentNode.firstChild.innerHTML = this._openMark; //设置节点前标记为目录展开形式 var _nodeBox = document.createElement("div"); //创建一个容器,称为box,用于存放所有子节点 _nodeBox.id = _parentId + this._boxSuffix; //容器的id规则为:在父节点id后加固定后缀 _nodeBox.className = "box"; //样式名称为box,div.box样式会对此节点生效 _parentNode.appendChild(_nodeBox); //将子节点box放入父节点中 var _children = _data.getElementsByTagName("tree")[0].childNodes; //获取所有item节点 var _child = null; //声明_child变量用于保存每个子节点 var _childType = null; //声明_childType变量用于保存每个子节点类型 for(var i=0; i<_children.length; i++) { //循环创建每个子节点 _child = _children[i]; _node = document.createElement("div"); //每个节点对应一个新div _node.id = _child.getAttribute("id"); //节点的id值就是获取数据中的id属性值 _childType = _child.getAttribute("isFolder")=="true"?this._folderType:this._itemType; //设置子节点类型 //根据节点类型不同,调用createItemHTML创建节点内容 if (_childType == this._itemType) { //非目录节点在最后多传一个link数据,用于点击后链接到新页面 _node.innerHTML = this.createItemHTML(_node.id, _childType, _child.firstChild.data, _child.getAttribute("link")); } else { //目录节点只需传递id,节点类型,节点数据 _node.innerHTML = this.createItemHTML(_node.id, _childType, _child.firstChild.data); } _nodeBox.appendChild(_node); //将创建好的节点加入子节点box中 } } //创建节点的页面片断 this.createItemHTML = function(itemId, itemType, itemData, itemLink) { //根据节点类型不同,返回不同的HTML片断 if (itemType == this._itemType) { //非目录节点的class属性以item开头,并且onclick事件调用Tree.clickItem函数 return '<span class="itemMark">'+this._itemMark+'</span>' + '<a href="Frame.do" style="text-decoration:none" target="main"><span class="item" >' +itemData+'</span></a>'; } else if (itemType == this._folderType) { //目录节点的class属性以folder开头,并且onclick事件调用Tree.getChildren函数 return '<span class="folderMark" onclick="Tree.getChildren(\'' + itemId + '\')">' + this._closeMark + '</span>' + '<span class="folder" onclick="Tree.getChildren(\'' + itemId + '\')">' + itemData + '</span>' } } //点击叶子节点后的动作,目前只是弹出对话框,可修改为链接到具体的页面 this.clickItem = function(_link) { return ; } //用于创建XMLHttpRequest对象 this.createXmlHttp=function() { var xmlHttp = null; //根据window.XMLHttpRequest对象是否存在使用不同的创建方式 if (window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); //FireFox、Opera等浏览器支持的创建方式 } else { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");//IE浏览器支持的创建方式 } return xmlHttp; } }
请教 关于在页面上循环显示数据的格式问题
很多时候会遇到这样的情况: 要从数据库拿出一组数据,格式化之后循环输出到页面上(例如相册里的图片)。然后要在每个数据上加个onclick事件,点击后弹出一个DIV,用来修改数据(不是提交表单,只是在页面上修改数据,或者发ajax请求,改完后直接显示在同页面上)。 我想讨论的问题是: 怎样让弹出的这个DIV定位到指定的数据上呢? 我现在想到的方法有: 1、给每个数据加个唯一的ID 如 <div id="id1" onclick="showchange('id1')">data1</div> <div id="id2" onclick="showchange('id2')">data2</div> <script> function showchange(id){ document.getElementById("targetDiv").value = id; var data = document.getElementById(id).innerHTML; document.getElementById("modDiv").style.display = "block"; } </script> 这样的。点击之后把传入的ID存到全局变量或隐藏域里,用户改完后再用JS读到这个ID完成页面上的修改。 2、用this对象 如 <div onclick="showchange(this)">data1</div> <div onclick="showchange(this)">data2</div> <script> function showchange(div){ globalTargetDiv = div; var data = div.innerHTML; document.getElementById("modDiv").style.display = "block"; } </script> 直接从元素里拿东西。 请问哪个方法比较好?大家平时都是怎样处理这类问题的? 如果用第一个方法的话,循环输出的那些DIV的ID一般是自己随便定义一个,还是直接使用例如数据库里记录的ID之类的信息? 之所以会这么问,是因为整个页面改好提交的时候,更新到数据库时,会需要这些数据的ID……数据的ID一般要怎样存在页面上呢?是用隐藏域还是直接设成DIV的ID?小弟是新手,被这些问题纠结了挺长时间了……因为总觉得把数据库里的ID直接显示到页面上不太好……
jsp上传文件页面报无法解析的编译问题
index.jsp <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <html> <head> <title>带进度条的文件上传</title> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <link href="CSS/style.css" rel="stylesheet"> <script language="javascript" src="JS/AjaxRequest.js"></script> <script language="javascript"> //此处需要加&nocache="+new Date().getTime(),否则将出现进度不更新的情况 function getProgress(){ var loader=new net.AjaxRequest("showProgress.jsp?nocache="+new Date().getTime(),deal_p,onerror,"GET"); } function onerror(){ alert("上传文件出错!"); } function deal_p(){ var h=this.req.responseText; h=h.replace(/\s/g,""); //去除字符串中的Unicode空白符 document.getElementById("progressPercent").style.display=""; //显示百分比 progressPercent.innerHTML=h+"%"; //显示完成的百分比 document.getElementById("progressBar").style.display="block"; //显示进度条 document.getElementById("imgProgress").width=h*(255/100); //显示完成的进度 } function deal(form){ form.submit(); //提交表单 timer=window.setInterval("getProgress()",500); //每隔500毫秒获取一次上传进度 } </script> </head> <body> <form name="form1" enctype="multipart/form-data" method="post" action="UpLoad?action=uploadFile"> <table width="500" height="289" border="0" align="center" cellpadding="0" cellspacing="0" background="images/bg.jpg"> <tr> <td width="61" rowspan="2">&nbsp;</td> <td width="439" align="center"> <table width="80%" height="190" border="0" cellpadding="0" cellspacing="0"> <tr> <td align="center">&nbsp;</td> </tr> <tr> <td height="34" style="color:#FFFFFF">请选择上传的文件:</td> </tr> <tr> <td height="42"><input name="file" type="file" size="42"></td> </tr> <tr> <td height="50" style="color:#FFFFFF"> 注:文件大小请控制在50M以内。</td> </tr> <tr> <td height="29" align="center" style="color:#FFFFFF"><div id="progressBar" class="prog_border" align="left"><img src="images/progressBar.jpg" width="0" height="13" id="imgProgress"></div>  <span id="progressPercent" style="width:40px;display:none">0%</span></td> </tr> <tr> <td height="29" align="center"><img src="images/shangchuan.gif" width="61" height="23" onClick="deal(form1)"> <img src="images/chongzhi.gif" width="61" height="23" onClick="form1.reset();">&nbsp; </td></tr> </table> </td> </tr> </table> </form> </body> </html> upload.java package com.wgh.servlet; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.*; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * * @author administrator */ public class UpLoad extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); if ("uploadFile".equals(action)) { this.uploadFile(request, response); // 上传文件 } } public void uploadFile(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=GBK"); request.setCharacterEncoding("GBK"); HttpSession session = request.getSession(); session.setAttribute("progressBar", 0); // 定义指定上传进度的Session变量 String error = ""; int maxSize = 50 * 1024 * 1024; // 单个上传文件大小的上限 DiskFileItemFactory factory = new DiskFileItemFactory(); // 基于磁盘文件项目创建一个工厂对象 ServletFileUpload upload = new ServletFileUpload(factory); // 创建一个新的文件上传对象 try { List items = upload.parseRequest(request);// 解析上传请求 Iterator itr = items.iterator();// 枚举方法 while (itr.hasNext()) { FileItem item = (FileItem) itr.next(); // 获取FileItem对象 if (!item.isFormField()) {// 判断是否为文件域 if (item.getName() != null && !item.getName().equals("")) {// 判断是否选择了文件 long upFileSize = item.getSize(); // 上传文件的大小 String fileName = item.getName(); // 获取文件名 // System.out.println("上传文件的大小:" + item.getSize()); if (upFileSize > maxSize) { error = "您上传的文件太大,请选择不超过50M的文件"; break; } // 此时文件暂存在服务器的内存中 File tempFile = new File(fileName);// 构造临时对象 // String savePath=tempFile.getName(); // //返回上传文件在客户端的完整路径名称 // request.setAttribute("filename", savePath); File file = new File(request.getRealPath("/upload"), tempFile.getName()); // 获取根目录对应的真实物理路径 InputStream is = item.getInputStream(); int buffer = 1024; // 定义缓冲区的大小 int length = 0; byte[] b = new byte[buffer]; double percent = 0; FileOutputStream fos = new FileOutputStream(file); while ((length = is.read(b)) != -1) { percent += length / (double) upFileSize * 100D; // 计算上传文件的百分比 fos.write(b, 0, length); // 向文件输出流写读取的数据 session.setAttribute("progressBar", Math .round(percent)); // 将上传百分比保存到Session中 } fos.close(); Thread.sleep(1000); // 线程休眠1秒 } else { error = "没有选择上传文件!"; } } } } catch (Exception e) { e.printStackTrace(); error = "上传文件出现错误:" + e.getMessage(); } if (!"".equals(error)) { request.setAttribute("error", error); request.getRequestDispatcher("error.jsp") .forward(request, response); } else { request.setAttribute("result", "文件上传成功!"); request.getRequestDispatcher("upFile_deal.jsp").forward(request, response); } } } 问题 java.lang.Error: 无法解析的编译问题: 无法解析导入 org.apache.commons.fileupload.disk 无法解析导入 org.apache.commons.fileupload.servlet DiskFileItemFactory 无法解析为类型 DiskFileItemFactory 无法解析为类型 ServletFileUpload 无法解析为类型 ServletFileUpload 无法解析为类型 com.wgh.servlet.UpLoad.<init>(UpLoad.java:15) sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) java.lang.reflect.Constructor.newInstance(Constructor.java:423) java.lang.Class.newInstance(Class.java:442) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:879) org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:610) org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1777) java.lang.Thread.run(Thread.java:745) 求救
shiro 登录认证页面不跳转
认证是没有问题的,登录之后一直在登录页面,然后直接输入index.jsp又是可以访问的, 说明认证成功了 直接上图帐号代码,求大神。。。 <beans xmlns="http://www.springframework.org/schema/beans" 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-3.2.xsd"> <!-- web.xml中shiro的filter对应的bean --> <!-- Shiro 的Web过滤器 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <!-- loginUrl认证提交地址,如果没有认证将会请求此地址进行认证,请求此地址将由formAuthenticationFilter进行表单认证 --> <property name="loginUrl" value="/login/login.html"/> <!-- 认证成功统一跳转到first.action,建议不配置,shiro认证成功自动到上一个请求路径 --> <property name="successUrl" value="/index.jsp"/> <!-- 通过unauthorizedUrl指定没有权限操作时跳转页面--> <!--<property name="unauthorizedUrl" value="/WEB-INF/pages/refuse.jsp"/>--> <!-- 自定义filter配置 --> <property name="filters"> <map> <!--将自定义 的FormAuthenticationFilter注入shiroFilter中--> <entry key="authc" value-ref="formAuthenticationFilter"/> </map> </property> <!-- 过虑器链定义,从上向下顺序执行,一般将/**放在最下边 --> <property name="filterChainDefinitions"> <value> <!-- 对静态资源设置匿名访问 --> /css/** = anon /datas/** = anon /html/** = anon /images/** = anon /js/** = anon /plugins/** = anon /temp/** = anon /login/login.html = anon /login/checkLogin.json = anon <!--请求这个地址退出登录 shiro清除session--> /login/logout = logout <!--所有url都必须认证通过才可以访问--> /** = authc <!--anon所有url都可以匿名访问--> <!--/** = anon--> </value> </property> </bean> <!-- securityManager安全管理器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="customRealm"/> <!-- 注入缓存管理器 --> <!--<property name="cacheManager" ref="cacheManager"/>--> <!-- 注入session管理器 --> <!--<property name="sessionManager" ref="sessionManager"/>--> <!-- 记住我 --> <!--<property name="rememberMeManager" ref="rememberMeManager"/>--> </bean> <!-- realm --> <bean id="customRealm" class="com.infore.common.CustomRealm"> </bean> <!-- 缓存管理器 --> <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"> <property name="cacheManagerConfigFile" value="classpath:/shiro/shiro-ehcache.xml"/> </bean> <bean id="formAuthenticationFilter" class="com.infore.common.CustomFormAuthenticationFilter"> <!-- 表单中账号的input名称 --> <property name="usernameParam" value="username" /> <!-- 表单中密码的input名称 --> <property name="passwordParam" value="password" /> </bean> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager" /> </bean> </beans> @ResponseBody @RequestMapping("/checkLogin.json") public AjaxResult<String> checkLogin(HttpServletRequest request){ AjaxResult<String> result = new AjaxResult<String>(); String username = request.getParameter("username"); String password = request.getParameter("password"); try{ /*if(username == null || "".equals(username)){ result.setSuccess(false); result.setMsg("请输入账号"); return result; } if(password == null || "".equals(password)){ result.setSuccess(false); result.setMsg("请输入密码"); return result; } EmpDto emp = empService.selectByUsername(username); if(emp == null){ result.setSuccess(false); result.setMsg("账号不存在"); return result; }**/ ByteSource salt = ByteSource.Util.bytes("emp"); SimpleHash simpleHash = new SimpleHash("MD5", password, salt, 2); String password_md5 = simpleHash.toString(); /*if(!emp.getPassword().equals(password_md5)){ result.setSuccess(false); result.setMsg("密码不正确"); return result; }*/ UsernamePasswordToken token = new UsernamePasswordToken(username, password_md5); Subject currentUser = SecurityUtils.getSubject(); //使用shiro来验证 token.setRememberMe(true); try { currentUser.login(token); EmpDto empDto = (EmpDto) currentUser.getPrincipal(); logger.info("User [" + empDto.getUsername() + "] logged in successfully."); //验证通过保存emp信息 super.getSession().setAttribute("emp", currentUser.getPrincipal()); super.getSession().setAttribute("username", username); super.getSession().setAttribute("empNo", empDto.getEmpNo()); } catch ( UnknownAccountException uae ) { uae.printStackTrace(); result.setSuccess(false); result.setMsg("账号不存在"); return result; } catch ( IncorrectCredentialsException ice ) { ice.printStackTrace(); result.setSuccess(false); result.setMsg("账号/密码不正确"); return result; } catch (LockedAccountException lae) { lae.printStackTrace(); result.setSuccess(false); result.setMsg("用户已被锁定"); return result; } catch (ExcessiveAttemptsException eae ) { eae.printStackTrace(); } }catch (Exception e){ logger.error("验证登录信息异常[checkLogin]",e); publicUtil.insertLog(0,e,0); result.setSuccess(false); result.setMsg("验证登录信息异常"); } return result; } /** * realm的认证方法,从数据库查询用户信息 * @param authToken * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authToken; EmpDto emp = empService.selectByUsername(token.getUsername()); if(emp == null){ throw new UnknownAccountException("账号不存在"); } SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(emp, emp.getPassword(), getName()); return simpleAuthenticationInfo; }
(Java WEB)http-404,新手卡着好几天了。
最近改写别人的Java Web项目练习,遇到这个问题卡着两三天了。 ![图片说明](https://img-ask.csdn.net/upload/201705/10/1494384669_341338.png) 以下是JSP代码 ``` <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>left</title> <base target="body"/> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <script type="text/javascript" src="<c:url value='/jquery/jquery-1.5.1.js'/>"></script> <script type="text/javascript" src="<c:url value='/menu/mymenu.js'/>"></script> <link rel="stylesheet" href="<c:url value='/menu/mymenu.css'/>" type="text/css" media="all"> <link rel="stylesheet" type="text/css" href="<c:url value='/jsps/css/left.css'/>"> <script language="javascript"> /* * 1. 对象名必须与第一个参数相同! 2. 第二个参数是显示在菜单上的大标题 */ var bar = new Q6MenuBar("bar", "仙林大学城网上书城"); $(function() { bar.colorStyle = 4;//指定配色样式,一共0,1,2,3,4 bar.config.imgDir = "<c:url value='/menu/img/'/>";//小工具所需图片的路径 bar.config.radioButton=true;//是否排斥,多个一级分类是否排斥 /* 1. 程序设计:一级分类名称 2. Java Javascript:二级分类名称 3. /goods/jsps/book/list.jsp:点击二级分类后链接到的URL 4. body:链接的内容在哪个框架页中显示 */ <c:forEach items="${parents}" var="parent"> <c:forEach items="${parent.children}" var="child"> bar.add("${parent.cname}", "${child.cname}", "/goods/BookServlet?method=findByCategory&cid=${child.cid}", "body"); </c:forEach> </c:forEach> $("#menu").html(bar.toString()); }); </script> </head> <body> <div id="menu"></div> </body> </html> ``` 以下servlet代码 ``` package cn.itcast.goods.book.web.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.itcast.commons.CommonUtils; import cn.itcast.goods.book.domain.Book; import cn.itcast.goods.book.service.BookService; import cn.itcast.goods.pager.PageBean; import cn.itcast.servlet.BaseServlet; public class BookServlet extends BaseServlet { private BookService bookService = new BookService(); /** * 获取当前页码 * * @param req * @return */ private int getPc(HttpServletRequest req) { int pc = 1; String param = req.getParameter("pc"); if (param != null && !param.trim().isEmpty()) { try { pc = Integer.parseInt(param); } catch (RuntimeException e) { } } return pc; } /** * 截取url,页面中的分页导航中需要使用它做为超链接的目标! * * @param req * @return */ /* * http://localhost:8080/goods/BookServlet?methed=findByCategory&cid=xxx&pc=3 * /goods/BookServlet + methed=findByCategory&cid=xxx&pc=3 */ private String getUrl(HttpServletRequest req) { String url = req.getRequestURI() + "?" + req.getQueryString(); /* * 如果url中存在pc参数,截取掉,如果不存在那就不用截取。 */ int index = url.lastIndexOf("&pc="); if (index != -1) { url = url.substring(0, index); } return url; } /** * 按bid查询 * * @param req * @param resp * @return * @throws ServletException * @throws IOException */ public String load(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String bid = req.getParameter("bid");//获取链接的参数bid Book book = bookService.load(bid);//通过bid得到book对象 req.setAttribute("book", book);//保存到req中 return "f:/jsps/book/desc.jsp";//转发到desc.jsp } /** * 按分类查 * * @param req * @param resp * @return * @throws ServletException * @throws IOException */ public String findByCategory(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* * 1. 得到pc:如果页面传递,使用页面的,如果没传,pc=1 */ int pc = getPc(req); /* * 2. 得到url:... */ String url = getUrl(req); /* * 3. 获取查询条件,本方法就是cid,即分类的id */ String cid = req.getParameter("cid"); /* * 4. 使用pc和cid调用service#findByCategory得到PageBean */ PageBean<Book> pb = bookService.findByCategory(cid, pc); /* * 5. 给PageBean设置url,保存PageBean,转发到/jsps/book/list.jsp */ pb.setUrl(url); req.setAttribute("pb", pb); return "f:/jsps/book/list.jsp"; } /** * 按作者查 * * @param req * @param resp * @return * @throws ServletException * @throws IOException */ public String findByAuthor(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* * 1. 得到pc:如果页面传递,使用页面的,如果没传,pc=1 */ int pc = getPc(req); /* * 2. 得到url:... */ String url = getUrl(req); /* * 3. 获取查询条件,本方法就是cid,即分类的id */ String author = req.getParameter("author"); /* * 4. 使用pc和cid调用service#findByCategory得到PageBean */ PageBean<Book> pb = bookService.findByAuthor(author, pc); /* * 5. 给PageBean设置url,保存PageBean,转发到/jsps/book/list.jsp */ pb.setUrl(url); req.setAttribute("pb", pb); return "f:/jsps/book/list.jsp"; } /** * 按出版社查询 * * @param req * @param resp * @return * @throws ServletException * @throws IOException */ public String findByPress(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* * 1. 得到pc:如果页面传递,使用页面的,如果没传,pc=1 */ int pc = getPc(req); /* * 2. 得到url:... */ String url = getUrl(req); /* * 3. 获取查询条件,本方法就是cid,即分类的id */ String press = req.getParameter("press"); /* * 4. 使用pc和cid调用service#findByCategory得到PageBean */ PageBean<Book> pb = bookService.findByPress(press, pc); /* * 5. 给PageBean设置url,保存PageBean,转发到/jsps/book/list.jsp */ pb.setUrl(url); req.setAttribute("pb", pb); return "f:/jsps/book/list.jsp"; } /** * 按图名查 * * @param req * @param resp * @return * @throws ServletException * @throws IOException */ public String findByBname(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* * 1. 得到pc:如果页面传递,使用页面的,如果没传,pc=1 */ int pc = getPc(req); /* * 2. 得到url:... */ String url = getUrl(req); /* * 3. 获取查询条件,本方法就是cid,即分类的id */ String bname = req.getParameter("bname"); /* * 4. 使用pc和cid调用service#findByCategory得到PageBean */ PageBean<Book> pb = bookService.findByBname(bname, pc); /* * 5. 给PageBean设置url,保存PageBean,转发到/jsps/book/list.jsp */ pb.setUrl(url); req.setAttribute("pb", pb); return "f:/jsps/book/list.jsp"; } /** * 多条件组合查询 * @param req * @param resp * @return * @throws ServletException * @throws IOException */ public String findByCombination(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* * 1. 得到pc:如果页面传递,使用页面的,如果没传,pc=1 */ int pc = getPc(req); /* * 2. 得到url:... */ String url = getUrl(req); /* * 3. 获取查询条件,本方法就是cid,即分类的id */ Book criteria = CommonUtils.toBean(req.getParameterMap(), Book.class); PageBean<Book> pb = bookService.findByCombination(criteria, pc); /* * 4. 使用pc和cid调用service#findByCategory得到PageBean */ /* * 5. 给PageBean设置url,保存PageBean,转发到/jsps/book/list.jsp */ pb.setUrl(url); req.setAttribute("pb", pb); return "f:/jsps/book/list.jsp"; } } ``` 以下是web.xml相关配置 ``` <servlet> <servlet-name>BookServlet</servlet-name> <servlet-class>cn.itcast.goods.book.web.servlet.BookServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>BookServlet</servlet-name> <url-pattern>/BookServlet</url-pattern> </servlet-mapping> ``` 相关文件位置 ![图片说明](https://img-ask.csdn.net/upload/201705/10/1494385059_583764.png)
请教yourgame^_^
yourgame你好, 在你共享的“图书管理系统”中,ViewPort采用了border的布局方式(layout:'border'), 其中viewport中的west部分作为“菜单区”, center部分作为“工作区”, 通过点击左边的某个菜单项,会在工作区内显示对应的操作界面, 同时工作区你采用的是card的布局方式(layout:'card'), 如此,只能够在工作区同一时刻显示一个交易画面(items:[start, p_company, p_user, p_dept, p_duty, p_subject, p_category, p_book, p_simple_book] 中的任意一个), 现在我想将“工作区”修改为tabpanel的布局方式,也就是达到如下效果——点击菜单,在工作区显示对应交易的画面panel, 如下图所以: [img]E:/未命名2.bmp[/img] 我现在遇到的问题是,无法将原来的交易面板放入点击菜单后弹出的对应tabs中去!就像图中所示一样,弹出来的是空白的tabs:( 对“图书管理系统”中 main.js代码的调整如下(你可以直接查找“chg by”字样的地方): Ext.BLANK_IMAGE_URL = 'lib/ext/resources/images/default/s.gif'; Ext.QuickTips.init(); var start = { id : 'start-panel', title : '欢迎使用', layout : 'fit', bodyStyle : 'padding:25px', html : '<img src="images/bg.jpg"/>' }; Ext.onReady(function() { setTimeout(function(){ /* 清除显示加载信息的div标记 */ Ext.get('loading').remove(); /* visible 使要素可以被看见 * hidden 使要素被隐藏 * inherit 指它将继承母体要素的可视性设置。 * 值 inherit 为缺省值。这使单元继承父单元的可见性。所以,如果某一段是隐藏的,则它包含的任何行间单元也都被隐藏。这一继承性可被明确指定的可见性取代。*/ Ext.getDom('header').style.visibility = 'visible'; /* 开始创建界面视图——程序可视区域 * 一个页面上只允许存在一个viewport */ var vp = new Ext.Viewport({ layout : 'border', defaults : { collapsible : true, split : true }, items : [{ xtype : 'box', region : 'north', applyTo : 'header', height : 30, split : false }, { xtype:'panel', title : currentUser, id : 'accordion-panel', layout : 'border', region : 'west', baseCls:'x-plain', margins : '2 0 5 5', width : 200, minSize : 200, maxSize : 250, bodyStyle : 'background-color:#DFE8F6', defaults : { border : false }, bbar : [{ text : '开始', iconCls : 'icon-plugin', menu : new Ext.menu.Menu({ items : [{ text : '关于系统', iconCls : 'icon-info', handler : function() { new Ext.Window({ closeAction : 'close', resizable : false, bodyStyle : 'padding: 7', modal : true, title : '关于本系统', html : '本系统采用目前较为流行的技术实现,<br>前台使用了ExtJs技术,所以实现了跨浏览器<br>' + '本程序在IE6,IE7,FireFox3均测试通过!<br><br>主要技术: Struts2 + Spring2.5 + iBatis2.3 + ExtJs2.2<br><br>' + '数&nbsp;&nbsp;据&nbsp;&nbsp;库: Microsoft SQL Server 2000', width : 300, height : 200 }).show(); } }, { text : '退出系统', iconCls : 'icon-delete', handler : function() { Ext.Msg.confirm('操作提示', '您确定要退出本系统?', function(yorn) { if ('yes' == yorn) { Ext.Ajax.request({ url : 'logout.action', success : function() { location = '/bmsh/index.jsp'; }, failure : function() { Ext.Msg.show({ title : '错误提示', msg : '退出系统失败!', icon : Ext.Msg.ERROR, buttons : Ext.Msg.OK }); } }); } }); } }] }) }], items : [{ layout : 'accordion', region : 'center', items : [{ title : '导航菜单', iconCls : 'icon-nav', border : false, items : [{ xtype : 'treepanel', border : false, rootVisible : false, autoScroll : true, loader : new Ext.tree.TreeLoader({ //根据界面勾选manager的值选择菜单项 dataUrl : nav == 'manager' ? 'js/tree-data-manager.json' : nav =='mine' ?'js/tree-data-mine.json' :'js/tree-data-simple.json' }), root : new Ext.tree.AsyncTreeNode(), listeners : { /* chg by megaecho 20090521 * 用tabPanel布局方式实现 菜单调出 工作区 交易界面 * 'click' : function(n) { try { //如果点击子叶点,则驱动显示相应的交易界面 //如何判定本次点击的node为原有的node呢? 就是不想重新加载页面。 var sn = this.selModel.selNode || {};// 方法:取原选定的node if (n.leaf && n.id != sn.id) { //Ext.Msg.alert("你点击了:"+n.id+"["+n.id.substring(0, n.id.indexOf('-'))+'-panel'+"]"); // 根据选中的菜单拼出panel,并指定载入到ViewPort中id为content-panel的标记 // 也就是将交易界面载入 region=center区域——指定活动items Ext.getCmp('content-panel').layout.setActiveItem(n.id.substring(0, n.id .indexOf('-')) + '-panel'); } } catch (e) { } }*/ 'click' : function(n){ //panel的命名规则:panel+'-panel' var treePanelId = n.id.substring(0, n.id .indexOf('-')) + '-panel'; //检查TabPanel(content-panel)中是否已经打开了id为treePanelId的panel //无,则新建panel并且id为treePanelId var tabTmp = Ext.getCmp('content-panel').getItem(treePanelId); if(tabTmp==null){ alert("新打开"+treePanelId+"panel"); Ext.getCmp('content-panel').add({ xtype:'panel', title: n.text, id:treePanelId, closable:true }).show(); }else{ alert("panel"+treePanelId+"已经被打开,跳回已经打开的panel去"); alert(treePanelId+"has been created....."); Ext.getCmp('content-panel').setActiveTab(tabTmp); } } } }] }] }] }, /* * chg by megaecho 20090521 * 用tabPanel布局方式实现 菜单调出 工作区 交易界面 { id : 'content-panel', region : 'center', layout : 'card', margins : '2 5 5 0', activeItem : 0, border : false, //以下items定义了中间区域包含的交易界面(类),并且按照顺序进行载入 ,默认载入第一个,此处也就是先载入 start items : [start, p_company, p_user, p_dept, p_duty, p_subject, p_category, p_book, p_simple_book] }*/ { title:'操作区域', id:'content-panel', region:'center', xtype:'tabpanel', margins : '0 1 1 0', activeItem : 0, border : false, autoTabs : false, hideCollapseTool :true , items:[start, p_company, p_user, p_dept, p_duty, p_subject, p_category, p_book, p_simple_book] }] }); }, 250); }); 希望这次表述清楚了,并且能得到你的帮助!谢谢! [b]问题补充:[/b] [code="java"] 'click' : function(n){ if( n.leaf ){ var treePanelId = n.id.substring(0, n.id.indexOf('-'))+'-panel'; var tabPanelTmp = Ext.getCmp('content-panel'); var tabTmp = tabPanelTmp.getItem(treePanelId); if(tabTmp==null){ alert("新打开"+treePanelId+"panel"); /* 使用if..elseif 判断菜单对应的交易界面,并调出——成功*/ if( n.id == 'book-manage' ){ tabPanelTmp.add(p_book).show(); }else if( n.id == 'company-manage'){ tabPanelTmp.add(p_company).show(); }else if( n.id == 'dept-manage'){ tabPanelTmp.add(p_dept).show(); }else if( n.id == 'user-manage'){ tabPanelTmp.add(p_user).show(); }else if( n.id == 'duty-manage'){ tabPanelTmp.add(p_duty).show(); }else if( n.id == 'subject-manage'){ tabPanelTmp.add(p_subject).show(); }else if( n.id == 'category-manage'){ tabPanelTmp.add(p_category).show(); } /* [新问题]:将上面if elseif 代替如下,根据传入的节点n得到对应的'p_XXXX'这样的名字, * 以获得对p_XXXX的调用,达到自动使用以后交易的增加..... * 但是执行 tabPanelTmp.add( 'p_'+n.id.substring(0, n.id.indexOf('-')) ).show(); * 却不能得到效果 tabPanelTmp.add( 'p_'+n.id.substring(0, n.id.indexOf('-')) ).show(); */ }else{ alert("panel"+treePanelId+"已经被打开,跳回已经打开的panel去"); Ext.getCmp('content-panel').setActiveTab(tabTmp); } }else{ //alert("非叶节点"); } } [/code] [b]问题补充:[/b] 谢谢issppt的帮助! 更是感谢yourgame,耐心的指导! 问题暂时解决了! 如你所说,我把p_xxxxx这些加入到新增加的panel对应的items参数中就ok了! 但是为了要根据点击菜单来选择对应的p_XXXX,我的做法相对死板 如下: [code="java"] 'click' : function(n){ if( n.leaf ){ var treePanelId = n.id.substring(0, n.id.indexOf('-'))+'-panel'; var tabPanelTmp = Ext.getCmp('content-panel'); var tabTmp = tabPanelTmp.getItem(treePanelId); if(tabTmp==null){ alert("新打开"+treePanelId+"panel"); [b] /* 死板:使用if..elseif 判断菜单对应的交易界面,并调出——成功*/ [/b] if( n.id == 'book-manage' ){ tabPanelTmp.add(p_book).show(); }else if( n.id == 'company-manage'){ tabPanelTmp.add(p_company).show(); }else if( n.id == 'dept-manage'){ tabPanelTmp.add(p_dept).show(); }else if( n.id == 'user-manage'){ tabPanelTmp.add(p_user).show(); }else if( n.id == 'duty-manage'){ tabPanelTmp.add(p_duty).show(); }else if( n.id == 'subject-manage'){ tabPanelTmp.add(p_subject).show(); }else if( n.id == 'category-manage'){ tabPanelTmp.add(p_category).show(); } [b] /* [新问题]:将上面if elseif 代替如下,根据传入的节点n得到对应的'p_XXXX'这样的名字, * 以获得对p_XXXX的调用,达到自动使用以后交易的增加..... * 但是执行 tabPanelTmp.add( 'p_'+n.id.substring(0, n.id.indexOf('-')) ).show(); * 却不能得到效果 tabPanelTmp.add( 'p_'+n.id.substring(0, n.id.indexOf('-')) ).show(); */ [/b] }else{ alert("panel"+treePanelId+"已经被打开,跳回已经打开的panel去"); Ext.getCmp('content-panel').setActiveTab(tabTmp); } }else{ //alert("非叶节点"); } } [/code] [b] 现在想请教如何处理[新问题]? [/b] 我想这个新问题关键还是自己对extjs没有理解所致, 对如下的代码段 的实质 和如何才能 引用未搞清楚!再次求教! [code="java"] var p_book = { title:'图书信息管理', id : 'book-panel', border : false, layout : 'fit', closable:'true', items : [book_panel] } [/code] 另外我通过网上的资料学习,掌握了向TabPanel中动态增加tabs的方法: 1.iframe方式 2.autoLoad方式 3.扩展Panel 资料连接:http://chenxueyong.iteye.com/blog/353371
页面内容显示不出来 ,看不懂哪里出错了。
``` main.jsp: <%@ page contentType="text/html;charset=UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>title</title> <%@ include file="../../include/common.jsp"%> <script type="text/javascript"> //定义了一个命名空间,ExpertsMntn.main.xxxx可以直接调用 $.namespace("ExpertsMntn.main"); ExpertsMntn.main.add=function() { $("#ExpertsMntnDetailWin").dialog({ href:'add', title:'添加', draggable:false, //设置dialog自由尺寸 onResize:function(){ $('#ExpertsMntnGrid').datagrid('resize'); } }).dialog('open'); }; ExpertsMntn.main.edit=function() { var row = $('#ExpertsMntnGrid').datagrid('getSelections'); //getSelections:可以多行选中操作; getSelected:只能单行操作; if(row.length==1){ $("#ExpertsMntnDetailWin").dialog({ href:'edit/'+row[0].id, title:'编辑', draggable:false, onResize:function(){ $('#ExpertsMntnGrid').datagrid('resize'); } }).dialog('open'); }else{ $.message.alert("Please select a record only!"); } }; ExpertsMntn.main.del=function() { //获取datagrid选中的数据行 var row = $("#ExpertMntnGrid").datagrid('getSelections'); if(row.length>=1){ //调用easyui的确认框 $.message.comfirm('确认','确认删除?',function(r) { if(r){ var ids = [ ]; //将选中的数据库的id压入ids[]数组; for (var i = 0; i < row.length; i++) { ids.push(row[i].id); } //调用jquery的post方法请求delete地址 $.post('del',{ ids:ids.join(',') },function(result){ //动态页200状态post成功回调并且服务器返回标准json数据执行回调函数 if(result){ // reload data $('#ExpertsMntnGrid').datagrid('clearSelections'); $('#ExpertsMntnGrid').datagrid('reload'); } },"json"); //指定将服务器返回的内容处理成json类型(此外,还可以返回 html、text之类) } }); }else{ $.message.alert('Please select a record only!'); } }; ExpertsMntn.main.listSearch=function() { $('#ExpertsMntnGrid').datagrid('load', { }); }; ExpertsMntn.main.init = function() { $('#ExpertsMntnGrid').datagrid({ //建表?建表插件用法 url:'search', method:'get', pageSize:20, toolbar:'#', fit : true, pagination : true, idField : "id", //支持分页选择记录 pagePosition : "bottom", rownumbers : true, border : false, singleSelect : false, striped : true, fitColumns : true, selectOnCheck : true, checkOnSelect : true, columns:[[{ field:'check', title : '', checkbox : true },{ field : 'id', title : '', width : 22, align : 'center', halign : 'center', sortable : true },{ field:'name', title:'姓名', width:22, align : 'center', halign : 'center', sortable : false },{ field:'sex', title:'性别', width:22, align : 'center', halign : 'center', sortable : false },{ field:'birthday', title:'出生日期', width:22, align : 'center', halign : 'center', sortable : false },{ field:'partymember', title:'政治状态', width:22, align : 'center', halign : 'center', sortable : false },{ field:'itemid', title:'专业', width:22, align : 'center', halign : 'center', sortable : false },{ field:'orgid', title:'所属组织', width:22, align : 'center', halign : 'center', sortable : false },{ field:'telephone', title:'联系方式', width:22, align : 'center', halign : 'center', sortable : false },{ field:'experience', title:'经历', width:22, align : 'center', halign : 'center', sortable : false },{ field:'remarks', title:'备注', width:22, align : 'center', halign : 'center', sortable : false },{ field:'content', title:'照片附件', width:22, align : 'center', halign : 'center', sortable : false },{ field:'photo-suffix', title:'照片文件后缀名', width:22, align : 'center', halign : 'center', sortable : false }]], //查看操作,onDblClickRow onDblClickRow : function(index, row) { $('#ExpertsMntnGrid').datagrid("clearSelections"); $('#ExpertsMntnGrid').datagrid("selectRow", index); $('#ExpertsMntnDetailWin').dialog({ href : 'view/' + row.id, title : "查看", draggable : false, onResize : function() { $('#ExpertsMntnGrid').datagrid('resize'); } }).dialog('open'); } }); }; $(document).ready(function() { ExpertsMntn.main.init(); }); </script> </head> <body> <div class="easyui-layout" fit="true" border="false" > <div region="north" border="false" > <div id="toolbar" border="false" class="dialog-toolbar" style="border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #DDDDDD"> <a href="#" class="easyui-linkbutton" data-options="plain:true,iconCls:'icon-add'" onclick="ExpertsMntn.main.add()">添加</a> <a href="#" class="easyui-linkbutton" data-options="plain:true,iconCls:'icon-edit'" onclick="ExpertsMntn.main.edit()">编辑</a> <a href="#" class="easyui-linkbutton" data-options="plain:true,iconCls:'icon-remove'" onclick="ExpertsMntn.main.del()">删除</a> </div> </div> <div region="center" border="false" style="width: 100%; height: 100%"> <table id="ExpertsMntnGrid"></table> </div> <div id="ExpertsMntnDetailWin" class="easyui-dialog" title="" style="width: 450px; height: 750px;" data-options="modal:true,closed:true"></div> </div> </body> </html> detail.jsp: <%@ page contentType="text/html;charset=UTF-8"%> <%@ include file="../../include/header.jsp"%> <script type="text/javascript"> $.namespace("ExpertsMntn.detail"); ExpertsMntn.id="${(ExpertsMntnEntity.id)==null?0:(ExpertsMntnEntity.id)}"; ExpertsMntn.detail.mode = "${mode}"; ExpertsMntn.detail.save = function(){ var url = $.ctx+'/zjkwh/save/'+ ExpertsMntn.id; $('#ExpertsMntnForm').form('submit', { url: url, onSubmit: function(param) { if(ExpertsMntn.detail.mode=='edit'){ return $(this).form('validate'); } var flag = false; $.ajax({ type : "post", url : 'check', dataType : "json", data : { id : $('#id').val() }, async : false, success : function(result) { if (result == true) { flag = true; } } }); if(!flag){ return $(this).form('validate'); } else { $.messager.alert('数据已存在'); $('#ExpertsMntnGrid').datagrid('load'); return !flag; } }, success: function(result) { var data = (new Function("","return "+ result))(); $('#ExpertsMntnGrid').datagrid('reload'); if (data.id) { ExpertsMntn.id = data.id; $.messager.alert('提示', '保存成功!','',function(){ $('#ExpertsMntnDetailWin').dialog('close'); }); } else { $.messager.show({ title: 'Error', msg: result }); } } }); } $(document).ready(function() { }); </script> <div class="easyui-layout" region="center" style="height:700px;border:1px dashed #FFFFFF"> <c:if test="${(mode=='edit') || (mode=='add')}"> <div class="editform" style="border:1px dashed #FFFFFF"> <form id="ExpertsMntnForm" method="post" novalidate style="margin-bottom: 0"> <input id="id" name="id" type="hidden" value="${ExpertsMntnEntity.id }" /> <ul style="list-style-type: none; height: 5px"></ul> "validType:'length[1,50]'" value="${ExpertsMntnEntity.wonawardz}" size="20" style="width: 140px;height:30px;line-height:30px;border-style:none;margin-right:3px;float: left;background: url('${ctx}/static/images/inputbg.png') ;background-size: 100% 100%; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='${ctx}/static/images/inputbg.png', sizingMethod='scale')\9;" /> </li> </ul>--> </div> </c:if> <c:if test="${mode=='view'}"> <div class="editform"> <table border=1> <tbody> <tr> <td class="label"><label>&nbps;ID:</label></td> <td>${expertsMntnEntity.id}</td> </tr> <tr> <td class="label"><label>姓名:</label></td> <td>${expertsMntnEntity.name}</td> </tr> <tr> <td class="label"><label>性别:</label></td> <td>${expertsMntnEntity.sex}</td> </tr> <tr> <td class="label"><label>出生日期:</label></td> <td>${expertsMntnEntity.birthday}</td> </tr> <tr> <td class="label"><label>专业:</label></td> <td>${expertsMntnEntity.itemid}</td> </tr> <tr> <td class="label"><label>获得奖项:</label></td> <td>${expertsMntnEntity.wonawardz}</td> </tr> <tr> <td class="label"><label>经历:</label></td> <td>${expertsMntnEntity.experience}</td> </tr> <tr> <td class="label"><label>备注:</label></td> <td>${expertsMntnEntity.remarks }</td> </tr> </tbody> </table> </div> </c:if> </div> 只有添加才能显示出内容,编辑和查看操作在对话框中显示不出来,就连div框都显示不了!对话框能打开,但是里面什么东西都没有! ```
我最近写了个留言表 但是出现了找不到memberAction ?
1,这个是struts 配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.objectFactory" value="spring" /> <constant name="struts.devMode" value="false"></constant> <package name="member" extends="struts-default" namespace="/member"> <action name="register" class="memberAction" method="registe"> <result name="success">/login.jsp</result> <result name="fail">/register.jsp</result> <result name="input">/register.jsp</result> </action> <action name="login" class="memberAction" method="login"> <result name="success" type="redirectAction"> <param name="namespace">/message</param> <param name="actionName">liuYanList</param> </result> <result name="fail">/login.jsp</result> </action> </package> <package name="message" extends="json-default" namespace="/message"> <action name="publish" class="messageAction" method="publish"> <!-- 这个action 成功后 是把数据库里面的留言抓去 放到这个成功页面 --> <result name="success" type="redirectAction"> <param name="actionName">liuYanList</param> </result> <!-- 失败还是返回这个页面 用异步提示 发送失败 所以选用json 所以这个包应该继承的是json-default --> <result name="fail" type="json"> <!-- 指定json字符串 根对象是谁 这个需要根据自己写的类来设计 --> <param name="root">errorMap</param> </result> </action> <action name="liuYanList" class="messageAction" method="liuYanList"> <result name="success">/WEB-INF/pages/message.jsp</result> </action> </package> <package name="verify" extends="json-default" namespace="/verify"> <!-- 因为我们只是生成一个校验码 所以 不用写方法 只需要excute就可以 --> <action name="code" class="verifyCodeAction"> <!-- 因为我们用的是流传输 验证码 所以 result 的类型应该是stream --> <result name="success" type="stream"> <param name="inputName">inputStream</param> </result> </action> <action name="check" class="verifyCodeAction" method="check"> <result name="success" type="json"> <param name="root">checkResult</param> </result> </action> </package> 2, 这个是登录 private static final long serialVersionUID = 7270980727777540053L; private Member member; private String rePassword; private String verifyCode;//通过属性驱动来收集页面的验证码 //保存收集到页面的数据 通过service来保存 所以就要注入一个service private MemberService memberService; public String login() { //根据一个指定的username 从数据库中 获取一个Member 对象 Member m = memberService.getMember(member.getUsername()); if (m != null) { //因为数据库里面保存的是我们加过密之后的密码 所以我们要对用户登录时输入的密码也进行加密 //这样才能比较 两个密码 String inputPassword = StringUtil.md532(member.getPassword()); if (m.getPassword().equals(inputPassword) ){ //信息完全正确 就需要把用户的信息存入session中 这样就不需要重复登录 //通过 Struts2 来访问 HttpSession 把member 的信息存放到session中 //m 是来自数据库的 有主键 id ActionContext.getContext().getSession().put("member", m); return "success"; }else { //密码错误 } }else { //输入的用户名不存在 } return "fail"; } 这个是登录页面 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <html> <head> <title>用户登录页面</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <!-- 引入 CSS 文件--> <link href="${pageContext.request.contextPath }/css/style.css" type="text/css" rel="stylesheet" /> <!-- 引入JavaScript 库 --> <script src="${pageContext.request.contextPath}/jslibs/jquery-1.11.3.min.js" type="text/javascript"></script> <script type="text/javascript"> jQuery(function () { jQuery("#refresh").click(function(){ jQuery("#verify_code").attr("src","${pageContext.request.contextPath }/verify/code?suibian" + new Date()) }); jQuery("#verify_code_input").blur(function(){ //获得输入框的值 和 服务器里面的验证码进行对比 var input = jQuery("#verify_code_input").val(); //发送到服务器端 和 服务器里面的验证码进行对比 var url = "${pageContext.request.contextPath }/verify/check"; var settings={ "url":url, "type":"POST", "data":{"inputCode" : input}, "dataType":"json", "success":function( responseData ){ jQuery("#verify_code_error").html( responseData ); } }; jQuery.ajax(settings); }); }); </script> </head> <body topMargin="10"> <center> <div id="append_parent"></div> <table cellSpacing="6" cellPadding="2" width="100%" border="0"> <tbody> <tr> <td> <table class="guide" cellSpacing="0" cellPadding="0" width="100%" border="0"> <tbody> <tr> <td> <a href='index.jsp'>主页</a>&nbsp;/&nbsp; <a href='#'>留言板(malastruts)</a>&nbsp;/&nbsp;用户登录 </td> </tr> </tbody> </table> <h4 align="center">${ msg }</h4> <!--<form id="settings" action="register_action.jsp" method="post"> --> <form id="settings" action="${pageContext.request.contextPath}/member/login" method="post"> <table class="tableborder" cellSpacing="0" cellPadding="0" width="100%" border="0"> <tbody> <tr class="header"> <td colSpan="3"> 登录系统 </td> </tr> </tbody> <tbody> <tr> <td class="altbg1" width="20%"> <b>用户名称 </b> </td> <td class="altbg2" valign="middle" width="20%"> <input type="text" name="username" value="${member.username}" /> </td> <td> <span style="color: red"> <s:fielderror fieldName="username"></s:fielderror> </span> </td> </tr> <tr> <td class="altbg1" width="20%"> <b>用户密码 </b> </td> <td class="altbg2"> <input type="password" name="password"/> </td> <td> <span style="color: red"> <s:fielderror fieldName="password"></s:fielderror> </span> </td> </tr> <tr> <td class="altbg1" width="20%"> <b>验证码 </b> </td> <td class="altbg2"> <input type="text" name="verifyCode" id="verify_code_input" /> </td> <td> <!-- 我们用jquery 给这个验证码绑定一个点击事件 实现异步的验证码刷新 --> <img src="${pageContext.request.contextPath}/verify/code" id="verify_code"> <a href="javascript: " id="refresh">输入正确</a> <span style="color: red" id="verify_code_error"> <s:fielderror fieldName="verifyCode"></s:fielderror> </span> </td> </tr> </tbody> </table> <br /> <center> <input class="button" type="reset" value="重置" name="settingsubmit" /> <input class="button" type="submit" value="提交" name="settingsubmit" /> </center> </form> </td> </tr> </tbody> </table> <hr> </center> </body> </html> 3,Spring 配置 <bean id="memberAction" class="message.action.MemberAction" p:memberService-ref="memberService" scope="singleton"/> <bean id="messageAction" class="message.action.MessageAction" p:messageService-ref="messageService" scope="singleton"/> <bean id="verifyCodeAction" class="message.action.VerifyCodeAction" scope="singleton"/> 4,这个是Member 类 public class Member implements Serializable { private static final long serialVersionUID = 1L; private String username; private String password; private Integer id; //维护 Member 到 Message 一对多的关系 private Set<Message> messages;//当前会员留言 private Set<Reply> replies;//当前会员回复 public Set<Reply> getReplies() { return replies; } public void setReplies(Set<Reply> replies) { this.replies = replies; } public Set<Message> getMessages() { return messages; } public void setMessages(Set<Message> messages) { this.messages = messages; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } } 启动时没有出现任何异常 就是登录的时候 会出现这个异常 type Exception report message Invalid action class configuration that references an unknown class named [memberAction] description The server encountered an internal error that prevented it from fulfilling this request. exception java.lang.RuntimeException: Invalid action class configuration that references an unknown class named [memberAction] root cause java.lang.ClassNotFoundException: memberAction
StringMVC+Spring-Security 登陆后地址栏出现/timeout 跳转到404页面
第一次使用Spring-Security ,下载了几个demo 也看了 文档, 使用最小http配置和配置测试用户 都是正常的, 就是使用数据库用户登录的时候,不知道是哪里出的问题, 求指点,感激不尽! [b]spring-security.xml内容[/b]: [code="java"] <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" 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-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd" default-autowire="byType" default-lazy-init="true"> <http auto-config='true'> <intercept-url pattern="/img/**" filters="none"/> <!-- 静态资源、登陆页面不过滤, filters="none" 表示不过滤 --> <intercept-url pattern="/js/**" filters="none"/> <intercept-url pattern="/css/**" filters="none"/> <intercept-url pattern="/dwz/**" filters="none"/> <intercept-url pattern="/index.jsp*" filters="none"/> <intercept-url pattern="/hello" filters="none"/> <intercept-url pattern="/user/login" filters="none"/> <intercept-url pattern="/**" access="ROLE_USER"/> <form-login login-page='/hello' default-target-url='/user/index' always-use-default-target='true'/> </http> <!-- 测试用户 <authentication-manager> <authentication-provider> <user-service> <user name="jimi" password="jimispassword" authorities="ROLE_USER,ROLE_ADMIN"/> <user name="bob" password="bobspassword" authorities="ROLE_USER"/> </user-service> </authentication-provider> </authentication-manager> --> <!-- 指定一个自定义的authentication-manager :customUserDetailsService --> <authentication-manager> <authentication-provider user-service-ref="customUserDetailsService"> <password-encoder hash="plaintext"/> </authentication-provider> </authentication-manager> <beans:bean id="customUserDetailsService" class="com.travel.spring.service.UserDetailsServiceImpl" /> </beans:beans> [/code] [b] com.travel.spring.service.UserDetailsServiceImpl 代码:[/b] [code="java"] package com.travel.spring.service; import java.util.ArrayList; import java.util.Collection; import javax.annotation.Resource; import org.apache.log4j.Logger; import org.springframework.dao.DataAccessException; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.GrantedAuthorityImpl; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.transaction.annotation.Transactional; import com.travel.spring.model.WebUser; @Transactional(readOnly = true) public class UserDetailsServiceImpl implements UserDetailsService { protected static Logger logger = Logger.getLogger("service"); @Resource(name = "webUserService") private IWebUserService webUserService; public UserDetails loadUserByUsername(String username){ try { WebUser user = webUserService.getUserByName(username);// user已经获得 为:admin,123456,李岩 if (user == null) { throw new UsernameNotFoundException("用户{ " + username + " }不存在!"); } //Set<GrantedAuthority> grantedAuths = obtainGrantedAuthorities(user); Collection<GrantedAuthority>grantedAuths = obtainGrantedAuthorities(user); // -- mini-web示例中无以下属性, 暂时全部设为true. --// boolean enabled = true; boolean accountNonExpired = true; boolean credentialsNonExpired = true; boolean accountNonLocked = true; UserDetails userdetails = new org.springframework.security.core.userdetails.User( user.getLoginName(), user.getPassWord(), enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, grantedAuths); return userdetails; } catch (Exception e) { // TODO: handle exception } return null; } /** * 获得当前User的权限('ROLE_' 开头的) */ private Collection<GrantedAuthority> obtainGrantedAuthorities(WebUser user) { Collection<GrantedAuthority> auths=new ArrayList<GrantedAuthority>(); GrantedAuthorityImpl auth2=new GrantedAuthorityImpl("ROLE_USER"); auths.add(auth2); return auths; } } [/code] [b]登陆页面代码:[/b] [code="java"] <div class="panel-c-l"> <form name="f" action="<%=path%>/j_spring_security_check" method='post'> <table cellpadding="0" cellspacing="0"> <tbody> <tr> <td align="left" colspan="2"> <h3>请使用Travel Manager系统账号登陆</h3> </td> </tr> <tr> <td align="right">账号:</td><td align="left"><input type="text" id="j_username" name="j_username" class="login-text" /></td> </tr> <tr> <td align="right">密码:</td><td align="left"><input type="password" name="j_password" class="login-text" /></td> </tr> <tr> <td align="center" colspan="2"> <input type="submit" id="btnLogin" value="登陆" class="login-btn" /> </td> </tr> </tbody> </table> </form> </div> [/code] [b] UserController.java 代码[/b] [code="java"]package com.travel.spring.web; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.GrantedAuthorityImpl; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import com.travel.spring.model.WebUser; import com.travel.spring.service.IWebUserService; @Controller @RequestMapping("/user") public class UserController { private IWebUserService webUserService; public IWebUserService getWebUserService() { return webUserService; } public void setWebUserService(IWebUserService webUserService) { this.webUserService = webUserService; } @RequestMapping(value="/index") public String index(Model model,HttpServletRequest request,HttpSession session) throws Exception{ return "admin/index"; } } [/code] 用户名 密码填写错误,还是跳转到当前页面, 如果填写正确了,就会出现 /timeout 404页面 ,如图 [img]http://dl.iteye.com/upload/attachment/0083/5848/ea079fb1-37b6-3aaa-806e-7af4198b89a3.jpg[/img]
Form表单数据自动填充的问题
应用很简单明了,就是将一个需要修改的员工信息传递到一个页面然后自动把已存在的数据填写到合适的位置,然后供人修改 问题:后台数据可以得到,可是无法将数据绑定到指定控件上 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>MyExtFullForm.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> <!-- Ext显示必须链接,前后顺序不能颠倒 --> <link rel="stylesheet" href="resources/css/ext-all.css" type="text/css"></link> <script type="text/javascript" src="ext-base.js"></script> <script type="text/javascript" src="ext-all.js"></script> <script type="text/javascript" src="ext-lang-zh_CN.js"></script> <!-- End --> <script> Ext.onReady(function(){ var reader = new Ext.data.JsonReader({ successProperty : 'success', root : 'data' }, [{ name : 'name', type : 'String', mapping : 'name' }, { name : 'address', type : 'String', mapping : 'address' }, { name : 'loves', type : 'int', mapping : 'loves' }, { name : 'memo', type : 'String', mapping : 'memo' }]); var form = new Ext.form.FormPanel({ labelAlign:'right', labelWidth:60, title:'我的表单', frame:true, width:650, url:'form.jsp', items:[{ layout:'column', items:[{ columnWidth:.5, layout:'form', defaultType:'textfield', xtype:'fieldset', title:'姓名', autoHeight:true, items:[{ fieldLabel: '姓名', name:'name', value:reader.get('name') },{ fieldLabel: '地址', name:'address', value:reader.get('address') }] },{ columnWidth:.5, layout:'form', defaultType:'checkbox', xtype:'fieldset', title:'住址', style:'margin-left:20px;', autoHeight:true, items:[{ fieldLabel: '足球', inputValue:'1', name:'loves' },{ fieldLabel: 'DIY', inputValue:'2', name:'loves' },{ fieldLabel: '睡觉', inputValue:'3', name:'loves' },{ xtype:'panel',html:'<center><img src="icon-info.gif"/></center>' }] }] },{ xtype:'fieldset', title:'个人介绍', autoHeight:true, items:[{ width:545, xtype:'textarea', name:'memo', fieldLabel:'个人介绍' }] }], buttons:[{ text:'提交', handler:function(){ form.getForm().submit(); } },{ text:'读取', handler:function(){ form.getForm().load({url:'Ds/Form.txt'}); Ext.MessageBox.alert('Msg',reader) } }] }); form.render("form"); }) </script> </head> <body> <div id="form"></div> </body> </html> ======================================================================== 我的后台Form.txt内容为 {success:true,data:[{ name:'Rooney', address:'Mu', loves:2, memo:'Tank' }]} ======================================================================= 请大家帮我看看 还有两个问题,1.多选框如果取到选中值 2.表单提交的时候可不可以先把所有控件的值封装成json格式的数组然后传走呢? Form表单数据自动填充
asp.net webuploader多图片上传并保存文件路径到数据库
![图片说明](https://img-ask.csdn.net/upload/201906/22/1561187942_114655.jpg) 要做一个滚动窗功能,使用webuploader插件 不知道在哪获取文件路径,保存到数据库里 上传的upload.js ``` (function( $ ){ // 当domReady的时候开始初始化 $(function() { var $wrap = $('.uploader-list-container'), // 图片容器 $queue = $( '<ul class="filelist"></ul>' ) .appendTo( $wrap.find( '.queueList' ) ), // 状态栏,包括进度和控制按钮 $statusBar = $wrap.find( '.statusBar' ), // 文件总体选择信息。 $info = $statusBar.find( '.info' ), // 上传按钮 $upload = $wrap.find( '.uploadBtn' ), // 没选择文件之前的内容。 $placeHolder = $wrap.find( '.placeholder' ), $progress = $statusBar.find( '.progress' ).hide(), // 添加的文件数量 fileCount = 0, // 添加的文件总大小 fileSize = 0, // 优化retina, 在retina下这个值是2 ratio = window.devicePixelRatio || 1, // 缩略图大小 thumbnailWidth = 110 * ratio, thumbnailHeight = 110 * ratio, // 可能有pedding, ready, uploading, confirm, done. state = 'pedding', // 所有文件的进度信息,key为file id percentages = {}, // 判断浏览器是否支持图片的base64 isSupportBase64 = ( function() { var data = new Image(); var support = true; data.onload = data.onerror = function() { if( this.width != 1 || this.height != 1 ) { support = false; } } data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="; return support; } )(), // 检测是否已经安装flash,检测flash的版本 flashVersion = ( function() { var version; try { version = navigator.plugins[ 'Shockwave Flash' ]; version = version.description; } catch ( ex ) { try { version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash') .GetVariable('$version'); } catch ( ex2 ) { version = '0.0'; } } version = version.match( /\d+/g ); return parseFloat( version[ 0 ] + '.' + version[ 1 ], 10 ); } )(), supportTransition = (function(){ var s = document.createElement('p').style, r = 'transition' in s || 'WebkitTransition' in s || 'MozTransition' in s || 'msTransition' in s || 'OTransition' in s; s = null; return r; })(), // WebUploader实例 uploader; if ( !WebUploader.Uploader.support('flash') && WebUploader.browser.ie ) { // flash 安装了但是版本过低。 if (flashVersion) { (function(container) { window['expressinstallcallback'] = function( state ) { switch(state) { case 'Download.Cancelled': alert('您取消了更新!') break; case 'Download.Failed': alert('安装失败') break; default: alert('安装已成功,请刷新!'); break; } delete window['expressinstallcallback']; }; var swf = 'expressInstall.swf'; // insert flash object var html = '<object type="application/' + 'x-shockwave-flash" data="' + swf + '" '; if (WebUploader.browser.ie) { html += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '; } html += 'width="100%" height="100%" style="outline:0">' + '<param name="movie" value="' + swf + '" />' + '<param name="wmode" value="transparent" />' + '<param name="allowscriptaccess" value="always" />' + '</object>'; container.html(html); })($wrap); // 压根就没有安转。 } else { $wrap.html('<a href="http://www.adobe.com/go/getflashplayer" target="_blank" border="0"><img alt="get flash player" src="http://www.adobe.com/macromedia/style_guide/images/160x41_Get_Flash_Player.jpg" /></a>'); } return; } else if (!WebUploader.Uploader.support()) { alert( 'Web Uploader 不支持您的浏览器!'); return; } // 实例化 uploader = WebUploader.create({ pick: { id: '#filePicker-2', label: '点击选择图片' }, formData: { uid: 123 }, dnd: '#dndArea', paste: '#uploader', swf: '../Uploader.swf', chunked: false, chunkSize: 512 * 1024, server: './Ajax/UpLoad.ashx', // runtimeOrder: 'flash', accept: { title: 'Images', extensions: 'gif,jpg,jpeg,bmp,png', mimeTypes: 'image/*' }, // 禁掉全局的拖拽功能。这样不会出现图片拖进页面的时候,把图片打开。 disableGlobalDnd: true, fileNumLimit: 300, fileSizeLimit: 200 * 1024 * 1024, // 200 M fileSingleSizeLimit: 50 * 1024 * 1024 // 50 M }); // 拖拽时不接受 js, txt 文件。 uploader.on( 'dndAccept', function( items ) { var denied = false, len = items.length, i = 0, // 修改js类型 unAllowed = 'text/plain;application/javascript '; for ( ; i < len; i++ ) { // 如果在列表里面 if ( ~unAllowed.indexOf( items[ i ].type ) ) { denied = true; break; } } return !denied; }); uploader.on('dialogOpen', function() { console.log('here'); }); // uploader.on('filesQueued', function() { // uploader.sort(function( a, b ) { // if ( a.name < b.name ) // return -1; // if ( a.name > b.name ) // return 1; // return 0; // }); // }); // 添加“添加文件”的按钮, uploader.addButton({ id: '#filePicker2', label: '继续添加' }); uploader.on('ready', function() { window.uploader = uploader; }); // 当有文件添加进来时执行,负责view的创建 function addFile(file) { alert(file.name); var $li = $( '<li id="' + file.id + '">' + '<p class="title">' + file.name + '</p>' + '<p class="imgWrap"></p>'+ '<p class="progress"><span></span></p>' + '</li>' ), $btns = $('<div class="file-panel">' + '<span class="cancel">删除</span>' + '<span class="rotateRight">向右旋转</span>' + '<span class="rotateLeft">向左旋转</span></div>').appendTo( $li ), $prgress = $li.find('p.progress span'), $wrap = $li.find( 'p.imgWrap' ), $info = $('<p class="error"></p>'), showError = function( code ) { switch( code ) { case 'exceed_size': text = '文件大小超出'; break; case 'interrupt': text = '上传暂停'; break; default: text = '上传失败,请重试'; break; } $info.text( text ).appendTo( $li ); }; if ( file.getStatus() === 'invalid' ) { showError( file.statusText ); } else { // @todo lazyload $wrap.text( '预览中' ); uploader.makeThumb( file, function( error, src ) { var img; if ( error ) { $wrap.text( '不能预览' ); return; } if( isSupportBase64 ) { img = $('<img src="'+src+'">'); $wrap.empty().append( img ); } else { $.ajax('../server/preview.php', { method: 'POST', data: src, dataType:'json' }).done(function( response ) { if (response.result) { img = $('<img src="'+response.result+'">'); $wrap.empty().append( img ); } else { $wrap.text("预览出错"); } }); } }, thumbnailWidth, thumbnailHeight ); percentages[ file.id ] = [ file.size, 0 ]; file.rotation = 0; } file.on('statuschange', function( cur, prev ) { if ( prev === 'progress' ) { $prgress.hide().width(0); } else if ( prev === 'queued' ) { $li.off( 'mouseenter mouseleave' ); $btns.remove(); } // 成功 if ( cur === 'error' || cur === 'invalid' ) { console.log( file.statusText ); showError( file.statusText ); percentages[ file.id ][ 1 ] = 1; } else if ( cur === 'interrupt' ) { showError( 'interrupt' ); } else if ( cur === 'queued' ) { percentages[ file.id ][ 1 ] = 0; } else if ( cur === 'progress' ) { $info.remove(); $prgress.css('display', 'block'); } else if ( cur === 'complete' ) { $li.append( '<span class="success"></span>' ); } $li.removeClass( 'state-' + prev ).addClass( 'state-' + cur ); }); $li.on( 'mouseenter', function() { $btns.stop().animate({height: 30}); }); $li.on( 'mouseleave', function() { $btns.stop().animate({height: 0}); }); $btns.on( 'click', 'span', function() { var index = $(this).index(), deg; switch ( index ) { case 0: uploader.removeFile( file ); return; case 1: file.rotation += 90; break; case 2: file.rotation -= 90; break; } if ( supportTransition ) { deg = 'rotate(' + file.rotation + 'deg)'; $wrap.css({ '-webkit-transform': deg, '-mos-transform': deg, '-o-transform': deg, 'transform': deg }); } else { $wrap.css( 'filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation='+ (~~((file.rotation/90)%4 + 4)%4) +')'); // use jquery animate to rotation // $({ // rotation: rotation // }).animate({ // rotation: file.rotation // }, { // easing: 'linear', // step: function( now ) { // now = now * Math.PI / 180; // var cos = Math.cos( now ), // sin = Math.sin( now ); // $wrap.css( 'filter', "progid:DXImageTransform.Microsoft.Matrix(M11=" + cos + ",M12=" + (-sin) + ",M21=" + sin + ",M22=" + cos + ",SizingMethod='auto expand')"); // } // }); } }); $li.appendTo( $queue ); } // 负责view的销毁 function removeFile( file ) { var $li = $('#'+file.id); delete percentages[ file.id ]; updateTotalProgress(); $li.off().find('.file-panel').off().end().remove(); } function updateTotalProgress() { var loaded = 0, total = 0, spans = $progress.children(), percent; $.each( percentages, function( k, v ) { total += v[ 0 ]; loaded += v[ 0 ] * v[ 1 ]; } ); percent = total ? loaded / total : 0; spans.eq( 0 ).text( Math.round( percent * 100 ) + '%' ); spans.eq( 1 ).css( 'width', Math.round( percent * 100 ) + '%' ); updateStatus(); } function updateStatus() { var text = '', stats; if ( state === 'ready' ) { text = '选中' + fileCount + '张图片,共' + WebUploader.formatSize( fileSize ) + '。'; } else if ( state === 'confirm' ) { stats = uploader.getStats(); if ( stats.uploadFailNum ) { text = '已成功上传' + stats.successNum+ '张照片至XX相册,'+ stats.uploadFailNum + '张照片上传失败,<a class="retry" href="#">重新上传</a>失败图片或<a class="ignore" href="#">忽略</a>' } } else { stats = uploader.getStats(); text = '共' + fileCount + '张(' + WebUploader.formatSize( fileSize ) + '),已上传' + stats.successNum + '张'; if ( stats.uploadFailNum ) { text += ',失败' + stats.uploadFailNum + '张'; } } $info.html( text ); } function setState( val ) { var file, stats; if ( val === state ) { return; } $upload.removeClass( 'state-' + state ); $upload.addClass( 'state-' + val ); state = val; switch ( state ) { case 'pedding': $placeHolder.removeClass( 'element-invisible' ); $queue.hide(); $statusBar.addClass( 'element-invisible' ); uploader.refresh(); break; case 'ready': $placeHolder.addClass( 'element-invisible' ); $( '#filePicker2' ).removeClass( 'element-invisible'); $queue.show(); $statusBar.removeClass('element-invisible'); uploader.refresh(); break; case 'uploading': $( '#filePicker2' ).addClass( 'element-invisible' ); $progress.show(); $upload.text( '暂停上传' ); break; case 'paused': $progress.show(); $upload.text( '继续上传' ); break; case 'confirm': $progress.hide(); $( '#filePicker2' ).removeClass( 'element-invisible' ); $upload.text( '开始上传' ); stats = uploader.getStats(); if ( stats.successNum && !stats.uploadFailNum ) { setState( 'finish' ); return; } break; case 'finish': stats = uploader.getStats(); if ( stats.successNum ) { alert( '上传成功' ); } else { // 没有成功的图片,重设 state = 'done'; location.reload(); } break; } updateStatus(); } uploader.onUploadProgress = function( file, percentage ) { var $li = $('#'+file.id), $percent = $li.find('.progress span'); $percent.css( 'width', percentage * 100 + '%' ); percentages[ file.id ][ 1 ] = percentage; updateTotalProgress(); }; uploader.onFileQueued = function( file ) { fileCount++; fileSize += file.size; if ( fileCount === 1 ) { $placeHolder.addClass( 'element-invisible' ); $statusBar.show(); } addFile( file ); setState( 'ready' ); updateTotalProgress(); }; uploader.onFileDequeued = function( file ) { fileCount--; fileSize -= file.size; if ( !fileCount ) { setState( 'pedding' ); } removeFile( file ); updateTotalProgress(); }; uploader.on( 'all', function( type ) { var stats; switch( type ) { case 'uploadFinished': setState( 'confirm' ); break; case 'startUpload': setState( 'uploading' ); break; case 'stopUpload': setState( 'paused' ); break; } }); uploader.onError = function( code ) { alert( 'Eroor: ' + code ); }; $upload.on('click', function() { if ( $(this).hasClass( 'disabled' ) ) { return false; } if ( state === 'ready' ) { uploader.upload(); } else if ( state === 'paused' ) { uploader.upload(); } else if ( state === 'uploading' ) { uploader.stop(); } }); $info.on( 'click', '.retry', function() { uploader.retry(); } ); $info.on( 'click', '.ignore', function() { alert( 'todo' ); } ); $upload.addClass( 'state-' + state ); updateTotalProgress(); }); })( jQuery ); ``` ashx文件 ``` <%@ WebHandler Language="C#" Class="Handler" %> using System; using System.Web; using System.IO; using System.Text; public class Handler : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; //指定字符集 context.Response.ContentEncoding = System.Text.Encoding.UTF8; if (context.Request["REQUEST_METHOD"] == "OPTIONS") { context.Response.End(); } SaveFile(); } /// <summary> /// 文件保存操作 /// </summary> /// <param name="basePath"></param> private void SaveFile(string basePath = "~/Upload/Images/") { var name = string.Empty; basePath = (basePath.IndexOf("~") > -1) ? System.Web.HttpContext.Current.Server.MapPath(basePath) : basePath; // basePath = FileHelper.GetUploadPath(); HttpFileCollection files = System.Web.HttpContext.Current.Request.Files; //如果目录不存在,则创建目录 if (!Directory.Exists(basePath)) { Directory.CreateDirectory(basePath); } var suffix = files[0].ContentType.Split('/'); //获取文件格式 var _suffix = suffix[1].Equals("jpeg", StringComparison.CurrentCultureIgnoreCase) ? ".jpg" : suffix[1]; var _temp = System.Web.HttpContext.Current.Request["name"]; //如果不修改文件名,则创建随机文件名 //if (!string.IsNullOrEmpty(_temp)) //{ // name = _temp; //} //else //{ Random rand = new Random(24 * (int)DateTime.Now.Ticks); name = rand.Next() + "." + _suffix; //} //文件保存 var full = basePath + name; files[0].SaveAs(full); var _result = "{\"jsonrpc\" : \"2.0\", \"result\" : null, \"Imgurl\" : \"" + name + "\"}"; System.Web.HttpContext.Current.Response.Write(_result); } public bool IsReusable { get { return false; } } } ```
php文件管理在iis环境下不正常
``` <?php require "../include/conn.php"; require "../include/function.php"; require "checkloginstate.php"; ?> <!doctype html> <html> <head> <meta charset="UTF-8"> <title>后台管理-<?php echo $config['sitename']?></title> <link rel="stylesheet" type="text/css" href="css/common.css"/> <link rel="stylesheet" type="text/css" href="css/main.css"/> <script type="text/javascript" src="js/libs/modernizr.min.js"></script> <script type="text/javascript" src="../include/jquery.min.js"></script> <script type="text/javascript" src="../include/laydate/laydate.js"></script> <script type="text/javascript" src="../include/layer/layer.js"></script> </head> <body> <?php require "top.php"; ?> <div class="container clearfix"> <?php require "left.php"; ?> <!--/sidebar--> <div class="main-wrap"> <div class="crumb-wrap"> <div class="crumb-list"><i class="icon-font"></i><a href="index.php">首页</a><span class="crumb-step">&gt;</span><a class="crumb-name" href="tool.php">常用工具</a><span class="crumb-step">&gt;</span><span>文件管理</span></div> </div> <div class="result-wrap"> <div class="result-content"> <?php /* 遍历文件夹; 功能:(a)可删除文件 (b)可编辑文本,网页文件 (c)可删除文件夹,前提是该文件夹为空 (d)可建立文件,文件夹,修改文件夹名称; lost63.com原创, 转载请注明出处. 交流QQ:35501547 */ $path="../"; $path=str_replace("/","\\",$path); //指定文件夹 $path=$path."\\"; if($_GET['folder']) { $path.=$_GET['folder']."\\"; $path=iconv("utf-8","gb2312//IGNORE",$path); } //本页面路径,下面传回时将用到; $url=$_SERVER['PHP_SELF']; //如果是文件夹,将加上链接; function folder($path,$str) { if(filetype($path.$str)=="dir") { return "<a href=\"?folder=".$_GET['folder']."\\".iconv("GBK","utf-8",$str)."\"><i class='icon-font'>&#xe009;</i> ".iconv("GBK","utf-8",$str)."</a>"; }else{ return "<i class='icon-font'>&#xe005;</i> ".iconv("GBK","utf-8",$str); } } switch($_GET['action']) { case "del"; if($_GET['type']=="file") { unlink(iconv("utf-8","gb2312//IGNORE",$_GET['path'])); }else{ deldir(iconv("utf-8","gb2312//IGNORE",$_GET['path'])); } echo "<script type=\"text/javascript\">alert('恭喜,删除成功!');location.href=\"".$url."\";</script>"; break; case "edit"; if($_GET['type']=="file") { $file=iconv("utf-8","gb2312//IGNORE",$_GET['path']); $file=fopen($file,"r"); while(!feof($file)) { $result.=fgets($file,9999); } fclose($file); echo '<form name="form1" method="post" action="?action=editsave&path='.$_GET['path'].'&type='.$_GET['type'].'"> <table width="100%" class="result-tab"> <tr> <th><strong> 编辑文件</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="'.$url.'">返回</a></th> </tr> <tr> <td>文件:'.$_GET['path'].'</td> </tr> <tr> <td><textarea name="textarea" style="width:98%;height:450px;">'.$result.'</textarea></td> </tr> <tr> <td><input class="botton-common" type="submit" name="Submit" value="提交"> <input class="botton-common" type="reset" name="Submit2" value="重置"></td> </tr> </table> </form>'; }else{ echo '<form name="form1" method="post" action="?action=dir_rename&path='.$_GET['path'].'&type='.$_GET['type'].'"> <table width="100%" class="result-tab"> <tr> <th><strong>文件夹更名</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="'.$url.'">返回</a></th> </tr> <tr> <td>文件夹更名: <input name="filename" type="text" value="'.$_GET['path'].'" size="50"></td> </tr> <tr> <td><input class="botton-common" type="submit" name="Submit" value="提交"> <input class="botton-common" type="reset" name="Submit2" value="重置"></td> </tr> </table> </form>'; } break; case "editsave"; $file=iconv("utf-8","gb2312//IGNORE",$_GET['path']); $file=fopen($file,"w"); fwrite($file,$_POST['textarea']); fclose($file); echo "<script type=\"text/javascript\">alert('恭喜,编辑成功!');location.href=\"".$url."\";</script>"; break; case "addfile"; echo '<form name="form1" method="post" action="?action=filesave&path='.$_GET['path'].'"> <table width="100%" class="result-tab"> <tr> <th><strong>新建文件</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="'.$url.'">返回</a></th> </tr> <tr> <td>文件名: <input name="filename" type="text" value="'.$_GET['path'].'" size="50"></td> </tr> <tr> <td><textarea name="textarea" style="width:98%;height:450px;">输入内容 </textarea></td> </tr> <tr> <td><input class="botton-common" type="submit" name="Submit" value="提交"> <input class="botton-common" type="reset" name="Submit2" value="重置"></td> </tr> </table> </form>'; break; case "filesave"; //包含点则建立文件,否则建立文件夹 if(strpos($_POST['filename'],".",2)){ $file=fopen(iconv("utf-8","gb2312//IGNORE",$_POST['filename']),"w"); fwrite($file,$_POST['textarea']); fclose($file); }else{ //文件夹若存在则退出,不存在则建立! if(file_exists($_POST['filename'])){ exit; }else{ mkdir(iconv("utf-8","gb2312//IGNORE",$_POST['filename'])); } } echo "<script type=\"text/javascript\">alert('恭喜,".$_POST['filename']."建立成功!');location.href=\"".$url."\";</script>"; break; case "dir_rename"; rename(iconv("utf-8","gb2312//IGNORE",$_GET['path']),iconv("utf-8","gb2312//IGNORE",$_POST['filename'])); echo "<script type=\"text/javascript\">alert('恭喜,".$_POST['filename']."更名成功!');location.href=\"".$url."\";</script>"; break; default: $s=explode("\n",trim(`dir/b $path`)); echo '<table width="100%" class="result-tab"> <tr> <td colspan="4"><a class="link-common" href="?action=addfile&path='.iconv("GBK","utf-8",$path).'"><i class="icon-font">&#xe026;</i> 建立文件</a><a class="link-common" href="'.$url.'"><i class="icon-font">&#xe010;</i> 返回上一级</a></td> </tr> <tr> <th>文件/文件夹</td> <th class="tc">文件属性</td> <th class="tc">文件大小</td> <th>操作</td> </tr>'; foreach($s as $value) { echo ' <tr> <td>'.folder($path,$value).'</td> <td class="tc">'.filetype($path.$value).'</td> <td class="tc">'.round(filesize($path.$value)/1024).'kb</td> <td class="tc"><a class="link-common" href="?action=edit&path='.iconv("GBK","utf-8",$path.'\\'.$value).'&type='.filetype($path.$value).'">编辑</a><a class="link-common" href="?action=del&path='.iconv("GBK","utf-8",$path.'\\'.$value).'&type='.filetype($path.$value).'" onClick="return confirm(\'确定删除:'.iconv("GBK","utf-8",$value).'\');">删除</a></td> </tr>'; } echo "</table>"; break; } ?> </div> </div> </div> <!--/main--> </div> </body> </html> ``` 这是我用的一个php文件管理代码,在apache环境下运行没有问题,但在iis环境下路径就出现问题,没有列出根目录下相应的文件,下面附上截图: apache环境下: ![图片说明](https://img-ask.csdn.net/upload/201610/19/1476889874_529819.jpg) iis环境下: ![图片说明](https://img-ask.csdn.net/upload/201610/19/1476889895_174286.jpg) 大家帮看一下是什么问题
dwr框架结合Spring框架不能调用DAO方法
想用dwr框架做一个不刷新页面,验证用户名存不存在的方法,但是页面始终无法实现方法,后台不报错,只是在JSP页面上弹出ERROR错误。 后台已经测试,可以正确进入对应方法CheckData,并且email也传入进去了,但就是不能调用userBiz方法。 怀疑跟Spring框架结合有错误,两次查询了Spring配置,都是正确的,请问何解? 下面贴jsp相关代码: [code="java"] /*邮箱名是否注册检查*/ function checkResult1(){ var result=null; var email = document.getElementById('email').value; if(email <= 5){ result='<span class="STYLE7">用户名必须大于5个字符</span>'; document.getElementById('result1').innerHTML=result; }else if(email > 50){ result='<span class="STYLE7">用户名必须小于50个字符</span>'; document.getElementById('result1').innerHTML=result; }else{ CheckOccupied.checkEmailOccupied(email,msg1); } } function msg1(data){ var result = null; if(data == "yes"){ result='<img src="../images/check_right.gif" alt="">'; }else if(data == "no"){ result='<span class="STYLE7">该用户名已注册,请更换用户名或<a href="#">登录</a></span>'; }else{ result='数据错误'; } document.getElementById('result1').innerHTML=result; } [/code] spring框架相关代码: [code="java"] <!-- 声明事务管理器 --> <bean id="myHibTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 基于@Transactional注解方式的事务管理 --> <tx:annotation-driven transaction-manager="myHibTransactionManager" /> <!-- 定义事务通知 --> <tx:advice id="txAdvice" transaction-manager="myHibTransactionManager"> <!-- 指定事务传播规则 --> <tx:attributes> <!-- 对get打头的方法应用SUPPORTS事务规则 --> <tx:method name="get*" propagation="SUPPORTS" /> <!-- 对其他方法应用REQUIRED事务规则 --> <tx:method name="*" propagation="REQUIRED"></tx:method> </tx:attributes> </tx:advice> <!-- 定义切面,并将事务通知和切面组合(定义哪些方法应用事务规则) --> <aop:config> <!-- 对com.tyyf.biz包下的所有类的所有方法都应用事务规则 --> <aop:pointcut id="bizMethods" expression="execution(* com.tyyf.biz.*.*(..))" /> <!-- 将事务通知和切面组合 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethods" /> </aop:config> <bean id="checkData" class="com.tyyf.dwr.CheckData" scope="prototype"> <property name="userBiz" ref="userBiz" /> </bean> [/code] java代码: [code="java"] User user = new User(); // 使用UserBiz接声明属性userBiz,并添加set方法,用于依赖注入 UserBiz userBiz; public void setUserBiz(UserBiz userBiz) { this.userBiz = userBiz; } public String checkEmailOccupied(String email) { user.setEmail(email); if (userBiz.getUser(user) != null) { return "no"; } else { return "yes"; } } [/code] dwr配置代码: [code="java"] <dwr> <allow> <create creator="new" javascript="CheckOccupied"> <param name="class" value="com.tyyf.dwr.CheckData" /> </create> </allow> </dwr> [/code]
spring3 + hibernate 4.1 配置的问题
项目用:spring MVC + spring 3.2.4 + Hibernate 4.2.6+spring security3.1.4 在启动容器时,spring security 通过hibernate去数据库加载权限时,报:No Session found for current thread异常。 异常如下: [code="java"] Caused by: org.hibernate.HibernateException: No Session found for current thread at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:990) at com.seveng.weixin.foundation.dao.support.HibernateGenericDao.getSession(HibernateGenericDao.java:58) at com.seveng.weixin.foundation.dao.support.HibernateGenericDao.getAll(HibernateGenericDao.java:85) at com.seveng.weixin.foundation.security.filter.support.WeixinInvocationSecurityMetadataSourceService.loadResourceDefine(WeixinInvocationSecurityMetadataSourceService.java:39) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:344) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:295) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:130) ... 60 more [/code] spring MVC 配置文件:spring-mvc.xml [code="xml"] <mvc:annotation-driven /> <!-- 开启controller注解支持 --> <context:component-scan base-package="com.seveng.weixin" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> [/code] spring 主配置文件: [code="xml"] <context:component-scan base-package="com.seveng.weixin"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> [/code] 事务的配置: [code="xml"] <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="create*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="merge*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED" /> <tx:method name="remove*" propagation="REQUIRED" /> <tx:method name="put*" propagation="REQUIRED" /> <tx:method name="use*" propagation="REQUIRED" /> <!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到 --> <tx:method name="get*" propagation="REQUIRED" read-only="true" /> <tx:method name="load*" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" read-only="true" /> <tx:method name="list*" propagation="REQUIRED" read-only="true" /> <tx:method name="*" read-only="true" /> </tx:attributes> </tx:advice> <aop:config proxy-target-class="true"> <!-- 对业务逻辑层实施事务 --> <aop:pointcut id="txPointcut" expression="execution(* com.seveng.weixin..service.impl.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" /> </aop:config> <aop:aspectj-autoproxy expose-proxy="true"/> <tx:annotation-driven transaction-manager="txManager" proxy-target-class="true" /> [/code] 数据库数相关配置: [code="xml"] <!-- 加载资源文件 --> <context:property-placeholder location="classpath:config/database.properties" /> <!-- 数据库映射 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${connection.driver_class}" /> <property name="url" value="${connection.url}" /> <property name="username" value="${connection.username}" /> <property name="password" value="${connection.password}" /> </bean> <!-- hibernate 需要的信息 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="packagesToScan"> <list> <value>com.seveng.weixin.**.model.*</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <prop key="hibernate.query.substitutions">${hibernate.query.substitutions}</prop> <prop key="hibernate.default_batch_fetch_size">${hibernate.default_batch_fetch_size}</prop> <prop key="hibernate.max_fetch_depth">${hibernate.max_fetch_depth}</prop> <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop> <prop key="hibernate.bytecode.use_reflection_optimizer">${hibernate.bytecode.use_reflection_optimizer}</prop> <prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop> <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop> <prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop> <prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory_class}</prop> <prop key="hibernate.cache.use_structured_entries">${hibernate.cache.use_structured_entries}</prop> <prop key="net.sf.ehcache.configurationResourceName">${net.sf.ehcache.configurationResourceName}</prop> <prop key="hibernate.current_session_context_class">${hibernate.current_session_context_class}</prop> </props> </property> </bean> [/code] spring security 相关配置: [code="xml"] <!-- 不拦截的请求 --> <security:http pattern="/login" security="none" /> <security:http pattern="/images/**" security="none" /> <security:http pattern="/css/**" security="none" /> <security:http pattern="/js/**" security="none" /> <!-- 保护应用程序的所有URL --> <security:http auto-config="true"> <!-- login-page: 指定登录页面 --> <security:form-login login-page="/login" /> <security:logout logout-success-url="/login" /> <!-- 会话管理配置 ,设置最多登录一次,二次登录会让第一次登录失效, 则设置error-if-maximum-exceeded为false,要求第一次有效设置为true --> <security:session-management invalid-session-url="/login"> <security:concurrency-control max-sessions="1" error-if-maximum-exceeded="false" /> </security:session-management> <!-- 增加一个自定义的filter,放在FILTER_SECURITY_INTERCEPTOR之前, 实现用户、角色、权限、资源的数据库管理。 --> <security:custom-filter ref="weixinFilter" before="FILTER_SECURITY_INTERCEPTOR" /> </security:http> <!-- 一个自定义的filter,必须包含authenticationManager, accessDecisionManager,securityMetadataSource三个属性。 --> <bean id="weixinFilter" class="com.seveng.weixin.foundation.security.filter.WeixinFilterSecurityInterceptor"> <property name="authenticationManager" ref="authenticationManager" /> <property name="accessDecisionManager" ref="weixinAccessDecisionManager" /> <property name="securityMetadataSource" ref="weixinInvocationSecurityMetadataSourceService" /> </bean> <!-- 注意能够为authentication-manager 设置alias别名 --> <security:authentication-manager alias="authenticationManager"> <security:authentication-provider user-service-ref="appUserDetailsService"> <security:password-encoder ref="passwordEncoder"> <security:salt-source user-property="username" /> </security:password-encoder> </security:authentication-provider> </security:authentication-manager> <!-- 事件监听:实现了 ApplicationListener监听接口,包括AuthenticationCredentialsNotFoundEvent 事件, AuthorizationFailureEvent事件,AuthorizedEvent事件, PublicInvocationEvent事件 --> <bean class="org.springframework.security.authentication.event.LoggerListener" /> <!-- 用户的密码加密或解密 --> <bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" /> <!-- 启用用户的缓存功能 --> <bean id="userCache" class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache"> <property name="cache" ref="userEhCache" /> </bean> <bean id="userEhCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> <property name="cacheName" value="userCache" /> <property name="cacheManager" ref="cacheManager" /> </bean> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" > <property name="configLocation" value="classpath:config/ehcache.xml" /> </bean> [/code] 当容器启动时,spring security加载权限的代码 [code="java"] @PostConstruct @Transactional public void loadResourceDefine() { List<Authority> authorities = this.getAll(Authority.class); // 应当是资源为key, 权限为value。 资源通常为url, 权限就是那些以ROLE_为前缀的角色。 一个资源可以由多个权限来访问。 resourceMap = new HashMap<String, Collection<ConfigAttribute>>(); for (Authority auth : authorities) { ConfigAttribute ca = new SecurityConfig(auth.getAuthName()); Set<Resource> resources = auth.getResources(); for (Resource res : resources) { String url = res.getResString(); // 判断资源文件和权限的对应关系,如果已经存在相关的资源url,则要通过该url为key提取出权限集合,将权限增加到权限集合中 if (resourceMap.containsKey(url)) { Collection<ConfigAttribute> value = resourceMap.get(url); value.add(ca); resourceMap.put(url, value); } else { Collection<ConfigAttribute> atts = new ArrayList<ConfigAttribute>(); atts.add(ca); resourceMap.put(url, atts); } } } } [/code]
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
【JSON解析】浅谈JSONObject的使用
简介 在程序开发过程中,在参数传递,函数返回值等方面,越来越多的使用JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,同时也易于机器解析和生成、易于理解、阅读和撰写,而且Json采用完全独立于语言的文本格式,这使得Json成为理想的数据交换语言。 JSON建构于两种结构: “名称/值”对的集合(A Collection of name/va...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
只因接了一个电话,程序员被骗 30 万!
今天想给大家说一个刚刚发生在我身边的一起真实的诈骗经历,我的朋友因此被骗走30万。注:为了保护当事人隐私,部分情节进行了修改。1平安夜突来的电话开始以为就像普通的诈骗一样,想办法让你把钱...
我一个37岁的程序员朋友
周末了,人一旦没有点事情干,心里就瞎想,而且跟几个老男人坐在一起,更容易瞎想,我自己现在也是 30 岁了,也是无时无刻在担心自己的职业生涯,担心丢掉工作没有收入,担心身体机能下降,担心突...
python自动下载图片
近日闲来无事,总有一种无形的力量萦绕在朕身边,让朕精神涣散,昏昏欲睡。 可是,像朕这么有职业操守的社畜怎么能在上班期间睡瞌睡呢,我不禁陷入了沉思。。。。 突然旁边的IOS同事问:‘嘿,兄弟,我发现一个网站的图片很有意思啊,能不能帮我保存下来提升我的开发灵感?’ 作为一个坚强的社畜怎么能说自己不行呢,当时朕就不假思索的答应:‘oh, It’s simple. Wait for me for a ...
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
Idea 中最常用的10款插件(提高开发效率),一定要学会使用!
学习使用一些插件,可以提高开发效率。对于我们开发人员很有帮助。这篇博客介绍了开发中使用的插件。
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
木兰编程语言,当事人最新回复来了
同行12年,不知Python是木兰,当事人回应来了
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
立即提问