課程網(wǎng)站:
相關(guān)文章:
使用 CGI
Apache服務器搭建
首先先下載apache httpd程序
將下載到的包解壓。然后放入比較正常的位置。
在“D:\Apache24\conf”里面找到httpd.conf。打開然后編輯育谬。
找到Define SRVROOT坞靶,把后面改成你的文件夾的位置
然后打開cmd杂靶,輸入"D:\Apache24\bin\httpd.exe" -k install -n apache
传货。
把文件里面的端口號修改為其他端口晃跺。(當然也可以繼續(xù)用80端口)
PS:如果出現(xiàn)AH00369: Failed to open the Windows service manager, perhaps you forgot to log in as Adminstrator?
衰琐,則需要以管理員身份打開cmd也糊。
安裝完成之后,在D:\Apache24\bin下打開ApacheMonitor.exe羡宙,出現(xiàn)如下界面狸剃。
點Start,然后打開http://localhost:8080/狗热。出來了頁面钞馁,說明已經(jīng)成功了。
PS:卸載Apache匿刮,只需要在cmd輸入sc delete apache
就行了僧凰。
編寫CGI程序(C語言)
CGI(公用網(wǎng)關(guān)接口)規(guī)定了Web服務器調(diào)用其他可執(zhí)行程序(CGI程序)的接口協(xié)議標準。Web服務器通過調(diào)用CGI程序?qū)崿F(xiàn)和Web瀏覽器的交互, 也就是CGI程序接受Web瀏覽器發(fā)送給Web服務器的信息,進行處理, 將響應結(jié)果再回送給Web服務器及Web瀏覽器熟丸。CGI程序一般完成Web網(wǎng)頁中表單(Form)數(shù)據(jù)的處理训措、數(shù)據(jù)庫查詢和實現(xiàn)與傳統(tǒng)應用系統(tǒng)的集成等工 作。CGI程序可以用任何程序設(shè)計語言編寫,如Shell腳本語言光羞、Perl绩鸣、Fortran、Pascal狞山、C語言等全闷。但是用C語言編寫的CGI程序具 有執(zhí)行速度快叉寂、安全性高(因為C語言程序是編譯執(zhí)行且不可被修改)等特點萍启。
我們編寫一段HelloWorld程序
#include <stdio.h>
int main()
{
printf("Content-type:text/html\n\n");
printf("Hello, World!\n");
return 0;
}
將后綴改為.cgi,然后打開http://localhost:8080/cgi-bin/Test.cgi
如果發(fā)現(xiàn)出現(xiàn)了403屏鳍,則遇到了權(quán)限訪問的問題勘纯。
這個時候,修改httpad.conf文件中的
<Directory />
AllowOverride none
Require all denied
</Directory>
為
<Directory />
Options Indexes FollowSymLinks
AllowOverride None
</Directory>
(這個不確定需不需要)打開\conf\extra\httpd-vhosts.conf钓瞭,在下面加上
<VirtualHost *:8080 >
ServerAdmin example@company.com
DocumentRoot D:\Apache24
<Directory "D:\Apache24">
Options -Indexes +FollowSymlinks
AllowOverride All
Require all granted
Require host ip
</Directory>
</VirtualHost>
然后重新打開Apache驳遵,用瀏覽器打開,就正常了山涡。
參考資料:
http://www.cnblogs.com/ribavnu/archive/2012/11/18/2775550.html
http://www.phpweblog.net/maple094/archive/2008/05/29/4000.html
運行程序
我們運行Apache堤结,然后打開瀏覽器輸入http://localhost:8080/cgi-bin/Test.exe
Java web 編程基礎(chǔ)
Maven介紹
如果沒有Maven,你可能不得不經(jīng)歷下面的過程:
- 如果使用了spring唆迁,去spring的官網(wǎng)下載jar包;如果使用hibernate竞穷,去hibernate的官網(wǎng)下載Jar包唐责;如果使用Log4j,去log4j的官網(wǎng)下載jar包.....
- 當某些jar包有依賴的時候瘾带,還要去下載對應的依賴jar包
- 當jar包依賴有沖突時鼠哥,不得不一個一個的排查
- 執(zhí)行構(gòu)建時,需要使用ant寫出很多重復的任務代碼
- 當新人加入開發(fā)時看政,需要拷貝大量的jar包朴恳,然后重復進行構(gòu)建
- 當進行測試時,需要一個一個的運行....檢查
有了Maven允蚣,它提供了三種功能:
- 依賴的管理:僅僅通過jar包的幾個屬性于颖,就能確定唯一的jar包,在指定的文件pom.xml中嚷兔,只要寫入這些依賴屬性恍飘,就會自動下載并管理jar包。
- 項目的構(gòu)建:內(nèi)置很多的插件與生命周期谴垫,支持多種任務章母,比如校驗、編譯翩剪、測試乳怎、打包、部署前弯、發(fā)布...
- 項目的知識管理:管理項目相關(guān)的其他內(nèi)容蚪缀,比如開發(fā)者信息,版本等等
所以恕出,據(jù)說Maven很強大
配置Maven
要配置Maven询枚,首先要去官網(wǎng)下載。
下載了之后浙巫,是一個壓縮包:
解壓之后金蜀,大概長這樣:
接著呢,我們就只要配置環(huán)境變量就行了的畴。打開環(huán)境變量渊抄,然后添加M2_HOME。下面的地址就是文件所在的地址丧裁。
接著在變量Path中添加%M2_HOME%\bin护桦。
完成之后,運行cmd煎娇,輸入命令:mvn -version
出現(xiàn)下圖的樣子二庵,就算大功告成了贪染。
參考資料:
http://www.cnblogs.com/xing901022/p/5024357.html
http://www.cnblogs.com/jifeng/p/4658765.html
編寫簡單 web 程序
這個時候,我們要使用特別牛逼Java語言的IDE催享,IntelliJ IDEA抑进。用起來不知道比eclipse高到哪里去了。
下載地址如下:
打開IntelliJ IDEA
點擊Create New Project新建項目睡陪。
選擇Maven寺渗,然后點擊Create from archetype,最后選擇maven-archetype-quickstart就行了兰迫,然后點擊Next信殊。
這里的GroupId一般是域名的反寫,也作為項目中類的包名汁果。GroupId一般分為多個段涡拘,這里我只說兩段,第一段為域据德,第二段為公司名稱鳄乏。域又分為org、com棘利、cn等等許多橱野,其中org為非營利組織,com為商業(yè)組織善玫。舉個apache公司的tomcat項目例子:這個項目的groupId是org.apache水援,它的域是org(因為tomcat是非營利項目),公司名稱是apache茅郎,artigactId是tomcat蜗元。這里我們設(shè)置為org.example。Artfactld是工程名系冗,也就是根文件夾名奕扣。我們設(shè)置為demo。Version是版本掌敬,我們的版本是1.0惯豆。然后繼續(xù)Next。
這里我們看到IntelliJ IDEA其實內(nèi)置了Maven涝开。這樣就免得我們?nèi)ヅ渲昧搜省@^續(xù)Next
把Project name命名為JettyMavenHelloWorld框仔,點Finish舀武。于是我們就成功創(chuàng)建了一個項目。
創(chuàng)建之后离斩,我們會發(fā)現(xiàn)右上角有一個Maven需要導入的框银舱。我們把它導入就好了瘪匿。
導入之后,就出現(xiàn)了新項目的樣子寻馏∑迕郑可以看到文件組織大概是怎么樣的。打開App.java诚欠,把它改名為HelloWorld.java顽染,然后輸入下面的代碼。
package org.example;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
public class HelloWorld extends AbstractHandler {
public void handle(String target, Request baseRequest,
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);
response.getWriter().println("<h1>Hello World</h1>");
}
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
server.setHandler(new HelloWorld());
server.start();
server.join();
}
}
這個時候轰绵,我們發(fā)現(xiàn)代碼都是紅色粉寞。因為沒有servlet和jetty的包。先別急著導入包(我導入包導入了好久)左腔,這個時候就展示Maven的威力了唧垦。
打開pom.xml,然后輸入下面的代碼:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jettyVersion>9.3.7.v20160115</jettyVersion>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>${jettyVersion}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1</version>
<executions>
<execution><goals><goal>java</goal></goals></execution>
</executions>
<configuration>
<mainClass>org.example.HelloWorld</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
然后再在右上角導入包液样。我們就發(fā)現(xiàn)我們需要的包就已經(jīng)自動下載并且導入了振亮。是不是很神奇?是不是很牛逼鞭莽?
右鍵HelloWorld.java坊秸,點擊run,然后在瀏覽器打開:http://localhost:8080澎怒。
大功告成妇斤!
編寫標準 Servlet 程序
過程與寫簡單 web 程序差不多。只不過開始選擇的不是maven-archetype-quickstart丹拯,而是下面的maven-archetype-webapp站超。項目命名為JettyMavenHelloWarApp。
創(chuàng)建完成之后乖酬,在src/main下面新建src/main/java/org/example/HelloServlet.java死相。
輸入代碼:
package org.example;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println("<h1>Hello Servlet</h1>");
response.getWriter().println("session=" + request.getSession(true).getId());
}
}
修改src/main/webapp/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
metadata-complete="false"
version="3.1">
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>org.example.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
</web-app>
修改pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>demo</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>demo Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<jettyVersion>9.3.7.v20160115</jettyVersion>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>demo</finalName>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jettyVersion}</version>
</plugin>
</plugins>
</build>
</project>
在右上角找到Maven Project,點開咬像。然后點擊有個黑框和m的按鈕算撮。
點開之后,在Command line里面輸入jetty:run
然后在瀏覽器打開:http://localhost:8080/hello
然后大功告成县昂!
習題部分
用自己的語言簡單說明 cgi 編程的優(yōu)點和缺點
優(yōu)點:
- 實現(xiàn)瀏覽器的交互肮柜,可以做到用HTML無法做到的事情
- 可以支持多種編程語言
- 可以讓沒有多少Web編程經(jīng)驗的人快速上手
- 比腳本安全性高,更加穩(wěn)定
缺點:
- 效率比較低
- 編程難度比較大倒彰,開發(fā)效率比較低审洞,維護難度比較大
在 cgi 實驗的基礎(chǔ)上,簡述middleware在程序開發(fā)中的作用
中間件處于操作系統(tǒng)軟件與用戶的應用軟件的中間待讳。中間件在操作系統(tǒng)芒澜、網(wǎng)絡和數(shù)據(jù)庫之上仰剿,應用軟件的下層,總的作用是為處于自己上層的應用軟件提供運行與開發(fā)的環(huán)境痴晦,幫助用戶靈活南吮、高效地開發(fā)和集成復雜的應用軟件。形象地說就是上下之間的中間誊酌。使用中間件部凑,有助于分工和代碼分離。例如我用CGI編程碧浊,我只需要編寫應用程序砚尽,而不管網(wǎng)頁部分。大大提高了編程效率辉词。
搜索 org.eclipse.jetty.server.handler.AbstractHandler 類
- 解釋 Java API頁面的組織
- 這個類實現(xiàn)了哪個接口必孤,這個接口有哪些方法?
Java API頁面的組織見網(wǎng)址:
http://docs.oracle.com/javase/7/docs/api/
它繼承了AbstractLifeCycle類瑞躺,實現(xiàn)了Handler接口敷搪。AbstractLifeCycle實現(xiàn)了LifeCycle接口。其實幢哨,Handler接口又是繼承了LifeCycle赡勘。
Handler里面的方法如下:
public interface Handler extends LifeCycle
{
//轉(zhuǎn)發(fā)的類型
public static final int DEFAULT=0;
public static final int REQUEST=1;
public static final int FORWARD=2;
public static final int INCLUDE=4;
public static final int ERROR=8;
public static final int ALL=15;
//用于處理http請求,target一般是url捞镰,dispatch是轉(zhuǎn)發(fā)的類型
public void handle(String target,
HttpServletRequest request,
HttpServletResponse response,
int dispatch)
throws IOException, ServletException;
//設(shè)置當前handler的server
public void setServer(Server server);
public Server getServer();
public void destroy();
}
參考資料:
http://blog.csdn.net/kobejayandy/article/details/20165539
Java web 編程有幾個元素是我們編程學習的重要內(nèi)容:
- javax.servlet.http.HttpServletRequest
- javax.servlet.http.HttpServletResponse
- javax.servlet.ServletRequest
- javax.servlet.ServletResponse
- 它們是 類 還是 接口闸与?是那個機構(gòu)定義?
- response.getWriter() 中 getWriter 返回的對象是什么岸售?
- 簡述 javax.servlet.ServletResponse 的 getOutputStream() 和 getWriter() 的區(qū)別
- 對比 javax.servlet.http.HttpServletResponse 和javax.servlet.ServletResponse 的方法践樱。這是一個典型裝飾模式, HttpServletResponse 添加了哪些新職能凸丸?
它們都是接口拷邢。是由Sun公司最早提出和定義的。
getWriter方法返回的是java.io.PrintWriter對象屎慢。
兩個接口的如下:
public java.io.PrintWriter getWriter()
throws java.io.IOException
public ServletOutputStream getOutputStream()
throws java.io.IOException
兩個方法返回的對象不一樣瞭稼。
- 除了繼承了ServletRequest的接口,HttpServletResponse還添加了如下接口:
void addCookie(Cookie cookie);
void addDateHeader(java.lang.String name, long date);
void addHeader(java.lang.String name, java.lang.String value);
void addIntHeader(java.lang.String name, int value);
boolean containsHeader(java.lang.String name);
java.lang.String encodeRedirectUrl(java.lang.String url)
java.lang.String encodeRedirectURL(java.lang.String url);
java.lang.String encodeUrl(java.lang.String url);
java.lang.String encodeURL(java.lang.String url);
void sendError(int sc);
void sendError(int sc, java.lang.String msg);
void sendRedirect(java.lang.String location);
void setDateHeader(java.lang.String name, long date);
void setHeader(java.lang.String name, java.lang.String value);
void setIntHeader(java.lang.String name, int value);
void setStatus(int sc);
void setStatus(int sc, java.lang.String sm);
參考資料:
http://tomcat.apache.org/tomcat-5.5-doc/servletapi/
Maven 默認的本地倉庫路徑是什么腻惠? 找到 JettyMavenHelloWarApp 打包的 war 文件的位置环肘。
Maven的默認本地倉庫在用戶目錄的.m2下,缺省的本地倉庫路徑為${user.home}/.m2/repository集灌。
war文件出現(xiàn)在了項目里面悔雹。
(!)閱讀 org.eclipse.jetty.server.Server 源代碼,簡述這個類的關(guān)鍵代碼荠商。
……