第三课:Java Web 编程原理

课程网站:

  • http://ss.sysu.edu.cn/~pml/dct/3_web_prog.html

相关文章:

  • 第一课:Java进阶与Socket通讯实验
  • 第二课:Socket通讯与HTTP服务器
  • 第三课:Java Web 编程原理
  • 第四课:RESTful Webservice 编程

使用 CGI


Apache服务器搭建

首先先下载apache httpd程序

下载地址

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

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

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

第三课:Java Web 编程原理_第1张图片
Define SRVROOT

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

第三课:Java Web 编程原理_第2张图片
修改为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,出现如下界面。

第三课:Java Web 编程原理_第3张图片
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 
int main()
{
    printf("Content-type:text/html\n\n"); 
    printf("Hello, World!\n");
    return 0;
}
第三课:Java Web 编程原理_第4张图片
放入D:\Apache24\cgi-bin文件夹下

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

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

第三课:Java Web 编程原理_第5张图片
403

这个时候,修改httpad.conf文件中的


    AllowOverride none
    Require all denied


    Options Indexes FollowSymLinks
    AllowOverride None

(这个不确定需不需要)打开\conf\extra\httpd-vhosts.conf,在下面加上


    ServerAdmin [email protected]
    DocumentRoot D:\Apache24
    
        Options -Indexes +FollowSymlinks
        AllowOverride All
        Require all granted  
        Require host ip  
    

然后重新打开Apache,用浏览器打开,就正常了。

第三课:Java Web 编程原理_第6张图片
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压缩包

解压之后,大概长这样:

第三课:Java Web 编程原理_第7张图片
Maven压缩包内容

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

第三课:Java Web 编程原理_第8张图片
添加M2_HOME

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

第三课:Java Web 编程原理_第9张图片
添加%M2_HOME%\bin

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

第三课:Java Web 编程原理_第10张图片
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

第三课:Java Web 编程原理_第11张图片
打开IntelliJ IDEA

点击Create New Project新建项目。

第三课:Java Web 编程原理_第12张图片
新建项目

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

第三课:Java Web 编程原理_第13张图片
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。

第三课:Java Web 编程原理_第14张图片
Next

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

第三课:Java Web 编程原理_第15张图片
命名为JettyMavenHelloWorld

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

第三课:Java Web 编程原理_第16张图片
导入包

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

第三课:Java Web 编程原理_第17张图片
新建出来的项目的样子

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

Hello World

"); } public static void main(String[] args) throws Exception { Server server = new Server(8080); server.setHandler(new HelloWorld()); server.start(); server.join(); } }
第三课:Java Web 编程原理_第18张图片
输入代码

这个时候,我们发现代码都是红色。因为没有servlet和jetty的包。先别急着导入包(我导入包导入了好久),这个时候就展示Maven的威力了。

打开pom.xml,然后输入下面的代码:


  4.0.0

  org.example
  demo
  1.0-SNAPSHOT
  jar

  demo
  http://maven.apache.org

  
    UTF-8
    9.3.7.v20160115
  

  
    
      junit
      junit
      3.8.1
      test
    
    
      org.eclipse.jetty
      jetty-server
      ${jettyVersion}
    
  

  
    
      
        org.codehaus.mojo
        exec-maven-plugin
        1.1
        
          java
        
        
          org.example.HelloWorld
        
      
    
  

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

第三课:Java Web 编程原理_第19张图片
程序不再爆红

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

第三课:Java Web 编程原理_第20张图片
浏览器显示出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("

Hello Servlet

"); response.getWriter().println("session=" + request.getSession(true).getId()); } }

修改src/main/webapp/WEB-INF/web.xml



  
    Hello
    org.example.HelloServlet
  
  
    Hello
    /hello/*
  

修改pom.xml


  4.0.0
  org.example
  demo
  war
  1.0-SNAPSHOT
  demo Maven Webapp
  http://maven.apache.org

  
    9.3.7.v20160115
  

  
    
      junit
      junit
      3.8.1
      test
    
      
          javax.servlet
          javax.servlet-api
          3.1.0
          provided
      
  
  
    demo
      
          
              org.eclipse.jetty
              jetty-maven-plugin
              ${jettyVersion}
          
      

  

在右上角找到Maven Project,点开。然后点击有个黑框和m的按钮。

第三课:Java Web 编程原理_第21张图片
运行程序

点开之后,在Command line里面输入jetty:run

第三课:Java Web 编程原理_第22张图片
运行程序

然后在浏览器打开: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/

第三课:Java Web 编程原理_第23张图片
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 源代码,简述这个类的关键代码。

……

你可能感兴趣的:(第三课:Java Web 编程原理)