本文目錄一覽:
- 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;
}
}
以上就是代碼了,測試成功了。
原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/130919.html
微信掃一掃
支付寶掃一掃