JavaWeb之服務器基礎
本章內容:
Web項目簡介
主流服務器介紹
Tomcat的安裝和配置
自定義Web服務器
什麽B/S和C/S結構?
B/S 瀏覽器/服務器
服務器一般是性能強大PC或工作站,安裝應用程序服務器軟件,如:Tomcat、JBoss,和DBMS如:MySQL、Oracle等。
瀏覽器去訪問服務器,不需要安裝客戶端軟件,如:網銀、淘寶。
優點:軟件安裝服務器端,省去客戶端更新、維護時間,目前管理系統一般是BS的。
缺點:服務器壓力比較大,瀏覽器不能呈現太復雜的特效。
JavaWEB項目都屬於BS結構程序。
C/S 客戶端/服務器
需要安裝客戶端軟件,如:QQ、微信、網遊。
優點:客戶端分擔大量工作,可以呈現復雜特效。
缺點:更新和維護比較麻煩。
主流Web服務器簡介
Web服務器是運行及發布Web應用的容器,只有將開發的Web項目放置到該容器中,才能使網絡中的所有用戶通過瀏覽器進行訪問。開發Java Web應用所采用的服務器主要是與JSP/Servlet兼容的Web服務器,比較常用的有Tomcat、Resin、JBoss、WebSphere 和 WebLogic 等
Tomcat 服務器
目前最為流行的Tomcat服務器是Apache-Jarkarta開源項目中的一個子項目,是一個小型、輕量級的支持JSP和Servlet 技術的Web服務器,也是初學者學習開發JSP應用的首選。
Resin 服務器
Resin是Caucho公司的產品,是一個非常流行的支持Servlet和JSP的服務器,速度非常快。Resin本身包含了一個支持HTML的Web服務器,這使它不僅可以顯示動態內容,而且顯示靜態內容的能力也毫不遜色,因此許多網站都是使用Resin服務器構建
JBoss服務器
JBoss是一個種遵從JavaEE規範的、開放源代碼的、純Java的EJB服務器,對於J2EE有很好的支持。JBoss采用JML API實現軟件模塊的集成與管理,其核心服務又是提供EJB服務器,不包含Servlet和JSP的Web容器,不過它可以和Tomcat完美結合
WebSphere 服務器
WebSphere是IBM公司的產品,可進一步細分為 WebSphere Performance Pack、Cache Manager 和WebSphere Application Server等系列,其中WebSphere Application Server 是基於Java 的應用環境,可以運行於 Sun Solaris、Windows NT 等多種操作系統平臺,用於建立、部署和管理Internet和Intranet Web應用程序。
WebLogic 服務器
WebLogic 是BEA公司的產品(現在已經被Oracle收購),可進一步細分為 WebLogic Server、WebLogic Enterprise 和 WebLogic Portal 等系列,其中 WebLogic Server 的功能特別強大。WebLogic 支持企業級的、多層次的和完全分布式的Web應用,並且服務器的配置簡單、界面友好。對於那些正在尋求能夠提供Java平臺所擁有的一切應用服務器的用戶來說,WebLogic是一個十分理想的選擇
Tomcat的安裝和配置
0、安裝JDK
1、配置JAVA_HOME
JAVA_HOME的值為JDK安裝目錄
2、下載Tomcat
3、配置環境變量
系統變量添加:
CATALINA_HOME 值: Tomcat安裝路徑
在Path添加: ;%CATALINA_HOME %\bin;
4、測試,打開cmd,輸入startup
打開瀏覽器輸入:http://localhost:8080,出現類似下面的頁面
Tomcat目錄介紹
bin 命令執行文件
conf 配置文件目錄
server.xml 核心配置,如:端口、連接池
tomcat-user.xml 用戶配置
web.xml web請求配置
lib tomcat運行需要的jar包
logs 日誌目錄
webapps web項目部署目錄
work 存放項目中的java字節碼文件
Tomcat和Eclipse的配置
1、打開Server面板
Window > Show View > Other > Server > Servers
2、雙擊create new server
選擇服務器版本,下一步
設置Tomcat安裝目錄
3、雙擊創建的服務器,設置項目部署路徑
4、創建Web項目
new > dynamic web project
下一步到最後,勾中復選框,點擊完成
5、在WebContent新建HTML頁面,右鍵點擊run as server運行。
Web項目的目錄介紹:
src Java源代碼
build 字節碼目錄
WebContent 網頁內容(JSP、HTML、JS、CSS、圖片)
META-INF 元信息
WEB-INF
web.xml 項目重要組件配置文件
lib 項目需要的jar包(拷貝後會自動導入項目)
Web服務器的原理
我們將網站部署到Web服務器上,用戶通過瀏覽器就可以訪問服務器上的頁面,這個過程是如何實現的呢?
Web服務器都是基於HTTP協議的,當瀏覽器訪問頁面時,首先會發送HTTP的請求頭給服務器,服務器接受請求後會在web項目的目錄中查找瀏覽器需要的頁面文件,然後服務器依次發送響應狀態和響應頭給瀏覽器,最後發送網頁的HTML代碼給瀏覽器,瀏覽器接受服務器的數據後會解析HTML文件並顯示出來。
下面的案例是通過Socket模擬Web服務器,實現瀏覽器訪問服務器上的頁面。
/**
* 自定義Web服務器
* @author chenheng
*
*/
public class MyTomcat {
private static final int PORT = 8888;
private ExecutorService threadPool = Executors.newFixedThreadPool(10); //創建線程池
/**
* 啟動服務器
*/
public void start(){
System.out.println("服務器啟動了");
try {
//創建服務器Socket,監聽8888端口
ServerSocket server = new ServerSocket(PORT);
while(true){
//獲得客戶端的連接Socket
Socket socket = server.accept();
//啟動線程對客戶端進行服務
threadPool.execute(new ServiceThread(socket));
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new MyTomcat().start();
}
}
/**
* 為客戶端服務的線程
* @author chenheng
*
*/
public class ServiceThread implements Runnable{
public static final String DIR = "C:/java_code/web/";
private Socket socket = null; // 客戶端連接
public ServiceThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
//獲得客戶端的輸入流
try(BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()))){
//讀取客戶端的請求信息
String line = br.readLine();
//截取出請求頭中客戶請求的網頁地址
String url = line.split(" ")[1];
System.out.println("url:"+url);
if(!url.endsWith(".html")){
return;
}
//在服務器的磁盤上讀取該頁面文件的內容
BufferedReader br2 = new BufferedReader(
new InputStreamReader(new FileInputStream(DIR+url)));
StringBuilder strb2 = new StringBuilder();
while((line = br2.readLine()) != null){
strb2.append(line);
}
br2.close();
System.out.println("HTML:"+strb2.toString());
//獲得客戶端的輸出流
OutputStream out = socket.getOutputStream();
//定義響應狀態
String status = "HTTP/1.1 200 OK\r\n";
byte[] b_status = status.getBytes("UTF-8");
//發送響應狀態
out.write(b_status, 0, b_status.length);
//將HTML正文轉為字節
byte[] html = strb2.toString().getBytes("UTF-8");
//定義響應頭
String response_headers = "Content-Type:text/html;charset=utf-8\r\n"
+ "Content-Length:"+html.length+"\r\n";
byte[] headers = response_headers.getBytes("UTF-8");
//發送響應頭
out.write(headers);
//發送字節作為響應頭和正文的分隔
out.write(new byte[]{13,10},0,2);
//發送正文
out.write(html,0,html.length);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
JavaWeb之服務器基礎