获取当前项目的URL

有一个定时器 需要每天定时访问该项目的一个链接,从而实现发送邮件提醒的功能 ,

但是不能new一个 HttpServletRequest new一个之后定时器失效, init方法中需要获得URL, 下面是代码 你懂的。

package com.lawstar.mod.timer.serv;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.lawstar.mod.timer.timers.AlarmClock;
import com.lawstar.mod.timer.timers.LoadTimerConfig;
import com.lawstar.mod.timer.timers.PerTimer;
import com.lawstar.mod.timer.timers.TimerPojo;

/**
*@author 鸭梨 E-MAIL:togetyou@gmail.com
*date and time:Oct 13, 2009 5:53:02 PM
*comp:law-star
*/
public class StartTimerServ extends HttpServlet implements ServletContextListener{

/**
 * 销毁定时器
 */
public void contextDestroyed(ServletContextEvent sce) {
    System.out.println("des the timer");
    List<com.lawstar.mod.timer.timers.AlarmClock>  listCL = (List)sce.getServletContext().getAttribute("timerList") ;
    System.out.println("listcl:"+listCL.size());
    for(Iterator<AlarmClock> it = listCL.iterator() ;it.hasNext();){
        AlarmClock al = it.next() ;
        al.cancel() ;
        System.out.println("---销毁定时器---"+al.getName());
    }

    List<PerTimer> listPer = (List)sce.getServletContext().getAttribute("perList") ;
    System.out.println("listPer:"+listPer.size());
    for(Iterator<PerTimer> it = listPer.iterator() ;it.hasNext();){
        PerTimer al = it.next() ;
        al.cancel() ;
        System.out.println("---销毁定时器---"+al.getName());
    }
}
public void contextInitialized(ServletContextEvent sce) {
    //  什么也不干
}

// 每天执行的定时器的列表

private List timerList = new ArrayList();
// 间隔定时器列表

private List perList = new ArrayList();

public StartTimerServ() {
    super();
}

/**
 * Destruction of the servlet. <br>
 */
public void destroy() {
    super.destroy(); // Just puts "destroy" string in log
    // Put your code here
}

/**
 * The doGet method of the servlet. <br>
 *
 * This method is called when a form has its tag value method equals to get.
 * 
 * @param request the request send by the client to the server
 * @param response the response send by the server to the client
 * @throws ServletException if an error occurred
 * @throws IOException if an error occurred
 */
public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
    out.println("<HTML>");
    out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
    out.println("  <BODY>");
    out.print("    This is ");
    out.print(this.getClass());
    out.println(", using the GET method  do nothing");
    out.println("  </BODY>");
    out.println("</HTML>");
    out.flush();
    out.close();
}

/**
 * The doPost method of the servlet. <br>
 *
 * This method is called when a form has its tag value method equals to post.
 * 
 * @param request the request send by the client to the server
 * @param response the response send by the server to the client
 * @throws ServletException if an error occurred
 * @throws IOException if an error occurred
 */
public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out
            .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
    out.println("<HTML>");
    out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
    out.println("  <BODY>");
    out.print("    This is ");
    out.print(this.getClass());
    out.println(", using the POST method do nothing");
    out.println("  </BODY>");
    out.println("</HTML>");
    out.flush();
    out.close();
}

/**
 * servlet 初始化 启动定时器
 */
public void init() throws ServletException {
      LoadTimerConfig ltc = new LoadTimerConfig();
      List<TimerPojo> ltList =  ltc.getTimerList("timer.xml") ;
      System.out.println(ltList.size()) ;
      TimerPojo tpo = null ;
      String type = "" ;
      for(int i=0;i<ltList.size();i++) {
          tpo = ltList.get(i) ;
          type = tpo.getType() ;
          if("range".equals(type)) {
              PerTimer ptm = new PerTimer(tpo.getName()) ;
              ptm.setUrlList(tpo.getUrlList()) ;
              ptm.runTask(tpo.getRange());
              perList.add(ptm) ;
          }
          else if("eday".equals(type)) {
              AlarmClock alm = new AlarmClock(tpo.getHour(),tpo.getMinute(),tpo.getSec(),tpo.getName()) ;
              alm.setUrlList(tpo.getUrlList()) ;
              alm.start() ;
              timerList.add(alm) ;
          }
      }
      this.getServletContext().setAttribute("perList", perList) ;
      this.getServletContext().setAttribute("timerList", timerList) ;

}

}

1个回答

在Servlet里面我可以获取到application (不用new) request没琢磨出来 但是我给你找了一个很好的文章 希望对你有帮助
[url]http://haofeng82.iteye.com/blog/456323[/url]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Android WebView如何像抓包那样可以拦截该页面的所有请求返回的response信息?
项目中有个需求是在Android端用webview打开一个页面,该如何像抓包那样获取到该页面向后台发送请求时的response信息,我知道在PC浏览器按F12可以看到所有的信息,里面可以看到请求的headers和response等等信息,在webview.setWebViewClient里有一个回调函数public void onLoadResource(WebView view, String url),这个回调时是该页面每此有新的请求需要更新当前界面时调用的,里面的参数url就是当前的请求,我尝试用这个url调用自己的请求方法试图获取response时拿到的数据包已经和实时获取的数据包不一样了,我估计是因为在触发这个回调时请求已经发送成功并且收到了返回值,由于请求里带有sid之类的标识,我再拿同样的请求来取数据是拿到的无效的数据,那要怎么像抓包一样拦截该页面的所有HTTP请求返回的信息呢?求大神 急急急!!!
怎样实时获取IE活动页面的句柄? 32位windows
项目要实现一个后台程序,监听IE浏览器有没有浏览特定页面 如果发现了特定页面加载,立刻弹出用户界面做一些操作可以代填用户名密码 用的方法是WM HTML GETOBJECT这个,获取IWebBrowser2接口进而监听 DWebEven2 事件,获取DocumentCompelete比对URL 现在已经把代填这部分搞定了,但是怎么才能实时监听IE当前活动页呢? 因为网页打开了可能有好几个标签, 能想到的方法都试过了: 1 最粗暴的就是开个线程不断的findwindow("IEFRAME")找Internet Explorer Server 2 用钩子监听SETFOCUS键盘焦点事件,有焦点,有IEFRAME然后执行 这个方法发现IE有个保护模式,钩子挂不上 请问有什么办法,能获取IE的活动页面?
前台传图片url到数据库,再次读取到前台图片不显示
@RequestMapping(value = "/uploadPic.action") @ResponseBody public Response uploadPic(@RequestParam("picture") MultipartFile picture , HttpServletRequest request) { Response response = new Response(); //获取文件在服务器的储存位置 String path = "D:/img"; File filePath = new File(path); System.out.println("文件的保存路径:" + path); if (!filePath.exists() && !filePath.isDirectory()) { System.out.println("目录不存在,创建目录:" + filePath); filePath.mkdir(); } //获取原始文件名称(包含格式) String originalFileName = picture.getOriginalFilename(); System.out.println("原始文件名称:" + originalFileName); //获取文件类型,以最后一个`.`为标识 String type = originalFileName.substring(originalFileName.lastIndexOf(".") + 1); System.out.println("文件类型:" + type); //获取文件名称(不包含格式) String name = originalFileName.substring(0, originalFileName.lastIndexOf(".")); //设置文件新名称: 当前时间+文件名称(不包含格式) Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String date = sdf.format(d); String fileName = date + name + "." + type; System.out.println("新文件名称:" + fileName); //项目url,这里可以使用常量或者去数据字典获取相应的url前缀; String fileUrl="http://localhost:8080"; //文件获取路径 fileUrl = fileUrl + request.getContextPath() + "/img/" + fileName; //在指定路径下创建一个文件 File targetFile = new File(path, fileName); //将文件保存到服务器指定位置 try { picture.transferTo(targetFile); System.out.println("上传成功"); //将文件在服务器的存储路径返回 response.setResult(fileUrl); } catch (IOException e) { e.printStackTrace(); response.setResult("上传失败"); } return response; } 后台
如何得到当前运行的action中运行的方法的名字呢?
例如:程序执行时调用了com.weberyb.bbs.action这个包中的UserAction这个类中的getList这个方法,请问有什么办法拿到这个方法的名字吗? [b]问题补充:[/b] 用反射的话只能拿指定的方法名,不过我想要的是方法名是action执行时从struts.xml的配置文件中动态解析出来的方法名; 例如:userAction 中有很多方法,在action执行时struts根据 <action name="reg" class="userAction" method="reg">解析出要用的方法是reg这个方法,那如果用Class c= Class.forname(classname)得到的只是userAction这个类,并不知道需要调用的具体的方法名,我想做成一个通用的类,当action执行的时候就动态的知道调用的是哪个类中的哪个方法,那请问要如何实现呢?难道要去动态解析xml文件吗?那用反射去获得类好像就没有什么意义了 8) [b]问题补充:[/b] 请问lovewhzlq那还有什么办法去实现动态拿方法名这个做法吗? [b]问题补充:[/b] whistler兄弟可能误解我的意思了,我的项目是用ssh做的,用的struts2做的mvc,不是struts。不过你说所说的的确是解决问题的办法,不过我的项目写的都很多了,要来改成这样的写法太麻烦,刚刚想了下,于是直接用 ServletActionContext.getRequest().getServletPath()这个方法得到了action请求的url,在用正则表达式匹配出×××.action来解决了这个问题
extjs如何控制左侧菜单默认不打开,现在项目进去后默认打开第一个,下面是我的js代码
``` Ext.namespace('Ext.app.frame'); Ext.app.frame.LeftPanel = Ext.extend(Ext.Panel, { //初始化加载的菜单ID welcomeMenuId : customInfo['defaultTopMenuId'], //项目路径 context : customInfo['context'], //构造方法 constructor : function(_cfg) { Ext.apply(this, _cfg); }, wizCount :0, readyCount :0, //初始化 initialize:function(_cfg){ //生成左侧面板 Ext.app.frame.LeftPanel.superclass.constructor.call(this, { id : 'accordion-panel', iconCls : 'icon-nav', layout : 'accordion', region : 'west', margins : '10 10 2 2', width : 220, bodyStyle : 'background-color:#DFE8F6', collapsible : true, split : false, layoutConfig : { animate : true } }); //左侧面板首次设置内容 var welcomeMenu = {menuId:this.welcomeMenuId, text:customInfo['defaultTopMenuName']}; this.setContent(welcomeMenu); }, //设置面板内容(主要方法) setContent:function(currMenu){ var aim = Ext.getCmp('accordion-panel'); var currScope = this; aim.removeAll(true); if(currMenu!=undefined && currMenu.menuId!=undefined){ var _temptitle = currMenu.text || ""; aim.setTitle(_temptitle); //添加扩展,如果菜单配置URL为IFM:开头的话, 表示为做菜单是扩展的菜单,嵌入IFRAME显示URL var _tempURL = currMenu.menuURL|| ""; if(_tempURL!=""){ aim.body.update(""); } if(_tempURL.indexOf("IFM:")>-1){ _tempURL = _tempURL.substring(4); aim.body.update("<IFRAME width=\"100%\" height=\"100%\" FRAMEBORDER=0 SCROLLING=auto SRC='"+_tempURL+"'></IFRAME>"); if(currScope.ownerCt.menuBar){ currScope.ownerCt.menuBar.enableAllButtons(); } return; } var requesturl = this.context+'/menu!topLeft.lxd?menuId='+currMenu.menuId; Ext.Ajax.request({ url: requesturl, success: function(response) { //获取响应的json字符 json = Ext.decode(response.responseText); if(json!=undefined && json.length!=undefined){ currScope.wizCount = json.length; currScope.readyCount = 0; for(var i=0;i<json.length;i++){ var left = json[i]; var title = left.text; var id = left.id; var url; if(left.menuUrl!=undefined){ url=left.menuUrl.substring(0,4)=="IFM:"?left.menuUrl.substring(4):left.menuUrl; } var target = left.urltarget; var panel; if(url && target=="leftFrame"){ if(url.substring(0,4)!="http"){ url = customInfo['context']+"/"+url; } panel = new Ext.Panel({ id : id, title : title, layout: 'fit', border: false, iconCls : 'icon-nav', items : [ new Ext.ux.IFrameComponent({ id: 'menu_iframe_'+id, url: url }) ] }); }else{ panel = new Ext.app.frame.WizardPanel({ id : id, title : title, group : 'group', checked : 'checked', dataUrl : '/menu!downLeft.lxd?menuId=' + id }); } aim.add(panel); aim.doLayout(); currScope.readyCount++; if(currScope.readyCount == currScope.wizCount){ if(currScope.ownerCt.menuBar){ currScope.ownerCt.menuBar.enableAllButtons(); } } } }else{ Ext.Msg.alert('错误','读取菜单错误!'); if(currScope.ownerCt.menuBar){ currScope.ownerCt.menuBar.enableAllButtons(); } } }, failure: function(){ Ext.Msg.alert('错误','连接服务器超时!'); if(currScope.ownerCt.menuBar){ currScope.ownerCt.menuBar.enableAllButtons(); } } }); } } }); Ext.app.frame.WizardPanel = Ext.extend(Ext.Panel, { context : customInfo['context'], iconCls : 'icon-nav', border : false, rootVisible : false, autoScroll : true, dataUrl : null, //buttons : {}, tree : null, constructor : function(_cfg) { Ext.apply(this, _cfg); var _tree = new Ext.tree.TreePanel({ iconCls : 'icon-nav', border : false, rootVisible : false, loader : new Ext.tree.TreeLoader({ // dataUrl : context + // '/jsonTree!wizardJson.lxd' dataUrl : this.context + this.dataUrl }), style : { padding : 3 }, root : new Ext.tree.AsyncTreeNode({ text : _cfg.title || this.title, // , // children : _cfg.childrens || null expanded : false }), listeners : { 'click' : function(n) { try { if (n.leaf) { if(n.attributes.urltarget=='_blank'){ var openURL = n.attributes.menuUrl; if(openURL.substring(0,4)!="http"){ openURL = customInfo['context']+"/"+openURL; } window.open(openURL); }else{ this.onNodeClick(n.id, n.text,n.attributes.menuUrl); } }else{ if(n.attributes.menuUrl){ if(n.attributes.urltarget=='_blank'){ var openURL = n.attributes.menuUrl; if(openURL.substring(0,4)!="http"){ openURL = encodeURI(customInfo['context']+"/"+openURL); } window.open(openURL); }else{ this.onNodeClick(n.id, n.text,n.attributes.menuUrl); } } } } catch (e) { } }, scope : this } }); this.tree = _tree; Ext.app.frame.WizardPanel.superclass.constructor.call(this, { margins : '2 0 5 5', layout : 'anchor', items : [this.tree] }); }, afterRender : function(){ Ext.app.frame.WizardPanel.superclass.afterRender.call(this); }, // 树图刷新 tree_refresh : function(menuId) { this.refresh(menuId); }, ReturnValue : function(title, value) { Ext.Msg.show({ title : title, msg : value, icon : Ext.Msg.INFO, minWidth : 210, buttons : Ext.Msg.OK }); }, // 为叶子菜单增加对应点击事件,调用链接对应的页面 onNodeClick : function(id,name,menuUrl) { var tabPanel = Ext.getCmp("content-panel"); var allItems = tabPanel.items.items; var tabPage; var b = true; var delegateArray = {'id':id,'name':name,'menuUrl':menuUrl}; if(menuUrl.substring(0,4)!="http"){ menuUrl = encodeURI(customInfo['context']+"/"+menuUrl); } for (var i = 0; i < allItems.length; i++) { var _text = allItems[i].title; if (_text == name) { tabPage = allItems[i]; // 设置当前tab页 tabPanel.setActiveTab(tabPage); b = false; // 重新刷新当前活动tab Ext.get('f_'+name).dom.src=menuUrl; break; } } if (b) { Ext.Ajax.request({ url : menuUrl,// 增加传递参数,处理暂停流程 success : this.showNodeTabPanel.createDelegate(this, delegateArray, true),// 调用异步函数,传递对应参数 failure : this.menuError, scope : this }); } }, // 为叶子菜单增加对应点击事件,调用链接对应的页面 showNodeTabPanel : function(result, thisObj, delegateArray) { var text = result.responseText; var tabPanel = Ext.getCmp("content-panel"); var _url = delegateArray['menuUrl']; if(_url.substring(0,4)!="http"){ _url = encodeURI(customInfo['context']+"/"+_url); } tabPage = tabPanel.add({ title : delegateArray['name'], html : "<iframe id='f_" + delegateArray['name'] + "' scrolling='auto' frameborder='0' width='100%' height='100%' src='" + _url + "'></iframe>", closable : true }); tabPanel.setActiveTab(tabPage); // 设置当前tab页 }, refresh : function(topMenuId) { var loader = new Ext.tree.TreeLoader({ dataUrl : this.context + '/menu!left.lxd?menuId=' +topMenuId }); loader.load(this.tree.root); this.tree.root.expand(true);//不起作用? }, expandTreeNodes: function(){ var tree = this.tree; tree.root.expand(true); } }); //根据组件ID获得相应的组件 function getComponent(id){ return Ext.getCmp(id); } //tab数量大于6个时,显示的提示信息 function alarmMessage(){ Ext.Msg.alert("提示信息","最多打开6个tab,请关闭无用页面"); } ```
select2 ajax获取java后台下拉框数据 并回显选中的值
用ajax 请求后台值后 发现 下拉框没有搜索功能了 ![图片说明](https://img-ask.csdn.net/upload/201808/05/1533440496_530669.png) ``` * 执行select2方法初始化 */ function select2Execute() { var dataList = [ { id: 0, text: 'enhancement' }, { id: 1, text: 'bug' }, { id: 2, text: 'duplicate' }, { id: 3, text: 'invalid' }, { id: 4, text: 'wontfix' } ]; var dataList1=[{'id':"1","text":"enhancement"}]; $(function() { /*本地注入方式*/ $(".downList2").select2({ // $("select[name='xuewei_id']").select2({ // $('select[id="xuewei_id"]').select2({ // $('#xuewei_id').select2({ // $("#selectSection").find("select.combox").select2({ // $(".select2-selection__choice").select2(); // $(".combox").select2({ placeholder : "请至少选择一个人名", tags : true, createTag : function(decorated, params) { return null; }, width : '256px', ajax: { url: '/erzhentang/manage/forAjax.do?requestType=12.5_1', dataType: 'json', data: function (params) { var query = { //请求的参数, 关键字和搜索条件之类的 search: params.term //select搜索框里面的value } // Query paramters will be ?search=[term]&page=[page] return query; }, delay: 250, processResults: function (data, params) { //返回的选项必须处理成以下格式 var results = [{ id: 0, text: 'enhancement' }, { id: 1, text: 'bug' }, { id: 2, text: 'duplicate' }, { id: 3, text: 'invalid' }, { id: 4, text: 'wontfix' }]; return { results: results //必须赋值给results并且必须返回一个obj }; } }, allowClear: true,//允许清空 escapeMarkup: function (markup) { return markup; }, // 自定义格式化防止xss注入 minimumInputLength: 0, formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果 formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择 }); //two AJAX获取数据方式 //$("select[name='xuewei_id']").select2({ /*$(".downList2").select2({ ajax: { type:'GET', url: '/erzhentang/manage/forAjax.do?requestType=12.5_1', // url: dataList1, dataType: 'json', delay: 250, data: function (params) { return { q: params.term, // search term 请求参数 page: params.page }; }, processResults: function (data, params) { params.page = params.page || 1; var itemList = []; var arr = data.result.list for(item in arr){ itemList.push({id: item, text: arr[item]}) } var itemList = []; var results = [{ id: 0, text: 'enhancement' }, { id: 1, text: 'bug' }, { id: 2, text: 'duplicate' }, { id: 3, text: 'invalid' }, { id: 4, text: 'wontfix' }]; var arr = result.list for(item in arr){ itemList.push({id: item, text: arr[item]}) } var results = [{ id: 0, text: 'enhancement' }, { id: 1, text: 'bug' }, { id: 2, text: 'duplicate' }, { id: 3, text: 'invalid' }, { id: 4, text: 'wontfix' }]; // var results=[{"id":"68","text":"平和质"},{"id":"104","text":"特禀质"}] return { // results: data.items,//itemList results: results , //必须赋值给results并且必须返回一个obj // results: data,//itemList pagination: { more: (params.page * 2) < data.total_count } }; }, cache: true }, placeholder:'请选择',//默认文字提示 language: "zh-CN", tags: true,//允许手动添加 allowClear: true,//允许清空 escapeMarkup: function (markup) { return markup; }, // 自定义格式化防止xss注入 minimumInputLength: 0, formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果 formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择 });*/ function formatState(state) { if (!state.id) { return state.text; } var $state = $('<span>' + state.text + '</span>'); return $state; } ; $('#sel_recommender').select2({ placeholder : "请选择一个人名", templateResult : formatState, width : '256px' }); // 通过id获取select2的text值,这里的text值可能有空格,需注意 function getSelect2Text(obj) { var select2Obj = $("select[name='xuewei_id']").select2(); return select2Obj.find("option:selected").text(); } /* 获取每一个name对应的值 */ var strXueweiId = ""; $("[name=xuewei_id]").each(function() { alert("this值:" + $(this).val()); /* 拼接每一项name的值 组合成和其它项目类似 gender那样的数组 */ strXueweiId += $(this).val() + "-"; }); alert("strXueweiId:" + strXueweiId) $("#strXueweiId").val(strXueweiId) }); } ```
C#WinForm程序如何用Cookie记住Web登录状态?
最近一个项目,要和MES系统交互,交互步骤如下: 注塑机设备与MES管理系统交互 实现目标: 通过注塑机设备与Mes系统的交互来实现注塑机设备自动打印条码,Mes系统记录当前条码号、物料erp号。 通过注塑机设备自动打印,代替当前人工打印标签、人工扫码作业。 交互步骤: 1. 注塑机设备用固定用户访问Mes系统。每台注塑机用户不同。 例:用户名为1,密码为123.登录方式: Request URL:http://127.0.0.1/obj/sysuser?chan=receive(no)|login Request Method:Post Form Date值为No:1 Password:123 2. 作业者在注塑机设备点击获取成型计划。 注塑机设备发送Url请求,Mes系统返回成型计划信息。 例Request URL:http://127.0.0.1/obj/sysuser?chan=tag(getplanraw,1) Request Method:Get 注释:tag(getplanraw,1)中的1为机台标号,当第二个机台请求时应为tag(getplanraw,2) 系统返回结果示例: {"data":[{"No":"20171219001","Key2":"1","Workgroup":"2","Itemno":"VNJMQD0A011A","Descr":"BoramqbD"},{"No":"20171219002","Key2":"1","Workgroup":"2","Itemno":"VNJMQD0A012A","Descr":"BoramqbA"}]} 数据示例: 计划号 机台 班组 物料 描述 20171219001 1 2 VNJMQD0A011A BoramqbD 20171219002 1 2 VNJMQD0A012A BoramqbA 3. 打印标签前,注塑机设备发送获取条码号的Url,Mes系统生成并输出条码号。 Request URL:http://127.0.0.1/obj/item?chan=tag(getprdfileno) Request Method:Get Mes系统返回结果为: {"data":[{"No":"192"}]}。 4. 注塑机设备接收并打印的条码号为192,编码规则为code128。自动化作业完成后提交该条码号、计划号、机台、班组、零件号、是否合格。 数据示例: 长度 描述 示例 11 计划号 20171212001 2 机台 2 1 班组 1 12 物料号 VNJMQD0A011A 1 是否合格(1合格,0不合格) 1 10 条码号 0123456789 YorN:为是否合格标识,1表示合格,2标识不合格。 用Post方式提交 http://127.0.0.1/obj/prdfile?chan=call(postprdfileno)&No=20171219001&Key2=2&Workgroup=1&Itemno= VNJMQD0A011A&YorN=1&Code=0123456789 5. Mes系统保持并记录。 接口协议为http 接口方式为Rest 如何记住登录信息,不必每次查询MES的时候都重新登录?
(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)
3G手机Android应用开发第四天课程2.从网络获取xml格式的视频资讯,我的解析xml出现错误
按照视频中的例子做,出现如下错误: web项目运行正常,如访问:http://localhost:8088/videoweb/video/list.do 返回的xml为: <?xml version="1.0" encoding="UTF-8" ?> - <videos> - <video id="78"> <title>喜羊羊与灰太狼全集</title> <timelength>90</timelength> </video> - <video id="78"> <title>实拍舰载直升东海救援演习</title> <timelength>20</timelength> </video> - <video id="78"> <title>喀麦隆VS荷兰</title> <timelength>30</timelength> </video> </videos> 这些短横线不知道是什么东东。 android项目是想解析这个xml文件,解析器的代码如下: public class VideoService { public static List<Video> getLastVideos() throws Exception{ String path = "http://192.168.1.100:8088/videoweb/video/list.do"; URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setReadTimeout(5*1000); conn.setRequestMethod("GET"); InputStream inStream = conn.getInputStream(); byte[] buffer = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while((len=inStream.read(buffer))!=-1){ bos.write(buffer, 0, len); } return parseXML(inStream); } private static List<Video> parseXML(InputStream inStream) throws Exception{ List<Video> videos = null; Video video = null; XmlPullParser parser = Xml.newPullParser(); parser.setInput(inStream, "UTF-8"); int eventType = parser.getEventType();//产生第一个事件 while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件 switch (eventType) { case XmlPullParser.START_DOCUMENT: videos = new ArrayList<Video>(); break; case XmlPullParser.START_TAG: String name = parser.getName();//获取解析器当前指向的元素的名称 if("video".equals(name)){ video = new Video(); video.setId(new Integer(parser.getAttributeValue(0))); } if(video!=null){ if("title".equals(name)){ video.setTitle(parser.nextText());//获取解析器当前指向元素的下一个文本节点的值 } if("timelength".equals(name)){ video.setTime(new Integer(parser.nextText())); } } break; case XmlPullParser.END_TAG: if("video".equals(parser.getName())){ videos.add(video); video = null; } break; } eventType = parser.next(); } return videos; } } 而activity代码如下: public class VideoClientActivity extends Activity { private ListView listView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); listView = (ListView)this.findViewById(R.id.listView); try { List<Video> videos = VideoService.getLastVideos(); List<HashMap<String, Object>> data = new ArrayList<HashMap<String,Object>>(); for(Video video : videos){ HashMap<String, Object> item = new HashMap<String, Object>(); item.put("id", video.getId()); item.put("title", video.getTitle()); item.put("timelength", "时长:"+ video.getTime()); data.add(item); } Log.i("size", videos.size()+""); SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.item, new String[]{"title", "timelength"}, new int[]{R.id.title, R.id.timelength}); listView.setAdapter(adapter); } catch (Exception e) { Toast.makeText(VideoClientActivity.this, "获取最新视频资讯失败", 1).show(); Log.e("VideoClientActivity", e.toString()); } } } 在LogCat中添加一个过滤器:VideoClientActivity,出现的错误是: [color=red]11-13 08:14:21.303: ERROR/VideoClientActivity(365): org.xmlpull.v1.XmlPullParserException: Premature end of document. (position:line -1, column -1) caused by: org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 0: no element found[/color] 请各位大侠解救。 :(
select2 ajax 获取java后台数据 提示params is not defined
下拉框没有任何选项内容 ![图片说明](https://img-ask.csdn.net/upload/201808/05/1533410857_939033.png) js代码 ``` /* 执行select2方法初始化 */ function select2Execute() { var dataList = [ { id: 0, text: 'enhancement' }, { id: 1, text: 'bug' }, { id: 2, text: 'duplicate' }, { id: 3, text: 'invalid' }, { id: 4, text: 'wontfix' } ]; var dataList1=[{'id':"1","text":"enhancement"}]; $(function() { /*本地注入方式*/ /*$("select[name='xuewei_id']").select2({ // $('select[id="xuewei_id"]').select2({ // $('#xuewei_id').select2({ // $("#selectSection").find("select.combox").select2({ // $(".select2-selection__choice").select2(); // $(".combox").select2({ placeholder : "请至少选择一个人名", tags : true, createTag : function(decorated, params) { return null; }, width : '256px', });*/ //two AJAX获取数据方式 //$("select[name='xuewei_id']").select2({ $(".downList2").select2({ ajax: { type:'GET', // url: '/erzhentang/manage/forAjax.do?requestType=12.1', url: dataList1, dataType: 'json', delay: 250, data: function (params) { return { q: params.term, // search term 请求参数 page: params.page }; }, processResults: function (data, params) { params.page = params.page || 1; /*var itemList = []; var arr = data.result.list for(item in arr){ itemList.push({id: item, text: arr[item]}) }*/ return { results: data.items,//itemList pagination: { more: (params.page * 2) < data.total_count } }; }, cache: true }, placeholder:'请选择',//默认文字提示 language: "zh-CN", tags: true,//允许手动添加 allowClear: true,//允许清空 escapeMarkup: function (markup) { return markup; }, // 自定义格式化防止xss注入 minimumInputLength: 0, formatResult: function formatRepo(repo){return repo.text;}, // 函数用来渲染结果 formatSelection: function formatRepoSelection(repo){return repo.text;} // 函数用于呈现当前的选择 }); function formatState(state) { if (!state.id) { return state.text; } var $state = $('<span>' + state.text + '</span>'); return $state; } ; $('#sel_recommender').select2({ placeholder : "请选择一个人名", templateResult : formatState, width : '256px' }); // 通过id获取select2的text值,这里的text值可能有空格,需注意 function getSelect2Text(obj) { var select2Obj = $("select[name='xuewei_id']").select2(); return select2Obj.find("option:selected").text(); } /* 获取每一个name对应的值 */ var strXueweiId = ""; $("[name=xuewei_id]").each(function() { alert("this值:" + $(this).val()); /* 拼接每一项name的值 组合成和其它项目类似 gender那样的数组 */ strXueweiId += $(this).val() + "-"; }); alert("strXueweiId:" + strXueweiId) $("#strXueweiId").val(strXueweiId) }); } ```
关于安卓内存泄露的问题
小弟最近在做一个小项目,基本上功能完成了,但发现在程序运行了几分钟后会自动退出,打印的日志信息如下: ![图片说明](https://img-ask.csdn.net/upload/201907/22/1563795606_231565.png) 然后又通过对程序进行注释后发现在将从服务器获取数据的功能注释掉后这个问题解决了,所以觉得问题应该是出在这一块,在这个功能中循环调用的函数有关于对象以及线程,不知是否是这一块的问题,现将整个程序贴上求大神帮忙看看: MainActivity中: ``` package com.example.gsontest; import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.widget.Toast; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.MyLocationConfiguration; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.utils.CoordinateConverter; import org.json.JSONObject; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class MainActivity extends AppCompatActivity { private MapView mapView; private BaiduMap baiduMap; public LocationClient mLocationClient; public static String responseData; public double dvalueX; public double dvalueY; private boolean isFirstLocate = true; public int mXDirection; //方向类的对象 public MyOrientationListener myOrientationListener; @Override //该函数主要是进行Activity初始化 protected void onCreate(Bundle savedInstanceState) { Log.i("MainActivity","进入到onCreate函数中进行初始化"); super.onCreate(savedInstanceState); //实例化对象 mLocationClient = new LocationClient(getApplicationContext()); //注册监听器 mLocationClient.registerLocationListener(new MyLocationListener()); //初始化SDK SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.bmpView); baiduMap = mapView.getMap(); baiduMap.setMyLocationEnabled(true); //尝试在监听按钮之前进行权限的允许 List<String> permissionList = new ArrayList<>(); if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION); } if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.READ_PHONE_STATE); } if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (!permissionList.isEmpty()) { String[] permission = permissionList.toArray(new String[permissionList.size()]); ActivityCompat.requestPermissions(MainActivity.this, permission, 1); requestLocation(); } else { requestLocation(); } } private void requestLocation() { Log.i("MainActivity", "进入到requestLocation函数中"); initLocation(); //定位开始 initOrientationListener(); myOrientationListener.start(); mLocationClient.start(); } private void initLocation() { Log.i("MainActivity", "跳进了initLocation定位初始化函数中"); LocationClientOption option = new LocationClientOption(); option.setCoorType("bd09ll"); option.setScanSpan(1000); mLocationClient.setLocOption(option); } private void initOrientationListener() { Log.i("MainActivity", "跳进了initOrientationListener方向初始化函数中"); myOrientationListener = new MyOrientationListener(getApplicationContext()); myOrientationListener.setOnOrientationListener(new MyOrientationListener.OnOrientationListener() { @Override public void onOrientationChanged(float x) { mXDirection = (int) x; } }); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { Log.i("MainActivityActivity","进入onRequestPermissionResult函数中"); switch (requestCode) { case 1: if (grantResults.length > 0) { for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "必须同意所有权限", Toast.LENGTH_LONG).show(); finish(); return; } } // sendRequestWithOkHttp(); } else { Toast.makeText(this, "发生未知错误", Toast.LENGTH_LONG).show(); finish(); } break; default: } } //定位监听器的类 public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { Log.i("MainActivity", "跳进了onReceiveLocation函数中"); if (location.getLocType() == BDLocation.TypeGpsLocation || location.getLocType() == BDLocation.TypeNetWorkLocation) { navigateTo(location); } } } private void navigateTo(BDLocation location) { Log.i("MainActivity", "跳进了navigateTo函数中"); //从服务器上获取实时的硬件位置 sendRequestWithOkHttp(); //将获取到的数据进行解析 ObjectJson(responseData); //将获取到的经纬度信息在地图上进行显示 displayLocation(dvalueX, dvalueY); //初次定位确定缩放尺寸,后面不改变便于手动伸缩 if (isFirstLocate) { BitmapDescriptor myBitMap = BitmapDescriptorFactory.fromResource(R.drawable.icon_reddirection); MyLocationConfiguration myLocationConfiguration = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, myBitMap); baiduMap.setMyLocationConfiguration(myLocationConfiguration); LatLng la = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(la); baiduMap.animateMapStatus(update); update = MapStatusUpdateFactory.zoomTo(18f); baiduMap.animateMapStatus(update); isFirstLocate = false; } //将手机当前位置的小蓝点显示在屏幕上 MyLocationData.Builder locationBuilder = new MyLocationData.Builder(); locationBuilder.latitude(location.getLatitude()); locationBuilder.longitude(location.getLongitude()); //将要执行获取方向方法 locationBuilder.direction(mXDirection); MyLocationData locationData = locationBuilder.build(); baiduMap.setMyLocationData(locationData); } //重写三个方法以对mapView进行管理,保证资源可以及时释放 @Override protected void onResume() { Log.i("MainActivity", "进入到onResume函数中"); super.onResume(); mapView.onResume(); } @Override protected void onPause() { Log.i("MainActivity", "进入到onPause函数中"); super.onPause(); mapView.onPause(); } @Override protected void onDestroy() { Log.i("MainActivity", "进入到onDestroy函数中"); super.onDestroy(); mapView.onDestroy(); baiduMap.setMyLocationEnabled(false); mLocationClient.stop(); //停止方向监听 myOrientationListener.stop(); } private void sendRequestWithOkHttp() { Log.i("MainActivity", "跳进了sendRequestWithOkHttp方法中"); new Thread(new Runnable() { @Override //重写run方法,run方法规定了该线程的具体使命 public void run() { Log.i("MainActivity","跳进OkHttp的子线程中"); try { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://huadiheal.cn/animal/latest_data") .build(); Response response = client.newCall(request).execute(); responseData = response.body().string(); // ObjectJson(responseData); } catch (Exception e) { e.printStackTrace(); } } //创建后线程仅是占有内存资源,在JVM管理的线程中还没有这个资源,要调用父类的start方法通知JVM }).start(); } private void ObjectJson(String responseData) { Log.i("MainActivity", "跳进了ObjectJson函数中"); try { JSONObject jsonObject = new JSONObject(responseData); JSONObject valueX = jsonObject.getJSONObject("value_x"); JSONObject valueY = jsonObject.getJSONObject("value_y"); Iterator<String> iteratorX = valueX.keys(); while (iteratorX.hasNext()) { String valueXkey = iteratorX.next(); String valueXValue = valueX.getString(valueXkey); String valueYValue = valueY.getString(valueXkey); dvalueX = Double.parseDouble(valueXValue); dvalueY = Double.parseDouble(valueYValue); } } catch (Exception e) { e.printStackTrace(); } } public void displayLocation(double dvalueX, double dvalueY) { Log.i("MainActivity", "进入displayLocation中"); LatLng latLng = new LatLng(dvalueY, dvalueX); //进行坐标转换 CoordinateConverter converter = new CoordinateConverter() .from(CoordinateConverter.CoordType.GPS) .coord(latLng); LatLng dLatlng = converter.convert(); //进行刷新时,先清除上一次的overlay baiduMap.clear(); //现添加Marker将位置在地图上标出来 BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_niu32); OverlayOptions option = new MarkerOptions() .position(dLatlng) .icon(bitmap); baiduMap.addOverlay(option); } } ``` 方向传感器的监听类如下: ``` package com.example.gsontest; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.util.Log; //方向监听器的类 public class MyOrientationListener implements SensorEventListener { private SensorManager mySensorManager; private Sensor mySensor; private Context myContext; private float lastX; private OnOrientationListener myOnOrientationListener; public void start(){ Log.i("MainActivity", "跳进了方向类的start函数中"); mySensorManager = (SensorManager) myContext.getSystemService(Context.SENSOR_SERVICE); if(mySensorManager!=null){ mySensor = mySensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); } if(mySensor!=null){ //SENSOR_UI可能会出现数据滞后现象,若后期数据滞后则改成别的类型 mySensorManager.registerListener(this,mySensor,SensorManager.SENSOR_DELAY_NORMAL); } } //接触注册方向传感器监听事件,即对onDestroy中所引方法的实现 public void stop(){ Log.i("MainActivity","跳进方向类的stop函数中"); mySensorManager.unregisterListener(this); } //方向传感器的一个构造函数 public MyOrientationListener(Context myContext){ this.myContext = myContext; } @Override public void onAccuracyChanged(Sensor sensor,int accuracy){} //监听方向变化 @Override public void onSensorChanged(SensorEvent event){ Log.i("MainActivity","跳进了onSensorChanged函数中"); if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){ float x = event.values[SensorManager.DATA_X]; if (Math.abs(x-lastX)>1.0){ if(myOnOrientationListener!=null){ myOnOrientationListener.onOrientationChanged(lastX); } } lastX = x; } } public void setOnOrientationListener(OnOrientationListener myOrientationListener){ this.myOnOrientationListener = myOrientationListener; } public interface OnOrientationListener{ void onOrientationChanged(float x); } } ``` 恳请大神帮忙看下程序谢谢!!
javaweb转spring后,bean容器写好了,其他的怎么写,好盲目
刚开始学spring,感觉很盲目,自己之前是写了一个简单的MAVEN的CRUD项目,分为dao层,,bean层,servelt和数据库连接的jdbc,现在要改为spring项目,配置了web.xml和bean,然后就不知道怎么做了,请大神指点一二,讲的详细点,谢谢啦! ``` public class User { private int id; // ID private String login_name;// 账号名 private String password;// 密码 private String salt;// MD5 private String name;// 姓名 private String name_mnemonic;// 姓名拼音助记码 private String name_pinyin;// 姓名拼音 private String nickname;// 昵称 private String email;// 电子邮件 private Integer mobile;// 电话 private Integer sort_num;// 排序号 private Integer status;// 状态 0[待审核],1[启用],2[禁用],3[删除] private Integer type;// 类型 1[系统用户] 2[学校用户] private String avatar;// 头像url private String remark;// 描述 ```这是bean类 * public interface UserDao { /** * 增加数据 * * @param * @return */ void Insert(User user); /** * 修改用户数据 * * @return */ public boolean update(User user); /** * 删除用户数据 * * @return * @throws SQLException */ public boolean delete(int Id); /** * 查询单个用户数据 * * @return */ // public User findUserById(String id); /** * 查询多个用户数据 */ public List<User> findList(); /** * 登录 */ // public boolean Login(String uname, String pwd); /** * 总页数 * * @return */ public int TotalPage(); /** * 获取所有数据 * * @param cur * @return */ public List<User> getUserList(int cur); //void AllDate(int ); /** * 用户登录 */ public User login(String login_name, String password); } 这是dao层 public class PageAction extends HttpServlet { private static final long serialVersionUID = 1L; private static final int DATE_PAGE = 5; /** * @see HttpServlet#HttpServlet() */ public PageAction() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doPost(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub request.setCharacterEncoding("UTF-8"); //获取pageNo 当前页码 cur为当前页码 String cur = (String) request.getParameter("cur"); UserDao userDao = new UserDaoImp(); cur = StringUtil.defaultIfEmpty(cur, "1"); List<User> list = userDao.getUserList(Integer.parseInt(cur)); int totalPage = userDao.TotalPage(); request.setAttribute("totalPage", totalPage); request.setAttribute("userList", list); request.setAttribute("cur", cur); request.getRequestDispatcher("page_list.jsp").forward(request, response); } } 这是分页的servlet
在java timer定时器中调用dao层会报错
现在在做一个web项目,使用spring+springMVC+hibernate框架, 问题描述: 项目中有一个扫描的功能,分即时任务、定时任务、周期任务三种,即时任务已经实现了,现在使用java.util.Timer、java.util.TimerTask类做定时任务,重写TimerTask的run方法,在run方法中调用之前已经没有问题的即时任务扫描方法。每次运行定时任务时,会卡在dao层方法的调用上,因为在即时任务的扫描方法中调用了dao层的数据操作方法,报错“No Session found for current thread”。 即时任务的执行流程:前台提交即时任务扫描请求->控制器调用service层的立即扫描方法startImmediateTask(); 定时任务的执行流程:前台提交定时任务扫描请求->控制器调用service层的定时扫描方法startTimerTask()->调用立即扫描方法startImmediateTask()。 下面附上代码和配置文件,请各位大牛帮忙解决啊! service层代码 ```java /** * 开始定时扫描任务 * @param blTask */ public void startTimerTask(final BLTask blTask) { Date startDate = blTask.getStartTime(); TimerTask task = new TimerTask() { @Override public void run() { // 调用扫描方法 startImmediateTask(blTask); } }; Timer timer = new Timer(); timer.schedule(task, startDate); } /** * 开始即时扫描任务 * @param blTask */ public void startImmediateTask(BLTask blTask) { BLScanParam blScanParam = new BLScanParam(); BLPolicyGroup blPolicyGroup = null; // 策略组 List<BLCheckItem> blCheckItems = null; // 检查项 Map<Long, BLCheckScript> blCheckScriptMap = new HashMap<Long, BLCheckScript>(); // 检查脚本 Long pgId = null; // 策略组ID String alias = null; // 策略别名、检查项别名 Long osType = blTask.getOsType(); // 操作系统类型 List<Long> csIds = new ArrayList<Long>(); // 检查脚本ID数组 blScanParam.setBlTask(blTask); pgId = blTask.getPgId(); // 通过策略组ID查找策略组 blPolicyGroup = blPolicyGroupDao.get(pgId); if (blPolicyGroup == null) { return; } blScanParam.setBlPolicyGroup(blPolicyGroup); alias = blPolicyGroup.getAlias(); // 通过别名、操作系统类别查找所有匹配的检查项 blCheckItems = blCheckItemDao.queryByProerties(new String[]{"alias", "osType"}, new Object[]{alias, osType}); if (blCheckItems == null || blCheckItems.size() <= 0) { return; } blScanParam.setBlCheckItems(blCheckItems); for (BLCheckItem blCheckItem : blCheckItems) { csIds.add(blCheckItem.getCsId()); } int size = csIds.size(); // 获取当前策略组下的所有检查项的检测脚本 List<BLCheckScript> blCheckScripts = blCheckScriptDao.queryByProerties("csId", (Long[])csIds.toArray(new Long[size])); for (BLCheckScript blCheckScript : blCheckScripts) { // 获取当前策略组下的所有检测脚本,并放入map中 blCheckScriptMap.put(blCheckScript.getCsId(), blCheckScript); } blScanParam.setBlCheckScriptMap(blCheckScriptMap); // 分割ip为数组,传入TaskDispatch String[] ips = getIps(blTask.getIpArea()); TaskDispatch taskDispatch = new TaskDispatch(ips, blScanParam); taskDispatch.StartTask(); // 将当前TaskDispatch对象的引用放入taskDispatchMap中,供停止任务时使用 taskDispatchMap.put(blTask.getTkId(), taskDispatch); } ``` BaseDao的部分代码 ```java public class BaseDao<E> implements Dao<E> { public SessionFactory getSessionFactory() { return this.sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public Session getSession() { return this.sessionFactory.getCurrentSession(); } @Resource(name = "sessionFactory") public void setSF(SessionFactory sessionFactory) { setSessionFactory(sessionFactory); } } ``` applicationContext.xml ```xml <?xml version="1.0" encoding="UTF-8"?> <context:annotation-config /> <context:component-scan base-package="com.djbh" /> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://192.168.1.247:3306/djbh_db?useUnicode=true&amp;characterEncoding=utf-8" /> <property name="user" value="root" /> <property name="password" value="mysql" /> <!-- <property name="driverClass" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> <property name="jdbcUrl" value="jdbc:sqlserver://localhost:1433;DatabaseName=DJBH_DB" /> <property name="user" value="sa" /> <property name="password" value="123456" /> --> <property name="acquireIncrement" value="3" /> <property name="idleConnectionTestPeriod" value="120" /> <property name="initialPoolSize" value="3" /> <property name="minPoolSize" value="3" /> <property name="maxPoolSize" value="15" /> <property name="numHelperThreads" value="3" /> <property name="preferredTestQuery" value="select 1" /> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> <!-- <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> --> <!-- <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> --> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.use_outer_join">true</prop> <prop key="hibernate.jdbc.fetch_size">30</prop> <prop key="hibernate.jdbc.batch_size">30</prop> <prop key="hibernate.jdbc.batch_versioned_data">true</prop> <prop key="hibernate.cache.use_second_level_cache">true</prop> <prop key="hibernate.cache.use_query_cache">true</prop> <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop> <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="javax.persistence.validation.mode">none</prop> </props> </property> <property name="dataSource" ref="dataSource" /> <property name="packagesToScan"> <list> <value>com.djbh.model</value> </list> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- 启动对@AspectJ注解的支持 --> <aop:aspectj-autoproxy/> </beans> ``` springmvc-servlet.xml ```xml <?xml version="1.0" encoding="UTF-8"?> <mvc:annotation-driven/> <mvc:resources location="/static/" mapping="/static/**"/> <mvc:resources location="/attachment/report_html/" mapping="/attachment/report_html/**"/> <context:component-scan base-package="com.djbh.controller" /> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property> <property name="prefix"><value>/WEB-INF/page/</value></property> <property name="suffix"><value>.jsp</value></property> </bean> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="messages" /> <property name="useCodeAsDefaultMessage" value="true" /> </bean> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--<property name="maxUploadSize" value="10485760"></property> --> </bean> <aop:aspectj-autoproxy proxy-target-class="true" /> </beans> ``` web.xml ```xml <?xml version="1.0" encoding="UTF-8"?> <display-name>djbh</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:applicationContext*.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>core.web.SystemInitListener</listener-class> </listener> <filter> <filter-name>loginFilter</filter-name> <filter-class>core.web.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>openSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> <init-param> <param-name>singleSession</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>openSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>characterEncoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> </web-app> ```
关于Extjs中悬浮框位置设置的问题。
最近在做关于Extjs的实习项目,里面涉及到 的设置,小队头头要求我把悬浮框显示的位置刚好以鼠标作为左上角,对于这个我不知道悬浮框组件中是否有对位置动态捕捉的设定。希望大家能够帮助我答疑解惑。 ``` Ext.define('query.controller.PayListInfoCheckController', { extend : 'Ext.app.Controller', views : [ 'PayListInfoCheckView' ], stores : [ 'PayListInfoCheckStore' ], init : function() { this.control({ 'paylistinfocheckview' : { afterrender : this.afterRender }, 'paylistinfocheckview button[action=search]' : { click : this.onSearchBtn } }); }, afterRender : function(tab) { var grid = tab.down('grid'); var store = grid.getStore(); store.load(); var view = grid.getView(); var tip = Ext.create('Ext.tip.ToolTip', { target : view.el, mouseOffset : [ -50, -20 ], delegate : view.cellSelector, trackMouse : false, frame : true, layout : 'fit', showDelay : 0, dismissDelay : 0, autoHide : false, items : [ { xtype : 'form' } ], listeners : { beforeshow : function(tip, eOptes) { var jsDom = tip.triggerElement; var detailType = jsDom.getAttribute('detailType'); var paramsStr = jsDom.getAttribute('paramsArr') if (!detailType || !paramsStr) { return false; } var title = jsDom.getAttribute('paramsTitle'); var titleArr = null; if(title){ titleArr = title.split(','); } var paramsArr = paramsStr.split(','); var record = view.getRecord(view .findItemByChild(tip.triggerElement)); var form = tip.down('form'); var map = {}; var titleMap = {}; Ext.suspendLayouts(); form.removeAll(); paramsArr.forEach(function(value, index) { var val = record.get(value); if (!Ext.isEmpty(val)) { map[value] = val; form.add({ xtype : 'displayfield', name : value }); if(titleArr){ titleMap[value] = titleArr[index]; } } }); if (Ext.Object.isEmpty(map)) { Ext.resumeLayouts(true); return false; } if(titleArr){ Ext.Object.each(map, function(key, value){ map[key] = titleMap[key] + ":" + value }); } switch (detailType) { case 'orderId': form.maxWidth = 150; break; case 'transTime': form.maxWidth = 200; break; case 'payCustName': form.maxWidth = 200; //form.maxHeight=300 break; case 'payCustCardNo': form.maxWidth = 200; //form.maxHeight=900 break; } form.getForm().setValues(map); Ext.resumeLayouts(true); } } }); }, // tabAfterRender: function (tab) { // var me = this; // Ext.Ajax.request( // { // url: 'query/view/list', // success: function (response) { // var obj = Ext.decode(response.responseText); // if (obj.success) { // var data = obj.data; // var combo = tab.down('extendcombo[name=orderType]'); // combo.setDefaultValue(data.id, function () { // // 在获取到当前用户开之后才加载数据 // me.searchButtonClick(tab.down('button[text=查询]')); // }); // } // } // }); // }, onSearchBtn : function(btn) { var tab = btn.up('paylistinfocheckview'); var form = tab.down('form'); var store = tab.down('grid').getStore(); var map = form.getForm().getValues(); // 额外加上排序 map.orderBy = true; store.getProxy().extraParams = map; store.loadPage(1); } // searchBtnClicked: function (btn) { // var tab = btn.up('paylistinfocheckview').down('grid'), // store = tab.getStore(); // var tab1=btn.up('paylistinfocheckview'); // var orderId = tab1.down('textfield[name=orderId]').getValue(); // var userId = tab1.down('textfield[name=userId]').getValue(); // var customerId = tab1.down('textfield[name=customerId]').getValue(); // store.loadPage(1, { // params: { // orderId: orderId, // userId: userId, // customerId: customerId // }, // callback: function (records, operation, success) { // if (!success) { // Ext.MessageBox.alert('内部错误'); // } // } // }); // } }); ``` 这是我对界面的controller代码,![图片说明](https://img-ask.csdn.net/upload/201505/26/1432604890_540443.png),这是悬浮框。这个界面并不是完善后的。
android 关于支付宝移动支付的一些问题
从支付宝官网下载了一个支付的demo。在植入自己的项目时候我把关于支付的代码都抽取出来了。 手机上有支付宝客户端的时候能正常调用。当卸载支付宝后无法调用了。 /** * @date 2016年6月6日 下午7:54:33 * @Class MpayUtils */ package com.example.testzhifu; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.Random; import com.alipay.sdk.app.PayTask; import android.annotation.SuppressLint; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.os.Handler; import android.os.Message; import android.support.v4.app.FragmentActivity; import android.text.TextUtils; import android.widget.Toast; public class MpayUtils { private FragmentActivity activity; public MpayUtils(Context context, FragmentActivity activity) { super(); this.activity = activity; } // 商户PID public static final String PARTNER = ""; // 商户收款账号 public static final String SELLER = ""; // 商户私钥,pkcs8格式 public static final String RSA_PRIVATE = ""; // 支付宝公钥 public static final String RSA_PUBLIC = ""; private static final int SDK_PAY_FLAG = 1; @SuppressLint("HandlerLeak") private Handler mHandler = new Handler() { @SuppressWarnings("unused") public void handleMessage(Message msg) { switch (msg.what) { case SDK_PAY_FLAG: { PayResult payResult = new PayResult((String) msg.obj); /** * 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/ * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665& * docType=1) 建议商户依赖异步通知 */ String resultInfo = payResult.getResult();// 同步返回需要验证的信息 String resultStatus = payResult.getResultStatus(); // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档 if (TextUtils.equals(resultStatus, "9000")) { Toast.makeText(activity, "支付成功", Toast.LENGTH_SHORT).show(); } else { // 判断resultStatus 为非"9000"则代表可能支付失败 // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态) if (TextUtils.equals(resultStatus, "8000")) { Toast.makeText(activity, "支付结果确认中", Toast.LENGTH_SHORT).show(); } else { // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误 Toast.makeText(activity, "支付失败", Toast.LENGTH_SHORT).show(); } } break; } default: break; } }; }; /** * call alipay sdk pay. 调用SDK支付 * */ public void pay(String arg1, String arg2, String arg3) { if (TextUtils.isEmpty(PARTNER) || TextUtils.isEmpty(RSA_PRIVATE) || TextUtils.isEmpty(SELLER)) { new AlertDialog.Builder(activity).setTitle("警告").setMessage("需要配置PARTNER | RSA_PRIVATE| SELLER") .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialoginterface, int i) { // } }).show(); return; } String orderInfo = getOrderInfo(arg1, arg2, arg3); /** * 特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中! */ String sign = sign(orderInfo); try { /** * 仅需对sign 做URL编码 */ sign = URLEncoder.encode(sign, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } /** * 完整的符合支付宝参数规范的订单信息 */ final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType(); Runnable payRunnable = new Runnable() { @Override public void run() { // 构造PayTask 对象 PayTask alipay = new PayTask(activity); // 调用支付接口,获取支付结果 String result = alipay.pay(payInfo, true); Message msg = new Message(); msg.what = SDK_PAY_FLAG; msg.obj = result; mHandler.sendMessage(msg); } }; // 必须异步调用 Thread payThread = new Thread(payRunnable); payThread.start(); } /** * create the order info. 创建订单信息 * */ private String getOrderInfo(String subject, String body, String price) { // 签约合作者身份ID String orderInfo = "partner=" + "\"" + PARTNER + "\""; // 签约卖家支付宝账号 orderInfo += "&seller_id=" + "\"" + SELLER + "\""; // 商户网站唯一订单号 orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\""; // 商品名称 orderInfo += "&subject=" + "\"" + subject + "\""; // 商品详情 orderInfo += "&body=" + "\"" + body + "\""; // 商品金额 orderInfo += "&total_fee=" + "\"" + price + "\""; // 服务器异步通知页面路径 orderInfo += "&notify_url=" + "\"" + "http://notify.msp.hk/notify.htm" + "\""; // 服务接口名称, 固定值 orderInfo += "&service=\"mobile.securitypay.pay\""; // 支付类型, 固定值 orderInfo += "&payment_type=\"1\""; // 参数编码, 固定值 orderInfo += "&_input_charset=\"utf-8\""; // 设置未付款交易的超时时间 // 默认30分钟,一旦超时,该笔交易就会自动被关闭。 // 取值范围:1m~15d。 // m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。 // 该参数数值不接受小数点,如1.5h,可转换为90m。 orderInfo += "&it_b_pay=\"30m\""; // extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付 // orderInfo += "&extern_token=" + "\"" + extern_token + "\""; // 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空 orderInfo += "&return_url=\"m.alipay.com\""; // 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用) // orderInfo += "&paymethod=\"expressGateway\""; return orderInfo; } /** * get the out_trade_no for an order. 生成商户订单号,该值在商户端应保持唯一(可自定义格式规范) * */ private String getOutTradeNo() { SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault()); Date date = new Date(); String key = format.format(date); Random r = new Random(); key = key + r.nextInt(); key = key.substring(0, 15); return key; } /** * sign the order info. 对订单信息进行签名 * * @param content * 待签名订单信息 */ private String sign(String content) { return SignUtils.sign(content, RSA_PRIVATE); } /** * get the sign type we use. 获取签名方式 * */ private String getSignType() { return "sign_type=\"RSA\""; } }
使用webupload,IE9频繁出现崩溃
做了个javaWeb项目,上传图片用的是webupload,但是用IE9,页面频繁崩溃! ```/* webuploader END */ var $wrap = $('#uploader'), 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); })(); if (!WebUploader.Uploader.support('flash') && WebUploader.browser.ie < 10) { // flash 安装了但是版本过低。 if (!flashVersion || (flashVersion < 11.5)) { //layer.alert("您当前浏览器flash插件版本较低,可能无法使用系统中功能,<a href='https://www.flash.cn/cdm/latest/flashplayerax_install_cn.exe'>点击升級</a>"); layer.confirm('您当前浏览器沒有flash,可能无法使用系统中功能,前往升级?', { btn : [ '确定', '取消' ]//按钮 }, function(index) { layer.close(index); //此处请求后台程序,下方是成功后的前台处理…… // var index = layer.load(0,{shade: [0.7, '#393D49']}, {shadeClose: true}); //0代表加载的风格,支持0-2 //window.location.href="www.hao123.com"; window.open('https://www.flash.cn/cdm/latest/flashplayerax_install_cn.exe'); }); // 压根就没有安转。 } else { //layer.alert("您当前浏览器沒有flash,可能无法使用系统中功能,<a href='https://www.flash.cn/cdm/latest/flashplayerax_install_cn.exe'>点击安裝</a>"); layer.confirm('您当前浏览器沒有flash,可能无法使用系统中功能,前往安装?', { btn : [ '确定', '取消' ]//按钮 }, function(index) { layer.close(index); //此处请求后台程序,下方是成功后的前台处理…… // var index = layer.load(0,{shade: [0.7, '#393D49']}, {shadeClose: true}); //0代表加载的风格,支持0-2 //window.location.href="www.hao123.com"; window.open('https://www.flash.cn/cdm/latest/flashplayerax_install_cn.exe'); }); } // return; } else if (!WebUploader.Uploader.support()) { layer.msg('Web Uploader 不支持您的浏览器!',{icon:6}); //return; } //var flag =true; var uploader = WebUploader.create({ auto: true, // swf文件路径 swf: '<%=basePath %>/static/webupload/Uploader.swf', // 文件接收服务端。 server:'<%=basePath %>/main/webuploader', // 选择文件的按钮。可选。 // 内部根据当前运行是创建,可能是input元素,也可能是flash. pick: '#picker', fileVal:'file', // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传! resize: false, formData: { folderId: "<%=requestBean.getFolderId()%>" }, accept: { title: 'Files', extensions: 'gif,jpg,jpeg,bmp,png,pdf,doc,docx,txt,xls,xlsx,ppt,pptx,zip,mp3,mp4,text,csv', mimeTypes: 'image/*,text/*' //word +',application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document' //excel +',application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' //ppt +',application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.presentationml.presentation' +',application/pdf' +',application/zip' +',application/csv' +',.csv' }, duplicate :true, //chunked: true, //分片处理 //chunkSize: 5 * 1024 * 1024, //每片5M chunkRetry:false,//如果失败,则不重试 //duplicate:false,//是否可重复选择同一文件 //fileSingleSizeLimit: 10*1024*1024,//限制大小10M,单文件 //fileSizeLimit: allMaxSize*1024*1024,//限制大小10M,所有被选文件,超出选择不上 fileNumLimit:20 }); // 当有文件被添加进队列的时候 uploader.on( 'fileQueued', function( file ) { var $list = $("#webuploaderList"); $list.append( '<div id="' + file.id + '" class="item">' + '<h4 class="info">' + file.name + '</h4>' + '<p class="state">等待上传...</p>' + '</div>' ); }); // 文件上传过程中创建进度条实时显示。 uploader.on( 'uploadProgress', function( file, percentage ) { $("#uploadfileQueue").css("display","block"); var $li = $( '#'+file.id ), $percent = $li.find('.progress .progress-bar'); // 避免重复创建 if ( !$percent.length ) { $percent = $('<div class="progress progress-striped active" style="width:300px; height:10px; border:2px solid #09F;">' + '<div class="progress-bar" role="progressbar" style="width: 0%;height:100%; background-color:#09F; text-align:center; line-height:10px; font-size:10px;">' + '</div>' + '</div>').appendTo( $li ).find('.progress-bar'); } $li.find('p.state').text('上传中...'); $percent.html( Math.round(percentage * 100) +"%" ); $percent.css( 'width', percentage * 100 + '%' ); }); uploader.on('uploadSuccess', function (file,response) { if(response.ISOK=='N'){ layer.msg(response.message); $('#' + file.id).find('p.state').text('上传出错:'+response.message); } else{ $('#' + file.id).find('p.state').text('已上传'); if(response.newFid){ newFid = response.newFid; } } }); uploader.on('uploadError', function (file) { //layer.msg('上传出错!'+handler); $('#' + file.id).find('p.state').text('上传出错!'); }); // 完成上传完了,成功或者失败,先删除进度条。 uploader.on( 'uploadComplete', function(file ) { $( '#'+file.id ).find('.progress').remove(); }); //所有文件上传完成 uploader.on('uploadFinished',function(file){ var changeList; $.ajax( { url: '<%=basePath %>/userSession/changeListBySwfUpload', dataType: "json", async:false, cache:false, success: function(data, textStatus, jqXHR) { changeList=data; }, error: function(jqXHR, textStatus, errorThrown) { //console.log(errorThrown); } }); if(changeList == undefined){ return false; } var v_div=$("<div style='width:600px'>"); var v_table=$("<table id='fileuploadsinfo'>").css("width","500px").appendTo(v_div); var v_hred_tr=$("<tr>").css("width","500px").css("height","40px"); $("<th>").text("文件名").css("width","200px").css("height","40px").appendTo(v_hred_tr); $("<th>").text("备注").css("width","300px").css("height","40px").appendTo(v_hred_tr); v_hred_tr.appendTo(v_table); $.each(changeList,function(idx,v_sel){ var v_body_tr=$("<tr>").css("width","500px").css("height","40px").attr("cFid",v_sel.cFId); $("<td>").text(v_sel.file).css("width","200px").css("height","40px").appendTo(v_body_tr); var v_rmk=$("<input type='text' class='remark'>").css("width",'90%').css("height","99%"); $("<td>").css("width","300px").css("height","40px").appendTo(v_body_tr).append(v_rmk); v_body_tr.appendTo(v_table); /* var v_div=$("<div ><span style='display: none' ><input type='text' name='cFId' value='"++"'/></span><span style='width: 100px' ><input type='text' name='cFReName' readonly='readonly' value='"+v_sel.file+"'/></span><span style='width: 400px' ><input type='text' name='cFNote'/></span></div>"); v_div.appendTo(v_form); */ //changeList.splice(idx,1); //return true; }); layer.open({ type: 1, title:"", area: ["500px", "300px"], content:v_div.html(), closeBtn:1, btnAlign: 'c', scrollbar:true, btn:['确定','取消'], yes: function(index, layero){ var jsonArray=[]; var v_flag=false; $("#fileuploadsinfo").find('tr').not(':eq(0)').each(function(idx,itr){ var v_cFid=$(itr).attr("cFid"); var v_remark=$(itr).find('.remark').val(); if($.trim(v_remark).length<=20){ jsonArray.push({"fileInfo":v_cFid+'_'+v_remark}); }else{ layer.msg("备注输入有误,请输入20位以内的备注信息"); v_flag=true; return false; } }); //var str= JSON.stringify(jsonArray) if(v_flag){ return false; } $.ajax({ url: '<%=basePath %>/main/saveNote', type: 'post', dataType: 'json', data:{datas:jsonArray}, async:false, success: function (data) { uploader.reset(); //alert(33); uploader.destory(); if(data.flag=="Y"){ layer.closeAll(); layer.msg("上传成功",{icon:6},function(){ if(newFid){//如果新增了文件夹则刷新父级窗口 parent.location.reload(); }else{ window.location.reload(); } }); } }, error: function(XMLHttpRequest, textStatus, errorThrown) { } }); } , btn2: function(index, layero){ if(newFid){//如果新增了文件夹则刷新父级窗口 parent.location.reload(); }else{ window.location.reload(); } } }); }); /* webuploader END */ ``` 崩溃错误描述如下 : 问题签名: 问题事件名称: APPCRASH 应用程序名: iexplore.exe 应用程序版本: 9.0.8112.16421 应用程序时间戳: 4d76255d 故障模块名称: Flash32_32_0_0_207.ocx 故障模块版本: 32.0.0.207 故障模块时间戳: 5ceb04d1 异常代码: c0000005 异常偏移: 002d7e64 OS 版本: 6.1.7601.2.1.0 .256.48 区域设置 ID: 2052 其他信息 1: 2826 其他信息 2: 2826ae5788d1601e09d13cfdc228c271 其他信息 3: a6c4 其他信息 4: a6c4ac129c9c2b4af725e35cc1a77c20 联机阅读隐私声明: http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0804 如果无法获取联机隐私声明,请脱机阅读我们的隐私声明: C:\Windows\system32\zh-CN\erofflps.txt
thinkphp登录连接数据库验证时出现404错误
错误界面 ![图片说明](https://img-ask.csdn.net/upload/201701/12/1484210922_771859.png) html ``` <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content=""> <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --> <meta name="description" content=""> <meta name="author" content=""> <link rel="icon" href=""> <title>泡车堂登录</title> <!-- Bootstrap core CSS --> <link href="/carProject/Public/css/bootstrap.min.css" rel="stylesheet"> <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --> <!--[if lt IE 9]> <![endif]--> </head> <body> <div class="container" id="d1"> <div class="row"> <div class="col-sm-6 col-sm-offset-3 form-box"> <div class="form-top"> <h2>泡车堂商户PAD版</h2> </div> <div class="form-bottom"> <form role="form" method="post" class="login-form"> <div class="form-group"> <label class="sr-only" >用户名</label> <input type="text" name="username" placeholder="请输入您的用户名" class="form-control" required> </div> <div class="form-group"> <label class="sr-only" >密码</label> <input type="password" name="password" placeholder="请输入您的密码" class="form-control" required> </div> <button type="button" class="btn btn-primary btn-block" onclick="login.check()">登录</button> </form> </div> </div> </div> </div> <script type="text/javascript"> function autoHeight(){ var winHeight=0; if (window.innerHeight) winHeight = window.innerHeight; else if ((document.body) && (document.body.clientHeight)) winHeight = document.body.clientHeight; if (document.documentElement && document.documentElement.clientHeight) winHeight = document.documentElement.clientHeight; document.getElementById("d1").style.marginTop= winHeight/3 +"px"; } autoHeight(); window.onresize = autoHeight; </script> <script src="/carProject/Public/js/jquery.js"></script> <script src="/carProject/Public/js/dialog/layer.js"></script> <script src="/carProject/Public/js/dialog.js"></script> <script src="/carProject/Public/js/admin/login.js"></script> <!-- IE10 viewport hack for Surface/desktop Windows 8 bug --> </body> </html> ``` login.js ``` var login = { check : function() { // 获取登录页面中的用户名 和 密码 var username = $('input[name="username"]').val(); var password = $('input[name="password"]').val(); if(!username) { dialog.error('用户名不能为空'); } if(!password) { dialog.error('密码不能为空'); } var url = "/carProject/index.php?m=admin&c=login&a=check"; var data = {'username':username,'password':password}; // 执行异步请求 $.post $.post(url,data,function(result){ if(result.status == 0) { return dialog.error(result.message); } if(result.status == 1) { return dialog.success(result.message, 'https://www.baidu.com/'); } },'JSON'); } } ``` AdminModel.class.php ``` <?php namespace Common\Model; use Think\Model; class AdminModel extends Model { private $_db = ''; public function __construct() { $this->_db = M('Admin'); } public function getAdminByUsername($username='') { $res = $this->_db->where('name="'.$username.'"')->find(); return $res; } } ``` LoginController.class.php ``` <?php namespace Admin\Controller; use Think\Controller; /** * use Common\Model 这块可以不需要使用,框架默认会加载里面的内容 */ class LoginController extends Controller { public function index(){ $this->display(); } public function check() { $username = $_POST['username']; $password = $_POST['password']; if(!trim($username)) { return show(0,'用户名不能为空'); } if(!trim($password)) { return show(0,'密码不能为空'); } print_r(C('DB_TYPE')); //导入当前项目下面的Model/AdminModel.class.php文件,然后实例化AdminModel类 $ret = D('Admin')->getAdminByUsername($username); print_r($ret); /* if(!$ret) { return show(0,'该用户不存在'); } if($ret['pwd'] != getMd5Password($password)) { return show(0,'密码错误'); } session('adminUser', $ret); return show(1,'登录成功');*/ } } ``` # 对数据库的配置 config.php ``` <?php return array( //'配置项'=>'配置值' //URL地址不区分大小写 'URL_CASE_INSENSITIVE' =>true, 'URL_MODEL'=>0, 'LOAD_EXT_CONFIG' => 'db', 'MD5_PRE' => 'sing_cms', 'HTML_FILE_SUFFIX' => '.html', ); ``` db.php ``` <?php return array( 'DB_TYPE' => 'mysql', 'DB_HOST' => '127.0.0.1', 'DB_USER' => 'root', 'DB_PWD' => '111111', 'DB_PORT' => 3366, 'DB_NAME' => 'demo', 'DB_CHARSET' => 'utf8', 'DB_PREFIX' =>'t_', ); ```
spring mvc+hibernate4事务控制
``` web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>spring-mvc</display-name> <!--配置欢迎界面 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <error-page> <error-code>404</error-code> <location>/error/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/error/exception.jsp</location> </error-page> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- Log4j配置 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>WEB-INF/log4j.properties</param-value> </context-param> <!-- 开一条watchdog线程每60秒扫描一下配置文件的变化 --> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> </context-param> <!--配置log4j包 --> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <!--配置listener --> <!--在这里可以配置spring的监听器,启动的时候需要把spring中的bean都注册到spring容器中 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--配置filter对编码进行转换 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value><!-- 强制转码 --> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--配置servlet --> <!--我们希望spring的控制器比其他servlet优先启动,所以你需要设置load-on-startup 这个东西:值越小越先启动(0-5),没有或者为负数的时候,servlet被选用的时候才加载--> <servlet> <servlet-name>controller</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:controll-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>controller</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> <filter> <filter-name>openSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> <init-param> <param-name>singleSession</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>sessionFactory</param-name> <param-value>sessionFactory</param-value> </init-param> </filter> <filter-mapping> <filter-name>openSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:hibernate.properties</value> </list> </property> </bean> <!-- DWR配置--> <dwr:annotation-config></dwr:annotation-config> <!-- 扫描需要转换的java对象 --> <dwr:annotation-scan scanRemoteProxy="true" base-package="com.tb.service" /> <!-- 部署项目时, 请把debug设为false <dwr:controller id="dwrController" debug="true" /> --> <!--DWR初始化配置 --> <dwr:configuration></dwr:configuration> <!-- 配置数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass"> <value>${db.driver}</value> </property> <property name="jdbcUrl"> <value>${db.url}</value> </property> <property name="user"> <value>${db.user}</value> </property> <property name="password"> <value>${db.password}</value> </property> <property name="maxPoolSize"> <value>300</value> </property> <property name="minPoolSize"> <value>1</value> </property> <property name="initialPoolSize"> <value>1</value> </property> <property name="maxIdleTime"> <value>60</value> </property> <property name="acquireIncrement"> <value>5</value> </property> <property name="acquireRetryAttempts"> <value>10</value> </property> <property name="acquireRetryDelay"> <value>1000</value> </property> <property name="autoCommitOnClose"> <value>true</value> </property> <property name="breakAfterAcquireFailure"> <value>false</value> </property> <property name="checkoutTimeout"> <value>100</value> </property> <property name="idleConnectionTestPeriod"> <value>60</value> </property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 让spring帮你扫描这个包底下的所有类,主要作用扫描跟数据库对应的实体类 --> <!-- 设置hibernate的属性 --> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.OracleDialect </prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.use_outer_join">true </prop> <prop key="hibernate.cglib.use_reflection_optimizer">true </prop> <prop key="hibernate.connection.useUnicode">true</prop> <prop key="hibernate.cache.use_query_cache">false</prop> <prop key="hibernate.default_batch_fetch_size">16</prop> <prop key="hibernate.c3p0.max_size">300</prop> <prop key="hibernate.c3p0.min_size">1</prop> <prop key="hibernate.c3p0.timeout">60</prop> <prop key="hibernate.c3p0.max_statements">100</prop> <prop key="hibernate.c3p0.idle_test_period">60</prop> <prop key="hibernate.c3p0.acquire_increment">5</prop> <prop key="hibernate.c3p0.validate">true</prop> <prop key="hibernate.current_session_context_class">thread</prop> </props> </property> <property name="packagesToScan" value="com.tb.model"/> </bean> <!--事务配置 --> <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 开启AOP监听 只对当前配置文件有效 --> <aop:aspectj-autoproxy expose-proxy="true" /> <!-- 开启注解事务 只对当前配置文件有效 --> <tx:annotation-driven transaction-manager="txManager"/> <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="execute*" propagation="REQUIRED" rollback-for ="Exception.class" /> <tx:method name="tes*" propagation="REQUIRED" /> <tx:method name="use*" propagation="REQUIRED" /> <!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到 --> <tx:method name="get*" propagation="REQUIRED" read-only="true" /> <tx:method name="count*" 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="*" propagation="REQUIRED" rollback-for ="Exception.class"/> </tx:attributes> </tx:advice> <bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true" lazy-init="true"> <property name="transactionManager" ref="txManager"></property> <property name="transactionAttributes"> <props> <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="save*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="tes*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="execute*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="remove*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="query*">PROPAGATION_REQUIRED, readOnly,-Exception</prop> <prop key="load*">PROPAGATION_REQUIRED, -Exception</prop> </props> </property> </bean> <!-- 只对业务逻辑层实施事务 --> <aop:config expose-proxy="true"> <aop:pointcut id="txPointcut" expression="execution(* com.tb.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" /> </aop:config> <!-- --> <!--配置拦截器 在springmvc的控制器配置文件中,你就可以这么配置拦截器,具体你在拦截器里面做什么,自己去做 <mvc:interceptors> 多个拦截器,顺序执行 <mvc:interceptor> 这里的path符号有/*, /**, *, ? 等,对于student.do?param=1从?开始不作为path 如果不配置或/*,将拦截所有的Controller <mvc:mapping path="/student/save*" /> <bean class="spring.common.interceptor.FromDupInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> --> </beans> controll-servlet.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="com.tb"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <context:component-scan base-package="com.tb"/> <!-- json --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="jsonHttpMessageConverter"/> </list> </property> </bean> <bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <!-- ③:对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" valu-e=".jsp"/> </bean> </beans> 以上为配置文件:包路径分别为com.tb.action;com.tb.service;com.tb.model;com.tb.dao; 其中com.tb.service下面又分com.tb.service.impl;com.tb.dao包下又分com.tb.dao.impl; 但是现在测试事物一直控制不了,请大神帮忙原因。测试方法: Controller.java @RequestMapping(params = "executeSearch") @Transactional public String executeSearch(HttpServletRequest request) { //测试事物控制。 infoService.test(); return "info/search"; } ServiceImpl.java public void test(){ try { infoDAO.test(); } catch (Exception e) { e.printStackTrace(); } } Service.java @Transactional public void test(); DaoImpl.java @Transactional public void test() { try { String sql = "update operation_log set username='1' where id='1'"; List<Object> condition = new ArrayList<Object>(); this.executeUpdateBySql(sql, condition); String sql1 = "update operation_log set username=33, where id='1'"; this.executeUpdateBySql(sql1, condition); } catch (RuntimeException e) { e.printStackTrace(); } } DaoImpl.java继承HibernateDao HibernateDao.java /***************注入***********/ @Resource private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public Session getSession() { //事务配置后,可通过getCurrentSession方法获得session return sessionFactory.getCurrentSession(); } public int executeUpdateBySql(final String sql,final List<Object> conditions){ try { Query query = getSession().createSQLQuery(sql); if(conditions!=null && conditions.size()>0){ for(int i=0;i<conditions.size();i++){ if(conditions.get(i)!=null && !conditions.get(i).equals("")){ query.setParameter(i, conditions.get(i)); } } } return query.executeUpdate(); } catch (RuntimeException e) { throw e; }finally{ System.out.println(getSessionFactory().getCurrentSession().beginTransaction().isActive()); } } 整体代码是这样的,在运行daoImpl.java中test()方法的时候执行第一条SQL时会提交事物,直接修改数据库中的值,执行第二条SQL时会报错,理论上应该都不提交事物。但实际上第一条执行了之后就提交事物了,不知道是我框架问题还是我写的问题,求大神帮忙指出问题所在。万分感谢! ```
datagrid根据后台数据动态显示列名与内容
已知后台返回数据格式为(1){"total":8,"rows":[{"HID":"1","HNAME":"世纪新 都","AMOUNT":"1075.00"},{"HID":"2","HNAME":"江南商 都","AMOUNT":"33.00"},{"HID":"3","HNAME":"凯瑞商都","AMOUNT":"- 51.00"},{"HID":"4","HNAME":"阳光百货","AMOUNT":"9.00"}, {"HID":"5","HNAME":"银泰百货","AMOUNT":"-35.00"}, {"HID":"281","HNAME":"测试1","AMOUNT":"-13.00"}, {"HID":"297","HNAME":"家乐福","AMOUNT":"-4.00"}, {"HID":"327","HNAME":"利比亚","AMOUNT":"-2.00"}]} (2){"total":16,"rows":[{"WAID":"1","WANO":"3001","WANAME":"上 衣","UNITS":"件","SALE":"900","KKHJ":"-35.00","KK1":"0.00","KK2":"- 20.00","KK3":"-12.00","KK4":"- 3.00","KK5":"","KK281":"","KK297":"","KK327":"","ROWNUMBER":"1.00"}, {"WAID":"47","WANO":"700096","WANAME":"工装","UNITS":" 套","SALE":"100","KKHJ":"-24.00","KK1":"-4.00","KK2":"- 1.00","KK3":"","KK4":"","KK5":"","KK281":"- 19.00","KK297":"","KK327":"","ROWNUMBER":"2.00"}, {"WAID":"12569","WANO":"3001A","WANAME":"休闲裤","UNITS":" 件","SALE":"100","KKHJ":"-24.00","KK1":"- 3.00","KK2":"2.00","KK3":"- 23.00","KK4":"","KK5":"","KK281":"","KK297":"","KK327":"","ROWNUMBER":"3.00"}, {"WAID":"6592","WANO":"A121","WANAME":"西装","UNITS":" 套","SALE":"33","KKHJ":"-23.00","KK1":"","KK2":"","KK3":"- 19.00","KK4":"","KK5":"","KK281":"","KK297":"","KK327":"- 4.00","ROWNUMBER":"4.00"},{"WAID":"21","WANO":"3006","WANAME":"牛仔 裤","UNITS":"条","SALE":"280","KKHJ":"- 14.00","KK1":"","KK2":"","KK3":"","KK4":"","KK5":"- 19.00","KK281":"5.00","KK297":"","KK327":"","ROWNUMBER":"5.00"}, {"WAID":"3","WANO":"30032","WANAME":"风衣","UNITS":" 件","SALE":"900","KKHJ":"-12.00","KK1":"18.00","KK2":"- 17.00","KK3":"3.00","KK4":"","KK5":"- 16.00","KK281":"","KK297":"","KK327":"","ROWNUMBER":"6.00"}, {"WAID":"6591","WANO":"A12","WANAME":"西装","UNITS":" 套","SALE":"0","KKHJ":"-5.00","KK1":"","KK2":"","KK3":"- 1.00","KK4":"","KK5":"","KK281":"","KK297":"- 4.00","KK327":"0.00","ROWNUMBER":"7.00"}, {"WAID":"99","WANO":"CY003","WANAME":"衬衫","UNITS":" 件","SALE":"0","KKHJ":"-1.00","KK1":"- 1.00","KK2":"","KK3":"","KK4":"","KK5":"","KK281":"","KK297":"","KK327":"","ROWNUMBER":"8.00"}, {"WAID":"1324","WANO":"NZK0869","WANAME":"睡衣","UNITS":" 双","SALE":"0","KKHJ":"- 1.00","KK1":"","KK2":"","KK3":"","KK4":"","KK5":"","KK281":"- 1.00","KK297":"","KK327":"","ROWNUMBER":"9.00"}, {"WAID":"53","WANO":"7001","WANAME":"t恤条纹","UNITS":" 件","SALE":"380","KKHJ":"0.00","KK1":"1.00","KK2":"- 1.00","KK3":"","KK4":"","KK5":"","KK281":"","KK297":"","KK327":"","ROWNUMBER":"10.00"}, {"WAID":"6572","WANO":"2543212","WANAME":"衬衫","UNITS":" 件","SALE":"44","KKHJ":"1.00","KK1":"1.00","KK2":"","KK3":"","KK4":"","KK5":"","KK281":"","KK297":"","KK327":"","ROWNUMBER":"11.00"}, {"WAID":"5","WANO":"3005","WANAME":"T恤","UNITS":" 件","SALE":"780","KKHJ":"2.00","KK1":"","KK2":"","KK3":"","KK4":"2.00","KK5":"","KK281":"","KK297":"","KK327":"","ROWNUMBER":"12.00"}, {"WAID":"48","WANO":"100330000001","WANAME":"女装雪纺衫红袖","UNITS":" 件","SALE":"500","KKHJ":"12.00","KK1":"","KK2":"12.00","KK3":"","KK4":"","KK5":"","KK281":"","KK297":"","KK327":"","ROWNUMBER":"13.00"}, {"WAID":"4","WANO":"3004","WANAME":"西便装","UNITS":" 件","SALE":"900","KKHJ":"15.00","KK1":"9.00","KK2":"","KK3":"","KK4":"5.00","KK5":"","KK281":"","KK297":"","KK327":"1.00","ROWNUMBER":"14.00"}, {"WAID":"2","WANO":"3002","WANAME":"大衣","UNITS":" 件","SALE":"900","KKHJ":"119.00","KK1":"54.00","KK2":"58.00","KK3":"1.00","KK4":"5.00","KK5":"","KK281":"","KK297":"","KK327":"1.00","ROWNUMBER":"15.00"}, {"WAID":"58","WANO":"771","WANAME":"女装-连衣裙","UNITS":" 套","SALE":"0","KKHJ":"1002.00","KK1":"1000.00","KK2":"","KK3":"","KK4":"","KK5":"","KK281":"2.00","KK297":"","KK327":"","ROWNUMBER":"16.00"}]} jsp: ``` <script type="text/javascript"> var colname=[]; var cols=[]; var ss=""; //分页设置 function pp(){ //var hide=$('#huizong').val(); //if(hide==0){ // hide1==true;hide2=true; //}else if(hide==1){ // hide1=false;hide2=true; //}else{ // hide1=true;hide2=false; //} $('#pp').pagination({//分页设置 layout:['first','links','last','manual'], pageSize:20, onSelectPage : function(pageNum, pageSize) { nouse=$('#nouse').val(); page=pageNum.toString(); getinventorydistri(page,nouse); } }); var col = [ [{ field : 'WARENAME', title : '商品', width : 20 }, { field : 'KCHJ', title : '小计', width : 20 }] ]; //s = "[["; // s = s + "{field:'WARENAME',title:'商品',width:160},{field:'COLORNAME',{field:'KCHJ',title:'小计'}"; // s = s + "]]"; var options= { idFile : 'WARENAME', width : '100%', height : '520px', fitColumns : true, striped : true, //隔行变色 rownumbers : true, //显示行数 singleSelect : true, columns:col, showFooter:true, onClickRow:function(rowIndex, rowData){ }, pageSize : 20 } //加载数据 $('#gg').datagrid(options); getinvdistridata(); setTimeout('1000'); getinvdistrisum(); setTimeout('1000'); getinventorydistri(); } //查询统计库存分布方法 function getinvdistridata(){ $('#selectd').dialog('close'); var nowdate =$('#nowdate').datebox('getValue');//当前时间 var wareid=$("#awareno").val();//货号 var adbrandid =$("#adbrandid").val();//品牌 var adtypeid=$("#adtypeid").val();//类型 var prodyear=$("#yearss").val();//生产年份 var seasonname=$("#jijie option:selected").text();//季节 //alert(nowdate); $.ajax({ type : "POST", //访问WebService使用Post方式请求 url : "InvDistriServlet", //调用WebService的地址和方法名称组合 ---- WsURL/方法名 data : { invdistriser : "getinvdistridata", nowdate:nowdate, wareid:wareid, adbrandid:adbrandid, adtypeid:adtypeid, prodyear:prodyear, seasonname:seasonname }, //这里是要传递的参数,格式为 data: "{paraName:paraValue}",下面将会看到 dataType : 'text', success : function(text) { //回调函数,result,返回值 if (text != "f") { data = $.parseJSON(text); $('#gg').datagrid('loadData', data); $('#pp').pagination({ total : data.total, }); } else { alert(text); } } }); } function getinvdistrisum(){ $('#selectd').dialog('close'); $.ajax({ type : "POST", //访问WebService使用Post方式请求 url : "InvDistriServlet", //调用WebService的地址和方法名称组合 ---- WsURL/方法名 data : { invdistriser : "getinvdistrisum" }, //这里是要传递的参数,格式为 data: "{paraName:paraValue}",下面将会看到 dataType : 'text', success : function(text) { //回调函数,result,返回值 if (text != "f") { alert(text); //colname = $.parseJSON(text); colname=text; } else { alert(text); } } }); } //查询库存分布列表方法 function getinventorydistri(page, nouse){ $('#selectd').dialog('close'); var hzfs=$("#huizong").val();//汇总方式 var wareid=$("#awareno").val();//货号 var adbrandid =$("#adbrandid").val();//品牌 var adtypeid=$("#adtypeid").val();//类型 var prodyear=$("#yearss").val();//生产年份 var seasonname=$("#jijie option:selected").text();//季节 var order=$("input[name='pai1']:checked").val();//排序方式 var paixu=$("#paixu").val();//排序项目 $.ajax({ type : "POST", //访问WebService使用Post方式请求 url : "InvDistriServlet", //调用WebService的地址和方法名称组合 ---- WsURL/方法名 data : { invdistriser : "getinvdistri", hzfs:hzfs, wareid:wareid, adbrandid:adbrandid, adtypeid:adtypeid, prodyear:prodyear, seasonname:seasonname, order:order, paixu:paixu, page:page,nouse:nouse }, //这里是要传递的参数,格式为 data: "{paraName:paraValue}",下面将会看到 dataType : 'text', success : function(text) { //回调函数,result,返回值 if (text != "f") { data = $.parseJSON(text); $('#gg').datagrid('loadData', data); $('#pp').pagination({ total : data.total, }); } else { alert(text); } } }); } </script> ``` Servlet:(为节约略去方法中从jsp取值) //库存分布数据求和及生成列表头 private void getinvdistrisum(HttpServletRequest request, HttpServletResponse response) throws Exception { Map<String,String> res = InvDistriBase.getinvdistrisum(); System.out.println("size"); System.out.println("size"+res.size()); PrintWriter out = response.getWriter(); out.print(res); out.close(); } private void getinvdistridata(HttpServletRequest request, HttpServletResponse response) throws IOException { // 获取统计库存数据 String res = InvDistriBase.getinvdistridata(); JSONObject obj = JSONObject.fromObject(res); InvDistriBase.sqltext=obj.getString("SQLTEXT"); PrintWriter out = response.getWriter(); out.print(res); out.close(); } private void getinvdistri(HttpServletRequest request, HttpServletResponse response) throws Exception { // 获得库存分页数据 String res = InvDistriBase.getinvdistri(); PrintWriter out = response.getWriter(); InvDistriBase.page = "1"; out.print(res); out.close(); }
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
《阿里巴巴开发手册》读书笔记-编程规约
Java编程规约命名风格 命名风格 类名使用UpperCamelCase风格 方法名,参数名,成员变量,局部变量都统一使用lowerCamelcase风格 常量命名全部大写,单词间用下划线隔开, 力求语义表达完整清楚,不要嫌名字长 ...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
Python绘图,圣诞树,花,爱心 | Turtle篇
1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle() circle.shape('circle') circle.color('red') circle.speed('fastest') circle.up() square = turtle.Turtle()
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
为什么听过很多道理,依然过不好这一生?
记录学习笔记是一个重要的习惯,不希望学习过的东西成为过眼云烟。做总结的同时也是一次复盘思考的过程。 本文是根据阅读得到 App上《万维钢·精英日课》部分文章后所做的一点笔记和思考。学习是一个系统的过程,思维模型的建立需要相对完整的学习和思考过程。以下观点是在碎片化阅读后总结的一点心得总结。
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
Linux 命令(122)—— watch 命令
1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 [1] watch(1) manual
Linux 命令(121)—— cal 命令
1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 [1] cal(1) manual
记jsp+servlet+jdbc实现的新闻管理系统
1.工具:eclipse+SQLyog 2.介绍:实现的内容就是显示新闻的基本信息,然后一个增删改查的操作。 3.数据库表设计 列名 中文名称 数据类型 长度 非空 newsId 文章ID int 11 √ newsTitle 文章标题 varchar 20 √ newsContent 文章内容 text newsStatus 是否审核 varchar 10 news...
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告(本文) 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允
相关热词 c#开发的dll注册 c#的反射 c# grid绑定数据源 c#多线程怎么循环 c# 鼠标左键 c# char占位符 c# 日期比较 c#16进制转换为int c#用递归求顺序表中最大 c#小型erp源代码
立即提问