先唠叨两句:
之前一直在搞开发,一次偶然的机会一下成了讲师。在当讲师的时间里我体会到了一个讲师和一个开发人员的区别,在公司开发项目时我个人注重功能的实现,关于技术是枝零八碎,就是我们说的什么都知道,但都没有细细的研究过。就这次偶然的机会让我有机会对技术进行了一下系统整理。但是在我成为讲师的日子里发现我的学员都是开发经验少,代码写的不多的,自己认为很简单的东西应该自己能够搞定但结果恰恰相反,之前一直想找机会写一系列类似系统的文章,但白天实在没有时间,这次我也算是下了狠心,哪怕晚上多熬熬也要把他写出来。
这一系列文章我不想去介绍太多的新技术和一些非常炫的页面效果,而是想为初学者或者想学习ssh编程的人提供一条快速入门的通道,这也就是我为什么要把本系列文章的名字起为《SSH快速开发与整合》的原因。
由于之前没有写过这么系统的文章,所以在书写过程中会有一些不足之处,希望大家多多担待。
好了废话不说了,我们开始正式的内容。
本系列文章中将会使用到 MyEclipse6.5 Bule 版开发工具,Tomcat6.0 Web服务和Mysql6.0数据库,这些资源都可以从网上找到。
第一部分 Struts 篇
第1章 基础知识回顾
为了能够更清晰的了解struts 框架工作原理,我们需要对 JSP 部分知识点进行回顾。
1.1 web应用程序中的Model1和Model2模型
在最早的 Java Web 应用程序中,JSP文件几乎担任了所有的工作如图1-1所示。其中包括了页面的显示、请求跳转的控制、业务的处理等等,这种方式在实际的项目开发中项目要是代码量少点也就无所谓了,如果代码量大的情况下要用这种方式开发出来的程序html代码、java代码、javascript脚本代码混在一起对于后期代码的维护是一件非常麻烦的事。所以这种方式的开发没有被业界给出什么明确的定义。
为了解决这种问题Sun公司制定了两种架构模式 Model 1 和 Model 2。
1.1.1 Model 1
为了解决直接在JSP页面上写代码可读性差的问题,我们将原先写在JSP页面上的业务逻辑代码提出来写到JavaBean中如图1-2。此时JSP充当了视图层为客户端提供了请求和响应,再由Jsp调用JavaBean进行处理业务逻辑。这种架构方式我们往往称之为 Model 1。
在Model1中,我们可以看出 Jsp 不但完成了对客户端的请求和应答工作还担任着调用不同业务类的请求跳转工作。但这个架构比起直接在JSP页面上写代码已经好多了,Model1中已经将业务代码从页面中的控制代码和Html代码中进行了分离。至少当程序业务代码出现问题时,我们不再会到JSP页面中去寻找修改业务逻辑代码了。
此时Model1比起直接在JSP页面上写代码已经强多了,但是对于大型项目而言还是不能够满足,毕竟JSP页面中还有控制跳转的代码存在。
1.1.1 Model 2
为了解决Mdel1中控制器代码和HTML、JavaScript代码写在一起,Sun公司制定了Model2,在Model2中引入了“控制器”概念,而控制器往往由Servlet充当。此时JSP页面中只剩下了HTML代码和一些客户端javascript脚本代码,请求由控制器Servlet进行控制跳转到不同的JAVABean或者JSP页面,这样Jsp中只提供对客户的界面视图我们用英文单词View表示,而Servlet只完成请求的跳转工作我们可以用英文Controller表示,JavaBean中完成业务逻辑和数据的封装我们可以用Model表示,这样我们将 View - Controller - Model三个单词的第一个字母提取出来就是我们所谓的 MVC 模式了。
1.2 MVC的概述
MVC是Model(模型) - View视图()-Controller(控制器)三个单词的缩写。MVC是J2EE中的一种模式,是针对于整个应用程序结构而言的,所以MVC模式从尺度上来讲要比我们平时所说的java设计模式要大。关于java设计模式在此就不做过多的讲解了,读者可以参考阎宏博士所写的《Java与模式》 。
在J2EE中有很多技术都可以实现MVC模式比如我们马上要学习的struts框架技术就是MVC的一种实现,还有 JSF、WebWork等等。
接下来我们需要搞清楚的一个问题就是J2EE、MVC、Struts他们之间样的关系。在此我们拿 宇宙 、太阳系 、地球来进行说明,我们都知道我们的地球是隶属于太阳系的,但是这个太阳系中不仅仅只有地球,还有火星、木星等等星球构成。例子中的太阳系就相当于MVC模式而地球相当于struts,从而我们知道MVC模式并不是只有struts能够实现,还有其他很多技术可以实现,像上面提到过的JSF、WebWork等等技术,所以我们只能够说struts是MVC模式的一种实现方式。而MVC和J2EE之间的关系就像太阳系和宇宙的关系一样,宇宙中有很多类似于太阳系的星系,所以MVC知识J2EE中的一种模式,如图1-4所示:
1.3 配置一个 Servlet
为了让读者对程序有更深的理解,在程序实例中全部都采取手工搭建和配置。(此处作者使用的是MyEclipse6.5Bule版本)
首先我们在MyEclipse中创建一个web应用程序步骤如下:
(1) 选择 “File 菜单 → New → Project ”,如图1-5所示。
(2)在弹出的New Project窗口中,选择“Web Project”,然后点击“Next”按钮,如图1-6所示。
图1-6 图1-7
(3)在“New Web Project”对话框的“Project Name:”为web工程起个名字,此处我们起名为 frist_Servlet 。将J2EE Specification Level选中 Java EE5.0 其他的不需要改变,默认就好了,单击“Finish”按钮,如图 1-7 所示。
(4)对准创建好的web工程下的“src目录右键” → 选择“New” → 选择“Class”,如图1-8所示。
(5)在弹出的New Java Class对话框中的 “Name:”中输入HelloWord,其他的不需改变,点击“Finish”按钮,如图1-9所示。
(6)修改HelloWorld类的代码,让其继承于javax.servlet.http.HttpServlet类,代码如下:
1 package com.study.struts.;
2
3 import javax.servlet.http.HttpServlet;
4
5 public class HelloWorld extends HttpServlet{
6
7 }
8
注意:在web应用程序中要想使一个普通的Class类变成一个Serlvet 就必须让这个普通类继承与javax.servlet.http.HttpServlet类。
(7)让HelloWorld重写父类javax.servlet.http.HttpServlet中的“doGet” 方法,并输出“HelloWorld”,具体代码如下:
1 import javax.servlet.ServletException;
2 import javax.servlet.http.HttpServlet;
3 import javax.servlet.http.HttpServletRequest;
4 import javax.servlet.http.HttpServletResponse;
5
6 public class HelloWorld extends HttpServlet {
7 @Override
8 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
9 throws ServletException, IOException {
10 System.out.println("HelloWorld");
11 }
12 }
13
(8)打开“WebRoot”目录 → “WEB-INF” → “web.xml”文件,如图所示。在打开的“web.xml”文件中配置 HelloWorld 。
1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app version="2.5"
3 xmlns="http://java.sun.com/xml/ns/javaee"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
7 <servlet>
8 <servlet-name>helloWorld</servlet-name>
9 <servlet-class> com.study.struts.HelloWorld</servlet-class>
10 </servlet>
11 <servlet-mapping>
12 <servlet-name>helloWorld</servlet-name>
13 <url-pattern>*.do</url-pattern>
14 </servlet-mapping>
15 <welcome-file-list>
16 <welcome-file>index.jsp</welcome-file>
17 </welcome-file-list>
18 </web-app>
19
(9)打开“WebRoot”目录中的“index.jsp”文件,并修改代码如下:
1 <%@ page language="java" pageEncoding="GB18030"%>
2 <html>
3 <head>
4 <title>手工配置的第一个Servlet</title>
5 </head>
6 <body>
7 <a href="click.do">点击测试Servlet程序</a>
8 </body>
9 </html>
10
注意:在“index.jsp”页面第一句代码中:
<%@ page language="java" pageEncoding="GB18030"%>
有一个pageEncoding 属性,他表示当前jsp页面的编码格式,GB18030为编码集,pageEncoding 属性默认为ISO-8859-1编码集,而ISO-8859-1编码中是不支持中文字符的,换句话说也就是如果当前页面pageEncoding="ISO-8859-1" 那么当前页面中是不允许出现中文字符的,所以此处我们将pageEncoding的值改为“GB18030”。在Java编程中常见的编码集有以下几种:
编码集名称
|
是否支持中文
|
ISO-8859-1
|
不支持
|
UTF-8
|
支持
|
GB2312
|
支持
|
GBK
|
支持
|
GB18030
|
支持
|
(10) 部署应用程序,如图1-11所示。
(11)运行web程序,如图1-12所示,在 IE 浏览器地址栏输入http://localhost:8080/frist_Servlet 如图1-13所示。
图1-12 图1-13
由于我们在9步中写过 <a href="click.do">点击测试Servlet程序</a> 代码当我们点击超链接“点解测试Servlet程序”时,浏览器将会发出一个 click.do 的请求,此时web应用程序会接收到浏览器发出的click.do请求,因为我们在第8步中为web.xml配置过如下代码:
1 <servlet-mapping>
2 <servlet-name>helloWorld</servlet-name>
3 <url-pattern>*.do</url-pattern>
4 </servlet-mapping>
5
其中 <url-pattern>*.do</url-pattern> 表示只要jsp页面发出的所有以 .do 结尾的请求都会被拦截。拦截后的请求会自动找到 <servlet-name>helloWorld</servlet-name> 并取得到值 “helloWorld” ,并会带着“helloWorld”值到下面这段代码去寻找<servlet>的子标签<servlet-name>的值和“helloWorld”相等的一项。
1 <servlet>
2 <servlet-name>helloWorld</servlet-name>
3 <servlet-class> com.study.struts.HelloWorld</servlet-class>
4 </servlet>
5
当请求被寻找到后程序会自动将请求跳转到所对应的<servlet-class>标签所配置的类中执行doGet 方法,调用流程如图1-14所示。
程序最后会在Eclipse控制台上打印“”,运行结果如图1-15所示:
本文章为Zhangsenwei(张森炜)原创,任何外部引用或摘抄请注明出处,并保持内容和格式不变,未经作者同意不得用于任何盈利目的,谢谢合作!