一、前言
創新互聯是一家專業從事成都做網站、網站設計、外貿營銷網站建設的網絡公司。作為專業網站制作公司,創新互聯依托的技術實力、以及多年的網站運營經驗,為您提供專業的成都網站建設、全網營銷推廣及網站設計開發服務!
前面我們已經嘗過了在云服務器上部署代碼的甜頭了,現在主菜就要上場了,那就是將我們的 JavaWeb 項目部署到云服務器上。興奮吧?淡定淡定~
二、項目部署
我們對于 Java Web 項目在本地機器(無論是 Windows 還是 Linux)上的部署已經了然于心了,那么對于在云服務器上部署 Java Web 項目又是如何操作的呢? 其實很簡單,還是離不開 Web 項目部署的那三點:
① 基礎的 JDK 環境
② 一個 Web 服務器。如 Tomcat、JBoss
③ 一款數據庫。如:mysql
對于云服務器上 Java Web 項目的部署,和平時在 Windows、Linux 下部署是一樣的。最多也就是只能使用純命令模式來操作而已,其實過程都一樣。
2.1 環境準備
既然是 Java Web 項目的部署,首先自然需要配置好相關的環境羅。也就是:先在云主機上搭建好 Java 開發環境,如 OpenJDK 的安裝、Tomcat 的安裝、Mysql 數據庫的安裝。
2.2 項目部署
我們要部署 Java Web 項目,那就至少得將項目上傳到云服務器。其實過程很簡單,基本上也就是下面三個步驟:
① 打包上傳:將項目打包成 war 文件,然后利用傳到遠程服務器(在Eclipse中直接將項目導出為.war文件)。
② 將 war 文件移動到 Tomcat 目錄下的 webapps 下。
③ 重啟 Tomcat,訪問我們的項目。
在這個過程中,我們需要注意。因為一般而已,作為一個 Web 項目,我們肯定是有數據庫的使用的。那么數據庫部分怎么辦呢?其實,只需要將我們已有的數據庫轉儲為 sql 文件,然后將 sql 文件上傳到云服務器上執行即可。以 mysql 為例,如下操作:
① 轉儲為 sql 腳本,并上傳:先在本地將我們項目使用的數據庫轉為 sql 文件,上傳到云服務器上 (可以利用 Navicat 將數據庫轉儲為.sql文件)。
② 執行 sql:然后進入 mysql 中執行該 sql 文件。(若服務器裝有Navicat,可直接用Navicat執行.sql文件,執行前需要選中存放表的數據庫,應該與代碼中數據庫連接語句包含的數據庫名保持一致)
服務器端寫個servlet,然后在doPost()方法里處理客戶端上傳的文件,大概代碼:DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(1024 * 1024); // 設置最多只允許在內存中存儲的數據, 單位:字節 factory.setRepository(cachepath); // 設置一旦文件大小超過設定值時數據存放的目錄 ServletFileUpload srvFileUpload = new ServletFileUpload(factory); srvFileUpload.setSizeMax(1024 * 1024 * 1024); // 設置允許用戶上傳文件大小, 單位:字節// 開始讀取上傳信息 List fileItems = null; try {fileItems = srvFileUpload.parseRequest(request); } catch (Exception e) {System.out.println("獲取上傳信息。。。。。。失敗"); }// 依次處理每個上傳的文件 Iterator iter = fileItems.iterator(); while (iter.hasNext()) {FileItem item = (FileItem) iter.next(); // 忽略其他不是文件域的所有表單信息if (!item.isFormField()) {// 取出文件域的所有表單信息} else { // 取出不是文件域的所有表單信息} }
Java平臺般三版本:Java ME(微型版用于某些手機)、Java SE(標準版用于臺式電腦)、Java EE(企業版用于服務器端應用)談Java我通指Java SE版本包含虛擬機編譯器
首先Java代碼編譯稱字節碼間格式字節碼目標電腦運行虛擬機快速解析目標電腦硬件操作系統所需要本機格式
除發者提供編寫處運行優勢Java能通垃圾收器(GC)實現自內存管理發者免手代碼釋放用象內存雖功能非用且降低代碼引入內存問題風險增加運行銷需要停執行垃圾收進程
本文比較Java SE用于Android發Java間差異首先我介紹發者習慣Java
SE語言結構及何Android運行其我介紹何優化AndroidJava代碼何優化內存配及何恰處理線程
比較AndroidDalvik JavaJava SE
雖遠Android現前發者能用Java編程語言移設備編寫應用程序Java功能極限版本稱Java
ME(微型版)同移設備需編寫同代碼寫應用程序能支持Java
ME任何手機運行幾乎能外由于存線商店應用發布程極其復雜
Android問世發者提供構建智能手機強應用機發者需用Java編程語言及熟知標準Java
API編寫代碼盡管Android發者仍使用Java SE編譯器編譯應用程序發現James
Gosling發JavaAndroid設備Java存許同處
Android設備運行VM(虛擬機)稱Dalvik初由谷歌Dan
Bornstein發適用于CPU內存受限移設備Java SEDalvik Java存些差異主要體現虛擬機Java
SE使用棧機設計Dalvik設計基于寄存器機器Android SDKdx工具Java
SE棧機器字節碼轉換基于寄存器Dalvik機器字節碼該轉換步驟由IDE自完
基于棧虛擬機基于寄存器虛擬機定義及差異列入我討論范圍由于歷史原Android使用基于寄存器虛擬機雖基于寄存器虛擬機比基于棧虛擬機快32%限于執行解釋字節碼虛擬機(說解釋型虛擬機)Android
2.2版本(稱Froyo)前Dalvik虛擬機都純解釋型Froyo版本引入JIT編譯器(即編譯)Java
SE早優勢
JIT編譯稱態翻譯執行前字節碼翻譯本機代碼(圖1所示)主要兩處首先消除些純解釋型虛擬機銷;其能本機代碼執行優化通靜態編譯代碼做例JIT編譯器運行CPU選擇合適優化根據應用程序輸入析代碼何運行便進行步優化
圖1 Android JavaJava SE翻譯步驟
雖AndroidDalvik JIT編譯器發展前景要達Java SEJIT編譯器般穩定、熟度尚需段間Dalvik JIT現Android提供巨性能優勢且斷改善
JAVA
SE虛擬機Dalvik虛擬機另區別者進行優化運行同機器實例機啟叫做zygote進程該進程創建第Dalvik實例由實例創建所其實例應用程序啟zygote進程收創建新虛擬機實例請求并給該應用程序創建新進程(圖2所示)發者已習慣于Java
SE發設計能看起切實際優勢避免由應用程序運行失敗導致Dalvik虛擬機崩潰繼引發應用程序崩潰
圖2 Android啟新Dalvik虛擬機實例
AndroidJava
SE除運行虛擬機同外實現API式Android屬于javajavax包API都自Apache
Harmony(源項目旨重新實現Java SE軟件棧該項目201111月再維護)發面些APIJava
SE包類似存些差別例谷歌HttpUrlConnection類進行Java SE版本所沒重升級
外Android平臺移除Java
SE關API例Swing/AWT包完全移除Android使用同UI框架其移除APIRMI、CORBA、ImageIOJMX或者替換特定Android版本(android包空間內)或者些實際原根本存
優化AndroidJava代碼
經改進Java
SE具備些簡化編寫復雜代碼結構新特性其些特性讓整流程變更簡單發者需要解何及何確使用另外由于Java
SE用于服務器端發(使用Java企業版API)發員專門服務器端Java代碼進行優化注解Java虛擬機腳本語言支持服務器端發進行優化例證雖些工具構建端發強發Android客戶端代碼些特性作用甚至起反作用Java發者已經習慣于限量RAMCPUAndroid發需要密切關注性能內存配簡單說發者需要使用稍微同待Android端發
隨著Android首發布情況所改變曾經些Android盡量用Java規范重新推薦主要Android目前JIT編譯器解決些規范導致性能問題
本文討論編寫Android應用程序需要解Java代碼我深究Java編程語言細節重點關注Android發重要東西發者仍需解數適用于Java SE規則建議同適用于AndroidDalvik虛擬機
Android類型安全枚舉
Java SE 5.0新增許便發者新特性其值期待引入類型安全枚舉枚舉代碼用表示屬于某組幾選擇早期版本Java用整型量解決問題雖技術行容易錯請看面代碼:
public class Machine {
public static final int STOPPED = 10;
public static final int INITIALIZING = 20;
public static final int STARTING = 30;
public static final int RUNNING = 40;
public static final int STOPPING = 50;
public static final int CRASHED = 60;
private int mState;
public Machine() {
mState = STOPPED;
}
public int getState() {
return mState;
}
public void setState(int state) {
mState = state;
}
}
問題雖些量期望沒機制保證setState()接收同值要設置添加檢查旦非預期值發者需要處理錯誤發者所需要編譯檢查非賦值類型安全枚舉解決問題所示:
public class Machine {
public enum State {
STOPPED, INITIALIZING, STARTING, RUNNING, STOPPING, CRASHED
}
private State mState;
public Machine() {
mState = State.STOPPED;
}
public State getState() {
return mState;
}
public void setState(State state) {
mState = state;
}
}
注意聲明同類型安全值新加內部枚舉類編譯解決非賦值問題所代碼更容易錯
Dalvik虛擬機沒JIT編譯器優化代碼建議Android平臺使用枚舉類型使用整型量相比種設計帶內存性能損失更些版本Android
API存整型量原今更強JIT編譯器及斷改進Dalvik虛擬機發者必再擔問題放膽使用類型安全枚舉即
仍存些情況使用整型量更選擇像intJava基本類型增加GC銷外Android SDK許已API仍依賴基本類型比Handler類——種情況沒太選擇
Android增強版for循環
Java SE 5.0引入增強版for循環提供通用縮寫表達式遍歷集合數組首先比較五種:
void loopOne(String[] names) {
int size = names.length;
for (int i = 0; i size; i++) {
printName(names[i]);
}
}
void loopTwo(String[] names) {
for (String name : names) {
printName(name);
}
}
void loopThree(Collection names) {
for (String name : names) {
printName(name);
}
}
void loopFour(Collection names) {
Iterator iterator = names.iterator();
while (iterator.hasNext()) {
printName(iterator.next());
}
}
// 要ArrayList使用增強版for循環
void loopFive(ArrayList names) {
int size = names.size();
for (int i = 0; i size; i++) {
printName(names.get(i));
}
}
面顯示四種同遍歷集合數組式前面兩種著相同性能所讀取元素放數組使用增強版for循環Collection象說增強版for循環使用迭代器遍歷元素著相同性能ArrayList象應避免使用增強版for循環
僅需要遍歷元素且需要元素位置定要使用數組或者ArrayList所其Collection類些情況更慢
般情況讀取元素幾乎變數據集性能要求高建議使用規數組數組固定添加數據影響性能所編寫代碼要考慮所素
隊列、同步鎖
通情況應用程序線程產數據另線程使用見例線程獲取網絡數據另線程(操作UI主線程)些數據展現給用戶種模式稱產者/消費者模式面向象編程課程發者用算實現該模式能要花幾面介紹些簡化產者/消費者模式實現現類
1. 更智能隊列
雖已現類并能用更少代碼實現該功能許Java發者仍選擇使用LinkedList及同步塊實現隊列功能發者java.util.concurrent包找同步相關類外本包包含信號量、鎖及單變量進行原操作類考慮面使用標準LinkedList實現線程安全隊列代碼
public class ThreadSafeQueue {
private LinkedList mList = new LinkedList();
private final Object mLock = new Object();
public void offer(String value) {
synchronized (mLock) {
mList.offer(value);
mLock.notifyAll();
}
}
public synchronized String poll() {
synchronized (mLock) {
while (mList.isEmpty()) {
try {
mLock.wait();
} catch (InterruptedException e) {
//簡潔起見忽略異處理
}
}
return mList.poll();
}
}
}
雖段代碼確并能考試滿實現測試段代碼浪費間實際所前面代碼用面行代替
LinkedBlockingQueue blockingQueue =
new LinkedBlockingQueue();
面行代碼能像前面例提供相同類型阻塞隊列甚至能提供額外線程安全操作java.util.concurrent包含許選隊列及并發映射類所般情況建議使用像前示例使用更代碼
2. 更智能鎖
Java提供synchronized關鍵字允許發者創建線程安全代碼塊synchronized關鍵字易于使用容易濫用性能造負面影響需要區讀數據寫數據synchronized關鍵字并效幸java.util.concurrent.locks包工具類種情況提供支持
public class ReadWriteLockDemo {
private final ReentrantReadWriteLock mLock;
private String mName;
private int mAge;
private String mAddress;
public ReadWriteLockDemo() {
mLock = new ReentrantReadWriteLock();
}
public void setPersonData(String name, int age, String address) {
ReentrantReadWriteLock.WriteLock writeLock = mLock.writeLock();
try {
writeLock.lock();
mName = name;
mAge = age;
mAddress = address;
} finally {
writeLock.unlock();
}
}
public String getName() {
ReentrantReadWriteLock.ReadLock readLock = mLock.readLock();
try {
readLock.lock();
return mName;
} finally {
readLock.unlock();
}
}
// 重復代碼再贅述
}
面代碼展示使用ReentrantReadWriteLock允許并發線程數據進行讀訪問并確保同間線程寫入相同數據
代碼使用synchronized關鍵字仍處理鎖問題效論何種情況都要考慮ReentrantReadWriteLock否
JAVA程序在開發完成后,需要部署到服務器,如果是WEB項目,需要部署到WEB服務器,否則部署到應用服務器。
JAVA是跨平臺的編程語言,服務器的操作系統可以是Windows、Linux或者其它,下面將在RedHat6操作系統下,詳細說明JAVA程序在WEB服務器和應用服務器上的部署情況。
1、JAVA程序部署在應用服務器
(1) JAVA程序HelloWorld 在Redhat6上部署的目錄結構
bin : 存放shell腳本run.sh
conf :存放配置文件log4j.properties
lib :存放JAR包HelloWorld.jar、log4j-1.2.16.jar
logs:存放程序運行日志文件log.log
(2)編寫測試類HelloWorld.java 并打成JAR包HelloWorld.jar
package com.test;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class HelloWorld {
private static Logger log = Logger.getLogger(HelloWorld.class);
public static void main(String[] args) {
try{
//log4j.properties變量的值在腳本bin/run.sh 中讀取
String config = System.getProperty("log4j.properties");
if (config != null) {
PropertyConfigurator.configure(config);
}
log.info("HelloWorld");
Thread thread = new Thread(){
public void run(){
while(true){
try {
Thread.sleep(5*1000);
log.info("每隔5秒打印一下日志");
} catch (InterruptedException e) {
e.printStackTrace();
log.error(e.getMessage());
}
}
}
};
thread.run();
} catch (Exception e) {
log.error("[X]啟動失敗:"+e.getMessage());
System.exit(1);
}
}
}
1、最原始的做法是將java程序編譯成.class文件,復制到tomcat中你的項目里的相應位置。
2、現在很多開發工具可以方便的部署java程序到tomcat,比如eclipse
通過add和remove來部署你的項目,通過publish來部署項目到tomcat你所設定的位置,默認是[盤符]:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
網頁題目:java服務器端代碼部署,java如何部署服務器
當前路徑:http://vcdvsql.cn/article4/hsshie.html
成都網站建設公司_創新互聯,為您提供虛擬主機、Google、品牌網站建設、電子商務、網站導航、網站收錄
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯