第三课:Java Web 编程原理

课程网站:

相关文章:

使用 CGI


Apache服务器搭建

首先先下载apache httpd程序

下载地址

将下载到的包解压。然后放入比较正常的位置。

在“D:\Apache24\conf”里面找到httpd.conf。打开然后编辑。

找到Define SRVROOT,把后面改成你的文件夹的位置

Define SRVROOT

然后打开cmd,输入"D:\Apache24\bin\httpd.exe" -k install -n apache

修改为8080端口

把文件里面的端口号修改为其他端口。(当然也可以继续用80端口)

PS:如果出现AH00369: Failed to open the Windows service manager, perhaps you forgot to log in as Adminstrator?,则需要以管理员身份打开cmd。

安装完成之后,在D:\Apache24\bin下打开ApacheMonitor.exe,出现如下界面。

ApacheMonitor

点Start,然后打开http://localhost:8080/。出来了页面,说明已经成功了。

PS:卸载Apache,只需要在cmd输入sc delete apache就行了。

编写CGI程序(C语言)

CGI(公用网关接口)规定了Web服务器调用其他可执行程序(CGI程序)的接口协议标准。Web服务器通过调用CGI程序实现和Web浏览器的交互, 也就是CGI程序接受Web浏览器发送给Web服务器的信息,进行处理, 将响应结果再回送给Web服务器及Web浏览器。CGI程序一般完成Web网页中表单(Form)数据的处理、数据库查询和实现与传统应用系统的集成等工 作。CGI程序可以用任何程序设计语言编写,如Shell脚本语言、Perl、Fortran、Pascal、C语言等。但是用C语言编写的CGI程序具 有执行速度快、安全性高(因为C语言程序是编译执行且不可被修改)等特点。

我们编写一段HelloWorld程序

#include <stdio.h>
int main()
{
    printf("Content-type:text/html\n\n"); 
    printf("Hello, World!\n");
    return 0;
}
放入D:\Apache24\cgi-bin文件夹下

将后缀改为.cgi,然后打开http://localhost:8080/cgi-bin/Test.cgi

如果发现出现了403,则遇到了权限访问的问题。

403

这个时候,修改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,用浏览器打开,就正常了。

Hello World

参考资料:
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 编程基础


Maven介绍

如果没有Maven,你可能不得不经历下面的过程:

  1. 如果使用了spring,去spring的官网下载jar包;如果使用hibernate,去hibernate的官网下载Jar包;如果使用Log4j,去log4j的官网下载jar包.....
  2. 当某些jar包有依赖的时候,还要去下载对应的依赖jar包
  3. 当jar包依赖有冲突时,不得不一个一个的排查
  4. 执行构建时,需要使用ant写出很多重复的任务代码
  5. 当新人加入开发时,需要拷贝大量的jar包,然后重复进行构建
  6. 当进行测试时,需要一个一个的运行....检查

有了Maven,它提供了三种功能:

  1. 依赖的管理:仅仅通过jar包的几个属性,就能确定唯一的jar包,在指定的文件pom.xml中,只要写入这些依赖属性,就会自动下载并管理jar包。
  2. 项目的构建:内置很多的插件与生命周期,支持多种任务,比如校验、编译、测试、打包、部署、发布...
  3. 项目的知识管理:管理项目相关的其他内容,比如开发者信息,版本等等

所以,据说Maven很强大

配置Maven

要配置Maven,首先要去官网下载。

Maven下载链接

下载了之后,是一个压缩包:

Maven压缩包

解压之后,大概长这样:

Maven压缩包内容

接着呢,我们就只要配置环境变量就行了。打开环境变量,然后添加M2_HOME。下面的地址就是文件所在的地址。

添加M2_HOME

接着在变量Path中添加%M2_HOME%\bin。

添加%M2_HOME%\bin

完成之后,运行cmd,输入命令:mvn -version

mvn -version

出现下图的样子,就算大功告成了。

参考资料:
http://www.cnblogs.com/xing901022/p/5024357.html
http://www.cnblogs.com/jifeng/p/4658765.html

编写简单 web 程序

这个时候,我们要使用特别牛逼Java语言的IDE,IntelliJ IDEA。用起来不知道比eclipse高到哪里去了。

下载地址如下:

下载地址

打开IntelliJ IDEA

打开IntelliJ IDEA

点击Create New Project新建项目。

新建项目

选择Maven,然后点击Create from archetype,最后选择maven-archetype-quickstart就行了,然后点击Next。

Next

这里的GroupId一般是域名的反写,也作为项目中类的包名。GroupId一般分为多个段,这里我只说两段,第一段为域,第二段为公司名称。域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。举个apache公司的tomcat项目例子:这个项目的groupId是org.apache,它的域是org(因为tomcat是非营利项目),公司名称是apache,artigactId是tomcat。这里我们设置为org.example。Artfactld是工程名,也就是根文件夹名。我们设置为demo。Version是版本,我们的版本是1.0。然后继续Next。

Next

这里我们看到IntelliJ IDEA其实内置了Maven。这样就免得我们去配置了。继续Next

命名为JettyMavenHelloWorld

把Project name命名为JettyMavenHelloWorld,点Finish。于是我们就成功创建了一个项目。

导入包

创建之后,我们会发现右上角有一个Maven需要导入的框。我们把它导入就好了。

新建出来的项目的样子

导入之后,就出现了新项目的样子。可以看到文件组织大概是怎么样的。打开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();
        }
}
输入代码

这个时候,我们发现代码都是红色。因为没有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>

然后再在右上角导入包。我们就发现我们需要的包就已经自动下载并且导入了。是不是很神奇?是不是很牛逼?

程序不再爆红

右键HelloWorld.java,点击run,然后在浏览器打开:http://localhost:8080

浏览器显示出Hello World

大功告成!

编写标准 Servlet 程序


过程与写简单 web 程序差不多。只不过开始选择的不是maven-archetype-quickstart,而是下面的maven-archetype-webapp。项目命名为JettyMavenHelloWarApp。

创建完成之后,在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 编程的优点和缺点

优点:

  • 实现浏览器的交互,可以做到用HTML无法做到的事情
  • 可以支持多种编程语言
  • 可以让没有多少Web编程经验的人快速上手
  • 比脚本安全性高,更加稳定

缺点:

  • 效率比较低
  • 编程难度比较大,开发效率比较低,维护难度比较大

在 cgi 实验的基础上,简述middleware在程序开发中的作用

中间件处于操作系统软件与用户的应用软件的中间。中间件在操作系统、网络和数据库之上,应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。形象地说就是上下之间的中间。使用中间件,有助于分工和代码分离。例如我用CGI编程,我只需要编写应用程序,而不管网页部分。大大提高了编程效率。

搜索 org.eclipse.jetty.server.handler.AbstractHandler 类

  • 解释 Java API页面的组织
  • 这个类实现了哪个接口,这个接口有哪些方法?

Java API页面的组织见网址:
http://docs.oracle.com/javase/7/docs/api/

AbstractHandler类的结构

它继承了AbstractLifeCycle类,实现了Handler接口。AbstractLifeCycle实现了LifeCycle接口。其实,Handler接口又是继承了LifeCycle。

Handler里面的方法如下:

public interface Handler extends LifeCycle  
{
    //转发的类型
    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是转发的类型  
    public void handle(String target,
                      HttpServletRequest request,
                      HttpServletResponse response,
                      int dispatch)
        throws IOException, ServletException;
    //设置当前handler的server
    public void setServer(Server server);
    public Server getServer();
    public void destroy();  
}

参考资料:
http://blog.csdn.net/kobejayandy/article/details/20165539

Java web 编程有几个元素是我们编程学习的重要内容:

  • javax.servlet.http.HttpServletRequest
  • javax.servlet.http.HttpServletResponse
  • javax.servlet.ServletRequest
  • javax.servlet.ServletResponse

  • 它们是 类 还是 接口?是那个机构定义?
  • response.getWriter() 中 getWriter 返回的对象是什么?
  • 简述 javax.servlet.ServletResponse 的 getOutputStream() 和 getWriter() 的区别
  • 对比 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文件出现在了项目里面。

(!)阅读 org.eclipse.jetty.server.Server 源代码,简述这个类的关键代码。

……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容