学java 中碰到的问题
一、myeclipse中部署的时候看不到项目的问题
问题描述: 点击myeclipse的项目部署, 发现在project下拉框里没有想要部署的项目
一开始我想将ispserver项目发布到tomcate里但是在project下拉列表里没有ispserver这个项目的
名字。
解决方法:
右键点击该项目,选择myeclipse---> Add Web project Capabilities (添加web项目)
二、formbean的属性得不到值
问题描述:在struts项目一个实现用户登录的功能.在action中调用actioniForm 的getPassword方法
得到提交的密码。但是得到的值一直为空。
解决方法:
public class LoginForm extends ActionForm { private String password; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
loginForm 中的属性password必须和html中的名一致。
<input type=”text” name=”password”>
必须要有getXXX和setXXX方法。
三、md5加密
package com.student.common.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5 { public static String md5(String input ) { MessageDigest md5; String result = ""; try { //加密 md5 = MessageDigest.getInstance("Md5"); md5.update(input.getBytes()); //字节转换成字符串 result = new sun.misc.BASE64Encoder().encode(md5.digest()); /*sun.misc.BASE64Encoder().encode()在jdk中是没有的,这是sun内部用的方法。 有可能你的jdk中没有。被SUN删除了。 编译会有警告提示。 */ } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return result; } }
四、重载,覆盖 一些区别
五、extjs 中layout的解释
extjs的容器组件都可以设置它的显示风格,它的有效值有 absolute, accordion, anchor, border, card, column, fit, form and table. 一共9
http://virgos.javaeye.com/blog/288924
六、struts中action的标签属性
<form-beans > <form-bean name="loginForm" type="com.student.web.form.LoginForm"/> <form-bean name="userConsoleForm" type="com.student.web.form.UserConsoleForm"/> </form-beans> <action path="/userConsole" attribute="userConsoleForm" name="userConsoleForm" parameter="method" scope="request" type="com.student.web.UserConsoleAction"> <forward name="list" path="/web/user/userlist.jsp"/> </action>
name的值对应为form-bean中的name,attribute的值对应为一个map的key 。
当一个form-bean被创建的时候,会建立一个map来保存form-bean,attribute 为key,name为该对象的引用。
第一次访问不存在的form-bean时会创建一个,第二次访问时就不用在创建了。
七、hibernate中createSQLQuery与createQuery的区别
1.createSQLQuery用的是sql语句进行查询的,createQuery用的是hql查询语句。
2、createSQLQuery是以对象数组进行存储,createQuery是以hibernate生成的Bean为对象装入list返回。
参考http://kevinhrw.javaeye.com/blog/324193
八、线程的同步
1、实现资源共享必须以实现接口的形式实现线程。
package com.student.common.util;
class MyThread implements Runnable { private int ticket =10; public void run() { for(int i=0 ; i<20;i++) { //System.out.println("线程"+name+"在运行"); if(this.ticket>0){ try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"售票"+this.ticket); this.ticket--; } } } } public class Test { public static void main(String[] args) { Runnable mt = new MyThread(); Thread t1 = new Thread(mt); Thread t2 = new Thread(mt); Thread t3 = new Thread(mt); t1.start(); t2.start(); t3.start(); } }
执行结果:
Thread-0售票10
Thread-2售票10
Thread-1售票10
Thread-1售票7
Thread-0售票6
Thread-2售票5
Thread-1售票4
Thread-0售票3
Thread-2售票2
Thread-1售票1
Thread-0售票0
Thread-2售票-1
我们发现,一张票被卖了两次。而且还出现了-1这样的票。这时我们就要用到线程的同步了synchiorzied
我们修改代码如下:
package com.student.common.util; class MyThread implements Runnable { private int ticket =10; //这里和上面不同 public synchronized void run() { for(int i=0 ; i<20;i++) { //System.out.println("线程"+name+"在运行"); if(this.ticket>0){ try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"售票"+this.ticket); this.ticket--; } } } } public class Test { public static void main(String[] args) { Runnable mt = new MyThread(); Thread t1 = new Thread(mt); Thread t2 = new Thread(mt); Thread t3 = new Thread(mt); t1.start(); t2.start(); t3.start(); } }
我们看下执行结果:
Thread-0售票10
Thread-0售票9
Thread-0售票8
Thread-0售票7
Thread-0售票6
Thread-0售票5
Thread-0售票4
Thread-0售票3
Thread-0售票2
Thread-0售票1
虽然售出票的没什么问题,我们发现票都被一个线程买完了,其他线程都卖不了票了。这时我们应该同
步代码块加错位置,应加在程序判断位置。
package com.student.common.util; class MyThread implements Runnable { private int ticket =10; public void run() { for(int i=0 ; i<20;i++) { //System.out.println("线程"+name+"在运行"); synchronized (this){ if(this.ticket>0){ try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"售票"+this.ticket); this.ticket--; } } } } } public class Test { public static void main(String[] args) { Runnable mt = new MyThread(); Thread t1 = new Thread(mt); Thread t2 = new Thread(mt); Thread t3 = new Thread(mt); t1.start(); t2.start(); t3.start(); } }执行结果:Thread-0售票10
Thread-0售票9
Thread-0售票8
Thread-0售票7
Thread-2售票6
Thread-2售票5
Thread-2售票4
Thread-1售票3
Thread-1售票2
Thread-2售票1
多个线程共享同一个资源,肯定是需要同步的,以保证数据的正确性,但是同步是需要牺牲性能
同时还必须注意死锁的问题,比如下面一个例子。
package com.student.common; class Lisi { public synchronized void give(Wanwu w){ System.out.println("给我钱"); w.send(); } public synchronized void free() { System.out.println("放人"); } } class Wanwu { public synchronized void give(Lisi l) { System.out.println("给我人"); l.free(); } public synchronized void send(){ System.out.println("给钱"); } } public class ThreadDemo1 extends Thread { Lisi li = new Lisi(); Wanwu W = new Wanwu(); public ThreadDemo1() { this.start(); li.give(W); } public void run(){ W.give(li); } public static void main(String[] args) { new ThreadDemo1(); } }
执行结果:
要解除死锁,只有把send或者free的synchronized删除。