【译】菜鸟学java web(一)-----导航篇

额,最近也是心血来潮准备翻译一个java web的系列博客,这是第一篇。虽然原文很简单,也没什么生词,但是这么一大堆文字能翻一来,我还是比较佩服自己的耐心的,嘿嘿,特别是这上传图片,简直太CD了,不管怎么说,还是有点小收获的,不光是锻炼了我的英语水平(⊙﹏⊙b汗),而且在翻译中我发现外国人写博客真的是好用心啊,从那些截图就可以看出来(我偷懒了,部分图没有贴),每一步都很认真,而且他们的博客都很有条理性,每个知识点都能罗列出几条要点。另外还有个感受是博客很完整,譬如我翻译的这篇就是java web系列的第一篇,往后还有好多篇,我也大致看了下,知识点都很完整。

再来看下咱国人的博客,虽不乏精品,但是我所见的大部分都是你抄我我抄你,而且好多文章都没有条理性或者更偷懒一点的直接贴上几百行代码(额,比如我。。。),这一点咱真得好好跟外国人学学呢。。


---------------------------------------------------------------------------------------------------------------------------------------------


web应用一般是指动态的web站点。java通过jsp与servlet技术为创建动态web站点提供了支持。我们当然可以使用纯静态的html网页来组建我们的网站,但是当网站的某些信息时刻变化的时候,仅仅通过html已经满足不了我们的需求,所以我们会使用诸如jsp、asp、php等技术来实现动态信息的展示以及与用户更好的交互。

   这篇文章的目的是介绍web应用不同组件的基本信息以及如何使用servlet和jsp创建我们的第一个web应用。
    1.web服务端和客户端
    2.html和http
    3.理解url
    4.我们为什么需要servlert和jsp
    5.使用servlet和jsp创建web应用
    6.web容器
    7.web应用的目录结构
    8.部署描述文件

web服务端和客户端
         web服务器是一个可以接受并响应用户请求的软件。譬如,apache 就是使用最广泛的web服务器之一,web服务器运行在具体物理机器上并在特定的端口监听用户的请求。
        web客户端是帮助我们与服务器通信的软件,通常是浏览器。比如火狐,chrome,ie等。当我们向服务端发送请求时(通过url),客户端将生成一个request请求发送给服务端。服务端响应请求后,客户端接收到服务端的响应内容,并将其解析最终展现在用户面前。
html和http:
web服务端和客户端是两种不同的软件,所以他们之间应该有一种公用的语言来彼此通信。这就是html,即超文本标记语言。
web服务器和客户端还需要一个公用的协议,即http协议(超文本传输协议),http协议工作在tcp/ip通信协议之上。
常见的http请求如下:
    1.http 方法:动作执行方式,比如post,get,put等。
    2.url:页面的地址
    3.组成参数:跟java方法参数类似,比如登陆时需要用户名密码一样。
   http请求示例:
1
2
3
GET /FirstServletProject/jsps/hello .jsp HTTP /1 .1
Host: localhost:8080
Cache-Control: no-cache
http响应组成部分如下:
    1.状态码:一个用来表示当前请求成功或者失败的整数。常见的比如200代表成功(success),404代表未找到指定页(not found),403请求被拒绝(access forbidden)等。
   2.内容类型(content type):比如text,html,image,pdf等。当然还有mime类型。
  3.内容(content):返回给浏览器的数据。
    http响应实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 >


MIME type和content type:上边的示例中我们可以看到响应头包括了“Content-type”这个标记。它通常也称为mime类型,服务器用mime类型告诉浏览器数据的类型。它帮助浏览器判断如何该如何解析数据。常用的mime类型有text/html,text/xml,application/xml等。

理解url:
url即统一资源定位符的简写,它用来定位浏览器和资源。互联网上的每一个资源都拥有其独特且唯一的地址。比如:
这就是一个url地址。

localhost:服务器的地址,通常情况下主机名都映射到了一个唯一的ip地址。有时多个主机映射到同一个ip地址,web服务器的虚拟主机负责决策不同的请求分发给不同的服务实例。

8080: 这是web服务器的监听端口,如果我们不指定,请求会发送给默认端口。端口号0-1023一般都被特定的服务占用,比如80代表http,443代表https,21代表ftp等等。

FirstServletProject/jsps/hello.jsp:代表资源的路径,可以是静态的html,jsp,servlet,php等。


我们为什么需要servlert和jsp:
web服务器擅长于静态html页面的显示但是他们不知道如何生成动态的内容以及如何保存数据到数据库中,所以我们需要另一种技术。当然很多编程语言都能达到我们的需求,比如php,python,ruby,rails等。这里我们只介绍servlet和jsp
java servlet和jsp技术属于服务器端的技术。

使用servlet和jsp创建web应用
我们将使用eclipse集成开发工具创建我们的第一个web应用。因为servlet和jsp是属于服务端技术,所以我们需要一个web容器来支持servlet技术,这里我们采用apache tomcat服务器。
为了方便开发,我们将tomcat配置到eclipse中,它可以帮助我们快速部署和运行web应用。
进入preference,选择server runtime environment,并选择你tomcat的版本。


然后提供tomcat的目录位置以及jre信息,并添加到运行环境上。

注:如果你没看见server标签,可以依次进入:window->show view->servers,然后便可以出现在eclipse的窗口中了。如果你已经在终端打开了服务器,你必须先停掉它然后才能在ide中开启服务器,否则将会有异常抛出。

现在我们已经万事俱备了,下面我们就来创建第一个servlet吧。
选择file->new->dynamic web project。正如下图所示:


这时你可以直接点finish也可以点next查看其他选项。
这时我们已经创建好了一个工程, 现在我们按照下图的配置方式创建我们的第一个servlet

点击finish之后,便生成了一个servlet,有部分代码时IDE为我们创建好的,我们只需要在其基础上增加自己的逻辑就行了。
现在我们在doget方法中添加一些代码,这个方法会用来处理http
的get请求,下面是这个servlet的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.journaldev.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;
 
/**
  * Servlet implementation class FirstServlet
  */
@WebServlet (description = "My First Servlet" , urlPatterns = { "/FirstServlet" , "/FirstServlet.do" }, initParams = { @WebInitParam (name= "id" ,value= "1" ), @WebInitParam (name= "name" ,value= "pankaj" )})
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>" ;
        
     /**
      * @see HttpServlet#HttpServlet()
      */
     public FirstServlet() {
         super ();
         // TODO Auto-generated constructor stub
     }
 
     /**
      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
      */
     protected 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);
     }
 
     /**
      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
      */
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         // TODO Auto-generated method stub
     }
 
}

 
在servlet3之前,我们需要在web.xml文件中为servlet配置url pattern,但是在servlet3.0中我们将采用java注解(annotation)技术,此处不过多介绍。

下面在servlet编辑器窗口中依次选择run->run on server选项,具体参照下面:


点击finish,eclipse会打开浏览器,我们可以看到下图所示的内容:

你可以刷新页面,可以看到时间值是动态的,你也可以使用其他浏览器查看该页内容。

通过这个小例子,我们可以发现servlet是用来生成html并向浏览器端返回的,如果你查看doget方法的实现,我们会发现,其实我们是通过PrinterWriter类输出html页面的。 这看上去是个很好的方式,但我们试想一下,当浏览器请求的页面很大时,如果我们还通过servlet输出,那将会使代码变得非常臃肿而且难以理解。这就是jsp产生的原因!
jsp跟servlet一样也属于服务器端的技术,它跟html很像,下面是我们的一个例子,效果跟上面servlet一样:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=US-ASCII"
     pageEncoding="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=<%= new Date() %>
</ h3 >
</ body >
</ html >

 
如果运行的话,效果跟上面servlet是一样的,此处不再截图了。
在接下来的几篇博客中我将逐一介绍servlet以及jsp技术更多的细节。

web容器:
tomcat就是一个典型的web 容器,当浏览器向服务器发送一个请求时,该请求会发送给web容器,web容器的作用就是选择合适的资源处理该请求(servlet或者jsp)。并将结果封装并返回给web服务器,然后web服务器将响应内容返回给客户端。
如果web容器收到请求后发现该请求需要由一个servlet处理,则web容器会创建两个对象:HttpServletRequest和HttpServletResponse,然后它基于url找到合适的servlet,并为该请求创建一个线程。然后web容器将调用servlet的service方法。service方法将根据请求类型调用doXXX方法(比如get请求,将会调用doget方法)。servlet方法生成动态页面并返将其写入response中。一旦servlet线程工作完成后,容器便会将response转化为http response并返回给浏览器。
web容器做的主要工作如下:
1.提供通信支持(communication support):容器为web服务器和servlet/jsp提供了便捷的通信方式。正是由于web容器,我们不再需在服务端创建一个服务端socket对象监听、解析任何请求以及生成响应。所有这些重要且复杂的工作统统由容器为我们完成,我们仅仅需要关注我们自己应用的业务逻辑而已。
2.生命周期和资源管理(lifecycle and resource management):容器管理所有servlet的生命周期,它还负责加载servlet到内存,初始化servler,执行servlet中的方法以及销毁servlet,容器同时还提供诸如JNDI(java命名与目录服务)的资源管理工具。
3.多线程支持(multitheading support):容器为每个请求创建一个新的线程并当请求结束时及时摧毁线程。servlet只有一个实例,容器并不会为每个请求生成单独的servlet,这必然节省了时间和空间。
4.支持jsp(jsp support):jsp跟普通java类还是有区别的,web容器对此也是提供支持的。每个jsp页面在被容器编译后会生成对应的servlet,然后容器就像管理servlet一样管理它们。
5.多任务(miscellaneous task):web容器管理资源池,做内存优化,运行gc,提供安全配置,提供多应用的支持,热部署,以及其他一些我们没法看到的工作。

web应用目录结构:
java web应用可以被打包成.war格式的文件,它们有着固定的格式。你可以在eclipse中通过export将web应用打包成war。
部署描述文件:(web.xml)
web.xml文件时web应用的配置文件,这个文件中包含了servlet的映射关系,欢迎页的指定,安全配置,过滤器,部分监听器等等。

以上就是我们java web系列的第一篇内容,接下来的几篇文章我们将介绍更多的servlet和jsp的知识。





  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值