`
收藏列表
标题 标签 来源
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>
Global site tag (gtag.js) - Google Analytics