Struts2 - 01 入门与环境搭建

/**

本博客由马瘦风整理并发布,创作不易,转载请注明出处:

 
 

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 业务层

即Service层,它负责业务逻辑处理,和项目需求息息相关.Web层依赖业务层,但业务层不依赖web层.

业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务的一致性(即事务应该放到业务层来控制).

1.2.3 持久层

即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的出现

Struts1 是最早的基于MVC模式的轻量级Web框架,能够合理的划分代码结构,并包含验证框架、国际化框架等多种实用工具框架.

由于师出名门(Apache),其在2005年之前非常流行.但由于Struts1的核心控制器是一个Servlet,随着技术的发展,其弊端开始出现.

与Struts1同时期,OpenSymphony 组织开发的WebWork也是一个优秀的MVC框架,其灵活性较之Struts1更高,但由于名气不够响亮,刚推出时使用者一直不多.

2.1.2 Struts2的由来

为了符合更加灵活、高效的开发需求,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的核心内部:


猜你喜欢

转载自blog.csdn.net/ma_shou_feng/article/details/78789899