题外话:
自从由开发人员转为培训讲师后,发现了很多技术的知识点是不全面的,在开发中只要只要能够满足功能就OK了。但是发现到了讲师的职位后还需要掌握很多以前很多没有接触过的知识点。然而对于开发经验少,代码量不多,基础有限的学员来说就很头大了。所以我想将知识点进行整理,写成一系列的文章,能够让他们快速的上手和开发,这也是为什么将这一系列文章起名叫做《SSH快速开发与整合》。本系列文章的书写目的不是让大家了解多么新的技术和多么炫的页面效果,而是想为入门者提供一条更快的捷径。
由于平时白天工作比较忙时间紧,一直担心怕写不完,但这次我下了很大决心将他写完。由于是第一次写这么系统的文章,里面会有很多不足,就请大家担待吧。
我们废话少说开始我们的正题。
开发环境:在本系列文章中,我们会用到的开发工具是 MyEclipse6.5 Blue 版本,服务为:Tomcat6.0,数据库为:Mysql6.0 。
第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.2 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
所示。
由于我们在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
6
其中 <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所示: