【Java Web初级系列教程】Web基础知识

前言:刚上手Java Web的时候,想寻找好一点的网上教程,发现网上资源鱼龙混杂,框架满天飞,对于新手刚开始就希望从基础的原理性的开始一步步了解,索性自己搜集材料开始写。

      本系列教程专门为Java Web初级开发者设计,阶梯式的循序渐进,没有用到任何框架,都是基础篇,一步步带你揭开Java Web应用的面纱,这是第一篇。

       背景说明

            任何事物的产生都是有原因的,为什么会有Java Web应用程序呢?

            话说女娲补石、盘古开天辟地。。算了,不扯蛋了,认真讲,Java Web应用程序解决了一件事:创建可交互的动态网页。为什么这么说?如果你想创建一个静态网页,用HTML就可以了,不用创建Java Web应用,HTML是超文本标记语言,直接存在服务器上,一个URL定位到HTML文件就好了,但是要想产生动态交互,你就需要Java Web应用。Java Web应用呢,就是通过Servlet和JSP来实现动态交互的。好,大家暂且先记住:1.Java Web是用来创建动态网页的;2.Java Web通过Servlet和JSP来创建动态网页。后面我会慢慢解释。

     目录:

           1.Web服务器和客户端

           2.HTML和HTTP

           3.URL

           4.为什么是Servlet和JSP?

           5.通过Servlet和JSP实现的第一个Web应用(***)

           6.Web容器

           7.Web应用目录结构

           8.发布描述Web.xml


  1.Web服务器和客户端  

Web服务器说白了就是个软件,这个软件能够处理来自客户端的请求,能够将客户端想要的东西发给客户端。就是这么地简单,例如:Apache就是用的很广泛的Web服务器,服务器软件是运行在物理机上的,同时一直监听着某个端口,这个端口就是客户端发送数据过来的入口。

         客户端就更简单了,浏览器就是我们最常用的客户端软件,Chrome、Safari、火狐等等。客户端的作用就是将我们的请求发给服务器,最常见的比如通过URL(浏览器地址栏输入网址),然后将服务器发送回来的数据解析后展现出来,方便我们看,我们现在看到的网页都是浏览器解析后展现出来的。

  2.HTML和HTTP

     有了Web服务器和客户端,他们需要交流互动啊!这二个是不同的软件,就好像是二个不同国家的人,他们之间怎么沟通呢?这个时候就需要一种互相都能理解的语言,对二个不同国家的人,通用的语言就是英语,对于Web服务器和客户端,通用的语言就是HTML(HyperText Markup Language)超文本标记语言,比简单文本说的多就叫“超文本”,那这二个人约定好语言之后,又有了新的问题,他们不站在一起,一个在中国,一个在美国,怎么沟通呢?客户端和服务器也是一样,约定好语言之后,还需要一套协议,定义好谁先开始讲话,说什么话,另一个人应该怎么回应?那这套讲话的标准就是HTTP,HTTP就规定了客户端先开始讲话,先说的内容包括:HTTP Method、URL等等,告诉服务器我想通过什么样的方法(get/post)从你这取什么数据(URL),下面是一个客户端请求的例子:
GET /FirstServletProject/jsps/hello.jsp HTTP/1.1
Host: localhost:8080
Cache-Control: no-cache

服务器接收到通过HTTP讲话方式讲的话之后,也通过HTTP方式回应客户端,包括有:状态码、日期、服务器类型、内容长度、内容类型等,例子如下:

200 OK
Date: Wed, 07 Aug 2013 19:55:50 GMT
Server: Apache-Coyote/1.1
Content-Length: 309
Content-Type: text/html;charset=US-ASCII

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Hello</title>
</head>
<body>
<h2>Hi There!</h2>
<br>
<h3>Date=Wed Aug 07 12:57:55 PDT 2013
</h3>
</body>
</html>
注意,服务器按照HTTP方式在回应客户端时候,有一项
Content-Type: text/html;charset=US-ASCII
“Content-Type”是告诉客户端我讲的是什么类型的话,chartset就是话的规范,就好像说我用的美式英语跟你讲的,服务器你要注意切换一下听的方式。

3.URL

   URL是 Universal Resource Locator (通用资源定位符),URL就是用来定位服务器上资源的。服务器上的每一个资源都有它唯一的地址,URL就是找到它的线路。让我们看一条URL:
http://localhost:8080/FirstServletProject/jsps/hello.jsp
http://  - 这部分是URL的第一部分,就是我们上面说的服务器和客户端沟通的标准(协议);
localhost  -这部分是服务器的标识,很多时候是IP地址或者域名,域名(例如www.baidu.com)最后也会被DNS(域名解析服务)转成IP,是用来定位资源在哪台服务器的。
8080 -这个也是我们上面提到过的Web服务器会监听一个网络端口,看这个端口是否有数据进来,这个端口是可选的,如果我们不提供的话,客户端的请求数据会根据使用的协议进默认的端口(HTTP协议是80,HTTPS是443,FTP是21),这些提前规定好的端口0-1023是系统保留端口。
FirstServletProject/jsps/hello.jsp  -这个就是被请求的资源。他可以是静态的资源,例如html、pdf,也可以是动态的,例如JSP、Servlet、PHP等。

4.为什么是Servlet和JSP?

    对于HTML,服务器处理起来很简单,静态的资源,你客户端请求我就直接给你,不用做任何复杂操作,但是在生成动态内容和数据持久化(把数据保存下来)上有问题,比如你在页面上选了个商品,想直接查看商品详情,如果是静态的你需要用另一个URL去查看商品详情,服务器不能动态根据你的操作动态给你反馈,这个是动态的问题,那还有你精心编辑好的微博发送到后台,后台也没法给你存下来(因为后台没有处理程序,都是静态的HTML),这个是持久化的问题,Servlet和JSPs就是干动态和持久化的,他们扩展了服务器的功能,为动态数据更新和数据持久化提供了支持。

5.通过Servlet和JSP实现的第一个Web应用

     接下来是重头戏,我会用MyEclipse和Tomcat构建我们第一个Demo。因为Servlet是服务端技术,我们需要Web容器来支持Servlet运行,这里我们用Apache Tomcat充当Web容器。Tomcat很容易装,这部分工作留给你自己。

在MyEclipse 中点击File->New->Web Project  输入“MyFirstServlet”创建新的Web应用程序,如下图


创建好之后点击工程,右键New Servlet,如下图所示:


       现在我们在doGet()方法内添加一些动态数据代码,我们第一个Servlet就像下面这样:

package com.jige.first;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(
		description = "My First Servlet", 
		urlPatterns = { "/FirstServlet" , "/FirstServlet.do"},
		initParams = {
			@WebInitParam (name="id",value="1"),
			@WebInitParam(name="name",value="Jack")
		}
)
public class FirstServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;
	public static final String HTML_START="<html><body>";
	public static final String HTML_END="</body></html>";
	
	public FirstServlet() {
		super();
	}

	public void destroy() {
		super.destroy(); 
	}
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		Date date = new Date();
		out.println(HTML_START + "<h2>Hi There!</h2><br/><h3>Date="+date +"</h3>"+HTML_END);
	}

	public void init() throws ServletException {
		// Put your code here
	}

}
这里要说的一点是在Servlet 3之前,我们需要在应用部署描述(web.xml)文件中提供Servlet声明和映射,但是Servlet 3使用java annotations告诉Servlet Container(Apache)这是一个Servlet,既简单又容易维护。

我们点右键,运行  Run As->MyEclipse Server,在浏览器输入地址http://localhost:8080/MyFirstServlet/FirstServlet,效果如下:



你可以刷新网页,数据是动态变化的。

因此Servlet这里就是用来生成HTML,并返回给response对象,容器将response返回给客户端。通过Servlet创建动态网页很简单,但是也很容易出错,遇到大数据量更是如此(你想啊,你用Java写html,估计没几个人会这么做吧!),因此就有了JSP,JSP语法结构上和HTML类似,只是添加了我们需要的动态内容。

JSP很容易看懂,长得像HTML嘛。那下面我们通过JSP实现刚才的效果:

<%@page import="java.util.Date" %>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>hello</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  
  <body>
    <h2>Hi There!</h2> <br>
    <h3>Date=<%= new Date() %>
  </body>
</html>
实现后效果一样。后面我会更详细的介绍Servlet和JSP,现在我们先还是把Java Web基础知识看完。

6.Web容器

Tomcat是个Web容器,它处理来自客户端的请求。具体流程是这样的,当请求过来的时候,如果这个请求是请求servlet的,web容器会创建二个对象 HTTPServletRequest and HTTPServletResponse, 然后,根据请求的URL找到对应的Servlet,为这个请求创建一个线程,然后调用Servlet的service()方法,在service()方法基础上调用doGet()和doPost()方法,Servlet doGet()和doPost()生成动态网页然后将它传递给response。一旦servlet线程完成,容器将response发给客户端。
Web容器几个核心功能:
      1.通信支持  - 容器提供了Web服务器和Servlet/JSP之间最简单的沟通方式,因为容器的存在,我们不需要自己写一个程序去监听服务器端口(就像上面说的HTTP:80),也不需要自己解析来自客户端HTTP请求,生成发给客户端的HTTP应答内容,这些工作容器都给做好了,我们只需要关系核心业务逻辑的实现;
      2.生命周期和资源管理 - 容器来负责管理Servlet的生命周期。容器创建线程,将Servlet加载到内存,调用Servlet的方法,销毁它们,不需要程序开发者自己维护Servlet的生命周期。容器还提供了像JNDI来实现资源池的管理。
      3.多线程的支持 - 容器为每一个到Servlet的请求创建一个线程,当处理完请求后结束线程。容器不会为每一个请求创建一个Servlet,因此Servlet是共用的,在Servlet中应当注意共享资源的同步问题,以及资源的死锁,这个后面会讲到。
      4.JSP的支持  - JSP不像一般的Java 类一样,容器会将每一个JSP编译成Servlet,然后容器会像管理其他Servlet一样管理JSP编译成的Servlet。
      5.其他任务  - 容器还提供了资源池管理、内存优化、垃圾回收、安全配置、多个应用支持、热部署和幕后的任务等等。

 7.Web应用目录结构

      Java Web应用可以被打包成Web Archive(WAR),它有一个定义好的结构。你可以把上面写的应用程序导出成War包,然后解压检查目录。目录结构如下:

8.发布描述Web.xml

        web.xml文件是Web容器的部署描述,同时包含了servlets的映射(在3.0之前),欢迎首页,安全配置,session timeout配置等等,这些我会在系列教程的后面讲到。

嗯嗯嗯,最后的话,机哥留个QQ:493967121  欢迎Java Web开发工程师互相学习交流。

发布了11 篇原创文章 · 获赞 233 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/zhengwangzw/article/details/59735834