在NetBeans环境下的Servlet编程

来源:互联网 发布:淘宝电风扇 编辑:程序博客网 时间:2024/06/06 20:56

在NetBeans环境下的Servlet编程

按照网络应用程序三层构架的划分,我们至少需要一个浏览器、一个应用程序服务器、一个数据库服务器。浏览器 已经是每台计算机的标配;支持Java EE的应用程序服务器,例如开源的Apache Tomcat、Oracle的Glassfish、BEA公司的WebLogic、IBM的Websphere等;还需要某款数据库产品,以进行数据的持久化储存,例如SQL Server、MySQL、Oracle、DB2、Access等。

本文主要讲解Servlet编程,主要包括以下几部分:

  • 开发环境的搭建
  • HTTP通讯协议基本概念
  • Servlet编程基础
  • 用户登录响应的实现

一、开发环境的搭建

1、软件下载

  在学习Servlet编程之前,首先需要搭建开发环境,一款方便快捷的开发工具不仅带来一个好的开始,而且增加学习兴趣,本人使用NetBeans IDE,原因有二:
(1)配置简单,安装之后直接使用,不用再进行配置
(2)免费,性价比高
开发环境的搭建需要安装JDK和NetBeans,链接如下:
JDK:oracle官网
NetBeans:NetBeans IDE下载页面

2、NetBeans IDE开发

NetBeans IDE开发包括开发控制台程序和Web应用程序
(1)NetBeans IDE开发控制台程序
这里写图片描述
(2)NetBeans IDE开发Web应用程序
这里写图片描述

二、HTTP通讯协议基本概念

1、HTTP协议介绍

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

2、HTTP协议特点

HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。

HTTP协议的主要特点可概括如下:
1)支持客户/服务器模式。

2)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

3)灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

4)无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

5)无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

3、HTTP的基本运行方式

1)基于HTTP协议的客户/服务器模式的信息交换过程,分四个过程:建立连接、发送请求信息、发送响应信息、关闭连接,如图所示,
这里写图片描述

2)浏览器与WEB服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对每一个页面的访问,浏览器与WEB服务器都要建立一次单独的连接。

3)浏览器到WEB服务器之间的所有通讯都是完全独立分开的请求和响应。

三、Servlet编程基础

1、Servlet的作用

  Servlet是用Java编写的Server端程序,它与协议和平台无关。Servlet 通过创建一个框架来扩展服务器的能力,以提供在 Web 上进行请求和响应服务。当客户机发送请求至服务器时,服务器可以将请求信息发送给 Servlet ,并让 Servlet 建立起服务器返回给客户机的响应。 当启动 Web 服务器或客户机第一次请求服务时,可以自动装入 Servlet 。装入后, Servlet 继续运行直到其它客户机发出请求。

2、Servlet实现过程

  Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:

1) 客户端发送请求至服务器端;
2) 服务器将请求信息发送至 Servlet;
3) Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
4) 服务器将响应返回给客户端。

一个 Servlet 就是 Java 编程语言中的一个类,它被用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访问的应用程序。虽然 Servlet 可以对任何类型的请求产生响应,但通常只用来扩展 Web 服务器的应用程序。

3、Servlet的生命周期

servlet的生命周期:

1)servlet有良好的生命周期的定义,包括加载、实例化、初始化、处理请求及服务结束。
2)这个生命周期由javax.servlet.Servlet接口的init()、service()、destroy()方法来表达。
3)首先,servlet容器加载servlet,完成servlet的实例化,容器运行servlet实例的init()方法进行初始化,服务请求到达时,调用service()方法,由service()方法自动运行与请求对应的doXXX()方法(即doGet或doPost),当服务器决定将实例销毁时,调用其destroy()方法。
  
Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。

四、用户登录响应的实现

本文建立了一个简单的网页交互—-用户登录响应,先看看登录页面,用户输入相应的用户名和密码,当用户名存在且密码正确时,可进入正式页面(本文用“欢迎光临!”页面代替),若用户不存在或者密码错误时,会弹出相应的错误提示界面。

登录

1、预备知识

(1)Servlet读取客户端发送过来的数据

  客户端发送到服务器的数据分为显式数据和隐式数据,显式数据是指用户通过浏览器主动向服务器提交的以超链接或表单显式提交的信息,从服务器的角度看,这些只不过是get或者post请求,在NetBeans IDE中,使用Servlet技术处理客户端请求时,只需在其processRequest中编写逻辑代码即可。隐式数据是指浏览器在用户没有意识到的提交的其他信息,如请求头的相关信息,获取请求头的信息编程如下:

创建一个名为“ShowHeadServlet”的Servlet,代码如下:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=UTF-8");        PrintWriter out=response.getWriter();        try{            Enumeration allHeaderName=request.getHeaderNames();                        out.print("<table>");            while(allHeaderName.hasMoreElements()){                String headerName=(String)allHeaderName.nextElement();                String headerValue=request.getHeader(headerName);                out.print("<tr>");                    out.print("<td>"+headerName+"</td>");                    out.print("<td>"+headerValue+"</td>");                out.print("<tr>");            }            out.print("<table>");        }finally{            out.close();        }     }

右键点击ShowHeadServlet的运行文件,显示如下:
这里写图片描述

(2)响应的重定向和请求的转发

1)请求的转发:RequestDispatcher对象是一个Web资源的包装器,可以用来把当前请求转发到该资源。 这种转发是在服务器端控制权的转向,客户端发来的请求将交由新的页面进行处理。 使用请求转发,在客户的浏览器地址栏中不会显示转发后的资源地址。 使用请求转发,可以将前一个页面的数据、状态等信息传到转发的页面。
2)响应的重定向:sendRedirect()方法实际是服务器向浏览器发送一个特殊的响应头(Location,状态码302), 它命令浏览器连接到新的位置。 因此,使用这种方法在浏览器的地址栏中可以看到地址的变化。 重定向是作为不同请求来看待的,因此,所有请求作用域的参数在重定向到下一个页面时都会失效。 使用sendRedirect()方法重定向时,资源不能位于WEB-INF目录中。

2、具体实现

(1)建立项目

打开NetBeans IDE,新建一个Java Web项目,其中index.jsp为欢迎页面,login.jsp为登录页面,ShowHeadServlet.java用于显示隐式信息,ShowMsgServlet1.java用于从登录界面到其他界面的逻辑编程,项目的框架图如下:
这里写图片描述

(2)核心代码

a)index.jsp欢迎页面

<body>   <h1>欢迎光临!</h1></body>

b)login.jsp登录页面

<body>        <form name="frm" method="POST" action="ShowMsgServlet1">            <table frame="box" cellspacing="5"  align="left">                <tr>                    <td colspan="2" align="center"><p><h3>用户登录</h3></p></td>                                    </tr>                <tr>                    <td><label for="username">用户名</label></td>                    <td><input type="text" name="username" value=""/></td>                </tr>                <tr>                    <td><label for="userpass">密    码</label></td>                    <td><input type="password" name="userpass" value=""/></td>                </tr>                <tr>                    <td colspan="2">                        <input type="image" src="./newbtn.png" width=100%                           height=80%  border="0" value="登录"                              onclick="document.forms['frm'].submit();">                    </td>                </tr>                <tr> </tr>            </table>        </form>    </body>

c)ShowMsgServlet1.java逻辑代码

protected void processRequest(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        request.setCharacterEncoding("UTF-8");//设置编码方式为UTF-8,能正确显示汉字        response.setContentType("text/html;charset=UTF-8");        PrintWriter out=response.getWriter();        try{            String username=request.getParameter("username");            String userpass=request.getParameter("userpass");            if("admin".equalsIgnoreCase(username)&&"1234".equals(userpass)){                RequestDispatcher rd=request.getRequestDispatcher("index.jsp");                rd.forward(request, response);            }else{                out.print("用户名或者密码错误,请重新输入!");                RequestDispatcher rd=request.getRequestDispatcher("login.jsp");                rd.include(request, response);            }            out.printf(username);        }finally{            out.close();        }    }
(3)运行结果

a)成功登录时

这里写图片描述

b)用户名或者密码错误时

这里写图片描述

0 0
原创粉丝点击