
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); } }