/**
本博客由马瘦风整理并发布,创作不易,转载请注明出处:
http://blog.csdn.net/ma_shou_feng
*/
1 框架概述
1.1 框架的意义与作用
框架,就是把一些繁琐的重复性代码封装起来,使程序员在编码中把更多的精力放到业务需求的分析和理解上.就是一个半成品,框架已经完成了一些通用的功能,编码人员只需要实现与业务相关的功能即可,减少了开发的工作量.
特点:封装了很多细节,程序员能快捷高效地开发.
1.2 三层架构
1.2.1 表现层
即Web层:它负责接收客户端请求,并向客户端响应结果.通常客户端使用 Http 协议请求 Web层,Web需要接收Http请求,完成Http响应.
表现层的设计一般都使用MVC设计模型:
--MVC是一个用于实现页面代码和后台代码分离的设计思想;
--MVC是表现层的设计模型,和其他层没有关系.
MVC名
说明
具体体现
M:Model
模型,封装数据
JavaBean,可重用组件
V:View
视图,负责结果的展示
html/jsp
C:Controller
控制器,负责接收请求,控制程序流程
Servlet/Filter
1.2.2 业务层表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端.
1.2.3 持久层即Service层,它负责业务逻辑处理,和项目需求息息相关.Web层依赖业务层,但业务层不依赖web层.
业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务的一致性(即事务应该放到业务层来控制).
即Dao层,负责数据持久化,包括数据层(即数据库和数据访问层).
数据库是对数据进行持久化的载体,数据访问层是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化到数据库中.
通俗的讲,持久层就是和数据库交互,对数据库表进行增删改查操作
1.3 三大框架和三层架构的关系
三大框架包括Struts2, Spring和Hibernate,它们在三层架构中所处的位置如下图所示:
1.4 Servlet和Filter的比较
Servlet
Filter
相同点
init(ServletConfig)
destroy()
service(ServletRequest, ServletResponse)
init(FilterConfig)
destroy()
doFilter(ServletRequest, ServletResponse, FilterChain)
1) 都可以作为控制器
2) 都是单例对象(Web的三大组件都是单例的)
3) 都可以接受请求和响应客户
不同点
Servlet是一个动态资源,可通过地址栏访问;
创建时间点:请求第一次到达Servlet时即创建
Filter不是动态资源,不能通过地址栏访问过滤器;
创建时间:服务器启动(应用加载时)即创建
2 Struts2入门
2.1 Struts2概述
Struts2是一种基于 MVC 模式的轻量级 Web框架,它自问世以来,就受到了广大Web 开发者的关注,并广泛应用于各种企业系统的开发中.目前掌握Struts2框架几乎成为Web开发者的必备技能之一.
2.1.1 Struts1的出现
2.1.2 Struts2的由来Struts1 是最早的基于MVC模式的轻量级Web框架,能够合理的划分代码结构,并包含验证框架、国际化框架等多种实用工具框架.
由于师出名门(Apache),其在2005年之前非常流行.但由于Struts1的核心控制器是一个Servlet,随着技术的发展,其弊端开始出现.
与Struts1同时期,OpenSymphony 组织开发的WebWork也是一个优秀的MVC框架,其灵活性较之Struts1更高,但由于名气不够响亮,刚推出时使用者一直不多.
为了符合更加灵活、高效的开发需求,Apache和OpenSymphony组织在Struts1和WebWork技术的基础上进行了合并,研发了Struts2框架.
Struts2是以 WebWork为核心的,它采用拦截器机制来处理用户的请求.这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离.
-- Struts2相当于WebWork的更新产品,与Struts1关联不大.
2.2 Struts2的优势
Struts2 拥有优良的设计和功能,其优势具体如下:
* 项目开源,使用及拓展方便;
* 提供Exception处理机制;
* Result方式的页面导航,通过 Result 标签很方便的实现重定向和页面跳转;
* 通过简单、集中的配置来调度业务类,使得配置和修改都非常容易;
-- Struts2 只有一个核心控制器,代码都写在普通的类中.
* 提供简单、统一的表达式语言来访问所有可供访问的数据;
* 提供标准、强大的验证框架和国际化框架;
* 提供强大的、可以有效减少页面代码的标签;
* 提供强大的文件上传、下载功能;
* 提供良好的 Ajax 支持;
* 拥有简单的插件,只需导入相应的JAR包,任何人都可以扩展Struts2框架,比如自定义拦截器、自定义结果类型、自定义标签等;
* 拥有智能的默认设置,不需要另外进行繁琐的配置;
2.3 Struts2的核心功能
* Action的实现方面:可以是一个POJO(Plain Old Java Objects,普通类);
* 线程模型方面:Action是一个请求对应一个实例,没有线程安全方面的问题;
* Servlet依赖方面:Action不再依赖于Servlet API,有利于测试:
-- 实现TDD(Test-Driven Development,测试驱动开发)
* 封装请求参数:可选择使用POJO类来封装请求的参数,或直接使用Action的属性;
* 表达式语言方面:整合了OGNL,比EL表达式更强大:
-- OGNL:ObjectGraph Navigation Language,对象图形导航语言
* 绑定值到视图技术:使用"ValueStack"(值栈)技术;
* 类型转换:使用OGNL进行转换,更方便;
* 数据校验:支持重写Validate方法或使用XWork的验证框架;
* 基于SpringAOP思想的拦截器机制,更易扩展.
3 Struts2入门案例
3.1 搭建开发环境
3.1.1 下载Struts2开发包
* Struts2官网: http://struts.apache.org
* 开发包目录结构:
Ø apps:用于存放官方提供的Struts2示例程序,可作为学习资料参考学习;
Ø docs:用于存放官方提供的Struts2文档,包括快速入门以及API等内容;
Ø lib:用于存放Struts2的核心类库,以及Struts2的第三方插件类库;
Ø src:用于存放该版本Struts2框架对应的源代码.
3.1.2 添加Jar包
* 拷贝必要jar包到classpath中:
文件名
说明
asm-3.3.jar
操作 java 字节码的类库
asm-commons-3.3.jar
提供了基于事件的表现形式
asm-tree-3.3.jar
提供了基于对象的表现形式
struts2-core-2.3.24.jar
Struts2 框架的核心类库
xwork-core-2.3.24.jar
WebWork 核心库,Struts2 的构建基础
ognl-3.0.6.jar
对象图导航语言(Object Graph Navigation Language),Struts2框架通过其读写对象的属性,比EL更强大
freemarker-2.3.22.jar
Struts2标签模板使用的类库,用于处理标签
javassist-3.11.0.GA.jar
java字节码解释器,用于生成代理
commons-fileupload-1.3.1.jar
Struts2文件上传组件依赖包
commons-io-2.2.jar
Struts2的输入输出,上传文件依赖的jar
commons-lang-2.4.jar
包含一些数据类型工具,是对java.lang包的增强
log4j-api-2.2.jar
Struts2的日志管理组件依赖包的 api
log4j-core-2.2.jar
Struts2的日志管理组件依赖包
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能.它使用相同的表达式去存取对象的属性.
* 拷贝哪些jar包?
-- Struts2自带案例struts-blank中,拷贝\WEB-INF\lib目录下的全部jar包.
3.1.3 建立Struts2的配置文件
在最顶层的构建路径,即类的根路径 -- src目录下,建立一个默认的(可修改,但不建议)名为struts.xml的配置文件,并导入约束:
<?xml version="1.0" encoding="UTF-8"?> <!-- 导入约束:在 struts2的核心jar包struts2-core-2.3.24.jar 中包含一个名称为 struts-2.3.dtd 的约束文件,在第30行复制即可 --> <!DOCTYPE struts PUBLIC "-//ApacheSoftware Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> </struts>
3.1.4 配置核心控制器
在web.xml中配置Struts2的核心控制器(一个过滤器):
Struts2比Struts1的一个优秀之处体现在:它使用更为强大的过滤器作为控制器.
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>CRMV1.0</display-name> <!-- Struts2的核心控制器:过滤器--> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
3.1.5 验证部署是否成功
部署应用,启动Tomcat服务器,不报错则表示环境搭建成功.
3.2 第一个Struts2案例
以下步骤是实际开发中经常重复的.
3.2.1 在WebRoot目录想编写一个index.jsp文件
<%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%> <% String path =request.getContextPath(); String basePath =request.getScheme()+"://"+ request.getServerName()+ ":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTMLPUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN"> <html> <head> <!-- base标签:绝对路径的另外一种写法 http://localhost:8080/项目名称/ --> <base href="<%=basePath%>"> <title>Struts2入门案例</title> <!-- 相对路径变成了绝对路径 <linkrel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h3>Struts2入门</h3> <%-- struts2框架会接收.action结尾或者是没有后缀的请求 --%> <a href="hello.action">入门:有后缀.action</a> <a href="hello">入门:没有后缀</a> </body> </html>
3.2.2 编写一个动作类(普通的Class)
/** * Struts2中把接收请求的类叫做动作类 * 把动作类中接收请求的方法叫做动作方法 */ public class HelloAction { /** * 动作方法的规则: * 1)修饰符必须public * 2)返回值可以String也可以是void【代表不跳转】,没有其他选项 * 3)方法中不能有参数 * @return */ public String sayHello(){ System.out.println("成功撸起Struts2框架..."); return "success"; //对应结果视图的name } }
3.2.3 在struts.xml文件中配置动作类
<?xml version="1.0" encoding="UTF-8"?> <!-- 导入约束:在 struts2的核心jar包 struts2-core-2.3.24.jar 中包含一个名称为: struts-2.3.dtd 的约束文件,在第30行复制即可 --> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="hello" extends="struts-default"> <!-- name:对应请求的地址,注意:没有后缀(与页面上是否写了后缀没有关系) class:为该名称指定其动作类 method:动作类中对应的hello要执行的方法 --> <action name="hello" class="com.healchow.action.HelloAction" method="sayHello"> <!-- 配置结果视图 --> <result name="success" type="dispatcher">/success.jsp</result> </action> </package> </struts>
3.2.4 结果视图页面
* 在WebRoot下创建success.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>入门成功</title> </head> <body> 成功入门 </body> </html>
3.2.5 测试
3.3 配置struts.xml时没有提示的问题
* 原因:没有找到对应的dtd约束文件.
* 解决办法:导入约束文件:
Ø 在Struts2的核心包struts-2.3.24.jar中找到struts-2.3.dtd约束文件;
Ø 在首选项(Preferences)中搜索XML Catalog,然后添加约束文件;
--注意:Key type为URI,Key为dtd约束文件中的 http://struts.apache.org/dtds/struts-2.3.dtd
Ø 新建配置文件时选择按照约束文件创建即可.
3.4 入门案例的执行过程
3.4.1 执行时序
3.4.2 内部执行流程
Struts2的核心内部: