- 浏览: 99713 次
- 性别:
- 来自: 济南
最新评论
收藏列表
- 全部 [14]
- 默认 [2]
- javascript [1]
- easyui [4]
- 问题解决方案 [1]
- java功能代码 [6]
- spring 3.1包详解 [1]
标题 | 标签 | 来源 | |
spring事务控制 | |||
spring事务控制 1配置文件中加上 <tx:annotation-driven transaction-manager="transactionManager"/> service中 @Transactional(readOnly=true), @Transactional(readOnly=true)在类上是类中所有的方法 都是一个数据库级别的 @Transactional(readOnly=true)在方法上是设置方法的数据库访问级别 2 <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" rollback-for="com.ecode.framework.exception.CRUDException,Exception" /> <tx:method name="create*" rollback-for="com.ecode.framework.exception.CRUDException,Exception" /> <tx:method name="copy*" rollback-for="com.ecode.framework.exception.CRUDException,Exception" /> <tx:method name="update*" rollback-for="com.ecode.framework.exception.CRUDException,Exception" /> <tx:method name="delete*" rollback-for="com.ecode.framework.exception.CRUDException,Exception" /> <tx:method name="find*" read-only="true" rollback-for="com.ecode.framework.exception.CRUDException,Exception" /> <tx:method name="list*" read-only="true" rollback-for="com.ecode.framework.exception.CRUDException,Exception" /> <tx:method name="is*" read-only="true" rollback-for="com.ecode.framework.exception.CRUDException,Exception" /> <tx:method name="*" read-only="true" rollback-for="com.ecode.framework.exception.CRUDException,Exception" /> </tx:attributes> </tx:advice> <!-- AOP代理设置 --> <aop:config> <!-- <aop:advisor pointcut="execution(* com.ecode.framework.service.*.*(..))" advice-ref="txAdvice" /> --> </aop:config> 这种定义所有的方法可以新增修改删除功能的名字 必须以xxx开头 service方法数据库事物级别是和方法名字关联定义好的 |
|||
Spring 3.1包详解 | spring 3.1包详解 | ||
Spring 3.1包详解 Spring 3.1与之前的 2.X 的不一样,新版本把原来的包分解了,功能分工明确: org.springframework.aop-3.1.0.M1.jar ---- ----spring 的面向切面编程,提供AOP(面向切面编程)实现, org.springframework.asm-3.1.0.M1.jar ---- ----spring 独立的asm 程序,相比2.5版本,需要额外的asm.jar包。 org.springframework.aspects-3.1.0.M1.jar ---- ----spring 提供对 AspectJ 框架的整合。 org.springframework.beans-3.1.0.M1.jar ---- ----springIoC(依赖注入)的基础实现。 org.springframework.context.support-3.1.0.M1.jar ---- ----spring-context 的扩展支持,用于 MVC 方面。 org.springframework.context-3.1.0.M1.jar ---- ----spring 提供在基础 IoC 功能上的扩展服务,此外还提供许多企业级服务的支持,如 邮件服务、任务调度、JNDI定位、EJB 集成、远程访问、 缓存以及各种视图层框架的封装等。 org.springframework.core-3.1.0.M1.jar ---- ----spring3.1的核心工具包。 org.springframework.expression-3.1.0.M1.jar ---- ----spring 表达式语言。 org.springframework.instrument.tomcat-3.1.0.M1.jar ---- ----spring3.1 对 Tomcat 的连接池的基成。 org.springframework.instrument-3.1.0.M1.jar ---- ----spring3.1 对服务器的代理接口。 org.springframework.jdbc-3.1.0.M1.jar ---- ----spring对 JDBC的简单封装。 org.springframework.jms-3.1.0.M1.jar ---- ----spring为简化 JMS API 使用而作的简单封装。 org.springframework.orm-3.1.0.M1.jar ---- ----spring 整合第三方的 ORM 映射支持,如 Hibernate 、Ibatis、Jdo 以及spring的JPA的支持。 org.springframework.oxm-3.1.0.M1.jar ---- ----spring 对Object/XMI 的映射的支持,可以让JAVA与XML之间来回切换。 org.springframework.test-3.1.0.M1.jar ---- ----spring 对Junit 等测试框架的简单封装。 org.springframework.transaction-3.1.0.M1.jar ---- ----为JDBC、Hibernate、JDO、JPA 等提供的一致的声明式和编程式事务管理。 org.springframework.web.portlet-3.1.0.M1.jar ---- ----springMVC 的增强。 org.springframework.web.servlet-3.1.0.M1.jar ---- ----对 J2EE6.0 Servlet3.0 的支持。 org.springframework.web.struts-3.1.0.M1.jar ---- ---- 整合 Struts 的支持。 org.springframework.web-3.1.0.M1.jar ---- ----springWeb 下的工具包。 |
|||
屏蔽键盘事件 | |||
function KeyDown() { //屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 /*alert("ASCII代码是:"+event.keyCode); */ if ((window.event.altKey) && ((window.event.keyCode == 37) || //屏蔽 Alt+ 方向键 ← (window.event.keyCode == 39))) { //屏蔽 Alt+ 方向键 → event.returnValue = false; } if ((event.keyCode == 8) || //屏蔽退格删除键 (event.keyCode == 116) || //屏蔽 F5 刷新键 (event.keyCode == 112) || //屏蔽 F1 刷新键 (event.ctrlKey && event.keyCode == 82)) { //Ctrl + R event.keyCode = 0; event.returnValue = false; } if ((event.ctrlKey) && (event.keyCode == 78)) //屏蔽 Ctrl+n { alert("ctrl + n"); event.returnValue = false; } if ((event.shiftKey) && (event.keyCode == 121)) //屏蔽 shift+F10 { event.returnValue = false; } if (window.event.srcElement.tagName == "A" && window.event.shiftKey) { window.event.returnValue = false; //屏蔽 shift 加鼠标左键新开一网页 } if (window.event.keyCode == 123 || window.event.keyCode == 122) { return false; } if ((window.event.altKey) && (window.event.keyCode == 115)) { //屏蔽Alt+F4 //window.showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px"); return false; } } document.onkeydown = KeyDown |
|||
JQueryEasyUi分页条 | easyui | ||
屏蔽分页条上的刷新按钮 $('#userTable').datagrid('getPager').pagination({showRefresh:false}); 刷新触发的事件 $('#userTable').datagrid('getPager').pagination({onRefresh:function(){ alert('dsfds'); }}); |
|||
EasyUi Tree 后台实现代码 | easyui, java功能代码 | ||
这个拼接树的方法是一次查询,然后拼接所有的树的节点信息,适用于数据量不太大的树,如菜单。 如果树的节点较多,且树的深度比较深的话,建议用异步加载模式 下边是一次查询拼接JQueryEasyUi树的方法 /** * 获取easyui树 * 账号Id * @author 庞维新 * 2012年7月2日20:53:39 * QQ 522264911 * @param accountId * @return * @throws CRUDException */ public JSONArray findAccountMoudles(String accountId) throws CRUDException { //要返回的Jsonarry JSONArray jsonArray=new JSONArray(); //获取登陆账号拥有的菜单信息 List<Module> moduleList = moduleMapper.findModuleByAccount(accountId); for (Module rootmodule : moduleList) { //获得根节点 if(rootmodule.getParentModule().getId().equals(StringConstant.ROOT_ID)){ JSONObject jsonObject=getChild(rootmodule,moduleList); jsonArray.add(jsonObject); } } return jsonArray; } /** * * @param module * @param moduleList * @return */ private JSONObject getChild(Module module, List<Module> moduleList) { JSONObject jsonObject=new JSONObject(); jsonObject.put("id", module.getId()); jsonObject.put("iconcls", ""); jsonObject.put("seq", module.getSequence()); Map<String, Object> attributes = new HashMap<String, Object>(); attributes.put("src", module.getUrl()); jsonObject.put("attributes",attributes); jsonObject.put("text", module.getName()); JSONArray childJsonArray=new JSONArray(); for (Module mod : moduleList) { if(mod.getParentModule().getId().equals(module.getId())){ childJsonArray.add(getChild(mod,moduleList)); } } if(!childJsonArray.isEmpty()){ jsonObject.put("state","closed"); jsonObject.put("children", childJsonArray); } return jsonObject; } |
|||
Js四则运算 | javascript | ||
//除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。 //调用:accDiv(arg1,arg2) //返回值:arg1除以arg2的精确结果 function accDiv(arg1,arg2){ var t1=0,t2=0,r1,r2; try{t1=arg1.toString().split(".")[1].length}catch(e){} try{t2=arg2.toString().split(".")[1].length}catch(e){} with(Math){ r1=Number(arg1.toString().replace(".","")); r2=Number(arg2.toString().replace(".","")); return (r1/r2)*pow(10,t2-t1); } } //给Number类型增加一个div方法,调用起来更加方便。 Number.prototype.div = function (arg){ return accDiv(this, arg); }; //乘法函数,用来得到精确的乘法结果 //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。 //调用:accMul(arg1,arg2) //返回值:arg1乘以arg2的精确结果 function accMul(arg1,arg2) { var m=0,s1=arg1.toString(),s2=arg2.toString(); try{m+=s1.split(".")[1].length}catch(e){} try{m+=s2.split(".")[1].length}catch(e){} return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m); } //给Number类型增加一个mul方法,调用起来更加方便。 Number.prototype.mul = function (arg){ return accMul(arg, this); }; //加法函数,用来得到精确的加法结果 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 //调用:accAdd(arg1,arg2) //返回值:arg1加上arg2的精确结果 function accAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split(".")[1].length;}catch(e){r1=0;} try{r2=arg2.toString().split(".")[1].length;}catch(e){r2=0;} m=Math.pow(10,Math.max(r1,r2)); return (arg1*m+arg2*m)/m; } //给Number类型增加一个add方法,调用起来更加方便。 Number.prototype.add = function (arg){ return accAdd(arg,this); }; //减法函数 function accSub(arg1,arg2){ var r1,r2,m,n; try{ r1=arg1.toString().split(".")[1].length; }catch(e){ r1=0; } try{ r2=arg2.toString().split(".")[1].length; }catch(e){ r2=0; } m=Math.pow(10,Math.max(r1,r2)); //last modify by deeka //动态控制精度长度 n=(r1>=r2)?r1:r2; return ((arg2*m-arg1*m)/m).toFixed(n); } ///给number类增加一个sub方法,调用起来更加方便 Number.prototype.sub = function (arg){ return accSub(arg,this); }; |
|||
扩展easyui datagrid的两个方法.动态添加和删除toolbar的项 | easyui | 扩展easyui datagrid的两个方法.动态添加和删除toolbar的项 | |
$.extend($.fn.datagrid.methods, { addToolbarItem: function(jq, items){ return jq.each(function(){ var toolbar = $(this).parent().prev("div.datagrid-toolbar"); for(var i = 0;i<items.length;i++){ var item = items[i]; if(item === "-"){ toolbar.append('<div class="datagrid-btn-separator"></div>'); }else{ var btn=$("<a href=\"javascript:void(0)\"></a>"); btn[0].onclick=eval(item.handler||function(){}); btn.css("float","left").appendTo(toolbar).linkbutton($.extend({},item,{plain:true})); } } toolbar = null; }); }, removeToolbarItem: function(jq, param){ return jq.each(function(){ var btns = $(this).parent().prev("div.datagrid-toolbar").children("a"); var cbtn = null; if(typeof param == "number"){ cbtn = btns.eq(param); }else if(typeof param == "string"){ var text = null; btns.each(function(){ text = $(this).data().linkbutton.options.text; if(text == param){ cbtn = $(this); text = null; return; } }); } if(cbtn){ var prev = cbtn.prev()[0]; var next = cbtn.next()[0]; if(prev && next && prev.nodeName == "DIV" && prev.nodeName == next.nodeName){ $(prev).remove(); }else if(next && next.nodeName == "DIV"){ $(next).remove(); }else if(prev && prev.nodeName == "DIV"){ $(prev).remove(); } cbtn.remove(); cbtn= null; } }); } }); 用法: $('#tt').datagrid("addToolbarItem",[{"text":"xxx"},"-",{"text":"xxxsss","iconCls":"icon-ok"}]) $('#tt').datagrid("removeToolbarItem","GetChanges")//根据btn的text删除 $('#tt').datagrid("removeToolbarItem",0)//根据下标删除 |
|||
EasyUI行编辑时编辑行不同的格式书写方法 | easyui | ||
一 下拉菜单式 (combobox,combotree) 1 (combobox)对于那些固定下拉框中数据的editor属性写法如下: 首先在script中创建那些我们下拉框中的数据 var sexs=[ {sexid:'0',name:'男'}, {sexid:'1',name:'女'}, {sexid:'2',name:'未知性别'}, {sexid:'3',name:'未说明'} ]; 当然这块信息也可以直接写到下班的data之后, 然后在datagrid中的columns要进行编辑的字段中的editor属性写法如下: editor:{ type:"combobox", options:{ valueField:'sexid',//后台中的数据 textField:'name',//显示的文本 panelHeight : 'auto',//面板高度 data:sexs, required:true } } 2(combotree) 对于那些下拉框中数据不是固定的,是在数据库中查询到的editor属性写法如下: editor:{ type : 'combotree', options : { url : 'your url', animate : true, onLoadSuccess : function(node, data) { var t = $(this); if (data) { $(data).each(function(index, d) { if (this.state == 'closed') { t.tree('expandAll'); } }); } }, required : true } } 二 文本框式 editor:{ type : 'validatebox', options : { required : true //是否必填项 } } |
|||
java 文件下载 | java功能代码 | ||
/** * @author Java_pang * @param response * @param request * @throws IOException * QQ:522264911 * time:2012年6月28日 */ public void download(HttpServletResponse response, HttpServletRequest request) throws IOException { // 输出流 OutputStream os = null; // 输入流 FileInputStream in = null; try { // 要下载文件的名称 String fileName = "upload.doc"; // 构建服务器端的文件路径 String logoPathDir = "/upload/img"; // 得到文件所在目录的真实路径 String logoRealPathDir = request.getSession().getServletContext() .getRealPath(logoPathDir); // 要下载文件的路径 String filedownload = logoRealPathDir + fileName; // 是对参数中的中文参数经行编码的,可以解决乱码的问题。 fileName = URLEncoder.encode(fileName, "utf-8"); // 清除首部的空白行 response.reset(); response.addHeader("Content-Disposition", "attachment; filename=" + fileName); response.setContentType("application/octet-stream;charset=UTF-8"); os = response.getOutputStream(); in = new FileInputStream(filedownload); byte[] b = new byte[1024]; int i = 0; while ((i = in.read(b)) > 0) { os.write(b, 0, i); } os.flush(); } catch (Exception e) { System.out.println(e.toString()); } finally { if (in != null) { in.close(); in = null; } if (os != null) { os.close(); os = null; } } } /** * @author Java_pang * @param path * @param response * @return * QQ:522264911 * time:2012年6月28日 */ public HttpServletResponse download(String path, HttpServletResponse response) { try { // path是指欲下载的文件的路径。 File file = new File(path); // 取得文件名。 String filename = file.getName(); // 取得文件的后缀名。 String ext = filename.substring(filename.lastIndexOf(".") + 1) .toUpperCase(); // 以流的形式下载文件。 InputStream fis = new BufferedInputStream(new FileInputStream(path)); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); // 清空response response.reset(); // 设置response的Header response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes())); response.addHeader("Content-Length", "" + file.length()); OutputStream toClient = new BufferedOutputStream( response.getOutputStream()); response.setContentType("application/octet-stream"); toClient.write(buffer); toClient.flush(); toClient.close(); } catch (IOException ex) { ex.printStackTrace(); } return response; } public void downloadLocal(HttpServletResponse response) throws FileNotFoundException { // 下载本地文件 String fileName = "Operator.doc".toString(); // 文件的默认保存名 // 读到流中 InputStream inStream = new FileInputStream("c:/Operator.doc");// 文件的存放路径 // 设置输出的格式 response.reset(); response.setContentType("bin"); response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); // 循环取出流中的数据 byte[] b = new byte[100]; int len; try { while ((len = inStream.read(b)) > 0) response.getOutputStream().write(b, 0, len); inStream.close(); } catch (IOException e) { e.printStackTrace(); } } public void downloadNet(HttpServletResponse response) throws MalformedURLException { // 下载网络文件 int bytesum = 0; int byteread = 0; URL url = new URL("windine.blogdriver.com/logo.gif"); try { URLConnection conn = url.openConnection(); InputStream inStream = conn.getInputStream(); FileOutputStream fs = new FileOutputStream("c:/abc.gif"); byte[] buffer = new byte[1204]; int length; while ((byteread = inStream.read(buffer)) != -1) { bytesum += byteread; System.out.println(bytesum); fs.write(buffer, 0, byteread); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // 支持在线打开文件的一种方式 public void downLoad(String filePath, HttpServletResponse response, boolean isOnLine) throws Exception { File f = new File(filePath); if (!f.exists()) { response.sendError(404, "File not found!"); return; } BufferedInputStream br = new BufferedInputStream(new FileInputStream(f)); byte[] buf = new byte[1024]; int len = 0; response.reset(); // 非常重要 if (isOnLine) { // 在线打开方式 URL u = new URL("file:///" + filePath); response.setContentType(u.openConnection().getContentType()); response.setHeader("Content-Disposition", "inline; filename=" + f.getName()); // 文件名应该编码成UTF-8 } else { // 纯下载方式 response.setContentType("application/x-msdownload"); response.setHeader("Content-Disposition", "attachment; filename=" + f.getName()); } OutputStream out = response.getOutputStream(); while ((len = br.read(buf)) > 0) out.write(buf, 0, len); br.close(); out.close(); } |
|||
Java文件上传 | java功能代码 | ||
/** * 删除文件 * @author Java_pang * @param path * 时间 2012年6月28日22:05:20 * QQ 522264911 */ publicString uploadMutlFile (HttpServletRequest request,@RequestParam MultipartFilefileInput,String type) throws Exception, Exception { //构建图片保存的目录 String logoPathDir = "/upload/img"; //得到图片保存目录的真实路径 String logoRealPathDir =request.getSession().getServletContext().getRealPath(logoPathDir); //根据真实路径创建目录 File logoSaveFile = new File(logoRealPathDir); if(!logoSaveFile.exists()) logoSaveFile.mkdirs(); // 获得文件名: String originalFileName = fileInput.getOriginalFilename(); //获取文件的后缀 String suffix = originalFileName.substring(originalFileName.lastIndexOf(".")); //获取文件的名称 StringdestFileName=originalFileName.substring(0,originalFileName.indexOf(".")); //构建文件名称 String logImageName = UUID.randomUUID().toString()+ suffix; /**拼成完整的文件保存路径加文件**/ String fileName = logoRealPathDir + File.separator + logImageName; //获取照片上传相对于项目的路径 String url= fileName.substring(fileName.indexOf("项目名称")-1); url=StringUtils.cleanPath(url); File file = new File(fileName); fileInput.transferTo(file); return "uploadPtotos"; } |
|||
Java文件上传(多文件上传) | java功能代码 | ||
/** * 多文件上传 * @author Java_pang * @param path * 时间 2012年6月28日22:05:20 * QQ 522264911 */ public String uploadMutlFile(HttpServletRequest request) { StringrealFileName =""; StringfileuploadPath=""; StringdestFileName=""; try{ //转型为MultipartHttpRequest MultipartHttpServletRequestmultipartRequest = (MultipartHttpServletRequest) request; //根据前台的name名称得到上传的文件 List<MultipartFile>files = multipartRequest.getFiles("file"); for(MultipartFile file : files) { //获得文件名: realFileName= file.getOriginalFilename(); //构建图片保存的目录 String logoPathDir ="/upload"; //得到图片保存目录的真实路径 String ctxPath =request.getSession().getServletContext().getRealPath(logoPathDir)+"\\"+"img\\"; fileuploadPath= ctxPath; fileuploadPath=StringUtils.cleanPath(fileuploadPath); //创建文件 FiledirPath = new File(fileuploadPath); if(!dirPath.exists()) { dirPath.mkdir(); } destFileName=Util.getUUID()+realFileName.substring(realFileName.indexOf("."),realFileName.length()); FileuploadFile = new File(fileuploadPath + destFileName); file.transferTo(uploadFile); // FileCopyUtils.copy(file.getBytes(),uploadFile); } }catch (Exception e) { e.printStackTrace(); } return fileuploadPath + destFileName; } |
|||
Java文件上传(单文件上传) | java功能代码 | ||
/** *文件上传(单文件上传) * @author Java_pang * @param path * 时间 2012年6月28日22:05:20 * QQ 522264911 */ public Stringupload(HttpServletRequest request) throws CRUDException { StringrealFileName = ""; try{ //转型为MultipartHttpRequest MultipartHttpServletRequestmultipartRequest = (MultipartHttpServletRequest) request; //根据前台的name名称得到上传的文件 MultipartFilefile = multipartRequest.getFile("file"); //获得文件名: realFileName= file.getOriginalFilename(); //获取路径 StringctxPath = request.getSession().getServletContext().getRealPath("/") +"temp\\"; StringfileuploadPath = ctxPath; //创建文件 FiledirPath = new File(fileuploadPath); if(!dirPath.exists()) { dirPath.mkdir(); } FileuploadFile = new File(fileuploadPath + realFileName); FileCopyUtils.copy(file.getBytes(),uploadFile); }catch (Exception e) { e.printStackTrace(); } returnrealFileName; } |
|||
java删除文件的方法 | java功能代码 | ||
/** * 删除文件 * @author Java_pang * @param path * 时间 2012年6月28日22:05:20 * QQ 522264911 */ public void deleteFile(String path){ File file=new File(path); List<File> fileList = new ArrayList<File>(); delete(file,fileList);//删掉文件 for(int i = fileList.size()-1 ; i >=0 ;i--){ fileList.get(i).delete();//删除文件夹 } } private void delete(File file, List<File> fileList) { if(file.isDirectory()){ fileList.add(file); if(file.listFiles().length>0){ for (File fi :file.listFiles()) { if(fi.isDirectory()){ delete(fi,fileList); }else{ fi.delete(); } } }else{ file.delete(); } }else{ file.delete(); } } |
|||
spring mvc中关于 Session过期的解决方法 | 问题解决方案 | ||
java关于session过期的解决方案 在web系统中,当session过期时,当用户操作的时候,此时系统一般会返回登陆界面。 让用户重新输入用户名和密码。 我们只需要在拦截器(拦截器的配置是在dispatcher-servlet.xml中写如下代码: <mvc:interceptors> <bean class="com.ecode.land.web.interceptor.AuthorityInterceptor"/> </mvc:interceptors> )中做相应的判断session是否不是null即可。 方法:重写HandlerInterceptorAdapter类中的preHandle()(登录之前的请求)方法 一 新建拦截器类AuthorityInterceptor 在路径com.ecode.land.web.interceptor(路径和dispatcher-servlet.xml文件中配置拦截器路径要一致)中新建AuthorityInterceptor的类,该类继承了HandlerInterceptorAdapter(需要引入spring-web-servlet-3.0.5.RELEASE.jar)类。 然后在AuthorityInterceptor类中重写HandlerInterceptorAdapter中的方法 HandlerInterceptorAdapter中的方法有三个 preHandle() 页面跳转请求之前的方法 postHandle() 页面跳转请求中的方法 afterCompletion() 页面跳转请求之后的方法 二 我们要在 页面跳转请求之前的方法中做session是否为空的判断 1首先我们判断页面是不是第一次登录,如果是第一次登录则不需要判断session是否为空,我们直接跳转到请求页面即可。 判断第一次登录的一种代码如下: !(request.getRequestURL().toString()).contains("login") 即判断请求路径URL中是否包含login字符串 2如果页面跳转请求不是第一次登录时候的请求,而是登陆之后的页面跳转请求,这时我们需要判断session是否过期,如果session已经过期,我们就要跳转到登录界面,这时我们请求转发到登录界面,拦截器中相关代码是 request.getRequestDispatcher("/view/login.jsp").forward(request,response); 这时候我们就实现了跳转到登录界面。 但这时候还有个问题,跳转之后的登录页面加载到了main.jsp页面中请求页面的iframe中了,这时登录页面本身不是父页面,但是我们应该设置登录页面为父页面。解决这个问题的方案如下: 我们通过request向登录页面中传送一个标志,页面接受到这个标志的时候实现父页面的刷新操作 拦截器类中添加代码如下request.setAttribute("flag", "ready"); 登陆页面上login.jsp中添加如下js代码。 <script type="text/javascript"> if("${requestScope.flag}"!='') top.location="<%=path%>/view/login.jsp"; </script> |