java堆中方法区中的内容会被删除么

java有垃圾回收机制,会自动回收不使用的对象,
问题一:那在堆中的方法区中存储的关于类的代码以及常量池等这些信息会,
在不使用这个类以后,这些信息是会被销毁么?怎样被销毁呢?是由GC回收么?
问题二:栈中自动分配的存储的对象引用会被自动销毁么?代码运行之后销毁么?

1个回答

堆上没有什么方法区。代码放在代码区,函数的局部变量放在堆栈上。
栈中自动分配的存储的对象引用会被自动销毁么,是的,在函数返回的时候销毁。

Bazingaea
Bazingaea 好的谢谢
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
做了一个小时的面试题(没有过 希望大家帮忙答下 虽然很幼稚 毕竟每个人都是这么过来的吗 感激了!)
XX软件工程师笔试试题 注:1、请参考人员将答案写在答题纸上,勿将答案写在此卷上。 2、请参考人员将编号与姓名填写在答题纸上。 1、 以下数据结构中不属于线性数据结构的是()。 A、队列 B、线性表 C、二叉树 D、栈 我的答案:C 2、 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是()。 A、 可行性分析 B、需求分析 C、详细设计 D、程序编码 我的答案:B 3、 结构化程序设计主要强调的是()。 A、 程序的规模 B、程序的易读性 C、程序的执行效率 D、程序的可移植性 我的答案:C 4、 在软件生命周期中,能准确地确定软件系统必须做什么和必须具备哪些功能的阶段()。 A、 概要设计 B、详细设计 C、可行性分析 D、需求分析 我的答案:B 5、 下列关于栈的叙述中正确的是()。 A、 在栈中只能插入数据 B、在栈中只能删除数据 B、 栈是先进先出的线性表 D、栈是先进后出的线性表 我的答案:D 6、 下面不属于软件设计原则的是()。 A、 抽象 B、模块化 C、自底向上 D、信息隐蔽 我的答案:C 7、 对长度为N的线性表进行顺序查找,在最坏情况下所需要的比较次数为()。 A、 N+1 B、N C、(N+1)/2 D、N/2 我的答案:C 8、 视图设计一般有3种设计次序,下列不属于视图设计的是()。 A、 自顶向下 B、由外向内 C、由内向外 D、自底向上 我的答案:C 9、下列有关数据库的描述,正确的是()。 A、数据库是一个DBF文件 B、数据库是一个关系 C、数据库是一个结构化的数据集合 D、数据库是一组文件 我的答案:C 10、下列说法中,不属于数据模型所描述的内容的是()。 A、数据结构 B、数据操作 C、数据查询 D、数据约束 我的答案:A 11、若按功能划分,软件测试的方法通常分为白盒测试方法和(黑盒测试方法)。 12、数据库系统的三级模式分别为(级联)模式、内部级模式与外部级模式。 13、在最坏情况下,冒泡排序的时间复杂度为(N+1/2)。 14、在面向对象方法中,信息隐蔽是通过对象的(封装)性来实现的。 15、关系模型的数据操纵既是建立在关系上的数据操纵,一般有(插入)、增加、删除、和修改四种操作。 16、TIME()的返回值的数据类型是(String)类型。 17、编写SQL语句 1)、创建一张学生表,包含以下信息,学号,姓名,年龄,性别,家庭住址,联系电话 我的答案: create table student( studentCardNo number(2) primary key, name char(10), age number(2), sex char(2) check(sex in (‘男’,’女’)), address varchar2(100), tel number(2) ) 2)、修改学生表的结构,添加一列信息,学历 我的答案: alter table student add(xueli varchar2(20)); 3)、修改学生表的结构,删除一列信息,家庭住址 我的答案: alter table student drop column address; 4)、向学生表添加如下信息: 学号 姓名 年龄 性别 联系电话 学历 1 A 22 男 123456 小学 2 B 21 男 119 中学 3 C 23 男 110 高中 4 D 18 女 114 大学 我的答案: insert into student values(‘&1’,’&2’,’&3’); 一次一次添加 5)修改学生表的数据,将电话号码以11开头的学员的学历改为“大专” 我的答案: update student set xueli=”大专” where tel like 11%; 6)删除学生表的数据,姓名以C开头,性别为‘男’的记录删除 我的答案: delete student where name like C% or sex=”男”; 7)查询学生表的数据,将所有年龄小于22岁的,学历为“大专”的,学生的姓名和学号显示出来 我的答案: select name,studentCardNo from student where age<22 and xueli=”大专”; 8)查询学生表的数据,查询所有信息,列出前25%的记录 我的答案: select top*0.25 from student; 9)查询出所有学生的姓名,性别,年龄降序排列 我的答案: select name,sex,age from student where age desc; 10)按照性别分组查询所有的平均年龄 我的答案: select avg(age) from student group by sex; 18、什么是存储过程?为什么存储过程要比单纯的SQL语句执行起来要快? 我的答案: 存储过程算是一种优化查询需要比单存SQL语句执行的要快 19、两张关联表,删除主表中已经在副表中没有的信息 我的答案 delete from fubiao a where a.fid not in(select id from zhubiao) 20、程序题: 用1、2、2、3、4、5这六个数字,用java或你熟悉的语言,打印出所有不同的排列,如:512234、412345等,要求:“4”不能再第三位,“3”与“5”不能相连。并将这些数据按从小到大输出。 我的答案 我的写的不好 没贴下 笔试的时候没写全 21、String 和 StringBuffer的区别 我的答案 String定长 StringBuffer 变长 22、&和&&的区别 我的答案 &短路与 &&逻辑与 网上答案: & 是位运算符,表示按位与运算, && 是逻辑运算符,表示逻辑与(and)。 23、final,finally,finalize的区别 我的答案 Final静变量关键字,finally异常关键字,finalize 网上答案 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法, 可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 24、数组有没有length()这个方法?String有没有length()这个方法? 我的答案: 数组没有length()这个方法,有length的属性。 String有length()这个方法。 25、是否可以继承String类? 我的答案: 不可以 解释的很乱 26、说出数据连接池的工作机制是什么? 我的答案: 反正解释的很乱我感觉 27、垃圾回收的优点和原理。并考虑2种回收机制。 我的答案: 动态回收 解释的很乱 网上答案: Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解, 它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念, 只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。 垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有 使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。 回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。 28、你所知道的集合类都有哪些?区别?主要方法? 我的答案: Arraylist 非线性的、Vertor线性的 29、JSP的内置对象及方法。 我的答案: Page,exception,out,page content,application,request,reponse,session,config 30、页面间对象传递的方法。 我的答案: 那几个方法都写错了 31、你知道Request对象的主要方法有哪些? 32、J2EE是技术还是平台还是框架? 我的答案: J2EE是技术也是平台 网上答案: J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。 J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。 33、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种(例如GBK编码类型)编码的字符串? Request encording(“GBK”) 34、j2ee常用的设计模式?说明工厂模式。 Gof23种设计模式 工厂模式:Factory 网上答案: Java中的23种设计模式: Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式), Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式), Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式), Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式), Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式), Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式), Observer(观察者模式), State(状态模式), Strategy(策略模式), Template Method(模板方法模式), Chain Of Responsibleity(责任链模式) 工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例, 通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。 首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。 然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。 当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。 35、JSP四种会话跟踪技术 我的答案: Application cookie session 36、排序都有哪几种方法?请举例 冒泡 选择 快序 二分查找 网上答案: 排序的方法有:插入排序(直接插入排序、希尔排序), 交换排序(冒泡排序、快速排序), 选择排序(直接选择排序、堆排序), 归并排序,分配排序(箱排序、基数排序) 快速排序的伪代码。 //使用快速排序方法对a[ 0 :n- 1 ]排序 从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点 把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点 递归地使用快速排序方法对left 进行排序 递归地使用快速排序方法对right 进行排序 所得结果为l e f t + m i d d l e + r i g h t 37、关于模块间的设计原则? 规范要一样 38、项目过程一般是怎样的?你参加过几个项目开发?参加过的项目流程是怎样的?自己负责与人合作工作内容及自我评价? 从需求调研——设计开发——实施 参加过网站的实施 模板的制作 39、tomcat自动关闭常见原因? 我的答案: 现在没遇到过 40、如何设置TOMCAT内存和连接数? 我的答案: Tomcat群集 41、你如何理解Tomcat是什么? 我的答案: Tomcat是JSP Servlet 容器恰当的说 42、静态变量和实例变量的区别? 我的答案: 静态变量域用final修饰,每次都被调用 实例变量则不会 43、IE、FF下面CSS的解释区别 我的答案: 自己编的 44、web前端技术你了解哪些技术? 我的答案: JAVAScript,CSS,DIV,Ajax,Ajax框架,DWR,dojo,jguery 45、什么是报表?什么是报表控件,作用是什么?你了解哪些报表工具? 我的答案: 解释的很乱 46、你了解的那些统计图表类型? 我的答案: 自己编的 47、Flex与数据库连接的三种方式? 我的答案: 自己编的 ------------------------------------------------------- 我答错的、 错在哪里? 没答上的帮忙解答下? 感激了 !
java编程,我这段代码是在ecplise上实现的,但DEBUG都没问题,运行后却什么都没有弹出
Dubug上显示, <terminated>SLinkedList [Java Application] <terminated, exit value: 0>C:\Program Files\Java\jdk1.7.0_07\bin\javaw.exe (2013-5-7 下午8:46:10) 系统变量的Path为C:\Program Files\Java\jdk1.7.0_07\bin; classpath.;%JAVA_HOME%\lib; 以下为代码: @author Administrator * */ //java ADT import java.awt.*; class SLinkedList{//插入和删除操作分为头尾和中间,对于头,前一个为空,对于尾,后一个结点为空,需要分别对待. public class book{ protected int number; protected String title; protected String writer; protected double pricing; protected String publishinghouse; book next; //这便是一个指针,只不过它是引用. public book(int number,double pricing,String title,String writer,String publishinghouse) { this.number=number; this.pricing=pricing; this.title=title; this.writer=writer; this.publishinghouse=publishinghouse; this.next=null; } } protected book head,tail;//链表类的保护数据成员 public SLinkedList() { head = tail = null; } //创建空链表 public boolean isEmpty() { return head == null; } //判断链表是否为空 public void addToHead(int number,double pricing,String title,String writer,String publishinghouse) { head=new book(number,pricing,title,writer,publishinghouse); //创建头结点 if(tail==null) tail=head; } public void addToTail(int number,double pricing,String title,String writer,String publishinghouse) { if(!isEmpty()) {//若链表非空那么将为指针的next初始化为新元素 tail.next=new book(number,pricing,title, writer, publishinghouse); tail=tail.next; //以书号number作为标识符 }else { //如果为空则创建新的,并将头尾指向它 head=tail=new book(number,pricing,title,writer,publishinghouse); } } public void addFirst(int number,double pricing,String title,String writer,String publishinghouse) { book newNode=new book(number,pricing,title,writer,publishinghouse); newNode.next = head; head = newNode; } //表头插入节点,高效率,这是插入操作之一 public void addLast(int number,double pricing,String title,String writer,String publishinghouse) { book newNode = new book(number,pricing,title,writer,publishinghouse); book p = head; while (p.next != null) p = p.next;//一直到next到表尾 p.next = newNode; newNode.next = null; } //表尾插入结点,在表尾接一个 public void removeFirst() { if (!isEmpty()) head = head.next; else System.out.println("The list have been emptied!"); } //表头删除结点,只需让表头指向下一个结点 public void removeLast() { //prev为前一个结点的指针,curr为当前的指针 book prev = null, curr = head; //删除表尾的结点 while(curr.next != null) { prev = curr; curr = curr.next; if(curr.next == null) prev.next=null; //使前一个结点指向空,则原本的表尾结点便断开了 } }//removeLast public boolean insert(int appointednumber,int number,double pricing,String title,String writer,String publishinghouse) {//结点插入到链表某一位置 book prev = head, curr = head.next; book newNode; newNode = new book(number, pricing, title, writer, publishinghouse); if(!isEmpty()) { while( (curr!= null) && (appointednumber==curr.number) ) { //两个判断条件不能换 当前不为空,且指定num一致. prev = curr; curr = curr.next; //appointednumber为指定插入的位置 } newNode.next = curr;//新结点的next指针指向当前cur,即要插入的位置的下一个结点 prev.next = newNode; //cur指向了要插入的结点 return true; } return false; } public void remove(int number){//删除指定位置的结点 book curr=head; book prev=null; boolean found=false; while((curr!=null)&&(!found)) { if(number==curr.number ) { if(prev==null) removeFirst(); else prev.next=curr.next; found=true; } else{ prev=curr; curr=curr.next ;//未找到要删除的位置则继续找,指针后移 } }//while }//remove public book index(int number)//查询操作 { //用index确定要找的number book p; for(p=head;p!=null;p=p.next ){ if(p.number==number) return p; number++; } System.out.print("Error!"); return null;//找不到,返回-1 } public int Length(SLinkedList L){//返回链表长度 int l=0; book p=head; while(p.next!=null) { p=p.next ; l=l+1;} return l; } public void Insertsort(SLinkedList L) { //按关键字即number非递减排序 //对链表L作直接插入排序(不需要移动元素) book p=L.head.next; book q=L.head;//q为前面的,p为后面的 book ptr=null; if(!isEmpty()){ for(int j=2;j<=Length(L);j++) { if(p.number>q.number) p=p.next; else { ptr=L.head ; if(q==L.head) { book ptr0=head; while(ptr0.next!=q) {ptr0=ptr0.next ;} ptr0.next=p.next; p.next=q; //找到p结点的后一个结点,将p结点的前一个结点的指针指向p之后的那个结点 }//q为头结点,第一趟 while(ptr.next!=q) {ptr=ptr.next ;}//while book ptr1=q; while(ptr1.next !=p) {ptr1=ptr1.next; } ptr.next =p; ptr1.next=p.next; p.next=q; //换了指针,结点的next域没变,故结点位置也没变 book m=q; q=p; p=m; p=p.next;q=q.next; }//else }//for }//if else System.out.print("排序失败,记录为空");//-1表示为空,错误,不能排序 }//insert public book SelectMinKey(SLinkedList L,int i){//为了简单选择排序,返回最小的number book pt=L.head; book p1; while(i>1){ ; pt=pt.next; i--; } p1=pt.next; while(p1.next!=null){ if(pt.number>p1.number) {book s=p1;p1=pt;pt=s; } p1=p1.next; }//比pt所指number小的则交换,p1与ptr一直比较下去直到链表全部都已经比较过了 return pt; }//SelectMinKey public void Selectionsort(SLinkedList L) {//简单选择排序,堆排序是一维数组存储才比较方便 if(L.head==null) System.out.print("Error,linkedlist is empty!"); if(L.head.next==null) System.out.print("Okay!There is only one book"); //以上需要修饰,给出友好互动界面 for(int i=1;i<=Length(L);i++){ //仍以number作为关键字进行排序 book j=null;book p=L.head ; while(i>1){ ; p=p.next; i--; } j=SelectMinKey(L,i); if(p!=j) //链表结点的交换,只需改变指针,改变next域 { book j1=head; book j2=head; while(j1.next!=p){j1=j1.next ;}//利用两个指针j1j2储存指向p和j的next域 while(j2.next!=j){j2=j2.next ;} j1.next=p.next ;j2.next=j.next ;p.next=j2.next;j.next=j1.next ; } } } public static void main(String[] args) { Frame frm=new Frame("SlinkedList!"); frm.setSize(300,200); frm.setLocation(500, 400); Panel pan=new Panel(); pan.setSize(150,100); pan.setLocation(50,50); pan.setBackground(Color.gray ); Button bun=new Button("yes"); bun.setSize(80, 20); bun.setLocation(50, 50); bun.setBackground(Color.yellow ); frm.setLayout(null); pan.setLayout(null); pan.add(bun); frm.add(pan); SLinkedList L=new SLinkedList(); L.addToHead(00,80.2,"AB", "Steven", "xx publishinghouse"); L.index(00); } }//class SLinkedList
Maven 项目UTF-8编码问题
我在我电脑上的G:\AdobeCQ路径下面有两个相同的项目: BMWPDF PDFGeneration ![图片说明](https://img-ask.csdn.net/upload/201511/19/1447909321_791529.png) 以前我在BMWPDF项目中的POM.xml文件里面加了以下的语句: ``` <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> ``` 并且将这个项目Text file encoding 改为了UTF-8。做这个两个操作的目的是为了让这个项目能够支持在代码中写入中文字符。后来这样编译并没有什么问题,而且中文也能够顺利的输出到相对应的PDF中。 可是,昨天晚上大概11点半左右,我发现打开eclipse的时候出现了错误,提示“error shows in .metadata/.log”。项目打不开,我只好把.metadata文件删掉之后,重新打开eclipse,导入项目之后,用maven进行编译,出现以下的错误: [ERROR] Failed to execute goal org.apache.felix:maven-scr-plugin:1.7.4:scr (generate-scr-descriptor) on project bmwpdf-bundle: Execution generate-scr-descriptor of goal org.apache.felix:maven-scr-plugin:1.7.4:scr failed: syntax error @[861,2] in file:/G:/AdobeCQ/bmwpdf/bundle/src/main/java/com/bmw/pdf/generator/GeneratorProcess.java -> [Help 1] 看了具体的错误信息,我有点懵了。因为提示的错误文件中根本没有861行,最多859行。后来具体的去看错误信息,知道是因为这个文件存在中文引起的,但是我又不能讲中文去掉。于是,我只能想着碰运气,重新创建了一个项目PDFGeneration,代码一样,POM文件也是一样的。但是并没有改动项目配置中的Text file encoding,默认是GBK,这个时候,中文乱码,于是,我直接拷贝这些含有中文的文件内容到对应的新项目中。保存,编译,没有错误。运行包之后,只要是在代码中出现的中文字符,全部乱码。于是,我将Text file encoding改为UTF-8。编译之后同原来的项目一样,出现以下错误: [ERROR] Failed to execute goal org.apache.felix:maven-scr-plugin:1.7.4:scr (generate-scr-descriptor) on project bmwpdf-bundle: Execution generate-scr-descriptor of goal org.apache.felix:maven-scr-plugin:1.7.4:scr failed: syntax error @[861,2] in file:/G:/AdobeCQ/bmwpdf/bundle/src/main/java/com/bmw/pdf/generator/GeneratorProcess.java -> [Help 1] 于是我试着将POM文件中的以下内容去掉: ``` <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> ``` 并将Text file encoding改为GBK。保存,编译,运行,中文正常出现。 以上总结一下就是项目编码的问题导致的,最后改为默认的编码解决了。具体问题是代码中出现了中文字符,如何让这些中文字符输出到PDF中不出现乱码,就出现了要将项目配置中的编译POM文件进行相应的编码改动措施,然并卵,后来又改回去了。只是奇怪的是第一个项目做了两个月左右,一直没出错,从昨天开始就奇怪的出现因为编码出现的问题。 说实话,这个项目的编码问题花了我不少的时间,但终究还是没有弄得太懂,有的时候只能是凭着感觉去具体的解决问题。哎,这种感觉真是不爽。花时间去弄懂这个问题吧,其他的事情又是一大堆;不花时间吧,以后可能又是同样的问题。这也许就是程序员的无奈。
Hibernate软删除
问题描述: 先说数据库设计吧,系统中所有的实体表全部都有Status这个属性,Status这个属性的作用是来控制该记录是否已被删除(删除一个实体对象,只是将Status设置成false)。 由于使用了Hibernate,并且通过在Hibernate配置,一个实体类可以load起关联的其他实体。那么,正常情况下并不会有问题,但是当该实体对象持有的其他实体对象被删除了,那么逻辑上,该对象是不应该持有被删除后的对象,但由于,系统只是update了Status属性,而且关联关系仍然存在,并且这些关联关系是通过Hibernate来管理,无法通过(或者说我不想绕过)Hibernate进行删除。 例如,User类有Set<Role>属性,Hibernate在加载User对象的时候,也会将Set<Role>也加载好,而他们之间的关联关系是通过Hibernate来控制的。假设,用户test有三个角色:sales,finacer跟master。而master后来被删除了,也就是Status属性被设置成了false。但是,User与Role之间的关系,并没有因为master被删除了而消失,于是系统加载test对象的时候,仍然将master对象加载到内存中,这样明显是违背了逻辑,请问这种情况,如何通过Hibernate来解决。 User类: [code="java"] public class User extends BaseModel { /** * */ private static final long serialVersionUID = 613756860331359836L; private Integer userId; private String username; private String password; private Set<Role> roleSet; /** default constructor */ User() { } } [/code] Role类: [code="java"]public class Role extends BaseModel { /** * */ private static final long serialVersionUID = 2041913483578524972L; private Integer roleId; private String roleName; private String roleAlias; /** default constructor */ Role() { } }[/code] Mapping文件: User.hbm.xml [code="xml"] <hibernate-mapping default-access="field"> <class name="User" table="T_User"> <id name="userId" column="UserId" type="integer"> <generator class="native" /> </id> <property name="username" column="Username" type="string" length="50" not-null="true" update="false" /> <property name="password" column="Password" type="string" length="50" not-null="true" /> <!-- 用户持有的角色 --> <set name="roleSet" table="T_User_Role_Link" cascade="all" lazy="false"> <key column="UserId" /> <many-to-many column="RoleId" class="Role" outer-join="auto" /> </set> <!-- 创建人 --> <many-to-one name="creator" class="User" column="Creator" cascade="all" update="false" /> <!-- 创建时间 --> <property name="createTime" column="CreateTime" type="timestamp" update="false" /> <!-- 修改人 --> <many-to-one name="modifier" class="User" column="Modifier" cascade="all" /> <!-- 修改时间 --> <property name="modifyTime" column="ModifyTime" type="timestamp" /> <!-- 数据状态 --> <property name="status" column="Status" type="enums.type.StatusType" /> </class> </hibernate-mapping> [/code] Role.hbm.xml [code="xml"] <hibernate-mapping default-access="field"> <class name="Role" table="T_Role"> <cache usage="read-write" /> <id name="roleId" column="RoleId" type="integer"> <generator class="native" /> </id> <property name="roleName" column="RoleName" type="string" length="50" /> <property name="roleAlias" column="RoleAlias" type="string" length="50" /> <!-- 创建人 --> <many-to-one name="creator" class="User" column="Creator" cascade="all" update="false" /> <!-- 创建时间 --> <property name="createTime" column="CreateTime" type="timestamp" update="false" /> <!-- 修改人 --> <many-to-one name="modifier" class="User" column="Modifier" cascade="all" /> <!-- 修改时间 --> <property name="modifyTime" column="ModifyTime" type="timestamp" /> <!-- 数据状态 --> <property name="status" column="Status" type="enums.type.StatusType" /> </class> </hibernate-mapping>[/code] [b]问题补充:[/b] To cwx714, 可能你还是没有理解我的意思。我这样的配置,是全部交给Hibernate来做。也就是说,Hibernate返回的是一个完整的对象,而不是先返回一个单表的User对象,然后再根据与User关联的表中的值去找相应的其他实体的对象。即,从DAO取出来的User对象就已经包含了Set<Role>中所有的值。 [b]问题补充:[/b] 我希望是通过Hibernate来配置,而不是硬编码一堆的where语句。否则,这个根本就不是问题。 [b]问题补充:[/b] 而且,我对Role表是有进行缓存的,如果没有办法剔除那些Status=false的值,那么Hibernate还是要缓存所有的记录,这样,如果数据量少的话是没有问题,但是当数据量达到一定程度时,问题就大了。 [b]问题补充:[/b] To:phenom, 呵呵,我对hibernate实在不熟。但是在我的代码中,Role是没有Set<User>属性的,即,User跟Role是一对多的关系,但是,没有办法从Role获取到所有拥有该角色的User。也就是说,控制方在User这边。 按照你说的,那么,我如果要删除Role对象,我是不是要先查找所有拥有该角色的User,然后遍历列表,删除?
如何卸载assembly?或者class
.net的动态编译功能很好,但是有个问题,动态编译的代码,每次执行后,都会产生一个新的assembly,而且无法卸载。这个动态方法执行多次之后,就会慢慢的内存泄漏。因为每个assembly都会占用内存。 google了一下,没有发现满意的答案。唯一的答案就是,把assembly放到一个appdomain里,然后所在的appdomain卸载掉。但如果这样的话,所有的东西都得通过rpc调用了,效率非常低。 从原理上来说,已经加载的class,应该是可以卸载的。不知道是否有办法调用原生的api去卸载一个已经加载的assembly。 [b]问题补充:[/b] 我的问题是,需要实现一个脚本操作的功能,对已有的数据进行处理,并且用到linq查询,然后返回查询的结果。 查询的逻辑是未知的,由客户输入脚本来实现。查询的结果是一个二维表。但是希望查询结果返回的数据结构是自描述的。为了简化问题,就用了linq的匿名对象。 现在的做法,是用动态编译的方法,用CSharpCodeProvider动态编译客户输入的那段代码,产生一个CompilerResult,这个地方的问题的实质,是需要一个编译器。现在为了省事,就调用了c#的编译器,但是后果就是每次执行一个脚本,就会生成一个Assembly。长期执行下去,内存会慢慢变少。因此希望能将这个Assembley卸载。 Expresstion Tree比较麻烦,因为问题就是要做语法分析,如果已经成了Tree就不需要做了。 感谢RednaxelaFX兄的解答,我想xie卸载程序集还是有可能的。理由是:第一,有些.net代码保护工具,就可以让clr把已经加载的类卸载,防止别人dump整个程序集。第二,Dlr的类是动态生成的。如果无法卸载动态生成的类,等着它的必定是内存泄漏。 从编程语言的发展趋势看,总的趋势是越来越灵活。开始阶段,是针对硬件的汇编,然后是对硬件的具体实现有一定抽象作用的c语言,再到有oo特性的c++,然后是继承了GC和更过oo特性的java和c#。现在的趋势是,对编程语言本身进行编程,表现就是Aop和动态语言。 动态语言,它需要的除了动态编译以为,就是对把gc的特性扩展到类的类型本身。当一个类的代码不再被需要,它也可以被GC。我以为,动态的创建和销毁代码,也是非常必要的。它实际上是未来编程语言的一个方向。 [b]问题补充:[/b] 再次感谢RednaxelaFX兄的热情解答。使我明白DLR是怎么实现的。 ironpython是个好主意。可惜我要的不仅仅是脚本,还需要linq的查询结果。如果用ironPython的话,它返回给我的是个动态类型,虽然可以动态增加删除成员,奈何我还要对返回的数据进行处理。如果不是.net的数据控件支持的类型,我还得开发一堆数据控件或者adapter去支持它的类型,比较麻烦,我还没做好成为ironpython的开发人员的心理准备。最理想的办法,就是能卸载assembly。这样工作量就是最小的。其实,不卸载也是无所谓的,因为我可以把写好的脚本缓存起来,不必每次都生成新的assembly。客户也不会无聊到写很多脚本故意把它搞崩溃。 之所以研究这个问题,纯属心理上的洁癖,想让它有个更好的解决方案。 关于.net保护工具如何让已经加载的类重新被卸载的问题,我也不知道答案,作者也没有公布。因为这可能就是他保护技术的核心。我想,如果有办法能让程序回到一个程序集加载之前的状态,就算是完成了卸载操作。如果确信程序集不再被引用,那么应该有办法完成这个操作。不过,这一定需要非常了解clr的底层结构。 .net没有提供加载的类卸载的方法,只是出于安全性的理由,这个类可能被别的代码引用,卸载了它,就可能会出现野指针。 此外,如果类可以卸载,那么有些静态构造函数的语义,可能会被改变。因为重新加载类的时候,静态构造函数可能会再次执行。 如果类也增加引用计数之类的机制,那么,类本身也应该是可以被gc的。 既然代码可以动态的创建,那为什么不可以动态的删除?既然对对象的GC可以做到,那么对类型的GC,一样可以做到。这不过是编程语言设计者观念上的问题,不是不可逾越的障碍。 静态编译,不过是为了提高运行效率而已。如果效率可以接受,那静态编译对于编程思想的表达,并不是必须的。 也就是说,动态的产生类,动态的销毁类,完全是可行的。类也不过是数据而已。
请教一个JVM内存优化的问题
<p>自己写的一个WEB爬虫程序,程序方面的优化我自己感觉做的不错了,各种对象的使用都想办法不让内存浪费。 <br />但还是吃内存吃的很厉害 <br />我想主要的消耗在于,对于每一个爬下来的网页,都要变成String在内存中分析超链接,这个估计很大。 <br />另外对于每一个分析到的URL,都需要保存起来。 <br /><br /><br />我当前使用的内存优化参数如下 <br />-Xms1024M -Xmx1024M -Xmn512M -Xss128K -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:MaxPermSize=128M -XX:NewSize=128M -XX:MaxNewSize=128M -XX:SurvivorRatio=8 <br /><br />机器内存是1G。。上面那堆参数,除了最大最小堆内存我也是不求甚解,不是非常明白我设置了什么。网上搜答案也是五花八门,希望大家能推荐一个内存优化参数的文章 <br />另外我上面设置的参数有哪些方面可以优化,或者哪些地方写的不对。 <br /><br />核心的代码我都贴到下面:(我是刚入门的菜鸟,大家别笑话我写的差哦) <br /><br />这个是主类,负责控制,那个monitor大家就当做System.out.println,其实就是</p> <pre name="code" class="java">package com.wood.core; import java.util.concurrent.*; import java.util.*; import com.wood.core.monitor.*; public class CrawlerController implements Runnable { //一个类,用来管理URL,由各抓取线程共享 private URLMap urlmap; //已成功处理URL总数 private int count; //目标完成任务总数 private int total; //管理所有的抓取线程,必要时进行关闭,由于抓取线程存在I/O读取,而I/0读取中的线程是不可中断的,需调用线程的cancel函数 private Crawler[] crawlers; //线程工厂,可以监视产生的线程工作状态 private CrawlerFactory factory; //线程数目 private int threadMax; //当前活动线程 private int threadActive; //线程执行器 private ExecutorService exec; //当系统关闭时取消 private boolean canceled; public CrawlerController(String seed) { this(seed,20,10000); } public CrawlerController(List&lt;string&gt; seeds) { this(seeds,20,10000); } public CrawlerController(String seed,int threadNum) { this(seed,threadNum,10000); } public CrawlerController(List&lt;string&gt; seeds,int threadNum) { this(seeds,threadNum,10000); } public CrawlerController(String seed,int threadNum,int total) { //初始化URLMap,保存抓取启始位置 urlmap=new URLMap(seed); init(threadNum, total); } public CrawlerController(List&lt;string&gt; seeds,int threadNum,int total) { urlmap=new URLMap(seeds); init(threadNum, total); } //构造 private void init(int threadNum,int total) { //初始完成URL总数为0 count=0; //设置目标完成总数 this.total=total; threadMax=threadNum; threadActive=threadNum; //初始化工作线程 crawlers=new Crawler[threadMax]; String id="Crawler "; for(int i=0;i&lt;threadmax;i++) crawlers[i]="new" crawler(id+(i+1),this,urlmap);="" factory="new" crawlerfactory();="" exec="Executors.newCachedThreadPool(factory);" canceled="false;" }="" 检查当前工作线程状态,并打印系统状态="" private="" boolean="" check()="" {="" if(canceled)="" return="" false;="" int="" count="getCount();" if(count=""&gt;total) { MonitorHolder.getMonitor().print("已抓取"+COUNT+"页面,完成目标任务"+total+"页面\n"); cancel(); return false; } threadActive=factory.getActive(); /*if(threadActive&lt;=0) { MonitorHolder.getMonitor().print("无活动工作线程,抓取任务提前结束\n"); cancel(); return false; }*/ MonitorHolder.getMonitor().print_status("统计信息:成功抓取"+COUNT+"页面,当前活动线程为"+threadActive+"个\n"); return true; } //结束抓取 public void cancel() { //调用每个抓取线程的离开方法 for(Crawler cw:crawlers) cw.cancel(); //销毁工厂 factory.destory(); exec.shutdownNow(); MonitorHolder.getMonitor().print("成功结束抓取工作,共抓取"+getCount()+"页面\n"); this.canceled=true; } public synchronized void count() { count++; } public synchronized int getCount() { return count; } public int getTotal() { return total; } public URLMap getMap() { return urlmap; } @Override public void run() { while(!Thread.currentThread().isInterrupted() &amp;&amp; !canceled) { try { MonitorHolder.getMonitor().print("初始化完毕\n"); MonitorHolder.getMonitor().print("开始抓取工作\n"); for(Crawler cw:crawlers) exec.execute(cw); int check_count=0; while (check()){ TimeUnit.SECONDS.sleep(5); check_count++; if(check_count==24) { //每2分钟把待处理URL队列打乱一次 urlmap.shuffle(); MonitorHolder.getMonitor().print("控制信息!!!待抓取URL顺序将打乱\n"); check_count=0; System.gc(); } } } catch (InterruptedException e) { MonitorHolder.getMonitor().print("抓取工作被中断\n"); cancel(); } } } public static void main(String[] args) { List&lt;string&gt; seeds=new ArrayList&lt;string&gt;(15); //问问的各个分类 seeds.add("http://wenwen.soso.com/"); seeds.add("http://wenwen.soso.com/z/c1879048192.htm"); seeds.add("http://wenwen.soso.com/z/c1090519040.htm"); seeds.add("http://wenwen.soso.com/z/c1627389952.htm"); seeds.add("http://wenwen.soso.com/z/c855638016.htm"); seeds.add("http://wenwen.soso.com/z/c1191182336.htm"); seeds.add("http://wenwen.soso.com/z/c1191182336.htm"); seeds.add("http://wenwen.soso.com/z/c620756992.htm"); seeds.add("http://wenwen.soso.com/z/c553648128.htm"); seeds.add("http://wenwen.soso.com/z/c385875968.htm"); seeds.add("http://wenwen.soso.com/z/c687865856.htm"); seeds.add("http://wenwen.soso.com/z/c16777216.htm"); seeds.add("http://wenwen.soso.com/z/c318767104.htm"); seeds.add("http://wenwen.soso.com/z/c150994944.htm"); seeds.add("http://wenwen.soso.com/z/c922746880.htm"); seeds.add("http://wenwen.soso.com/z/c83886080.htm"); CrawlerController controller=new CrawlerController(seeds,5,2000000); List&lt;string&gt; format=new ArrayList&lt;string&gt;(10); //问问回答问题的格式 format.add("http://wenwen.soso.com/z/q"); controller.getMap().addLimit(format); Thread thread=new Thread(controller); thread.start(); } } </pre> <p><br /></p> <pre name="code" class="java">package com.wood.core; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.regex.*; import java.io.*; import java.net.*; import com.wood.core.monitor.*; public class Crawler implements Runnable { //抓取线程ID private String id; //控制器 private CrawlerController controller; //URL,供各线程共享 private URLMap urlmap; private boolean canceled; //保存抓取的网页内容,用于分析超链接 private String content; //字符集 private String charset; //匹配超链接的正则表达式 private String link_reg="&lt;a\\s+(.*?)href\\s*=\\s*\"?(.*?)[\"(\\s*?)](.*?)&gt;"; private Pattern link_pattern=Pattern.compile(link_reg,Pattern.CASE_INSENSITIVE); //匹配字符集的正则表达式 private String charset_reg="&lt;meta\\s+http-equiv=\"content-type\"\\s+content=\"text html;="" charset="(.*?)\&amp;quot;(.*?)"&gt; "; private Pattern charset_pattern=Pattern.compile(charset_reg, Pattern.CASE_INSENSITIVE); private Pattern dir_path_pattern=Pattern.compile("^\\w+$", Pattern.CASE_INSENSITIVE); //保存当前抓取的URL的主机 private String host; //生成待建立的文件夹名 private String host_path; //抓取网页的根目录 private String root_path="E:\\web"; private File root_dir=new File(root_path); //输入来自URL,输出到文件 private InputStreamReader in=null; private OutputStreamWriter out=null; //输入输出缓冲区 private char[] buf=new char[10240]; //网页内容缓冲区 private StringBuilder contentbuilder=new StringBuilder(1024*1024); //通过一个URL,下载网页内容 private void download(URL url) { in=null; out=null; //建立抓取文件 String urlfile=url.getFile(); if(urlfile.endsWith("/")) urlfile+="indexindex"; File file=new File(host_path,urlfile); File file_dir=new File(file.getParent()); if(!file_dir.exists()) file_dir.mkdirs(); MonitorHolder.getMonitor().print(id+"开始准备下载"+url.toString()+"\n"); try { //打开链接 URLConnection conn=url.openConnection(); //超时30秒 conn.setConnectTimeout(30000); conn.setDoOutput(true); //不是HTML不下载 /*String type=conn.getContentType(); if( (type==null)|| (!type.equals("text/html")) ) return;*/ //将网页内容的缓冲区清空 contentbuilder.setLength(0); in=new InputStreamReader(conn.getInputStream(),charset); out=new OutputStreamWriter(new FileOutputStream(file),charset); int len; //读取网页内容,并写入文件,保存到网页内容缓冲里面 while((len=in.read(buf, 0, 10240)) &gt;0) { out.write(buf, 0, len); //append可以减小系统损耗 contentbuilder.append(buf, 0, len); } out.flush(); //将网页内容缓冲区的内容读到content中,用于分析 content=null; content=contentbuilder.toString(); } catch (IOException e) { MonitorHolder.getMonitor().print("错误!!!"+id+"下载页面"+url.toString()+"错误\n"); } finally{ try { if(in!=null) in.close(); if(out!=null) out.close(); } catch (IOException e) { } in=null; out=null; } } public Crawler(String id,CrawlerController controller,URLMap urlmap) { this.id=id; this.controller=controller; this.urlmap=urlmap; this.charset="utf-8"; canceled=false; MonitorHolder.getMonitor().print(id+"就绪\n"); } //设置字符集,通过正则表达式获取字符集格式 //为了性能,该功能并未使用 private void setCharset() { Matcher matcher=charset_pattern.matcher(content); String CHARSET="GB2312"; if(matcher.find()) CHARSET=matcher.group(1).trim(); this.charset=CHARSET; try { content=new String(content.getBytes("GB2312"),CHARSET); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } //从网页内容中分析超链接 private List&lt;string&gt; retrieveLinks(URL url) { List&lt;string&gt; urls=new LinkedList&lt;string&gt;(); if(content==null) return urls; Matcher matcher=link_pattern.matcher(content); String link; String host_reg="http://"+host; String host_nowww; if(host.contains("www")) host_nowww=host.substring(host.lastIndexOf("w")+2); else { host_nowww=host; } while(matcher.find()) { //通过抓取第1组的内容 link=matcher.group(2).trim().toLowerCase(); if (link.length() &lt; 1) { continue; } //网页内部链接,忽略 if (link.charAt(0) == '#') { continue; } //发送邮件链接,忽略 if (link.indexOf("mailto:") != -1) { continue; } if (link.toLowerCase().indexOf("javascript") != -1) { continue; } //分析绝对地址或相对地址 if (link.indexOf("://") == -1){ if (link.charAt(0) == '/') //处理绝对地址 link = "http://" + host+ link; else if(link.startsWith("./")) link="http://" + host+ link.substring(1); else { String file = url.getFile(); String file_path=file.substring(0, file.lastIndexOf('/')); while(link.startsWith("../")) { link=link.substring(link.indexOf("/")+1); file_path=file_path.substring(0, file_path.lastIndexOf("/")); } link="http://"+host+file_path+"/"+link; } } int index = link.indexOf('#'); if (index != -1) { link = link.substring(0, index); } if(!urlmap.testHost(link)) continue; if(!urlmap.testLimit(link)) continue; urls.add(link); } return urls; } //设置主机并建立目录 private void setHost(String host) { this.host=host; this.host_path=root_path+"\\"+host; File host_dir=new File(host_path); if(!host_dir.exists()) host_dir.mkdirs(); } @Override public void run() { if(!root_dir.exists()) root_dir.mkdirs(); while(!Thread.currentThread().isInterrupted() &amp;&amp; !canceled &amp;&amp; (controller.getCount()&lt;controller.gettotal()) )="" {="" try="" {="" 获得一个待抓取的url,如果没有可用url,则进入阻塞状态,该方法调用是线程安全的="" string="" urlstring="urlmap.getURL();" monitorholder.getmonitor().print(id+"开始抓取"+urlstring+"\n");="" 建立url="" url="" url="new" url(urlstring);="" 设置主机="" sethost(url.gethost());="" 清空网页内容,并下贼="" content="null;" download(url);="" 未下载到内容="" if(content="=null)" {="" continue;="" }="" monitorholder.getmonitor().print(id+"抓取"+urlstring+"完毕,进行解析\n");="" setcharset();="" 分析超链接="" list&lt;string=""&gt; urls=retrieveLinks(url); //将分析到的超连接加入到待抓取的URL队列中,并将成功抓取数+1 urlmap.addAll(urls); controller.count(); MonitorHolder.getMonitor().print(id+"解析"+urlstring+"完毕,共计"+urls.size()+"个超链接,开始新任务\n"); content=null; TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { MonitorHolder.getMonitor().print(id+"被中断\n"); canceled=true; } catch (MalformedURLException e) { MonitorHolder.getMonitor().print(id+"报告:URL格式错误\n"); }catch (Exception e) { e.printStackTrace(); } } } //退出,由控制器调用,关闭所有底层I/O资源 public void cancel() { try { if(in!=null) in.close(); } catch (IOException e) { } try { if(out!=null) out.close(); } catch (IOException e) { e.printStackTrace(); } MonitorHolder.getMonitor().print(id+"停止工作\n"); canceled=true; } } </pre> <p> </p> <pre name="code" class="java">package com.wood.core; import java.net.MalformedURLException; import java.net.URL; import java.util.concurrent.*; import java.util.*; public class URLMap { //待抓取的URL队列 private LinkedList&lt;string&gt; URLQueue; //缓存解析出来的URL,使用Hash方便快速查找,&lt;k,false&gt;表示未抓取,&lt;k,true&gt;表示抓取结束 private HashMap&lt;string,boolean&gt; cachedURL; private HashSet&lt;string&gt; hosts; private HashSet&lt;string&gt; format_limit; //默认构造器,初始化队列,集合 private URLMap() { URLQueue=new LinkedList&lt;string&gt;(); cachedURL=new HashMap&lt;string,boolean&gt;(50000); hosts=new HashSet&lt;string&gt;(20); format_limit=new HashSet&lt;string&gt;(20); } public URLMap(List&lt;string&gt; seeds) { this(); for(String s:seeds) cachedURL.put(s, false); URLQueue.addAll(seeds); for (String string : seeds) { try { URL test=new URL(string); String host=test.getHost(); hosts.add(host); } catch (MalformedURLException e) { e.printStackTrace(); } } } public URLMap(String seed) { this(); cachedURL.put(seed, false); URLQueue.add(seed); try { URL test=new URL(seed); hosts.add(test.getHost()); } catch (MalformedURLException e) { e.printStackTrace(); } } //将解析出来的URL添加到URLMap中,如果有重复则忽略,URL有效性由外部保证,该方法是线程安全的 public synchronized void addURL(String url) throws InterruptedException { //如果该URL已存在,忽略该URL if(cachedURL.keySet().contains(url)) return; cachedURL.put(url, false); URLQueue.add(url); //有可用URL,唤醒所有阻塞线程 notifyAll(); } //将解析出来的URL添加到URLMap中,如果有重复则忽略,URL有效性由外部保证,该方法是同步的 public synchronized void addAll(List&lt;string&gt; urls) throws InterruptedException { for (String url : urls) { if(cachedURL.keySet().contains(url)) continue; cachedURL.put(url,false); URLQueue.add(url); } notifyAll(); } //从当前URL队列中获取一个URL,如果当前队列无可用URL,则该线程进入阻塞状态 public synchronized String getURL() throws InterruptedException { //该处进入阻塞 while(URLQueue.size()==0) wait(); //将其从队列中删除 String url=URLQueue.remove(); cachedURL.put(url, true); return url; } public boolean testHost(String host) { for(String host_allow:hosts) { if(host.contains(host_allow)) return true; } return false; } public void addHost(List&lt;string&gt; l) { hosts.addAll(l); } public void addLimit(List&lt;string&gt; l) { format_limit.addAll(l); } public boolean testLimit(String url) { if(format_limit.size()==0) return true; else { for(String s:format_limit) if(url.contains(s)) return true; } return false; } //将待抓取队列打乱 private int swap_check=0; public synchronized void shuffle() { swap_check++; int size=URLQueue.size(); if(size&lt;1000) { java.util.Collections.shuffle(URLQueue); swap_check=0; } else { if(size&gt;=1000 &amp;&amp; size&lt;5000) { if(swap_check==5) { java.util.Collections.shuffle(URLQueue); swap_check=0; } } else { if(swap_check==15) { java.util.Collections.shuffle(URLQueue); swap_check=0; } } } } } </pre> <p><br /><br />附件里是内存使用情况<br /><strong>问题补充</strong><br />主要占用内存的是char[] <br />我的策略是所有分析到的有效URL都存储在HashMap中 <br />但是几万个URL不至于占用大多数内存吧? <br />我的工作线程只有5个,设置的多了,一会就崩了 <br /><br />哪位高人路过,帮我看眼吧 <br />祝你新年好运~</p> <p> </p> <p>附件里是内存占用,缓存的URL总数是20000个,一个大概占用80B,程序内存总数是150MB</p> <p>我不知道到底是什么东西不停的吃内存,回收不掉,程序运行的时间越长,线程数越多,内存吃的越快</p>
请大家帮忙看看我的json数据和struts2后台交互的问题
搞了很久,就是不出数据,快崩溃了,action中System.out.println();没问题,json的格式也是正确的,但在js里面就是死活取不到,请大家帮忙看看,谢谢了!! <br />js: <br />Ext.onReady(function(){ <br />&nbsp;&nbsp;&nbsp; var ds = new Ext.data.JsonStore({ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy : new Ext.data.HttpProxy({url:'List.action',method:'POST'}), <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader: new Ext.data.JsonReader({ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; successProperty: "successproperty", <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; totalProperty: 'totalProperty', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root: 'root', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fields: [ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'userId','userName','password','email' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ] <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }) <br />&nbsp;&nbsp;&nbsp; }); <br />&nbsp;&nbsp;&nbsp; //alert(ds.getCount()) ;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; //alert(ds.getAt(0).get("userName")) ; <br />&nbsp;&nbsp;&nbsp; var colModel = new Ext.grid.ColumnModel([ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {id:'title',header:'ID',width:50,sortable:true,dataIndex:'userId'}, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {header:'用户名', width:100,sortable:true,dataIndex:'userName'}, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {header:'密码明码',width:100,sortable:true,dataIndex:'password'}, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {header:'电子邮件',width:100,sortable:true,dataIndex:'email'} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]); <br />&nbsp;&nbsp;&nbsp; var tb = new Ext.Toolbar("north-div"); <br />&nbsp;&nbsp;&nbsp; tb.add({ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text: '添加', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tooltip:'Add a new row', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iconCls:'add', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handler: newUser <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text: '编辑', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tooltip:'edit a new row', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iconCls:'option', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handler: editUser <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text: '删除', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tooltip:'delete a new row', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iconCls:'remove', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handler: delUser <br />&nbsp;&nbsp;&nbsp; }); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; var grid = new Ext.grid.GridPanel({ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; border:false, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; region:'south', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; height:500, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loadMask: true, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; el:'center', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title:'用户列表', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; store: ds, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cm: colModel, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; autoScroll: true, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bbar: new Ext.PagingToolbar({ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageSize: 20, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; store: ds, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; displayInfo: true, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; displayMsg: '第{0} 到 {1} 条数据 共{2}条', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emptyMsg: "没有数据" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }); <br />&nbsp;&nbsp;&nbsp; var viewport = new Ext.Viewport({ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; layout:'border', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; items:[{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; border:false, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; region:'north', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contentEl:'north-div', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tbar:tb, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; height:26 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grid <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]} <br />&nbsp;&nbsp;&nbsp; ); <br />&nbsp;&nbsp;&nbsp; ds.load({params:{start:0, limit:20}}); <br />}); <br /> <br />action: <br /> <br />package part1.action; <br /> <br />import java.io.PrintWriter; <br />import java.util.List; <br />import java.util.Map; <br /> <br />import javax.servlet.http.HttpServletRequest; <br />import javax.servlet.http.HttpServletResponse; <br /> <br />import net.sf.json.JSONArray; <br />import net.sf.json.JSONObject; <br /> <br />import org.apache.struts2.ServletActionContext; <br /> <br />import part1.model.Appuser; <br /> <br />import com.opensymphony.xwork2.ActionContext; <br /> <br />public class ListAction extends BaseAction { <br /> <br /> String jsonString; <br /> <br /> public String getJsonString() { <br /> return jsonString; <br /> } <br /> <br /> public void setJsonString(String jsonString) { <br /> this.jsonString = jsonString; <br /> } <br /> <br /> public String execute() throws Exception{ <br /> <br /> ActionContext ctx = ActionContext.getContext(); <br /> Map session = ActionContext.getContext().getSession(); <br /> HttpServletRequest request = (HttpServletRequest)ctx.get(ServletActionContext.HTTP_REQUEST); <br /> HttpServletResponse response = (HttpServletResponse)ctx.get(ServletActionContext.HTTP_RESPONSE); <br /> response.reset(); <br /> response.setCharacterEncoding("utf-8"); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //PrintWriter pw = response.getWriter(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List appusers = null; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; appusers = mgr.getAppusers(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSONArray array = new JSONArray(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSONObject json = new JSONObject(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(appusers != null &amp;&amp; appusers.size() &gt; 0){ <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;appusers.size();i++){ <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSONObject row = new JSONObject(); <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Appuser user_temp = (Appuser)appusers.get(i); <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row.put("userId",user_temp.getUserId()); <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row.put("userName", user_temp.getUserName()); <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row.put("password",user_temp.getPassword()); <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row.put("email", user_temp.getEmail()); <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array.add(row); <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; json.put("successproperty", true); <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; json.put("totalProperty", appusers.size()); <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; json.put("root", array); <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.jsonString = json.toString(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "sucess"; <br /> } <br /> <br />} <br /> <br /><br /><strong>问题补充:</strong><br />{"successproperty":true,"totalProperty":1,"root":[{"userId":1,"userName":"sa","password":"1","email":"1@1.1"}]} <br />这个是System.out.println(jsonString);打出来的 <br /> <br />我把response.getWriter().println(jsonString);加上了也是没数据,才开始研究ext没多久,谢谢回贴!<br /><strong>问题补充:</strong><br />fields: [ <br />&nbsp;&nbsp;&nbsp; {'userId'},{'userName'},{'password'},{'email'} <br />&nbsp;&nbsp; ] 这样子加上报错- -++<br /><strong>问题补充:</strong><br />各位看看啦!!~~<br /><strong>问题补充:</strong><br />我在js里面加这么一句: <br />ds.on('loadexception',function(t,o,a,e){alert('ex = '+e+',this = '+t+',o = '+o+',a = '+a);}); <br />其中e打出来是[Object Error] <br />不知道是什么原因?<br /><strong>问题补充:</strong><br />目前页面上可以打出json的字符串{"root":[{"userId":1,"userName":"sa","password":"1","email":"1@1.1"}],"totalProperty":1,"successproperty":true} <br />但跳不到jsp里面了。。<br /><strong>问题补充:</strong><br />我的意思是,现在页面只打出个json字符串,不显示表格什么其他的元素了<br /><strong>问题补充:</strong><br />我的就是先访问List.action然后打算进入List.jsp显示action取出的数据呀 <br />但打出的就是一堆数据串,页面出不来<br /><strong>问题补充:</strong><br />试了把successproperty去掉,把JsonStore换成Ext.data.Store还是只打出字串。。<br /><strong>问题补充:</strong><br />好像和region:"center"也没什么关系,现在的唯一问题是不出页面- -|| <br />谢谢两位回贴!<br /><strong>问题补充:</strong><br />我如果先要访问一个action去取数据,然后在跳到一个jsp页面显示数据,这么写对么?<br /><strong>问题补充:</strong><br />请把你第一个item内容取得,再把grid的region设置为center,你的页面就可以出现。 <br /> <br />--------这句话没懂- -|| <br /><br /><strong>问题补充:</strong><br />是直接写 <br />var viewport = new Ext.Viewport({ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grid <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]} <br />&nbsp;&nbsp;&nbsp; ); 吗?<br /><strong>问题补充:</strong><br />目前我的访问流程是:login.html-&gt;submit-&gt;LoginAction-&gt;success后返回login.html-&gt;再进入ListAction-&gt;list.jsp <br />这个要是用extjs看的话是不是有问题?<br /><strong>问题补充:</strong><br />grid中region设置为center也是不显示页面,只有数据- - <br /> <br />{"root":[{"userId":1,"userName":"sa","password":"1","email":"1@1.1"},{"userId":2,"userName":"1","password":"1","email":"1"},{"userId":3,"userName":"2","password":"2","email":"2"},{"userId":4,"userName":"3","password":"3","email":"3"},{"userId":5,"userName":"4","password":"4","email":"4"},{"userId":6,"userName":"5","password":"5","email":"5"},{"userId":7,"userName":"6","password":"6","email":"6"},{"userId":8,"userName":"7","password":"7","email":"7"},{"userId":9,"userName":"8","password":"8","email":"8"},{"userId":10,"userName":"9","password":"9","email":"9"}],"totalProperty":10} <br /> <br /> <br />我去吃点东西,一会回来,非常感谢!<br /><strong>问题补充:</strong><br />tb那段是需要在jsp里面加上 <br />&lt;div id="north-div"&gt;&lt;/div&gt; <br />这一行~ <br /> <br />现在问题就是如果我先访问list.action,然后return null; <br />就直接打出字符串,没进jsp- -<br /><strong>问题补充:</strong><br />晕,有点乱了。。。我才接触extjs没多久 <br /> <br />我的意思是,我要在数据库里取一个list,显示在jsp上,如果是struts或者是struts2的话就是先访问ListAction取数据,然后mapping转向到jsp,页面就出来了。 <br />但Extjs也是如此吗?我有点晕了。。<br /><strong>问题补充:</strong><br />我把js改了一个简单的 <br />Ext.onReady(function(){ <br />&nbsp;&nbsp;&nbsp; Ext.BLANK_IMAGE_URL = 'extjs/resources/images/default/s.gif'; <br />&nbsp;&nbsp;&nbsp; Ext.QuickTips.init(); <br />&nbsp;&nbsp;&nbsp; var sm = new Ext.grid.CheckboxSelectionModel(); <br />&nbsp;&nbsp;&nbsp; var cm = new Ext.grid.ColumnModel([ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Ext.grid.RowNumberer(), <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {header:'编号',dataIndex:'userId',sortable:true}, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {header:'用户名',dataIndex:'userName'}, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {header:'密码',dataIndex:'password'}, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {header:'电子邮件',dataIndex:'email'} <br />&nbsp;&nbsp;&nbsp; ]); <br />&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; var ds = new Ext.data.Store({ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy: new Ext.data.HttpProxy({url:'List.action'}), <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader: new Ext.data.JsonReader({ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root: 'root', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; totalProperty: 'totalProperty' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, [ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {name: 'userId',mapping:'userId',type:'int'}, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {name: 'userName',mapping:'userName',type:'string'}, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {name: 'password',mapping:'password',type:'string'}, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {name: 'email',mapping:'email',type:'string'} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]) <br />&nbsp;&nbsp;&nbsp; }); <br /> <br />&nbsp;&nbsp;&nbsp; var grid = new Ext.grid.GridPanel({ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; el: 'center', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ds: ds, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm: sm, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cm: cm, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width:700, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; height:280, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bbar: new Ext.PagingToolbar({ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageSize: 10, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; store: ds, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; displayInfo: true, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emptyMsg: "没有记录" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }) <br />&nbsp;&nbsp;&nbsp; }); <br /> <br />&nbsp;&nbsp;&nbsp; grid.render(); <br />&nbsp;&nbsp;&nbsp; ds.load({params:{start:0, limit:10}}); <br />&nbsp;&nbsp;&nbsp; ds.load({callback:function(records,success,totalRecords){alert('records = '+records);}}); <br />}); <br /> <br /> <br /> <br />但是也不好用- -|不知道哪里有问题<br /><strong>问题补充:</strong><br />问题好像解决了,我把ListAction查询数据的代码一起写到了LoginAction里,然后如果登录成功的话就window.location = 'List.jsp';终于出数据了! <br />谢谢两位!!非常感谢!!!
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
【资源】一个C/C++开发工程师的学习路线(已经无路可退,唯有逆风飞翔)【内附资源页】
声明: 1)该文章整理自网上的大牛和专家无私奉献的资料,具体引用的资料请看参考文献。 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。 3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 4)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。大家都共享一点点,一起为祖国科研的推进...
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
20道你必须要背会的微服务面试题,面试一定会被问到
写在前面: 在学习springcloud之前大家一定要先了解下,常见的面试题有那块,然后我们带着问题去学习这个微服务技术,那么就会更加理解springcloud技术。如果你已经学了springcloud,那么在准备面试的时候,一定要看看看这些面试题。 文章目录1、什么是微服务?2、微服务之间是如何通讯的?3、springcloud 与dubbo有哪些区别?4、请谈谈对SpringBoot 和S...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
2020 年,大火的 Python 和 JavaScript 是否会被取而代之?
Python 和 JavaScript 是目前最火的两大编程语言,但是2020 年,什么编程语言将会取而代之呢? 作者 |Richard Kenneth Eng 译者 |明明如月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: Python 和 JavaScript 是目前最火的两大编程语言。然而,他们不可能永远屹立不倒。最终,必将像其他编程语言一...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
神级宝库!GitHub 标星 1.2w+,Chrome 最天秀的插件都在这里啦!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个沉迷 Chrome 不能自拔的蒟蒻… 作为一个在远古时代用过什么 IE、360、猎豹等浏览器的资深器哥,当我第一次了解 Chrome 的时候,就被它的美貌给吸引住了… 就在我用了一段时间之后,我坚决的卸载了电脑上其它碍眼的浏览器,并觉得在之前的搬砖生涯中,我不配当哥,我只配是个沙雕… ...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
张朝阳回应迟到 1 分钟罚 500:资本家就得剥削员工
loonggg读完需要2分钟速读仅需 1 分钟大家我,我是你们的校长。前几天,搜狐的董事局主席兼 CEO 张朝阳和搜狐都上热搜了。原因很简单,就是搜狐出了“考勤新规”。一封搜狐对员工发布...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
从顶级黑客到上市公司老板
一看标题,很多老读者就知道我在写什么了。今天Ucloud成功上市,季昕华成为我所熟悉的朋友里又双叒叕一个成功上市的案例。我们认识大概是十五年多吧,如果没记错,第一次见面应该是2004年,...
世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?
点击上方蓝字设为星标下面开始今天的学习~今天分享四个代码量很少,但很牛逼很经典的算法或项目案例。1、no code 项目地址:https://github.com/kelseyhight...
​两年前不知如何编写代码的我,现在是一名人工智能工程师
全文共3526字,预计学习时长11分钟 图源:Unsplash 经常有小伙伴私信给小芯,我没有编程基础,不会写代码,如何进入AI行业呢?还能赶上AI浪潮吗? 任何时候努力都不算晚。 下面,小芯就给大家讲一个朋友的真实故事,希望能给那些处于迷茫与徘徊中的小伙伴们一丝启发。(下文以第一人称叙述) 图源:Unsplash 正如Elsa所说,职业转换是...
强烈推荐10本程序员必读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
作为一个程序员,内存的这些硬核知识你必须懂!
我们之前讲过CPU,也说了CPU和内存的那点事儿,今天咱就再来说说有关内存,作为一个程序员,你必须要懂的哪那些硬核知识! 大白话聊一聊,很重要! 先来大白话的跟大家聊一聊,我们这里说的内存啊,其实就是说的我们电脑里面的内存条,所以嘞,内存就是内存条,数据要放在这上面才能被cpu读取从而做运算,还有硬盘,就是电脑中的C盘啥的,一个程序需要运行的话需要向内存申请一块独立的内存空间,这个程序本身是存放在...
非典逼出了淘宝和京东,新冠病毒能够逼出什么?
loonggg读完需要5分钟速读仅需 2 分钟大家好,我是你们的校长。我知道大家在家里都憋坏了,大家可能相对于封闭在家里“坐月子”,更希望能够早日上班。今天我带着大家换个思路来聊一个问题...
牛逼!一行代码居然能解决这么多曾经困扰我半天的算法题
春节假期这么长,干啥最好?当然是折腾一些算法题了,下面给大家讲几道一行代码就能解决的算法题,当然,我相信这些算法题你都做过,不过就算做过,也是可以看一看滴,毕竟,你当初大概率不是一行代码解决的。 学会了一行代码解决,以后遇到面试官问起的话,就可以装逼了。 一、2 的幂次方 问题描述:判断一个整数 n 是否为 2 的幂次方 对于这道题,常规操作是不断这把这个数除以 2,然后判断是否有余数,直到 ...
立即提问