课程网站:
- 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,把后面改成你的文件夹的位置
然后打开cmd,输入"D:\Apache24\bin\httpd.exe" -k install -n apache
。
把文件里面的端口号修改为其他端口。(当然也可以继续用80端口)
PS:如果出现AH00369: Failed to open the Windows service manager, perhaps you forgot to log in as Adminstrator?
,则需要以管理员身份打开cmd。
安装完成之后,在D:\Apache24\bin下打开ApacheMonitor.exe,出现如下界面。
点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;
}
将后缀改为.cgi,然后打开http://localhost:8080/cgi-bin/Test.cgi
如果发现出现了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,用浏览器打开,就正常了。
参考资料:
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,你可能不得不经历下面的过程:
- 如果使用了spring,去spring的官网下载jar包;如果使用hibernate,去hibernate的官网下载Jar包;如果使用Log4j,去log4j的官网下载jar包.....
- 当某些jar包有依赖的时候,还要去下载对应的依赖jar包
- 当jar包依赖有冲突时,不得不一个一个的排查
- 执行构建时,需要使用ant写出很多重复的任务代码
- 当新人加入开发时,需要拷贝大量的jar包,然后重复进行构建
- 当进行测试时,需要一个一个的运行....检查
有了Maven,它提供了三种功能:
- 依赖的管理:仅仅通过jar包的几个属性,就能确定唯一的jar包,在指定的文件pom.xml中,只要写入这些依赖属性,就会自动下载并管理jar包。
- 项目的构建:内置很多的插件与生命周期,支持多种任务,比如校验、编译、测试、打包、部署、发布...
- 项目的知识管理:管理项目相关的其他内容,比如开发者信息,版本等等
所以,据说Maven很强大
配置Maven
要配置Maven,首先要去官网下载。
Maven下载链接
下载了之后,是一个压缩包:
解压之后,大概长这样:
接着呢,我们就只要配置环境变量就行了。打开环境变量,然后添加M2_HOME。下面的地址就是文件所在的地址。
接着在变量Path中添加%M2_HOME%\bin。
完成之后,运行cmd,输入命令: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
点击Create New Project新建项目。
选择Maven,然后点击Create from archetype,最后选择maven-archetype-quickstart就行了,然后点击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。
这里我们看到IntelliJ IDEA其实内置了Maven。这样就免得我们去配置了。继续Next
把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("Hello World
");
}
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,然后输入下面的代码:
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
然后再在右上角导入包。我们就发现我们需要的包就已经自动下载并且导入了。是不是很神奇?是不是很牛逼?
右键HelloWorld.java,点击run,然后在浏览器打开:http://localhost:8080。
大功告成!
编写标准 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的按钮。
点开之后,在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/
它继承了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 源代码,简述这个类的关键代码。
……