基于Java技术的Web应用开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 Web 应用的发展历史

早期的Web应用仅仅是对静态信息的访问,服务器根据用户的请求把相应的静态的HTML页面传送给客户端进行显示。应用程序不会对请求的信息进行任何的处理。

例1_1:静态页面的实现。

Ex1_1_1.html

        <html>
        <head>
           <title>Web应用-----静态显示</title>
        </head>
        <body>
           <a href="Ex1_1_2.html">本书的写作特点</a>
        </body>
        </html>

Ex1_1_2.html

        <html>
        <head>
           <title>显示静态内容</title>
        </head>
        <body>

本书立足于高职高专,语言浅显易懂,对进行Web开发的各个环节都予以介绍,并用一个项目贯穿本书的各个章节。理论知识不求全面,以必需、够用为度。重点在于实用技术。

        </body>
        </html>

后来出现了Java的Applet小应用程序。当用户发出请求后,Applet随着页面一起被下载到客户端,Applet在浏览器的JVM中运行,能够提供动态的页面内容。从某种程度说, Applet扩展了Web服务器的功能。

例1_2:Applet的应用。

HelloApplet.java

        import java.awt.*;
        import java.applet.*;
        public class HelloApplet extends Applet {
            public void init() {
            }
            public void paint(Graphics g) {
                g.drawString("Welcome to Java!!", 50, 60 );
            }
        }

HelloTest.html

        <HTML>
        <HEAD>
        </HEAD>
        <BODY >
        <CENTER>
        <APPLET
            code ="HelloApplet.class"
            width = 500
            height= 300
            >
        </APPLET>
        </CENTER>
        </BODY>
        </HTML>

由于Applet不能对数据库进行访问,慢慢就出现了在服务器端运行的Servlet。Servlet实际上也是一段Java程序,它会根据用户提交数据的不同从而响应不同的页面,实现动态Web应用。

Servlet是运行在服务器端的Web Container的Web容器中,当一个HTTP请求传到服务器,Web Server Plugin会检测这次请求的是静态资源还是动态资源。如果是静态资源, Web Server Plugin会将请求传递给Web Server,Web Server将请求直接映射到某个页面,不加任何改变地将页面传回给客户端。但如果请求的是动态资源,Web Server Plugin会将请求传递给Web Container,Web Container会调用相应的Servlet,根据用户提交数据的不同,将动态内容传回给客户端。

例1_3:Servlet的应用。

Ex1_3.html

        <html>
        <body bgcolor="cyan" >
        <font color="" size="8">
        <form action="Ex1_3" method="get">
            <input type="text" name="paraTxt">
            <input type="submit" value="提交">
        </form>
        </body>
        </html>

Ex1_3.java

        import javax.servlet.*;
        import javax.servlet.http.*;
        import java.io.*;
        public class Ex5_5 extends HttpServlet
        {
            public  void  doGet(HttpServletRequest  request,HttpServletResponse  response)  throws
ServletException, IOException
            {
                response.setContentType("text/html;charset=GB2312");
                PrintWriter out=response.getWriter();
                out.println("<html>");
                out.println("<head><title>Servlet的应用</title></head>");
                out.println("<body>");
                out.println("<hr width=80% align=left color=blue>");
                String para=request.getParameter("paraTxt");
                out.print("<br>"+para);
                out.println("<br><br><hr width=80% align=left color=blue>");
                out.println("</body>");
                out.println("</html>");
            }
        }

在Ex1_3.html文件中定义了一个文本框和一个提交按钮,当用户在文本框中输入内容,单击提交按钮后,服务器端的Servlet会得到用户的提交信息,并将其显示出来。根据用户输入的内容不同,显示不同的信息,完成动态页面的显示。

但Servlet的缺点在于,如果仅仅使用Servlet往往会把业务逻辑和显示逻辑混合到一起。例如,上面的Servlet程序将用户信息的获取和显示放到一起,程序的可读性变得很差。这时就出现了JSP。

JSP可以用来实现更好的MVC模式,也就是分离视图、控制和业务逻辑,这样可以使应用程序的结构更加清晰。视图层一般由界面设计人员和界面程序员来完成,随着用户需求的变化而变化;模型层则由业务逻辑程序员来完成,根据流程的变化而变化;控制层则一般由负责整体控制的程序员来完成,这部分代码比较稳定,一般会实现一个通用的架构。这种模块功能的划分有利于在代码修改过程中进行模块的隔离,而不需要把具有不同功能的代码混杂在一起造成混乱。用JSP页面来显示给用户的数据,用Servlet控制页面的流程。Servlet会根据请求信息的不同或应用程序逻辑的设定而调用相应的JSP页面。

例1_4:JSP页面的实现。

input.html

        <html>
        <head>
        <title>input.html</title>
        </head>
        <body>
        <form action="FirstServlet" method="get">
           <input type="text" name="paraTxt">
          <input type="submit" value="提交">
          </form>
        </body>
        </html>

FirstServlet.java

        package com;
        import javax.servlet.*;
        import javax.servlet.http.*;
        import java.io.*;
        public class FirstServlet extends HttpServlet{
            public  void  doGet(HttpServletRequest  request,HttpServletResponse  response)  throws
ServletException, IOException
            {
                HttpSession session=request.getSession();
                String para=request.getParameter("paraTxt");
              System.out.println(para);
                session.setAttribute("para", para);
                response.sendRedirect("showInfo.jsp");
            }
        }

showInput.jsp

        <%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
        <%
        String path = request.getContextPath();
    String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
        %>
        <html>
          <head>
            <title>My JSP 'showInfo.jsp' starting page</title>
          </head>
          <body>
            用户输入的信息为:<br>
            <%
              String para=(String)session.getAttribute("para");
            %>
            <%=para %>
          </body>
        </html>

EJB是企业级的JavaBean,它提供了对业务逻辑数据的封装。JavaBean可以通过Web Container来访问EJB。Java应用程序客户端也可以访问EJB。

例1_5:简单的EJB应用。

HelloWorld.java

        package com.foshanshop.ejb3;
        public interface HelloWorld {
            public String SayHello(String name);
        }

HelloWorldBean.java

        package com.foshanshop.ejb3.impl;
        import com.foshanshop.ejb3.HelloWorld;
        import javax.ejb.Remote;
        import javax.ejb.Stateless;
        public class HelloWorldBean implements HelloWorld {
            public String SayHello(String name) {
              return name +"说:你好!世界,这是我的第一个EJB3哦。";
            }
        }

HelloWorldTest.java

        package junit.test;
        import static org.junit.Assert.*;
        import java.util.Properties;
        import javax.naming.InitialContext;
        import org.junit.BeforeClass;
        import org.junit.Test;
        import com.foshanshop.ejb3.HelloWorld;
        /**
          * 单元测试用例,运行该用例时,你需要把[Jboss安装目录]/client下的jar加入项目的类路径
下。
          *
          */
        public class HelloWorldTest {
            protected static HelloWorld helloworld;
            @BeforeClass
            public static void setUpBeforeClass() throws Exception {
              Properties props = new Properties();
              props.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
              props.setProperty("java.naming.provider.url", "localhost:1099");
              InitialContext ctx = new InitialContext(props);
              helloworld = (HelloWorld)ctx.lookup("HelloWorldBean/remote");
            }
            @Test
            public void testSayHello() {
             String result = helloworld.SayHello("佛山人");
             //System.out.println(result);
                assertEquals("佛山人说:你好!世界,这是我的第一个EJB3哦.", result);
             }
         }