struts2基本概念

三层架构:

我们的开发架构一般都是基于两种形式,一种是C/S架构,也就是客户端/服务器,另一种是B/S架构,也就是浏览器服务器。在JavaEE开发中,几乎全都是基于B/S架构的开发。那么在B/S架构中,系统标准的三层架构包括:表现层、业务层、持久层。三层架构在我们的实际开发中使用的非常多,所以我们课程中的案例也都是基于三层架构设计的。

三层架构中,每一层各司其职,接下来我们就说说每层都负责哪些方面:

表现层:

也就是我们常说的web层。它负责接收客户端请求,向客户端响应结果,通常客户端使用http协议请求web层,web需要接收http请求,完成http响应。

表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。

表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端。

表现层的设计一般都使用MVC模型。(MVC是表现层的设计模型,和其他层没有关系)

业务层:

也就是我们常说的service层。它负责业务逻辑处理,和我们开发项目的需求息息相关。web层依赖业务层,但是业务层不依赖web层。

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

持久层:

也就是我们是常说的dao层。负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进行持久化的载体,数据访问层是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化到数据库中。

通俗的讲,持久层就是和数据库交互,对数据库表进行曾删改查的。

三大框架和三层架构的关系

三大框架包含了我们已经讲过的Hibernate,即将要学习的struts2和后面我们要学习的Spring。

它们在三层架构中所处的位置,如下图所示:

truts2概述

Struts2是一种基于MVC模式的轻量级Web框架,它自问世以来,就受到了广大Web开发者的关注,并广泛应用于各种企业系统的开发中。目前掌握Struts2框架几乎成为Web开发者的必备技能之一。接下来将针对Struts2的特点、安装以及执行流程等内容进行详细的讲解。

在介绍Struts2之前,先来认识一下Struts1。Struts1是最早的基于MVC模式的轻量级Web框架,它能够合理的划分代码结构,并包含验证框架、国际化框架等多种实用工具框架。但是随着技术的进步,Struts1的局限性也越来越多的暴露出来。为了符合更加灵活、高效的开发需求,Struts2框架应运而生。

Struts2是Struts1的下一代产品,是在 Struts1和WebWork技术的基础上进行合并后的全新框架(WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的J2EE Web框架,它也是一个MVC框架)。虽然Struts2的名字与Struts1相似,但其设计思想却有很大不同。实质上,Struts2是以WebWork为核心的,它采用拦截器的机制来处理用户的请求。这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts2可以理解为WebWork的更新产品。

Struts2环境搭建

下载struts2开发包

Struts2的官网: https://struts.apache.org/

struts2开发包目录介绍

解压后的目录结构如下:

从图中可以看出,展示的是解压后的Struts2.3.24的目录结构,为了让大家对每个目录的内容和作用有一定的了解,接下来针对这些目录进行简单介绍,具体如下:

  1. apps:该文件夹存用于存放官方提供的Struts2示例程序,这些程序可以作为学习者的学习资料,可为学习者提供很好的参照。各示例均为war文件,可以通过zip方式进行解压。
  2. docs:该文件夹用于存放官方提供的Struts2文档,包括Struts2的快速入门、Struts2的文档,以及API文档等内容。
  3. lib:该文件夹用于存放Struts2的核心类库,以及Struts2的第三方插件类库。
  4. src:该文件夹用于存放该版本Struts2框架对应的源代码。

有了Struts2的开发环境,接下来我们可以进行Struts2的开发了。

搭建步骤

第一步:拷贝struts2必备jar包到web工程的lib目录

首先,需要我们创建一个WEB工程,引入相关的jar包文件。引入哪些jar包呢?将struts-2.3.24框架目录中的lib文件夹打开,得到Struts2 开发中可能用到的所有JAR包(此版本有107个JAR包)。实际的开发中,我们根本不用引入这么多的jar包。

要进行struts2的基本的开发,可以参考struts-2.3.24中的apps下的一些示例代码,其中struts2-blank.war是一个struts2的空的工程。我们只需要将struts2-blank.war解压后进入到WEB-INF下的lib中查看。

Struts2 项目依赖的基础JAR包说明

文件名

说明

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框架通过其读写对象的属性

freemarker-2.3.22.jar

Struts2标签模板使用的类库

javassist-3.11.0.GA.jar

javaScript字节码解释器

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的日志管理组件依赖包

第二步:在类的根路径下创建一个名称为struts.xml的文件,并导入约束

这个时候,我们还需要观察apps中的示例代码,在WEB-INF的classes中,有一个名称为struts.xml的文件,这个文件就是struts2的配置文件。

我们在开发中需要将struts.xml文件引入到工程的src下,因为src下内容发布到web服务器中就是WEB-INF下的classes中。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 导入约束:约束的位置:在struts2的核心jar包中struts2-core-2.3.24.jar中包含一个名称为:struts-2.3.dtd的约束文件
-->
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd">
<struts></struts>

第三步:在web.xml配置struts2的核心控制器(一个过滤器)

Struts2框架要想执行,所有的请求都需要经过这个前端控制器(核心过滤器),所以需要配置这个核心过滤器。因为这个过滤器完成了框架的部分的功能。那么我们接下来对过滤器进行配置。我们打开web.xml,在web.xml中进行如下配置。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5"><display-name>day01struts2template</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><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list>
</web-app>

验证搭建成功与否:

把应用部署到tomcat中,启动tomcat,不报异常则表示搭建成功。

Struts2入门案例

案例需求

此章节我们使用的案例需求是,通过点击超链接发送请求,由Struts2中类来负责接收,并且在控制台输出接收到了的语句。

案例实现

第一步:在Web应用中编写一个index.jsp页面,放到WebContent目录下。如下图:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Struts2的入门案例</title></head><body><%--struts2的核心控制器(过滤器)默认会拦截以.action为后缀或者没有后缀的请求。例如:hello.action或者hello --%><a href="${pageContext.request.contextPath}/hello.action">访问struts2的第一个动作类中的方法.action</a><a href="${pageContext.request.contextPath}/hello">访问struts2的第一个动作类中的方法</a></body>
</html>

第二步:编写一个Class,放到你想指定的包下:

/*** 我们的第一个动作类*  动作类:*        Struts2中用于处理请求的类,叫做动作类。*         其实就是一个普通的java类。
*/
public class HelloAction {/*** 我们把动作类中的具有特定编写规则的方法叫做动作方法。* 规则是:*      1、访问修饰符必须是public*   2、方法的返回值必须是String*      3、方法的参数列表必须是空的* @return*/public String sayHello(){System.out.println(this);System.out.println("HelloAction中的sayHello方法执行了。。。。");return "success";}
}

第三步:在配置文件中配置我们的动作类

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><!-- 目前照抄 --><package name="p1" extends="struts-default"><action name="hello" class="com.itheima.web.action.HelloAction" method="sayHello"><result name="success" type="dispatcher">/success.jsp</result></action></package></struts>

第四步:在WebContent中编写一个success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
执行成功!
</body>
</html>

第六步:启动tomcat测试访问结果

Struts2的执行过程

执行时序

首先是,启动tomcat服务器,这时候会加载web.xml,当读到filter标签时,会创建过滤器对象。

struts2的核心过滤器(StrutsPrepareAndExecuteFilter)会负责加载类路径下的struts.xml配置文件。

接下来,从客户端发送请求过来 先经过前端控制器(核心过滤器StrutsPrepareAndExecuteFilter),前端控制器会根据请求的名称在struts.xml中找到对应的配置,创建我们的动作类对象(每次访问时都会创建新的Action对象),然后执行指定的方法,根据方法的返回值找到Result的配置进行页面的跳转.最后响应浏览器。

内部执行流程:

struts2框架在默认情况下核心控制器(StrutsPrepareAndExecuteFilter)默认会拦截以.action为后缀的请求,或者是没有任何后缀的请求。当拦截下来后,送入struts2的核心内部。如下图所示:

struts2的配置文件详解

Struts2中的配置文件

配置文件说明

通过上图,我们知道了学习struts2框架,配置文件的重要性。那么在struts2中给我们提供了6个配置文件。他们的加载时机是tomcat启动服务一加载我们的应用时,就加载struts2的配置文件。

他们的加载顺序入下图:

顺序

配置文件名

所在位置

说明

1

default.properties

struts2-core-2.3.15.3.jar\org\apache\struts2

不能修改

2

struts-default.xml

struts2-core-2.3.15.3.jar

不能修改

3

strtuts-plugin.xml

在struts2提供的插件jar包中

不能修改

4

struts.xml

我们的应用中

我们修改的:推荐

5

struts.properties

我们的应用中

我们修改的

6

web.xml

我们的应用中

我们修改的,可以给过滤器配置参数

struts2中的常用常量

常量定义在了default.properties配置文件中,体现形式都是key=value。所有的struts2应用都会用到这些常量。

常用的:

常量名

常量值

说明

struts.i18n.encoding

UTF-8

应用中使用的编码

struts.objectFactory.spring.autoWire

name

和spring框架整合有关

struts.multipart.parser

jakarta

指定文件上传用的组件

struts.multipart.maxSize

2097152

文件上传总文件大小限制:2M

struts.action.extension

action,,

能进入Struts2框架内部的url地址后缀名。多个值用逗号分隔

struts.enable.DynamicMethodInvocation

false

是否允许动态方法调用

struts.devMode

false

是否是开发模式。开发模式:改了配置文件,不需要重启。输出更多的错误信息。开发阶段建议为true。

struts.ui.theme

xhtml

页面展示用的主题

struts.xml中的标签详解

constant标签

作用:用于修改struts2中的常量属性:name:指定常量的keyvalue:指定常量的值用法:<!-- 开启开发者模式 --><constant name="struts.devMode" value="true"></constant>

package标签


作用:在struts2的配置文件中引入了面向对象思想,使用了分包管理。易于管理动作类。便于模块化开发动作类。
属性:name:包的名称。必须写。且必须唯一。extends:一般情况下需要继承struts-default包,但不是必须的。不过如果不继承的话,将无法使用struts2提供的核心功能。struts-default.xml中定义着struts-default这个包。而struts-default.xml是在我们的struts.xml加载之前加载。abstract:把包声明为抽象包,抽象包就是用来被继承的。只要是没有<action>元素的包,就可以声明为抽象包。namespace:名称空间。它的作用是把访问的URL按照模块化来管理。名称空间的写法:必须以/开头后面可以是字母和数组的组合,也可只有字母。如果有数字的话,数字不能作为/后面的第一个字符。当我们指定了名称空间之后,访问的URL就变成了:名称空间+action标签的name属性取值例如:/n1/hello.action/customer/addCustomer.action/customer/editCustomer.action/linkman/findAllLinkMan.action/linkman/removeLinkMan.action名称空间的默认值是:""(struts2官方文档中提供的)
用法:
<package name="myDefault" extends="struts-default" abstract="true"><!-- 此处就可以定义公共配置,该公共配置应该是当前应用中的公共配置 -->
</package>
<package name="p1" extends="myDefault" namespace="/n1">
<action name="hello" class="com.itheima.web.action.HelloAction" method="sayHello"><result name="success" type="dispatcher">/success.jsp</result></action>
</package>

action标签


作用:建立动作名称和动作类以及动作方法的对应关系。
属性:name:指定的动作名称。和页面中url后面保持一种。注意此处不能后缀。动作名称必须唯一。class:指定的是动作类的全限定类名。method:指定的是动作方法名称

动作类的三种创建方式:

第一种:无侵入式创建(实际开发中基本不用)

/*** 我们的第一个动作类* 动作类的第一种创建方式:*     无侵入式的创建。
*/
public class HelloAction {/*** @return*/public String sayHello(){System.out.println(this);System.out.println("HelloAction中的sayHello方法执行了。。。。");return "success";}
}
<action name="hello" class="com.itheima.web.action.HelloAction" method="sayHello"><result name="success" type="dispatcher">/success.jsp</result>
</action>

第二种:实现Action接口的定义方式 (实际开发中用的也不多)

/*** 动作类的第二种创建方式:*  实现Action接口*/
public class Hello2Action implements Action{@Overridepublic String execute() throws Exception {System.out.println("Hello2Action的execute方法执行了............");return ERROR;}
}
默认的动作方法是:execute(),所以可以不指定method属性
<action name="hello2" class="com.itheima.web.action.Hello2Action"><result name="success" type="dispatcher">/success.jsp</result>
</action>
Action接口中的常量SUCCESS:一般多用于成功ERROR:一般多用于动作方法执行失败LOGIN:一般多用于返回登录页面NONE:一般用于不返回任何结果视图,和return null作用是一样的INPUT:一般多用于数据回显,也是struts2中数据回显时的默认返回值。     

第三种:继承ActionSupport (们实际开发中采用的方式)


/*** 动作类的第三种创建方式:*  继承ActionSupport
*/
public class Hello3Action extends ActionSupport{
}
<action name="hello3" class="com.itheima.web.action.Hello3Action"><result name="success" type="dispatcher">/success.jsp</result>
</action>

默认动作类:ActionSupport类


通过struts-default.xml中我们知道默认的动作类是ActionSupport,所以如果实现该类的execute方法,则可以不用指定class和method属性
<action name="defaultAction"><result name="success" type="dispatcher">/success.jsp</result>
</action>

配置action时使用通配符


3.4.1原始全匹配配置方式:
<package name="user" extends="struts-default" namespace="/user" ><action name="addUser" class="com.itheima.web.action.UserAction" method="addUser"><result name="success">/success.jsp</result></action><action name="updateUser" class="com.itheima.web.action.UserAction" method="updateUser"><result name="success">/success.jsp</result></action><action name="deleteUser" class="com.itheima.web.action.UserAction" method="deleteUser"><result name="success">/success.jsp</result></action><action name="findUser" class="com.itheima.web.action.UserAction" method="findUser"><result name="success">/success.jsp</result></action>
</package>
页面访问方式:
<a href="${pageContext.request.contextPath}/addUser.action">添加用户</a>
<a href="${pageContext.request.contextPath}/updateUser.action">修改用户</a>
<a href="${pageContext.request.contextPath}/deleteUser.action">删除用户</a>
<a href="${pageContext.request.contextPath}/findUser.action">查询用户</a>Action类中的方法:
/*** 用户管理的动作类
*/
public class UserAction extends ActionSupport {public String addUser(){System.out.println("添加了用户");return SUCCESS;}   public String updateUser(){System.out.println("更新了用户");return SUCCESS;}   public String deleteUser(){System.out.println("删除了用户");return SUCCESS;}public String findUser(){System.out.println("查询了用户");return SUCCESS;}
}

使用通配符访问方式
第一种:单一通配符


<package name="user" extends="struts-default"><action name="*" class="com.itheima.web.action.UserAction" method="{1}"><result name="success">/success.jsp</result></action>
</package>
页面访问方式和Action类中的方法不变

第二种:多个通配符组合使用


<package name="user" extends="struts-default">                                           <action name="*_*" class="com.itheima.web.action.{2}Action" method="{1}{2}"><result name="success">/success.jsp</result></action>
</package>页面访问方式:
<a href="${pageContext.request.contextPath}/add_User.action">添加用户</a>
<a href="${pageContext.request.contextPath}/update_User.action">修改用户</a>
<a href="${pageContext.request.contextPath}/delete_User.action">删除用户</a>
<a href="${pageContext.request.contextPath}/find_User.action">查询用户</a>
Action类中的方法不变。

第三种:动态方法调用


<!-- 开启动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="user" extends="struts-default">                                  <action name="user" class="com.itheima.web.action.UserAction" ><result name="success">/success.jsp</result></action>
</package>页面访问方式:
<a href="${pageContext.request.contextPath}/user!addUser.action">添加用户</a>
<a href="${pageContext.request.contextPath}/user!updateUser.action">修改用户</a>
<a href="${pageContext.request.contextPath}/user!deleteUser.action">删除用户</a>
<a href="${pageContext.request.contextPath}/user!findUser.action">查询用户</a>
Action类中的方法不变。

struts2总结(一)相关推荐

  1. struts2 与 sping 整合 控制器中 service注入的问题

    以个人见解认为struts1 与spring整合的时候按照习惯,我们会把 action 控制器直接配置到sping中去: eg : 这里以使用元注解方式实现Service注入进行讲解: 控制器关键代码 ...

  2. Spring整合Struts2

    ①导入Struts2 jar包 ②在web.xml文件中创建过滤器 <?xml version="1.0" encoding="UTF-8"?> & ...

  3. Struts2标签库

    这是个音乐播放列表 1.queryMusic.jsp <%@ page language="java" import="java.util.*" page ...

  4. Struts2中Action接收参数

    Struts2中Action接收参数的方法主要有以下三种: Struts2中Action接收参数的方法主要有以下三种: 1.使用Action的属性接收参数:     a.定义:在Action类中定义属 ...

  5. struts2笔记01-环境搭建

    1.官网下载struts2 struts-2.3.28-all.zip,这个包可谓应有尽有,以后全靠它了! 2.jar包怎么选?       (1)struts-2.3.28-all\struts-2 ...

  6. 使用Struts2标签遍历集合

    遍历Map<String,Object> 遍历Map<Stirng,List<Student>> 遍历List<Map<String,Student&g ...

  7. 关于SpringMVC和Struts2的区别

    1.    与struts2不同 1.  springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器. 2. springmvc是基于方法开发,传递参数是通 ...

  8. java struts2值栈ognl_Struts2 (三) — OGNL与值栈

    一.OGNL表达式 1.概述 1.1什么是OGNL ​ OGNL是Object-Graph Navigation Language的缩写,俗称对象图导航语言. 它是一种功能强大的表达式语言,通过它简单 ...

  9. 基于Struts2框架的名片管理系统

    目录 1.系统设计 2.数据库设计 3.系统管理 4.用户管理 5.名片管理 本篇博文将分享一款基于Struts2框架的名片管理系统,JSP引擎为Tomcat9.0,数据库采用的是MySQL5.5,集 ...

  10. Struts2 2.5版本新配置filter-class

    在web.xml 默认代码: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns=&q ...

最新文章

  1. javascript 手势缩放 旋转 拖动支持:hammer.js
  2. 解决windows图片查看器背景色变成米黄色
  3. 大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?
  4. openCV4.2.0 error: (-5:Bad argument) CAP_IMAGES: can’t find starting number (in the name of file)
  5. seata-golang 接入指南
  6. 机器学习——支持向量机SVM之非线性模型(原问题转化为对偶问题)
  7. java类名与文件名_为什么Java文件名必须与公共类名相同?
  8. 程序员必看!Android面试10大知识点总结宝典助你通关!年薪50W
  9. js 刷新div_vue.js备忘记录(五) vue-router
  10. javascript挑战编程技能-第九题:数据结构
  11. 为啥浏览器中的对象和w3c不一样??
  12. php wmi,wmi与vbs
  13. PHP判断客户端协议类型是否为https
  14. windows终止处理程序( __try __finally) 简单解析
  15. Django实现websocket完成实时通讯,聊天室,在线客服等
  16. 新款清新个人自动发卡程序源码
  17. Pr 音频效果参考:特殊效果
  18. MySQL中文参考手册
  19. 宏观经济指标分析与数据可视化——PMI
  20. mysql根据经纬度计算距离并排序

热门文章

  1. 赢在龙头TDX公式(部分)
  2. 波特“钻石”模型理论的基本内容
  3. PyOpenCV图像逆时针旋转90度
  4. 全媒体运营师胡耀文教你:从0到专业玩转活动运营
  5. 惠普服务器型号详解,ZOL为您把脉 惠普塔式服务器型号详解
  6. 光线追踪Ray Tracing
  7. 实对称矩阵为正定矩阵的一个充分必要条件
  8. cocos2d-x 欢乐捕鱼游戏总结
  9. Window向阿里云ESC传送文件(Centos)
  10. Steam里的这款动态壁纸wallpaper engine也可以免费白嫖了