您的位置:

java郭德纲(“郭德纲”)

本文目录一览:

为什么JavaWeb项目要分层

首先让我们坐着时光机回到n年前的web开发。

那个时候最早都是静态的html页面,后来有了数据库,有了所谓的动态页面,

然后程序猿在编码的时候,会把所有的代码都写在页面上,包括数据库连接,包括事务控制,接收参数,各种校验,各种逻辑,各种html/js/css代码等等

怎么样?够乱吧?像一坨那什么一样,这个页面可能有成千上万行?

那么好,问题来了,回头需要修改的时候,你怎么办?

你找个东西找半天,好不容易找到了,还不敢改,怕被其他地方用了,改出连带问题。

页面一出错,定位不准到底是哪里的问题,从头到尾的挨个排查。

等等等等。

这就是大家常说的什么叫可维护性,这也是为什么越来越多的公司的规范要求不能写复杂sql。

还记得之前在东软的时候,一哥们写了一个80多行的大sql来完成一个核心的查询。

试问这个大sql天天在数据库里run,还有性能可言?

再试问谁敢改?

后来项目要改需求还是出现bug了,那个sql要改动,写sql的哥们改了好久才改好,因为时间长他也忘了,

再后来他离职了。。。

有人问,那简单sql实现不了我的功能呀,怎么办?

从数据库设计层面开始下手,要允许适当的冗余,把表弄好,就迎刃而解了,这也是数据库层面的一种解耦吧。

后来。。。

进入第二阶段,大家痛定思痛,决定要把页面和逻辑拆开,页面只是负责显示,逻辑都在后台。

这就出现了短暂的,在jsp里使用标签调用bean的用法。bean里耦合了除了页面之外的所有东西。

再后来。。。

进入了第三阶段,大家又痛定思痛,决定要拆成三部分,就是大名鼎鼎的MVC。

再再后来。。。

衍生出来了类似于struts/springmvc等等的mvc框架

---------------

JavaWeb项目的层有2个维度。

第一个维度是MVC的三层:

M:model,模型层,包括了你的业务逻辑和数据库操作,封装好给视图层使用的。

V:view,视图层,仅仅做的是展示数据,不包含业务逻辑,主要是jsp/html等等

C:controller,控制层,负责接收请求,调用模型层处理业务逻辑并返回给视图层。

第二个维度是java代码里的三层:

controller:控制层,负责接收参数/解析参数/封装参数,调用serivce,将service方法的返回值进行封装(如果需要),返回数据/返回页面,路由。

service:负责业务逻辑,事务控制在这层里做,被controller调用,以及调用dao。

dao:持久层,负责数据库交互,被service调用。

这2个维度别弄混了哟。我今天主要说的是第二个维度的层哟。

我认为,第二个维度是第一个维度的延伸,其实第二个维度再加上一个表现层就完美了,这就为什么有人说是4层架构。

---------------

前戏结束,步入正题:

有些学生朋友可能会问为什么要分层呢?我本来可以在一个地方写完的东西,非要散落在各个层中,都在一起不是挺好的吗?

开发效率高呀~

跳来跳去的我脑子都晕啦。。。

这就是为什么有人会把所有的东西都扔在一个层里,比如controller层。。。

其实我们可以在jsp上把所有的逻辑以及数据库操作,数据展示全部写在一起,耦合在一起,这样开发起来貌似更快,

但是维护性非常差,有朝一日想改一个小地方,牵一发而动全一身,隐患很高,无法快速定位问题。

因此我们需要分层。

分层了之后,你理论上改了持久层的东西,逻辑层是不用变动的。

每个Dao类是跟每个表走,Dao的每个方法里就一个个的简单sql,不包含任何业务逻辑,可以被不同的service复用和调用。

经过抽象后基本上都是通用的,因而我们在定义DAO层的时候可以将相关的方法定义完毕,

这样的好处是在对Service进行扩展的时候不需要再对DAO层进行修改,提高了程序的可扩展性。

提高了程序的可扩展性。具体什么时候做这些操作,怎么做这些操作都由Service来处理。

(就像郭德纲的相声里的一句话:“行了,你甭管了”)

而Service则不是,一个Service里可以会调用多个不同的dao,完成特定的业务逻辑,事务控制,

封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性

同时,一个Service的方法也有可能被多个Controller的方法来调用。

逻辑出问题就在Service找问题,数据库,sql有问题就在Dao层找问题,

参数解析错误,跳转错误,就在Controller上找问题。

这样快速定位问题,互不干扰。

---------------

分层架构(这里会延伸到更广阔的架构):

回头项目玩大了,怎么办?拆!!!

具体可以搜一下:maven分模块开发,怎么玩代码依赖,怎么玩微服务,怎么玩SOA,怎么玩RPC,怎么玩dubbo。

web项目发展有几个阶段啊

第一个阶段(单一应用架构):

所有代码都耦合在一个项目里,放在一台服务器上,这种all in one的方式是有好处的。

创业初期,不用什么架构,走敏捷开发,最快速的实现需求才是王道。

你甭管我有多烂,我至少能跑起来,我至少能在外网上让你访问,让你使用。

当然了,初期的访问量很少,节省部署和运维成本才是王道呀。

听阿里的讲座,说淘宝的前期的版本用的就是一台PC机作为服务器,所有的功能耦合在一个项目里,

每次往生产环境上发版本,要上传一个600mb的包,呵呵。

第二个阶段(垂直应用架构):

哎哟,不错哦。自己的儿子被越来越多的人访问,访问量激增,一台服务器扛不住了,

没事,我们可以玩负载均衡,玩集群。

但是!这种性能加速度其实会变得越来越小,因为你的项目是耦合在一起的。

这时,我们需要拆分项目,这里又有2个维度,按层拆,按模块拆。

将拆好的不同项目分别部署在不同的服务器上,并且再分不同的小集群。

第三个阶段(分布式服务架构):

唉呀妈呀,访问量陡增,到这步你创业应该算成功了,开始烧投资人的钱了吧。

经过上面拆成了越来越多的模块,模块与模块交互越来越多,怎么办?

这个时候我们需要把核心的业务抽出来,作为独立的服务,慢慢发展成稳定的服务中心,

用来提升业务复用和整合。

就像阿里的大牛说过,没有淘宝的积累,天猫能那么快的出来吗?

这个时候,你的缓存,数据库,消息队列等服务都应该是分布式的。

第四个阶段(流动计算架构)

哎呀妈呀,访问量又上了一个台阶,翻了好几百倍吖,肿么办?

这个时候服务越来越多,一些容量和资源的浪费问题凸显出来,

这时我们需要一个调度中心来基于访问压力动态的管理集群容量,

提高利用率。

第五个阶段(云计算架构)

抱歉,作者正在学习中,未完待续。

现在选择去学习java还有前途吗?培训机构那么多,每月都培训出来很多人,都不值钱了吧?

学到了就是自己的.

是这样,

在培训机构学习的时候,

他们教给了我们关于这门计算机语言的基础知识,

好一点的培训机构会引导我们学会如何学习计算机语言.

所有计算机语言都是相通的.

面向对象思想已经普遍应用于各种计算机语言了,

学精了你会发现计算机语言就是我们的人类语言(写代码就跟平时说话一样简单).

计算机语言用得好的人会非常出色,

就像相声演员郭德纲.

想必你见过会怯场会紧张一说话就磕巴的人,

这样他不可能成为相声演员,但他绝对可以成为一名出色的程序员,项目经理,黑客大师,或者比尔盖茨?

高分急求java扑克出牌代码

我不知道电脑出牌为什么要进行大小比较以及删牌操作? 我的是52张牌若干玩家,随机发牌给玩家,玩家收到电脑发的牌。

这个是定义52张牌:Card.java

package com.etc.week4.day03;

public class Card {

// 点数 3 ---0 4 1 12 2 11 A 13 小王 14 大王

public int rank;

public final static int THREE = 0;

public final static int FOUR = 1;

public final static int FIVE = 2;

public final static int SIX = 3;

public final static int SEVEN = 4;

public final static int EIGHT = 5;

public final static int NINE = 6;

public final static int TEN = 7;

public final static int JACK = 8;//J

public final static int QUEEN = 9;//Q

public final static int KING = 10;//K

public final static int ACE = 11;//A

public final static int DEUCE = 12; //2

public final static int BLACK = 13; //小王

public final static int COLOR = 14;//大王

//花色(suit=0suit=4)

private int suit;

public final static int CLUB = 0; //梅花

public static final int DIAMOND = 1; //方块(钻石)

public static final int HEART = 2; //红桃(红心)

public static final int SPADE = 3; //黑桃(花锄)

public static final int JOKER = 4; //王

public Card(int suit,int rank){

this.setSuit(suit);

this.setRank(rank);

}

public Card(){}

public int getRank() {

return rank;

}

public void setRank(int rank) {

if(rankCard.THREE||rankCard.COLOR){

throw new RuntimeException();

}

this.rank = rank;

}

public int getSuit() {

return suit;

}

public void setSuit(int suit) {

if(suitCard.CLUB || suitCard.JOKER){

throw new RuntimeException();

}

this.suit = suit;

}

// 点数对应 名称

public final static String[] RANK_NAMES={

"3","4","5","6","7","8","9","10","J","Q",

"K","A","2","小王","大王"};

public final static String[] SUIT_NAMES={

"梅花","方块","红桃","黑桃",""};

@Override

public String toString() {

return SUIT_NAMES[this.suit]+RANK_NAMES[this.rank];

}

public static void main(String[] args) {

Card c =new Card(HEART, ACE);

System.out.println(c);

}

}

这个是定义若干玩家Player.java

package com.etc.week4.day03;

import java.util.Arrays;

public class Player {

String id;

String name;

Card cards[] ={};

public void addCards(Card card ){

// 每个玩家获取的牌

cards = Arrays.copyOf(cards, cards.length+1);

cards[cards.length-1] = card;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Card[] getCards() {

return cards;

}

public void setCards(Card[] cards) {

this.cards = cards;

}

public Player(String id, String name) {

this.id = id;

this.name = name;

}

public Player() {

super();

}

@Override

public String toString() {

return "Player:"+name+" cards="

+ Arrays.toString(cards) + "]";

}

}

这个是电脑随机发牌给玩家,玩家收到电脑发的牌PlayDemo.java

package com.etc.week4.day03;

import java.util.Arrays;

import java.util.Random;

public class PlayerDemo {

public static void main(String[] args) {

// 创建一副扑克牌

// 方块:13张(THREE~DEUCE)

// 梅花:13张(THREE~DEUCE)

// 黑桃:13张(THREE~DEUCE)

// 红桃:13张(THREE~DEUCE)

// 王: BLACK COLOR

Card [] cards = new Card[54];

int i=0;

// 构造52张普通的牌

for(int rank=Card.THREE;rank=Card.DEUCE;rank++){

cards[i++] = new Card(Card.DIAMOND, rank);

cards[i++] = new Card(Card.CLUB, rank);

cards[i++] = new Card(Card.SPADE, rank);

cards[i++] = new Card(Card.HEART, rank);

}

// 添加 大小王

cards[i++] = new Card(Card.JOKER, Card.BLACK);

cards[i++] = new Card(Card.JOKER, Card.COLOR);

// 将数组 变成集合 List

// List arr= Arrays.asList(cards);

// 将集合里面的元素 打乱... 洗牌

//Collections.shuffle(arr);

// 洗牌//

for(int n=cards.length-1;n=1;n--){

Random rd = new Random();

int index = rd.nextInt(n); //1 0

Card t = cards[n];

cards[n] = cards[index];

cards[index] = t;

}

// System.out.println("=====测试洗牌.....\n"+Arrays.toString(cards));

// 组建玩家团队

Player[] players = new Player[4];

players[0] = new Player("1010", "张柏芝");

players[1] = new Player("1011", "曾志伟");

players[2] = new Player("1012", "谭咏麟");

// players[3] = new Player("1013", "郭德纲");

// 发牌.....

for(int j =0;jcards.length;j++){

players[j%players.length].addCards(cards[j]);

}

// 显示各个玩家的牌

for(int m=0;mplayers.length;m++){

System.out.println(players[m]);

}

}

}

用eclipse写的

在Person类中,没有跟Dog属性设置值的方法,在够着函数中虽然有this.dog = dog;但是没有地方传入值进去。

你可以在构造函数中添加传入参数Dog dog,然后在main中实例化Person的时候也传入。即

Person类:

public Person(int age,String name,Dog dog )

{

this.age = age;

this.name = name;

this.dog = dog;  

}

main方法:

Person p1 = new Person(23,"郭德纲",dog);

2.在Person类中写个set方法,然后在main中添加给person对象赋dog值的代码。

Person类:

public void setDog(Dog dog){this.dog=dog;}

main方法:

在Person p1 = new Person(23,"郭德纲");后面加上

p1.setDog(dog);

3.其实可以直接这样。。

在main方法中:

在Person p1 = new Person(23,"郭德纲");后面加上

p1.dog=dog;

lz三个的方法,你看到办就是了。。纯手工啊

求大神帮帮忙,今天考java不会做这个题,小弟谢谢了

package clent;

import java.util.Scanner;

public class Department {

private String id;

private String name;

public Department(String id,String name){

this.id=id;

this.name=name;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public static void main(String agrs[]){

Department d = new Department("00001","销售部");

System.out.println("部门信息  部门编号:"+d.getId()+",  部门名称:"+d.getName());

Employee e = new Employee("0003","郭德纲",2000,d);

System.out.println("员工信息  员工编号:"+e.getId()+",  姓名:"+e.getName()+",  底薪:"+e.getSalary()+",  所在部门:"+e.getDepart().getName());

Scanner s = new Scanner(System.in);

System.out.println("请输入"+e.getName()+"本月销售额:");

int num = s.nextInt();

e.SumSalary(num);

}

}

package clent;

public class Employee {

private String id;

private String name;

private int salary;

private Department depart;

public void SumSalary(int num){

if(num100000){

System.out.println(name+"本月的工资为"+(int)(salary+num*0.01)+"元");

}

if(num100000  num 200000){

System.out.println(name+"本月的工资为"+(int)(salary+num*0.02)+"元");

}

if(num=200000){

System.out.println(name+"本月的工资为"+(int)(salary+num*0.03)+"元");

}

}

public Employee() {

}

public Employee(String id, String name, int salary, Department depart) {

super();

this.id = id;

this.name = name;

this.salary = salary;

this.depart = depart;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getSalary() {

return salary;

}

public void setSalary(int salary) {

this.salary = salary;

}

public Department getDepart() {

return depart;

}

public void setDepart(Department depart) {

this.depart = depart;

}

}

以上就是代码了,测试成功了。