热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java郭德纲(“郭德纲”)

本文目录一览:1、为什么JavaWeb项目要分层

本文目录一览:


  • 1、为什么JavaWeb项目要分层


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


  • 3、高分急求java扑克出牌代码


  • 4、用eclipse写的


  • 5、求大神帮帮忙,今天考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;

}

}

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


推荐阅读
  • 一、Struts2是一个基于MVC设计模式的Web应用框架在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2优点1、实现 ... [详细]
  • MVC中的自定义控件
    怎么样创建自定义控 ... [详细]
  • TiDB | TiDB在5A级物流企业核心系统的应用与实践
    TiDB在5A级物流企业核心系统的应用与实践前言一、业务背景科捷物流概况神州金库简介二、现状与挑战神州金库现有技术体系业务挑战应对方案三、TiDB解决方案测试迁移收益问题四、说在最 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之六 || API项目整体搭建 6.1 仓储模式
    代码已上传Github+Gitee,文末有地址  书接上文:前几回文章中,我们花了三天的时间简单了解了下接口文档Swagger框架,已经完全解放了我们的以前的Word说明文档,并且可以在线进行调 ... [详细]
  • [翻译]微服务设计模式5. 服务发现服务端服务发现
    服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地 ... [详细]
  • BPM是什么软件?1、BPM是BusinessProcessManagement的简称,译为业务流程管理,它是一种以规范化的构造端到端的卓越业务流程为中心以持续的提高组织业务绩效为 ... [详细]
  • 后台自动化测试与持续部署实践
    后台自动化测试与持续部署实践https:mp.weixin.qq.comslqwGUCKZM0AvEw_xh-7BDA后台自动化测试与持续部署实践原创 腾讯程序员 腾讯技术工程 2 ... [详细]
  • 关于extjs开发实战pdf的信息
    本文目录一览:1、extjs实用开发指南2、本 ... [详细]
author-avatar
开卷_汤娅造_673
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有