20170601

来源:互联网 发布:tough cookie.js 编辑:程序博客网 时间:2024/06/10 21:28

计划:
1servlet学习
2多线程学习第一部分
3线程池
4mysql与oracle区别
5 60题练习
6 20页 spring学习

一 servlet学习
1.1-servlet简介
servlet首先要实现servlet接口,然后要发布在servlet服务器上
我们通常对实现了servlet接口的类,也叫做servlet
servlet在服务器第一次调用时装载,第二次时首先检查有无此servlet存在
生命周期:init service destroy

1.2-在项目中使用servlet
1.2.1创建一个servlet
1.2.2我们一般继承httpServlet类来实现web功能
1.2.3在web.xml中配置servlet-name
servlet-class
servlet-mapping
servlet-name
url-pattern
用于实现对servlet的拦截
同一个servlet可以被映射到多个地址上
1.3-servlet存在线程安全问题
解决办法:
在使用共享的变量时,加上synchronized(this){}代码块,但是不推荐

二 线程学习
2.1-线程的几个状态
2.1.1新建-》就绪=-》运行-》终止
2.1.2三个阻塞状态
1 等待阻塞 线程调用了wait方法:wait方法释放互斥锁
2 同步阻塞 运行到了同步块
3 其他阻塞 sleep,join:sleep方法不释放互斥锁
2.2 实现线程的两个方法
2.2.1
继承thread类 和实现runnable接口
2.3 几个线程应用的经典场景
2.3.1银行取款

2.3.2消费者/生产者模型注意:在生产者,消费者模型中,生产,消费代码应和产品代码在同一类中,消费者线程和生产者线程只是负责调用产品类2.3.3哲学家用餐问题

2.3 线程池

三mysql和oracle区别
1mysql免费oracle收费
2mysql分页用limit,oracle分页用rownum
3oracle支持行级锁mysql 只在innodb引擎里可以使用,
4mysql自动提交,oracle不自动提交
5两者事务支持的级别不同
6oracle有一些比较方便的函数mysql没有
7oracle 用到的一些函数 max min to_char to_date nvl round upper fm concat

/**
* 消费者
* @author Administrator
*
*/
public class ConsumerThread implements Runnable {
private Stocks stocks;

public ConsumerThread(Stocks stocks) {    this.stocks = stocks;}@Overridepublic void run() {    System.out.println("start 10 circulate");    for (int i = 0; i < 10; i++) {        stocks.consumer();    }}

}
/**
* 生产者
* @author Administrator
*
*/
public class ProductorThread implements Runnable {
private Stocks stocks;

public ProductorThread(Stocks stocks) {    this.stocks = stocks;}@Overridepublic void run() {    System.out.println("start 10 circulate");    for (int i = 0; i < 10; i++) {        stocks.produce();    }}

}
/**
* 产品工厂类
* @author Administrator
*
*/
public class Stocks {
public static double stockings = 0;

/** * 消费过程 */public synchronized void consumer() {    if (stockings <= 0) {        try {            wait();        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    stockings = stockings - 10;    System.out.println("consuming 10 yuan ....");    notify();}/** * 生产 */public synchronized void produce() {    if (Stocks.stockings >= 10) {        try {            wait();        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    stockings = stockings + 10;    System.out.println("product 10 yuan ....");    notify();}

}

四 20页spring学习34-54页
2.1 spring 配置的可选方案
三种主要装配机制
1xml中显示配置
2java中显示配置
3隐世的javabean发现机制,及自动装配(最简便)
2.2 自动化装配bean
spring从两个方面协作来实现了自动化装配

1组件扫描2自动装配2.2.1创建可被发现的bean    >一个cd接口,它将具体cd的播放功能和cd本身的耦合降低    public interface CompacDisc{    void play();    }    >cd 的实现类,添加compnont注解,可以被spring扫描到    @Component    public class SgtPappers implements CompacDisc{         @Override        public void play(){        system.out.print("play....");        }    }    >spring配置类,默认扫面配置类目录下的包    @Configuration    @CompnentScan    public class CDPlayerConfig{    }    >使用xml开启扫描的话是<context:component-scan>    <?xml version=....    <beans xlmns="/...>    <context:component-scan base-package="xxxx"/>    </beans>2.2.2为组件扫描的bean命名spring应用上下文所有的bean都会给一个id,默认为类名的首字母大写若想自定义bean id,则做如下修改@Component("your classId")    public class SgtPappers implements CompacDisc{         @Override        public void play(){        system.out.print("play....");        }    }    2.2.3 设置组件扫描的基础包    作如下配置    @Configuration    @ComponentScan("soundsystem")    public class CDPlayerConfig(){    }    若你想更明确地表明你所设置的是基础包,那么可以用如下配置(可扫描多个包)    @Configuration    @ComponentScan(basePackages = {"soundsystem","video"})    public class CDPlayerConfig(){    }    给予如上配置在代码重构时可能会带来麻烦,所以可以写成如下配置    @Configuration    @ComponentScan(basePackageClasses = {CDPlayer.class,Video.class})    public class CDPlayerConfig(){    }    spring会扫描类所在的包及子包    2.2.4 通过为bean 属性 添加注解实现自动装配    为了实现自动转配,我们需要借助@Autowired注解,例子如下:    @Component    public class CDPlayer implements MediaPlayer{    private CompactDisc cd;    @Autowired    public CDPlayer { CompactDisc cd){    this.cd = cd;    }    public void play(){    cd.play();    }    }    @Autowired注解不仅能作用于构造器上,还能用于需要注入类的任意方法上,或者直接放在属性上    例子略(43页)

2.3 使用java代码显示装配bean
有时不能使用组件扫描和自动装配来实现bean的管理(例如第三方类库时),因此有时需要利用java代码显示的配置bean到spring中去
2.3.1 创建配置类(因为要显示装配bean,所以讲componentscan注解去掉了)
@Configuration
public class CDPlayerConfig{
@Bean
public class CompactDisc sgtPeppers(){
return new SgtPeppers();
}
@Beanpublic CDplayer(){
return new CDPlayer(sgtPeppers());
}
}

2.3.3 借助javaconfig实现注入如上述代码,spring默认bean是单例模式没有必要在位第二个cdplayer bean 创建完全相同的实例,spring会拦截对 sgtPeppers的调用,并确保返回的是唯一实例还有一种理解起来更简单的方式:@Beanpublic CDplayer(CompactDisc compactDisc){return new CDPlayer(compactDisc);}这样,spring在请求CDPlayer时,会自动把compactDIsc在spring中的bean注入进来注意:此处我们是把compactDisc 作为构造方法的参数传进去的,若是setter方法的话,则需写成如下形式,(即手动调用setter方法)@Beanpublic CDplayer(CompactDisc compactDisc){    return new CDPlayer().setCompactDisc(compactDisc);}

2.4 使用xml装配bean
作者在此处巴拉巴拉了一大堆关于xml是落后的配置,并希望我们开发时尽量选择自动化配置和javaconfig的话…
2.4.1 spring的配置文件要以<bean> 为根(springtools 可以创建xml的基本配置和xsd头)
2.4.2 声明一个简单的bean
<bean class=”soundsystem.SgtPeppers” id=”sgtPeppers”/>
2.4.3 借助构造器注入初始化bean
在xml配置中,只有一种声明bean的方式,就是使用<bean>元素来声明并制定class属性
①通过构造器注入bean
<bean id=”xxx” class=”xxx”>
<constructor-arg ref=”compactDisc”>
</bean>
使用c命名空间
<bean id=”xxx” class=”xxx” c:cd-ref=”compactDisc” /bean>
c 指构造方法
cd指参数名
ref指bean注入
或者c命名空间也可以使用位置参数
<bean id=”xxx” class=”xxx” c:_0-ref=”compactDisc” /bean>
_0指参数位置
② 将变量注入到构造器中
<constructor-arg value=”i want play…”>
c命名空间(直接参数名 + = 即可)
<c-title=”i want play…”>