交流QQ群:26651479
Day1:
1.MVC概述
2.Struts框架 (技术概览)
3.Struts开发步骤
4.Struts新手上路
5.Struts详解
6.使用工具构建struts应用
**************************************************************
一 MVC概述
1.名词解释
MVC模式是“Model-View-Controller”的缩写,中文翻译为“模型-视图-控制器”。
2.模式起源
MVC模式最早是smalltalk语言研究团提出的,应用于用户交互应用程序中。
3.设计思想
即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。
1.2 视图
代表用户交互界面
对于Web应用来说,可以概括为HTML界面,但有可能为XHTML、XML和Applet。
1.3 模型
就是业务流程/状态的处理以及业务规则的制定
业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。
业务模型还有一个很重要的模型那就是数据模型(JavaBean)
1.4 控制器
可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。
控制层并不做任何的数据处理。因此,一个模型可能对应多个视图,一个视图可能对应多个模型。
1.5 Jsp的模型1 (Model 1)
以JSP为中心的开发模型
在 JSP 页面中同时实现显示,业务逻辑和流程控制
JSP页面中可以非常容易地结合业务逻辑(jsp:useBean)、服务端处理过程(jsp:scriplet)和HTML(),现在很多的Web应用就是由一组JSP页面构成的。
Model 1 缺点:
1)强耦合
(1)难以维护、调试、更新、扩展、重用
违背简单就是美丽的美学原则
(2)JSP 文件的编写者必须既是网页设计者,又是Java 开发者
通常结果是要么Java代码很糟,要么是网页很难看,甚至Java代码和网页脚本代码都很糟
难以实现分层开发
2)内嵌的流程逻辑
要理解应用程序的整个流程,您必须浏览所有网页
试想一下拥有1000个网页的Web应用的错综复杂的逻辑
1.6 Model 2
以Servlet为中心的开发模型
提供应用的处理过程控制(一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。从而弥补了Model 1的不足。
具有组件化的优点从而更易于实现对大规模系统的开发和管理
Model 2 缺点:
原来通过建立一个简单的JSP页面就能实现的应用现在变成了多个步骤的设计和实现过程。
所有的页面和组件必须在MVC框架中实现,所以必须进行附加地开发工作。
MVC本身就是一个非常复杂的系统,所以采用MVC实现Web应用时,最好选一个现成的MVC框架,在此之下进行开发,从而取得事半功倍的效果。现在有很多可供使用的MVC框架。
引入框架的作用
A. 使得功能组件松散耦合,甚至可配置
B. 提供公用的服务:
例如:i18n,安全,表单的重复提交,文件上传……
C. 简化开发模型——使得开发人员的精力集中在业务逻辑之上
框架的分类
A.设计的思路
白盒框架(White-Box):使用时,需要了解其内部结构(extends);入侵性框架;基于继承的框架
黑盒框架(Black-Box):不需了解其代码细节,最多实现其接口;非入侵性框架;基于对象构件组装的框架
B.功能、作用
Web:Strusts1.x, WebWork, Strusts2.x(发展1.x和webwork), JSF(抗衡.net), Tapestry,
Shale, ZK, Echo, Myfaces/ADF, (根本全是Servlet规范) ……
Business:Spring, Seam
Persistence(持久层):Hibernate, Toplink, OpenOJB, ……
评价框架的优劣?
A.设计理念 先进?
B.编程模型 简单?
C.是否拥抱规范、标准?
D.社区是否庞大?第三方的支持程度?
程序设计思路
可维护性:预见需求(预见多年后的事)
可重用:
代码可重用(最低级别):粒度:方法(常用代码块),类,包,组件(类库)
设计的可重用:框架(半成品,如Hibernate);产品(开发软件);算法、设计模式
分析的可重用(最高级别,见不到代码):文档、规范、标准(ISO:CMM,CMMI)
可扩展性:
*****************************************************
二、Struts框架 (技术概览)
1.Struts简介
Apache OpenSource
官方网站:http://jakarta.apache.org
Struts 是Apache组织的一个开放源码项目。
Struts是一个比较好的MVC框架,提供了对开发MVC系统的底层支持。
它采用的主要技术是Servlet,JSP,资源文件和custom tag library。
Struts优点
利用Struts提供的taglib可以大大节约开发时间
表现与逻辑分离,维护扩展比较方便
国际化支持与完善的验证框架
统一错误处理方法
大量内置设计模式的使用: 单例模式、组合模式、命令模式、委派模式等
便于团队开发
巨大的用户社区
稳定且成熟
大量第三方工具的支持
Struts缺点
不适合小型应用开发,小型项目直接使用JSP和Servlet反而方便快捷
基于请求的框架
相对于基于组件事件驱动的框架来说设计理念已经相对落后,其可重用的粒度也相对比较小
2.Struts快速上手
需求描述:
系统的登录
开发步骤
1) 创建项目、搭建环境
下载Struts开发包
把%STRUTS_HOME%/lib/*.jar拷贝到WEB-INF/lib
把%STRUTS_HOME%/contrib/struts-el/lib/*.jar拷贝到WEB-INF/lib
把%STRUTS_HOME%/lib/*.tld拷贝到WEB-INF(新版本无需这么做)
将%STRUTS_HOME%/contrib/struts-el/lib/*.tld 拷贝到WEB-INF(新版本无需这么做)
如果用MyEclipse,对着工程右键 -> MyEclips -> Add Struts Capabilities...
也就可以搭建好所需的环境了,并且自动写好WEB-INF/web.xml文件、WEB-INF/struts-config.xml文件
2) 配置WEB-INF/web.xml文件
实质是继承HttpServlet类(ActionServlet类)
3) 在WEB-INF创建struts-config.xml文件
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
说明:以上是默认的写法,系统可以自动生成。
以下是具体的配置说明,当然现在不用加进去
scope="request">
/WEB-INF/validation.xml" />
4) 提供login.jsp
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<% //上句引入struts的标签库 %>
<% /* 上面的
3)develop ur ActionForm (服务器端验证需要遵循的规范)
(1) 自定义ActionForm 要继承 ValidatorForm
最好不要重写validate方法!如果重写validate方法,则必须显式调用 return super.validate(...)方法
(2) 动态form要继承 org.apache.struts.validator.DynaValidatorForm
4)(服务器端验证需要遵循的规范)
5)copy validation rules to ApplicationResources.properties
register.title=Super Boy Register Form
register.name=Name:
register.gender=Gender:
register.age=Age:
register.city=City:
register.email=Email:
register.birthday=Birthday:
# {0} 表示第一个参数
errors.required={0} is required.
errors.integer={0} must be an integer.
errors.date={0} is not a date.
errors.email={0} is an invalid e-mail address.
errors.minlength={0} can not be less than {1} characters.
errors.maxlength={0} can not be larged than {2} characters.
6)active javaScript in Jsp page.(采用客户端验证才需要这一步)
建议:(1) 客户端能做的验证,一般不要在服务器端验证。
一般输入格式等方面的验证
(2) 客户端实在没有能力进行验证的情况,发到服务器端做验证。
事例见“./struts1.x/WorkSpace/day4/controllerWeb2”
Day4:
一、 文件上传
步骤:
1)定义表单
请选择上传的文件: | |
a)form
public class FileUploadForm extends ActionForm {
private FormFile file;
public FormFile getFile() { return file; }
public void setFile(FormFile file) { this.file = file; }
}
b)action
import java.io.*;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.upload.FormFile;
public class FileAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
FileUploadForm frm = (FileUploadForm)form;
FormFile file = frm.getFile();
InputStream is = file.getInputStream();
String path = "d://temp//" + file.getFileName(); //必须要先有这个文件夹存在
byte[] databuffer = new byte[file.getFileSize()];
try {
FileOutputStream fos = new FileOutputStream(path);
while(is.read(databuffer) != -1) {fos.write(databuffer);}
} catch (IOException e) {}
return mapping.findForward("success");
}}
二、Struts Tiles----强大的页面模板与页面布局技术
1.作用:Tiles框架提供模板机制,完成页面布局和内容展示逻辑的解耦
-------分离变与不变的元素:布局是不变的,而内容是变化的
2.如何使用tiles框架
步骤:
1) 在struts-config.xml配置tiles插件
2) 定义tiles:tiles-define.xml
"-//Apache Software Foundation//DTD Tiles Configuration 1.3//EN"
"http://struts.apache.org/dtds/tiles-config_1_3.dtd">
3) 定义布局以及所有的组成部分
baselayout.jsp
header.jsp
footer.sjp
body.jsp
navigator.jsp
变化的内容定义为:
baselayout.jsp参考代码:
-------------------------------------------------------------------------------------------------------
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>
4) 在页面中引用 tiles:
也可以覆盖定义的属性值
3.使用tiles-define.xml定义tiles的好处:
1) tiles可重用(被多个页面)
2) tiles的定义可以被"继承"和"覆盖"
3) 使用已定义的definition
Struts 标签
************************************************************************************************
一、Struts标签库概述
1.回顾已经学了JSTL标签库
标签库的作用:
1.使得(jsp)页面开发人员不再依赖Java(EL表达式的作用也是如此)
2.功能封装:可重用
2.Struts的五类标签库
Bean Tags :用来创建bean、访问bean
HTML Tags :用来创建 html 页面的动态元素,对html进行了封装;
Logic Tags:逻辑判断、集合迭代和流程控制。
Nested Tags:该标签库建立在前三个标签库的基础上,具有前三个标签库的所有功能,只是允许标签间的嵌套。
Tiles Tags :该标签库包含的标签可以用来创建tiles样式的页面;布局专用。
3.重点学习前3类标签库
二、Bean标签
可以看成
它可以定义bean :获取某些数据(cookie,请求参数,请求头),将之定义成一个脚本变量,并同时置于某个作用域(缺省pagaContext) 中;
bean标签的公共属性:
id - 定义一个变量
name - 引用一个存在的bean或对象的名字
property - 被引用的bean的属性
scope - 放置或搜索bean的范围,若没有制定,则依次 page--request---session--application
1.
作用: 把一个bean 或其属性, 定义成一个变量
* 通过
Example1:
1) 定义一个Java bean:student,并且对其属性进行赋值
2) 通过
3) 输出
<%=stuName%> //jsp形式
${stuAge } //EL表达式
* 如果JavaBean的属性是List等类型,可以指定type属性
Example2:
1)在Java Bean中添加List属性,并提供get/set方法。
private List songs;
public List getSongs() {
List list = new ArrayList();
list.add("我爱北京**");
list.add("我和你");
list.add("我不做大哥好多年");
return list;
}
2)
3)输出
${mySongs[0] }
* 定义新变量,例如:
2.
作用: 输出 bean 或bean属性;
等价于:
${} 或者 <%= %>
3.
作用:读取属性静态文本内容,支持国际化(i18n)
Example:
1)确认在类路径上含有
com/ApplicationResources.properties
配置路径:
2)在文件中加入key,value对
page.title=/u9875/u9762/u6807/u9898
3)提供message.jsp
使用
4.
作用:获得一个集合或者数组的大小
Example:
1)定义Java Bean : student
2)读取student这个java bean的songs的size
3)输出songsize值
Exapmple:定义一个列表,输出其size,要求使用
1)<%定义一个List,并初始化%>
2)使用
注意:如果使用${},必须要把list放置到范围对象中
3)输出
5.
作用:读取请求头中cookie的信息
*
获得指定的名为 "customid" 的coockie,并将其赋值给脚本变量 cid
* 若找不到id为costCookie这个cookie,所以系统创建一个cookie,并将它的值设置为"uu11"
输出:
*
输出:
6.
作用:获取请求头的属性信息
//打印出:Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.8.0.7) Gecko/20061011....未完
//打印出:127.0.0.1:8080
// no defined Header
7.
作用:对指定url(由forward、href或page确定)处的资源做一个请求,
将响应数据作为一个String类型的bean绑定到page作用域,
同时创建一个scripting变量。我们可以通过id值访问它们。
Example:
1)在根目录下定义一个文件:include.txt
2)获取文件的内容数据,并赋于words
3)输出内容
8.
作用:获取指定的资源,以String或者InputStream的方式来读取,其中input属性是决定了对应的方式。
默认(false)是以字符串的方式来读取。
例如:
//打印出:java.io.ByteArrayInputStream@735f45 input="false"时同样这打印
9.
作用:取出url中queryString中指定参数名称的值
例子:
只会读取第一个名字为"action"的参数
把url中queryString中名字叫hobby的所有值赋值给变量ps,所以ps应该是一个数组
10.
作用:把pageContext中的特定的隐含对象(application, request, response, config, session) 取出来,
绑定到某个id中,本页的其它地方就可以使用id来操纵这些隐含对象了。
Example:
三、HTML标签库
使用taglib指令引入标签库
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
通常是配合bean标签一起使用,是struts中最常用的标签之一。
1.
作用:对html的form表单进行简单的封装,满足struts中表单请求的处理
如果你有上述一个标签,那么你的Struts配置文件的元素中必须有一个如下内容:
这就是说一个form标签是和form bean相关联的。
任何包含在